From 51dc1d973265f7d69b8fd0c2dbdfe83ea4bcb9a5 Mon Sep 17 00:00:00 2001
From: Joost De Cock
Date: Tue, 1 Apr 2025 16:15:20 +0200
Subject: [PATCH] [breaking]: FreeSewing v4 (#7297)
Refer to the CHANGELOG for all info.
---------
Co-authored-by: Wouter van Wageningen
Co-authored-by: Josh Munic
Co-authored-by: Jonathan Haas
---
.eslintrc.cjs | 12 +-
.github/workflows/dependabot-sync.yml | 46 -
.gitignore | 58 +-
.husky/pre-commit | 2 +-
.prettierignore | 3 +-
CHANGELOG.md | 398 +-
README.md | 40 +-
artwork/stickers/sticker-2025.svg | 754 +
config/authors.mjs | 80 -
config/badges.yaml | 18 +-
config/changelog.yaml | 24 +
config/dependencies.yaml | 437 +-
config/exceptions.yaml | 106 +-
config/languages.json | 2 +-
config/pattern-options.js | 4 -
config/scripts.yaml | 75 +-
config/social.mjs | 10 -
config/software/designs.json | 304 +-
config/software/packages.json | 10 +-
config/templates/build.dflt.mjs | 35 -
config/templates/design.test.mjs.mustache | 4 +-
config/templates/design/i18n/index.mjs | 9 +-
config/templates/design/package.json.mustache | 8 +-
config/templates/design/tests/shared.test.mjs | 2 +-
config/templates/package.dflt.json | 17 +-
config/templates/plugin/package.json.mustache | 6 +-
config/templates/readme.dflt.md | 44 +-
config/templates/readme.main.md | 40 +-
config/templates/use-design.mjs.mustache | 17 -
config/trustees.mjs | 35 -
crowdin.yml | 19 -
designs/aaron/README.md | 63 +-
designs/aaron/about.json | 20 +
designs/aaron/data.mjs | 4 -
designs/aaron/i18n/de.json | 45 -
designs/aaron/i18n/es.json | 45 -
designs/aaron/i18n/fr.json | 45 -
designs/aaron/i18n/index.mjs | 7 +-
designs/aaron/i18n/nl.json | 45 -
designs/aaron/i18n/uk.json | 45 -
designs/aaron/package.json | 37 +-
designs/aaron/src/front.mjs | 2 +-
designs/aaron/src/index.mjs | 8 +-
designs/aaron/tests/shared.test.mjs | 4 +-
designs/albert/README.md | 63 +-
designs/albert/about.json | 19 +
designs/albert/build.mjs | 35 -
designs/albert/data.mjs | 4 -
designs/albert/i18n/de.json | 36 -
designs/albert/i18n/es.json | 36 -
designs/albert/i18n/fr.json | 36 -
designs/albert/i18n/index.mjs | 7 +-
designs/albert/i18n/nl.json | 90 -
designs/albert/i18n/uk.json | 36 -
designs/albert/package.json | 33 +-
designs/albert/src/front.mjs | 64 +-
designs/albert/src/index.mjs | 6 +-
designs/albert/src/pocket.mjs | 44 +-
designs/albert/tests/shared.test.mjs | 4 +-
designs/bee/README.md | 63 +-
designs/bee/about.json | 20 +
designs/bee/build.mjs | 35 -
designs/bee/data.mjs | 4 -
designs/bee/i18n/de.json | 120 -
designs/bee/i18n/es.json | 120 -
designs/bee/i18n/fr.json | 120 -
designs/bee/i18n/index.mjs | 7 +-
designs/bee/i18n/nl.json | 120 -
designs/bee/i18n/uk.json | 120 -
designs/bee/package.json | 35 +-
designs/bee/src/index.mjs | 6 +-
designs/bee/tests/shared.test.mjs | 4 +-
designs/bella/README.md | 63 +-
designs/bella/about.json | 21 +
designs/bella/build.mjs | 35 -
designs/bella/data.mjs | 4 -
designs/bella/i18n/de.json | 87 -
designs/bella/i18n/es.json | 87 -
designs/bella/i18n/fr.json | 87 -
designs/bella/i18n/index.mjs | 7 +-
designs/bella/i18n/nl.json | 87 -
designs/bella/i18n/uk.json | 87 -
designs/bella/package.json | 33 +-
designs/bella/src/back.mjs | 16 +-
designs/bella/src/index.mjs | 6 +-
designs/bella/tests/shared.test.mjs | 4 +-
designs/benjamin/README.md | 63 +-
designs/benjamin/about.json | 17 +
designs/benjamin/build.mjs | 35 -
designs/benjamin/data.mjs | 4 -
designs/benjamin/i18n/de.json | 50 -
designs/benjamin/i18n/es.json | 50 -
designs/benjamin/i18n/fr.json | 50 -
designs/benjamin/i18n/index.mjs | 7 +-
designs/benjamin/i18n/nl.json | 50 -
designs/benjamin/i18n/uk.json | 50 -
designs/benjamin/package.json | 33 +-
designs/benjamin/src/base.mjs | 4 +-
designs/benjamin/src/index.mjs | 6 +-
designs/benjamin/tests/shared.test.mjs | 4 +-
designs/bent/README.md | 63 +-
designs/bent/about.json | 19 +
designs/bent/build.mjs | 35 -
designs/bent/data.mjs | 4 -
designs/bent/i18n/de.json | 20 -
designs/bent/i18n/es.json | 20 -
designs/bent/i18n/fr.json | 20 -
designs/bent/i18n/index.mjs | 7 +-
designs/bent/i18n/nl.json | 20 -
designs/bent/i18n/uk.json | 20 -
designs/bent/package.json | 37 +-
designs/bent/src/index.mjs | 6 +-
designs/bent/src/sleeve.mjs | 11 +-
designs/bent/tests/shared.test.mjs | 4 +-
designs/bibi/CHANGELOG.md | 8 +
designs/bibi/README.md | 63 +-
designs/bibi/about.json | 19 +
designs/bibi/build.mjs | 35 -
designs/bibi/data.mjs | 4 -
designs/bibi/i18n/de.json | 50 -
designs/bibi/i18n/es.json | 50 -
designs/bibi/i18n/fr.json | 50 -
designs/bibi/i18n/index.mjs | 7 +-
designs/bibi/i18n/nl.json | 50 -
designs/bibi/i18n/uk.json | 50 -
designs/bibi/package.json | 33 +-
designs/bibi/src/cuff.mjs | 7 +-
designs/bibi/src/front.mjs | 1 +
designs/bibi/src/index.mjs | 5 +-
designs/bibi/src/waistband.mjs | 8 +-
designs/bibi/tests/shared.test.mjs | 4 +-
designs/bob/README.md | 63 +-
designs/bob/about.json | 19 +
designs/bob/build.mjs | 35 -
designs/bob/data.mjs | 4 -
designs/bob/i18n/de.json | 26 -
designs/bob/i18n/es.json | 26 -
designs/bob/i18n/fr.json | 26 -
designs/bob/i18n/index.mjs | 7 +-
designs/bob/i18n/nl.json | 26 -
designs/bob/i18n/uk.json | 26 -
designs/bob/package.json | 33 +-
designs/bob/src/index.mjs | 6 +-
designs/bob/tests/shared.test.mjs | 4 +-
designs/bonny/CHANGELOG.md | 17 +
designs/bonny/README.md | 143 +
designs/bonny/about.json | 12 +
designs/{aaron => bonny}/build.mjs | 0
designs/bonny/data.mjs | 4 +
designs/bonny/i18n/en.json | 61 +
designs/bonny/i18n/index.mjs | 3 +
designs/bonny/package.json | 63 +
designs/bonny/src/front.mjs | 654 +
designs/bonny/src/index.mjs | 15 +
designs/bonny/src/side.mjs | 704 +
designs/bonny/tests/shared.test.mjs | 20 +
designs/breanna/README.md | 63 +-
designs/breanna/about.json | 18 +
designs/breanna/build.mjs | 35 -
designs/breanna/data.mjs | 4 -
designs/breanna/i18n/de.json | 191 -
designs/breanna/i18n/es.json | 191 -
designs/breanna/i18n/fr.json | 191 -
designs/breanna/i18n/index.mjs | 7 +-
designs/breanna/i18n/nl.json | 191 -
designs/breanna/i18n/uk.json | 191 -
designs/breanna/package.json | 35 +-
designs/breanna/src/base.mjs | 12 +-
designs/breanna/src/index.mjs | 6 +-
designs/breanna/src/sleeve.mjs | 3 +-
designs/breanna/tests/shared.test.mjs | 4 +-
designs/brian/CHANGELOG.md | 6 +
designs/brian/README.md | 63 +-
designs/brian/about.json | 18 +
designs/brian/build.mjs | 35 -
designs/brian/data.mjs | 4 -
designs/brian/i18n/de.json | 154 -
designs/brian/i18n/es.json | 154 -
designs/brian/i18n/fr.json | 154 -
designs/brian/i18n/index.mjs | 7 +-
designs/brian/i18n/nl.json | 154 -
designs/brian/i18n/uk.json | 154 -
designs/brian/package.json | 35 +-
designs/brian/src/base.mjs | 11 +-
designs/brian/src/index.mjs | 6 +-
designs/brian/tests/shared.test.mjs | 4 +-
designs/bruce/README.md | 63 +-
designs/bruce/about.json | 20 +
designs/bruce/build.mjs | 35 -
designs/bruce/data.mjs | 4 -
designs/bruce/i18n/de.json | 37 -
designs/bruce/i18n/es.json | 93 -
designs/bruce/i18n/fr.json | 37 -
designs/bruce/i18n/index.mjs | 7 +-
designs/bruce/i18n/nl.json | 37 -
designs/bruce/i18n/uk.json | 37 -
designs/bruce/package.json | 33 +-
designs/bruce/src/index.mjs | 6 +-
designs/bruce/tests/shared.test.mjs | 4 +-
designs/carlita/README.md | 63 +-
designs/carlita/about.json | 29 +
designs/carlita/build.mjs | 35 -
designs/carlita/data.mjs | 4 -
designs/carlita/i18n/de.json | 15 -
designs/carlita/i18n/es.json | 15 -
designs/carlita/i18n/fr.json | 15 -
designs/carlita/i18n/index.mjs | 7 +-
designs/carlita/i18n/nl.json | 15 -
designs/carlita/i18n/uk.json | 15 -
designs/carlita/package.json | 41 +-
designs/carlita/src/index.mjs | 5 +-
designs/carlita/tests/shared.test.mjs | 4 +-
designs/carlton/README.md | 63 +-
designs/carlton/about.json | 28 +
designs/carlton/build.mjs | 35 -
designs/carlton/data.mjs | 4 -
designs/carlton/i18n/de.json | 138 -
designs/carlton/i18n/es.json | 138 -
designs/carlton/i18n/fr.json | 138 -
designs/carlton/i18n/index.mjs | 7 +-
designs/carlton/i18n/nl.json | 138 -
designs/carlton/i18n/uk.json | 138 -
designs/carlton/package.json | 39 +-
designs/carlton/src/back.mjs | 6 +-
designs/carlton/src/front.mjs | 8 +-
designs/carlton/src/index.mjs | 5 +-
designs/carlton/src/topsleeve.mjs | 7 +-
designs/carlton/src/undersleeve.mjs | 7 +-
designs/carlton/tests/shared.test.mjs | 4 +-
designs/cathrin/CHANGELOG.md | 7 +
designs/cathrin/README.md | 63 +-
designs/cathrin/about.json | 23 +
designs/cathrin/build.mjs | 35 -
designs/cathrin/data.mjs | 4 -
designs/cathrin/i18n/de.json | 49 -
designs/cathrin/i18n/es.json | 49 -
designs/cathrin/i18n/fr.json | 49 -
designs/cathrin/i18n/index.mjs | 7 +-
designs/cathrin/i18n/nl.json | 49 -
designs/cathrin/i18n/uk.json | 49 -
designs/cathrin/package.json | 33 +-
designs/cathrin/src/index.mjs | 6 +-
designs/cathrin/tests/shared.test.mjs | 4 +-
designs/charlie/CHANGELOG.md | 10 +
designs/charlie/README.md | 63 +-
designs/charlie/about.json | 25 +
designs/charlie/build.mjs | 35 -
designs/charlie/data.mjs | 4 -
designs/charlie/i18n/de.json | 90 -
designs/charlie/i18n/es.json | 90 -
designs/charlie/i18n/fr.json | 90 -
designs/charlie/i18n/index.mjs | 7 +-
designs/charlie/i18n/nl.json | 90 -
designs/charlie/i18n/uk.json | 90 -
designs/charlie/package.json | 37 +-
designs/charlie/src/front.mjs | 6 +-
designs/charlie/src/index.mjs | 5 +-
designs/charlie/tests/shared.test.mjs | 4 +-
designs/cornelius/README.md | 63 +-
designs/cornelius/about.json | 21 +
designs/cornelius/build.mjs | 35 -
designs/cornelius/data.mjs | 4 -
designs/cornelius/i18n/de.json | 53 -
designs/cornelius/i18n/es.json | 53 -
designs/cornelius/i18n/fr.json | 53 -
designs/cornelius/i18n/index.mjs | 7 +-
designs/cornelius/i18n/nl.json | 53 -
designs/cornelius/i18n/uk.json | 53 -
designs/cornelius/package.json | 33 +-
designs/cornelius/src/index.mjs | 5 +-
designs/cornelius/tests/shared.test.mjs | 4 +-
designs/diana/README.md | 63 +-
designs/diana/about.json | 18 +
designs/diana/build.mjs | 35 -
designs/diana/data.mjs | 4 -
designs/diana/i18n/de.json | 28 -
designs/diana/i18n/es.json | 28 -
designs/diana/i18n/fr.json | 28 -
designs/diana/i18n/index.mjs | 7 +-
designs/diana/i18n/nl.json | 28 -
designs/diana/i18n/uk.json | 28 -
designs/diana/package.json | 37 +-
designs/diana/src/front.mjs | 26 +-
designs/diana/src/index.mjs | 6 +-
designs/diana/tests/shared.test.mjs | 4 +-
designs/examples/README.md | 63 +-
designs/examples/build.mjs | 35 -
designs/examples/data.mjs | 4 -
designs/examples/i18n/de.json | 7 -
designs/examples/i18n/es.json | 7 -
designs/examples/i18n/fr.json | 7 -
designs/examples/i18n/index.mjs | 7 +-
designs/examples/i18n/nl.json | 7 -
designs/examples/i18n/uk.json | 7 -
designs/examples/package.json | 35 +-
designs/examples/src/index.mjs | 2 -
designs/examples/tests/shared.test.mjs | 4 +-
designs/florence/README.md | 63 +-
designs/florence/about.json | 16 +
designs/florence/build.mjs | 35 -
designs/florence/data.mjs | 4 -
designs/florence/i18n/de.json | 22 -
designs/florence/i18n/es.json | 22 -
designs/florence/i18n/fr.json | 22 -
designs/florence/i18n/index.mjs | 7 +-
designs/florence/i18n/nl.json | 22 -
designs/florence/i18n/uk.json | 22 -
designs/florence/package.json | 33 +-
designs/florence/src/index.mjs | 6 +-
designs/florence/tests/shared.test.mjs | 4 +-
designs/florent/README.md | 63 +-
designs/florent/about.json | 20 +
designs/florent/build.mjs | 35 -
designs/florent/data.mjs | 4 -
designs/florent/i18n/de.json | 18 -
designs/florent/i18n/es.json | 18 -
designs/florent/i18n/fr.json | 18 -
designs/florent/i18n/index.mjs | 7 +-
designs/florent/i18n/nl.json | 18 -
designs/florent/i18n/uk.json | 18 -
designs/florent/package.json | 33 +-
designs/florent/src/brimbottom.mjs | 4 +-
designs/florent/src/index.mjs | 6 +-
designs/florent/src/top.mjs | 4 +-
designs/florent/tests/shared.test.mjs | 4 +-
designs/gozer/README.md | 63 +-
designs/gozer/about.json | 16 +
designs/gozer/build.mjs | 35 -
designs/gozer/data.mjs | 4 -
designs/gozer/i18n/de.json | 7 -
designs/gozer/i18n/es.json | 7 -
designs/gozer/i18n/fr.json | 7 -
designs/gozer/i18n/index.mjs | 7 +-
designs/gozer/i18n/nl.json | 7 -
designs/gozer/i18n/uk.json | 7 -
designs/gozer/package.json | 33 +-
designs/gozer/src/index.mjs | 8 +-
designs/gozer/tests/shared.test.mjs | 4 +-
designs/hi/README.md | 63 +-
designs/hi/about.json | 18 +
designs/hi/build.mjs | 35 -
designs/hi/data.mjs | 4 -
designs/hi/i18n/de.json | 34 -
designs/hi/i18n/es.json | 34 -
designs/hi/i18n/fr.json | 34 -
designs/hi/i18n/index.mjs | 7 +-
designs/hi/i18n/nl.json | 34 -
designs/hi/i18n/uk.json | 34 -
designs/hi/package.json | 33 +-
designs/hi/src/index.mjs | 5 +-
designs/hi/tests/shared.test.mjs | 4 +-
designs/holmes/README.md | 63 +-
designs/holmes/about.json | 21 +
designs/holmes/build.mjs | 35 -
designs/holmes/data.mjs | 4 -
designs/holmes/i18n/de.json | 48 -
designs/holmes/i18n/es.json | 48 -
designs/holmes/i18n/fr.json | 48 -
designs/holmes/i18n/index.mjs | 7 +-
designs/holmes/i18n/nl.json | 48 -
designs/holmes/i18n/uk.json | 48 -
designs/holmes/package.json | 37 +-
designs/holmes/src/crown.mjs | 3 +-
designs/holmes/src/ear.mjs | 4 +-
designs/holmes/src/index.mjs | 6 +-
designs/holmes/src/visor.mjs | 2 +-
designs/holmes/tests/shared.test.mjs | 4 +-
designs/hortensia/README.md | 63 +-
designs/hortensia/about.json | 23 +
designs/hortensia/build.mjs | 35 -
designs/hortensia/data.mjs | 4 -
designs/hortensia/i18n/de.json | 41 -
designs/hortensia/i18n/es.json | 41 -
designs/hortensia/i18n/fr.json | 41 -
designs/hortensia/i18n/index.mjs | 7 +-
designs/hortensia/i18n/nl.json | 41 -
designs/hortensia/i18n/uk.json | 41 -
designs/hortensia/package.json | 33 +-
designs/hortensia/src/index.mjs | 5 +-
designs/hortensia/tests/shared.test.mjs | 4 +-
designs/huey/CHANGELOG.md | 12 +
designs/huey/README.md | 63 +-
designs/huey/about.json | 20 +
designs/huey/build.mjs | 35 -
designs/huey/data.mjs | 4 -
designs/huey/i18n/de.json | 44 -
designs/huey/i18n/es.json | 44 -
designs/huey/i18n/fr.json | 44 -
designs/huey/i18n/index.mjs | 7 +-
designs/huey/i18n/nl.json | 44 -
designs/huey/i18n/uk.json | 64 -
designs/huey/package.json | 37 +-
designs/huey/src/back.mjs | 3 +-
designs/huey/src/index.mjs | 6 +-
designs/huey/tests/shared.test.mjs | 4 +-
designs/hugo/CHANGELOG.md | 6 +
designs/hugo/README.md | 63 +-
designs/hugo/about.json | 19 +
designs/hugo/build.mjs | 35 -
designs/hugo/data.mjs | 4 -
designs/hugo/i18n/de.json | 29 -
designs/hugo/i18n/es.json | 29 -
designs/hugo/i18n/fr.json | 29 -
designs/hugo/i18n/index.mjs | 7 +-
designs/hugo/i18n/nl.json | 29 -
designs/hugo/i18n/uk.json | 37 -
designs/hugo/package.json | 37 +-
designs/hugo/src/index.mjs | 5 +-
designs/hugo/tests/shared.test.mjs | 4 +-
designs/jaeger/README.md | 63 +-
designs/jaeger/about.json | 25 +
designs/jaeger/build.mjs | 35 -
designs/jaeger/data.mjs | 4 -
designs/jaeger/i18n/de.json | 187 -
designs/jaeger/i18n/es.json | 187 -
designs/jaeger/i18n/fr.json | 187 -
designs/jaeger/i18n/index.mjs | 7 +-
designs/jaeger/i18n/nl.json | 187 -
designs/jaeger/i18n/uk.json | 187 -
designs/jaeger/package.json | 39 +-
designs/jaeger/src/index.mjs | 5 +-
designs/jaeger/tests/shared.test.mjs | 4 +-
designs/jane/README.md | 63 +-
designs/jane/about.json | 18 +
designs/jane/build.mjs | 35 -
designs/jane/data.mjs | 4 -
designs/jane/i18n/de.json | 7 -
designs/jane/i18n/es.json | 7 -
designs/jane/i18n/fr.json | 7 -
designs/jane/i18n/index.mjs | 7 +-
designs/jane/i18n/nl.json | 7 -
designs/jane/i18n/uk.json | 7 -
designs/jane/package.json | 33 +-
designs/jane/src/index.mjs | 6 +-
designs/jane/src/sleeve.mjs | 4 +-
designs/jane/tests/shared.test.mjs | 4 +-
designs/legend/README.md | 63 +-
designs/legend/build.mjs | 35 -
designs/legend/data.mjs | 4 -
designs/legend/i18n/de.json | 7 -
designs/legend/i18n/es.json | 7 -
designs/legend/i18n/fr.json | 7 -
designs/legend/i18n/index.mjs | 7 +-
designs/legend/i18n/nl.json | 7 -
designs/legend/i18n/uk.json | 7 -
designs/legend/package.json | 33 +-
designs/legend/src/index.mjs | 2 -
designs/legend/tests/shared.test.mjs | 4 +-
designs/lily/README.md | 63 +-
designs/lily/about.json | 21 +
designs/lily/build.mjs | 35 -
designs/lily/data.mjs | 4 -
designs/lily/i18n/de.json | 7 -
designs/lily/i18n/es.json | 7 -
designs/lily/i18n/fr.json | 7 -
designs/lily/i18n/index.mjs | 7 +-
designs/lily/i18n/nl.json | 7 -
designs/lily/i18n/uk.json | 7 -
designs/lily/package.json | 37 +-
designs/lily/src/back.mjs | 7 +-
designs/lily/src/index.mjs | 6 +-
designs/lily/tests/shared.test.mjs | 4 +-
designs/lucy/README.md | 63 +-
designs/lucy/about.json | 18 +
designs/lucy/build.mjs | 35 -
designs/lucy/data.mjs | 4 -
designs/lucy/i18n/de.json | 22 -
designs/lucy/i18n/es.json | 22 -
designs/lucy/i18n/fr.json | 22 -
designs/lucy/i18n/index.mjs | 7 +-
designs/lucy/i18n/nl.json | 22 -
designs/lucy/i18n/uk.json | 22 -
designs/lucy/package.json | 33 +-
designs/lucy/src/index.mjs | 9 +-
designs/lucy/tests/shared.test.mjs | 4 +-
designs/lumina/README.md | 63 +-
designs/lumina/about.json | 19 +
designs/lumina/build.mjs | 35 -
designs/lumina/data.mjs | 4 -
designs/lumina/i18n/de.json | 7 -
designs/lumina/i18n/es.json | 7 -
designs/lumina/i18n/fr.json | 7 -
designs/lumina/i18n/index.mjs | 7 +-
designs/lumina/i18n/nl.json | 7 -
designs/lumina/i18n/uk.json | 7 -
designs/lumina/package.json | 33 +-
designs/lumina/src/index.mjs | 8 +-
designs/lumina/tests/shared.test.mjs | 4 +-
designs/lumira/README.md | 63 +-
designs/lumira/about.json | 19 +
designs/lumira/build.mjs | 35 -
designs/lumira/data.mjs | 4 -
designs/lumira/i18n/de.json | 7 -
designs/lumira/i18n/es.json | 7 -
designs/lumira/i18n/fr.json | 7 -
designs/lumira/i18n/index.mjs | 7 +-
designs/lumira/i18n/nl.json | 7 -
designs/lumira/i18n/uk.json | 7 -
designs/lumira/package.json | 33 +-
designs/lumira/src/index.mjs | 9 +-
designs/lumira/tests/shared.test.mjs | 4 +-
designs/lunetius/README.md | 63 +-
designs/lunetius/about.json | 18 +
designs/lunetius/build.mjs | 35 -
designs/lunetius/data.mjs | 4 -
designs/lunetius/i18n/de.json | 22 -
designs/lunetius/i18n/es.json | 22 -
designs/lunetius/i18n/fr.json | 22 -
designs/lunetius/i18n/index.mjs | 7 +-
designs/lunetius/i18n/nl.json | 22 -
designs/lunetius/i18n/uk.json | 22 -
designs/lunetius/package.json | 33 +-
designs/lunetius/src/index.mjs | 6 +-
designs/lunetius/tests/shared.test.mjs | 4 +-
designs/magde/README.md | 63 +-
designs/magde/about.json | 13 +
designs/magde/build.mjs | 35 -
designs/magde/data.mjs | 4 -
designs/magde/i18n/de.json | 44 -
designs/magde/i18n/es.json | 44 -
designs/magde/i18n/fr.json | 44 -
designs/magde/i18n/index.mjs | 7 +-
designs/magde/i18n/nl.json | 44 -
designs/magde/i18n/uk.json | 44 -
designs/magde/package.json | 33 +-
designs/magde/src/index.mjs | 5 +-
designs/magde/tests/shared.test.mjs | 4 +-
designs/noble/CHANGELOG.md | 7 +
designs/noble/README.md | 63 +-
designs/noble/about.json | 20 +
designs/noble/build.mjs | 35 -
designs/noble/data.mjs | 4 -
designs/noble/i18n/de.json | 99 -
designs/noble/i18n/es.json | 99 -
designs/noble/i18n/fr.json | 99 -
designs/noble/i18n/index.mjs | 7 +-
designs/noble/i18n/nl.json | 99 -
designs/noble/i18n/uk.json | 103 -
designs/noble/package.json | 35 +-
designs/noble/src/index.mjs | 16 +-
designs/noble/tests/shared.test.mjs | 4 +-
designs/octoplushy/README.md | 63 +-
designs/octoplushy/about.json | 18 +
designs/octoplushy/build.mjs | 35 -
designs/octoplushy/data.mjs | 4 -
designs/octoplushy/i18n/de.json | 52 -
designs/octoplushy/i18n/es.json | 52 -
designs/octoplushy/i18n/fr.json | 52 -
designs/octoplushy/i18n/index.mjs | 7 +-
designs/octoplushy/i18n/nl.json | 52 -
designs/octoplushy/i18n/uk.json | 52 -
designs/octoplushy/package.json | 33 +-
designs/octoplushy/src/index.mjs | 17 +-
designs/octoplushy/tests/shared.test.mjs | 4 +-
designs/onyx/CHANGELOG.md | 6 +
designs/onyx/README.md | 63 +-
designs/onyx/about.json | 23 +
designs/onyx/build.mjs | 35 -
designs/onyx/data.mjs | 4 -
designs/onyx/i18n/de.json | 252 -
designs/onyx/i18n/es.json | 252 -
designs/onyx/i18n/fr.json | 252 -
designs/onyx/i18n/index.mjs | 7 +-
designs/onyx/i18n/nl.json | 252 -
designs/onyx/i18n/uk.json | 252 -
designs/onyx/package.json | 33 +-
designs/onyx/src/index.mjs | 5 +-
designs/onyx/tests/shared.test.mjs | 4 +-
designs/opal/README.md | 63 +-
designs/opal/about.json | 21 +
designs/opal/build.mjs | 35 -
designs/opal/data.mjs | 4 -
designs/opal/i18n/de.json | 7 -
designs/opal/i18n/es.json | 7 -
designs/opal/i18n/fr.json | 7 -
designs/opal/i18n/index.mjs | 7 +-
designs/opal/i18n/nl.json | 7 -
designs/opal/i18n/uk.json | 7 -
designs/opal/package.json | 33 +-
designs/opal/src/index.mjs | 5 +-
designs/opal/tests/shared.test.mjs | 4 +-
designs/otis/README.md | 63 +-
designs/otis/about.json | 12 +
designs/otis/build.mjs | 35 -
designs/otis/data.mjs | 4 -
designs/otis/i18n/de.json | 51 -
designs/otis/i18n/es.json | 51 -
designs/otis/i18n/fr.json | 51 -
designs/otis/i18n/index.mjs | 7 +-
designs/otis/i18n/nl.json | 51 -
designs/otis/i18n/uk.json | 51 -
designs/otis/package.json | 33 +-
designs/otis/src/index.mjs | 5 +-
designs/otis/tests/shared.test.mjs | 4 +-
designs/paco/README.md | 63 +-
designs/paco/about.json | 21 +
designs/paco/build.mjs | 35 -
designs/paco/data.mjs | 4 -
designs/paco/i18n/de.json | 37 -
designs/paco/i18n/es.json | 37 -
designs/paco/i18n/fr.json | 37 -
designs/paco/i18n/index.mjs | 7 +-
designs/paco/i18n/nl.json | 37 -
designs/paco/i18n/uk.json | 41 -
designs/paco/package.json | 37 +-
designs/paco/src/back.mjs | 6 +-
designs/paco/src/index.mjs | 5 +-
designs/paco/tests/shared.test.mjs | 4 +-
designs/penelope/README.md | 63 +-
designs/penelope/about.json | 20 +
designs/penelope/build.mjs | 35 -
designs/penelope/data.mjs | 4 -
designs/penelope/i18n/de.json | 72 -
designs/penelope/i18n/es.json | 72 -
designs/penelope/i18n/fr.json | 72 -
designs/penelope/i18n/index.mjs | 7 +-
designs/penelope/i18n/nl.json | 72 -
designs/penelope/i18n/uk.json | 72 -
designs/penelope/package.json | 33 +-
designs/penelope/src/index.mjs | 6 +-
designs/penelope/tests/shared.test.mjs | 4 +-
designs/plugintest/README.md | 63 +-
designs/plugintest/build.mjs | 35 -
designs/plugintest/data.mjs | 4 -
designs/plugintest/i18n/de.json | 7 -
designs/plugintest/i18n/es.json | 7 -
designs/plugintest/i18n/fr.json | 7 -
designs/plugintest/i18n/index.mjs | 7 +-
designs/plugintest/i18n/nl.json | 7 -
designs/plugintest/i18n/uk.json | 7 -
designs/plugintest/package.json | 55 +-
designs/plugintest/src/index.mjs | 2 -
designs/plugintest/tests/shared.test.mjs | 4 +-
designs/rendertest/README.md | 63 +-
designs/rendertest/build.mjs | 35 -
designs/rendertest/data.mjs | 4 -
designs/rendertest/i18n/de.json | 7 -
designs/rendertest/i18n/es.json | 7 -
designs/rendertest/i18n/fr.json | 7 -
designs/rendertest/i18n/index.mjs | 7 +-
designs/rendertest/i18n/nl.json | 7 -
designs/rendertest/i18n/uk.json | 7 -
designs/rendertest/package.json | 33 +-
designs/rendertest/src/index.mjs | 2 -
designs/rendertest/tests/shared.test.mjs | 4 +-
designs/sandy/README.md | 63 +-
designs/sandy/about.json | 22 +
designs/sandy/build.mjs | 35 -
designs/sandy/data.mjs | 4 -
designs/sandy/i18n/de.json | 51 -
designs/sandy/i18n/es.json | 51 -
designs/sandy/i18n/fr.json | 51 -
designs/sandy/i18n/index.mjs | 7 +-
designs/sandy/i18n/nl.json | 51 -
designs/sandy/i18n/uk.json | 51 -
designs/sandy/package.json | 39 +-
designs/sandy/src/index.mjs | 6 +-
designs/sandy/tests/shared.test.mjs | 4 +-
designs/shelly/CHANGELOG.md | 6 +
designs/shelly/README.md | 63 +-
designs/shelly/about.json | 20 +
designs/shelly/build.mjs | 35 -
designs/shelly/data.mjs | 4 -
designs/shelly/i18n/de.json | 30 -
designs/shelly/i18n/es.json | 30 -
designs/shelly/i18n/fr.json | 30 -
designs/shelly/i18n/index.mjs | 7 +-
designs/shelly/i18n/nl.json | 30 -
designs/shelly/i18n/uk.json | 38 -
designs/shelly/package.json | 33 +-
designs/shelly/src/index.mjs | 6 +-
designs/shelly/tests/shared.test.mjs | 4 +-
designs/shin/README.md | 63 +-
designs/shin/about.json | 20 +
designs/shin/build.mjs | 35 -
designs/shin/data.mjs | 4 -
designs/shin/i18n/de.json | 36 -
designs/shin/i18n/es.json | 36 -
designs/shin/i18n/fr.json | 36 -
designs/shin/i18n/index.mjs | 7 +-
designs/shin/i18n/nl.json | 36 -
designs/shin/i18n/uk.json | 36 -
designs/shin/package.json | 35 +-
designs/shin/src/index.mjs | 6 +-
designs/shin/tests/shared.test.mjs | 4 +-
designs/simon/CHANGELOG.md | 6 +
designs/simon/README.md | 63 +-
designs/simon/about.json | 21 +
designs/simon/build.mjs | 35 -
designs/simon/data.mjs | 4 -
designs/simon/i18n/de.json | 187 -
designs/simon/i18n/en.json | 1 +
designs/simon/i18n/es.json | 187 -
designs/simon/i18n/fr.json | 187 -
designs/simon/i18n/index.mjs | 7 +-
designs/simon/i18n/nl.json | 187 -
designs/simon/i18n/uk.json | 187 -
designs/simon/package.json | 39 +-
designs/simon/src/index.mjs | 5 +-
designs/simon/tests/shared.test.mjs | 4 +-
designs/simone/CHANGELOG.md | 6 +
designs/simone/README.md | 63 +-
designs/simone/about.json | 21 +
designs/simone/build.mjs | 35 -
designs/simone/data.mjs | 4 -
designs/simone/i18n/de.json | 47 -
designs/simone/i18n/es.json | 47 -
designs/simone/i18n/fr.json | 46 -
designs/simone/i18n/index.mjs | 7 +-
designs/simone/i18n/nl.json | 46 -
designs/simone/i18n/uk.json | 47 -
designs/simone/package.json | 41 +-
designs/simone/src/index.mjs | 5 +-
designs/simone/tests/shared.test.mjs | 4 +-
designs/skully/README.md | 63 +-
designs/skully/about.json | 18 +
designs/skully/build.mjs | 35 -
designs/skully/data.mjs | 4 -
designs/skully/i18n/de.json | 38 -
designs/skully/i18n/es.json | 38 -
designs/skully/i18n/fr.json | 38 -
designs/skully/i18n/index.mjs | 7 +-
designs/skully/i18n/nl.json | 38 -
designs/skully/i18n/uk.json | 25 -
designs/skully/package.json | 33 +-
designs/skully/src/index.mjs | 5 +-
designs/skully/tests/shared.test.mjs | 4 +-
designs/sven/README.md | 63 +-
designs/sven/about.json | 18 +
designs/sven/build.mjs | 35 -
designs/sven/data.mjs | 4 -
designs/sven/i18n/de.json | 30 -
designs/sven/i18n/es.json | 30 -
designs/sven/i18n/fr.json | 30 -
designs/sven/i18n/index.mjs | 7 +-
designs/sven/i18n/nl.json | 30 -
designs/sven/i18n/uk.json | 30 -
designs/sven/package.json | 37 +-
designs/sven/src/frontback.mjs | 6 +-
designs/sven/src/index.mjs | 6 +-
designs/sven/src/sleeve.mjs | 4 +-
designs/sven/tests/shared.test.mjs | 4 +-
designs/tamiko/CHANGELOG.md | 6 +
designs/tamiko/README.md | 63 +-
designs/tamiko/about.json | 16 +
designs/tamiko/build.mjs | 35 -
designs/tamiko/data.mjs | 4 -
designs/tamiko/i18n/de.json | 38 -
designs/tamiko/i18n/es.json | 38 -
designs/tamiko/i18n/fr.json | 38 -
designs/tamiko/i18n/index.mjs | 7 +-
designs/tamiko/i18n/nl.json | 38 -
designs/tamiko/i18n/uk.json | 34 -
designs/tamiko/package.json | 35 +-
designs/tamiko/src/index.mjs | 6 +-
designs/tamiko/src/top.mjs | 3 +-
designs/tamiko/tests/shared.test.mjs | 4 +-
designs/teagan/CHANGELOG.md | 10 +
designs/teagan/README.md | 63 +-
designs/teagan/about.json | 19 +
designs/teagan/build.mjs | 35 -
designs/teagan/data.mjs | 4 -
designs/teagan/i18n/de.json | 50 -
designs/teagan/i18n/es.json | 50 -
designs/teagan/i18n/fr.json | 50 -
designs/teagan/i18n/index.mjs | 7 +-
designs/teagan/i18n/nl.json | 50 -
designs/teagan/i18n/uk.json | 50 -
designs/teagan/package.json | 37 +-
designs/teagan/src/front.mjs | 7 +-
designs/teagan/src/index.mjs | 6 +-
designs/teagan/tests/shared.test.mjs | 4 +-
designs/tiberius/README.md | 63 +-
designs/tiberius/about.json | 15 +
designs/tiberius/build.mjs | 35 -
designs/tiberius/data.mjs | 4 -
designs/tiberius/i18n/de.json | 50 -
designs/tiberius/i18n/es.json | 50 -
designs/tiberius/i18n/fr.json | 50 -
designs/tiberius/i18n/index.mjs | 7 +-
designs/tiberius/i18n/nl.json | 50 -
designs/tiberius/i18n/uk.json | 50 -
designs/tiberius/package.json | 33 +-
designs/tiberius/src/index.mjs | 6 +-
designs/tiberius/tests/shared.test.mjs | 4 +-
designs/titan/CHANGELOG.md | 6 +
designs/titan/README.md | 63 +-
designs/titan/about.json | 18 +
designs/titan/build.mjs | 35 -
designs/titan/data.mjs | 4 -
designs/titan/i18n/de.json | 71 -
designs/titan/i18n/es.json | 71 -
designs/titan/i18n/fr.json | 71 -
designs/titan/i18n/index.mjs | 7 +-
designs/titan/i18n/nl.json | 71 -
designs/titan/i18n/uk.json | 79 -
designs/titan/package.json | 35 +-
designs/titan/src/back.mjs | 6 +-
designs/titan/src/index.mjs | 6 +-
designs/titan/tests/shared.test.mjs | 4 +-
designs/trayvon/README.md | 63 +-
designs/trayvon/about.json | 17 +
designs/trayvon/build.mjs | 35 -
designs/trayvon/data.mjs | 4 -
designs/trayvon/i18n/de.json | 24 -
designs/trayvon/i18n/es.json | 24 -
designs/trayvon/i18n/fr.json | 24 -
designs/trayvon/i18n/index.mjs | 7 +-
designs/trayvon/i18n/nl.json | 24 -
designs/trayvon/i18n/uk.json | 28 -
designs/trayvon/package.json | 35 +-
designs/trayvon/src/index.mjs | 5 +-
designs/trayvon/tests/shared.test.mjs | 4 +-
designs/tristan/README.md | 63 +-
designs/tristan/about.json | 17 +
designs/tristan/build.mjs | 35 -
designs/tristan/data.mjs | 4 -
designs/tristan/i18n/de.json | 182 -
designs/tristan/i18n/es.json | 182 -
designs/tristan/i18n/fr.json | 182 -
designs/tristan/i18n/index.mjs | 7 +-
designs/tristan/i18n/nl.json | 182 -
designs/tristan/i18n/uk.json | 182 -
designs/tristan/package.json | 33 +-
designs/tristan/src/index.mjs | 7 +-
designs/tristan/tests/shared.test.mjs | 4 +-
designs/uma/CHANGELOG.md | 10 +
designs/uma/README.md | 63 +-
designs/uma/about.json | 18 +
designs/uma/build.mjs | 35 -
designs/uma/data.mjs | 4 -
designs/uma/i18n/de.json | 56 -
designs/uma/i18n/es.json | 56 -
designs/uma/i18n/fr.json | 56 -
designs/uma/i18n/index.mjs | 7 +-
designs/uma/i18n/nl.json | 56 -
designs/uma/i18n/uk.json | 56 -
designs/uma/package.json | 33 +-
designs/uma/src/index.mjs | 19 +-
designs/uma/tests/shared.test.mjs | 4 +-
designs/umbra/README.md | 63 +-
designs/umbra/about.json | 24 +
designs/umbra/build.mjs | 35 -
designs/umbra/data.mjs | 4 -
designs/umbra/i18n/de.json | 56 -
designs/umbra/i18n/es.json | 56 -
designs/umbra/i18n/fr.json | 56 -
designs/umbra/i18n/index.mjs | 7 +-
designs/umbra/i18n/nl.json | 56 -
designs/umbra/i18n/uk.json | 56 -
designs/umbra/package.json | 33 +-
designs/umbra/src/index.mjs | 15 +-
designs/umbra/tests/shared.test.mjs | 4 +-
designs/wahid/CHANGELOG.md | 6 +
designs/wahid/README.md | 63 +-
designs/wahid/about.json | 21 +
designs/wahid/build.mjs | 35 -
designs/wahid/data.mjs | 4 -
designs/wahid/i18n/de.json | 73 -
designs/wahid/i18n/es.json | 73 -
designs/wahid/i18n/fr.json | 73 -
designs/wahid/i18n/index.mjs | 7 +-
designs/wahid/i18n/nl.json | 73 -
designs/wahid/i18n/uk.json | 89 -
designs/wahid/package.json | 37 +-
designs/wahid/src/index.mjs | 5 +-
designs/wahid/tests/shared.test.mjs | 4 +-
designs/walburga/README.md | 63 +-
designs/walburga/about.json | 17 +
designs/walburga/build.mjs | 35 -
designs/walburga/data.mjs | 4 -
designs/walburga/i18n/de.json | 35 -
designs/walburga/i18n/es.json | 35 -
designs/walburga/i18n/fr.json | 35 -
designs/walburga/i18n/index.mjs | 7 +-
designs/walburga/i18n/nl.json | 35 -
designs/walburga/i18n/uk.json | 36 -
designs/walburga/package.json | 33 +-
designs/walburga/src/index.mjs | 6 +-
designs/walburga/tests/shared.test.mjs | 4 +-
designs/waralee/README.md | 63 +-
designs/waralee/about.json | 19 +
designs/waralee/build.mjs | 35 -
designs/waralee/data.mjs | 4 -
designs/waralee/i18n/de.json | 167 -
designs/waralee/i18n/es.json | 167 -
designs/waralee/i18n/fr.json | 167 -
designs/waralee/i18n/index.mjs | 7 +-
designs/waralee/i18n/nl.json | 167 -
designs/waralee/i18n/uk.json | 167 -
designs/waralee/package.json | 33 +-
designs/waralee/src/index.mjs | 5 +-
designs/waralee/tests/shared.test.mjs | 4 +-
designs/yuri/README.md | 63 +-
designs/yuri/about.json | 19 +
designs/yuri/build.mjs | 35 -
designs/yuri/data.mjs | 4 -
designs/yuri/i18n/de.json | 14 -
designs/yuri/i18n/es.json | 14 -
designs/yuri/i18n/fr.json | 14 -
designs/yuri/i18n/index.mjs | 7 +-
designs/yuri/i18n/nl.json | 14 -
designs/yuri/i18n/uk.json | 19 -
designs/yuri/package.json | 37 +-
designs/yuri/src/back.mjs | 6 +-
designs/yuri/src/front.mjs | 6 +-
designs/yuri/src/index.mjs | 6 +-
designs/yuri/tests/shared.test.mjs | 4 +-
i18n/designs.mjs | 2 +
lerna.json | 4 +-
nx.json | 74 +-
package-lock.json | 70333 ++++++++++++++++
package.json | 40 +-
packages/collection/CHANGELOG.md | 23 +
packages/collection/README.md | 143 +
packages/collection/package.json | 112 +
.../collection/src}/examples.mjs | 17 +-
packages/collection/src/i18n.mjs | 125 +
packages/collection/src/index.mjs | 187 +
packages/config/CHANGELOG.md | 23 +
packages/config/README.md | 143 +
packages/config/package.json | 47 +
packages/config/src/apikeys.mjs | 11 +
packages/config/src/cloudflare.mjs | 6 +
packages/config/src/control.mjs | 169 +
packages/config/src/index.mjs | 26 +
{config => packages/config/src}/logo.mjs | 5 +
.../config/src}/measurements.mjs | 0
{config => packages/config/src}/roles.mjs | 2 +
.../config/src/sewing.mjs | 0
packages/config/src/urls.mjs | 24 +
packages/config/src/wot.mjs | 31 +
packages/core/CHANGELOG.md | 16 +
packages/core/README.md | 63 +-
packages/core/about.json | 20 +
packages/core/build.mjs | 35 -
packages/core/data.mjs | 4 -
packages/core/package.json | 29 +-
packages/core/src/index.mjs | 4 +-
packages/core/src/pattern/index.mjs | 2 +-
packages/core/src/svg.mjs | 2 +-
packages/i18n/CHANGELOG.md | 228 +
packages/i18n/README.md | 143 +
packages/i18n/package.json | 51 +
packages/i18n/src/flags.mjs | 26 +
packages/i18n/src/index.mjs | 4 +
packages/i18n/src/measurements.mjs | 40 +
packages/models/README.md | 63 +-
packages/models/build.mjs | 35 -
packages/models/data.mjs | 4 -
packages/models/package.json | 27 +-
packages/models/src/index.mjs | 2 +-
packages/new-design/CHANGELOG.md | 33 -
packages/new-design/README.md | 162 -
packages/new-design/build.mjs | 45 -
packages/new-design/data.mjs | 4 -
packages/new-design/i18n/de.json | 34 -
packages/new-design/i18n/en.json | 34 -
packages/new-design/i18n/es.json | 34 -
packages/new-design/i18n/fr.json | 34 -
packages/new-design/i18n/nl.json | 34 -
packages/new-design/i18n/uk.json | 34 -
packages/new-design/index.mjs | 18 -
packages/new-design/lib/config.mjs | 113 -
packages/new-design/lib/download-list.mjs | 735 -
packages/new-design/lib/utils.mjs | 316 -
packages/new-design/package.json | 68 -
packages/prettier-config/README.md | 63 +-
packages/prettier-config/data.mjs | 4 -
packages/prettier-config/package.json | 13 +-
packages/react-components/CHANGELOG.md | 23 -
packages/react-components/README.md | 162 -
packages/react-components/build.mjs | 36 -
packages/react-components/data.mjs | 4 -
packages/react-components/package.json | 68 -
.../src/editor/components/view-wrapper.mjs | 137 -
packages/react-components/src/editor/en.yaml | 290 -
.../react-components/src/editor/index.mjs | 89 -
packages/react-components/src/editor/nl.yaml | 23 -
packages/react-components/src/editor/props.md | 26 -
.../editor/swizzle/components/accordion.mjs | 64 -
.../swizzle/components/aside-view-menu.mjs | 122 -
.../swizzle/components/auth-wrapper.mjs | 210 -
.../swizzle/components/curated-sets.mjs | 37 -
.../swizzle/components/designs-view.mjs | 28 -
.../editor/swizzle/components/draft-view.mjs | 67 -
.../editor/swizzle/components/dynamic-mdx.mjs | 12 -
.../editor/swizzle/components/error-view.mjs | 23 -
.../src/editor/swizzle/components/flags.mjs | 103 -
.../editor/swizzle/components/header-menu.mjs | 525 -
.../editor/swizzle/components/html-span.mjs | 1 -
.../src/editor/swizzle/components/icons.mjs | 1135 -
.../src/editor/swizzle/components/index.mjs | 659 -
.../src/editor/swizzle/components/inputs.mjs | 349 -
.../swizzle/components/large-screen-only.mjs | 1 -
.../src/editor/swizzle/components/link.mjs | 48 -
.../src/editor/swizzle/components/loaders.mjs | 6 -
.../swizzle/components/loading-status.mjs | 57 -
.../editor/swizzle/components/markdown.mjs | 3 -
.../components/measurements-editor.mjs | 57 -
.../components/measurements-set-card.mjs | 94 -
.../swizzle/components/measurements-view.mjs | 171 -
.../swizzle/components/menus/containers.mjs | 272 -
.../components/menus/core-settings-menu.mjs | 135 -
.../components/menus/design-options-menu.mjs | 112 -
.../swizzle/components/menus/draft-menu.mjs | 52 -
.../components/menus/shared-inputs.mjs | 459 -
.../components/menus/shared-values.mjs | 142 -
.../components/menus/ui-preferences-menu.mjs | 60 -
.../src/editor/swizzle/components/null.mjs | 5 -
.../swizzle/components/pattern-layout.mjs | 34 -
.../src/editor/swizzle/components/popout.mjs | 102 -
.../editor/swizzle/components/save-view.mjs | 214 -
.../src/editor/swizzle/components/sets.mjs | 225 -
.../src/editor/swizzle/components/spinner.mjs | 21 -
.../src/editor/swizzle/components/tabs.mjs | 66 -
.../src/editor/swizzle/components/tooltip.mjs | 13 -
.../editor/swizzle/components/undos-view.mjs | 144 -
.../src/editor/swizzle/components/ux.mjs | 12 -
.../editor/swizzle/components/view-picker.mjs | 111 -
.../swizzle/components/zoomable-pattern.mjs | 88 -
.../src/editor/swizzle/config.mjs | 198 -
.../src/editor/swizzle/hooks/index.mjs | 73 -
.../src/editor/swizzle/hooks/use-account.mjs | 59 -
.../src/editor/swizzle/hooks/use-backend.mjs | 633 -
.../editor/swizzle/hooks/use-editor-state.mjs | 120 -
.../editor/swizzle/methods/core-settings.mjs | 149 -
.../editor/swizzle/methods/design-options.mjs | 87 -
.../src/editor/swizzle/methods/editor.mjs | 720 -
.../src/editor/swizzle/methods/formatting.mjs | 245 -
.../src/editor/swizzle/methods/index.mjs | 240 -
.../editor/swizzle/methods/measurements.mjs | 84 -
.../editor/swizzle/methods/ui-preferences.mjs | 60 -
.../react-components/src/editor/utils.mjs | 4 -
packages/react-components/src/index.mjs | 51 -
.../src/linedrawings/aaron.mjs | 99 -
.../src/linedrawings/albert.mjs | 99 -
.../react-components/src/linedrawings/bee.mjs | 58 -
.../src/linedrawings/bella.mjs | 99 -
.../src/linedrawings/benjamin.mjs | 54 -
.../src/linedrawings/bent.mjs | 99 -
.../src/linedrawings/bibi.mjs | 99 -
.../react-components/src/linedrawings/bob.mjs | 89 -
.../src/linedrawings/breanna.mjs | 99 -
.../src/linedrawings/brian.mjs | 99 -
.../src/linedrawings/bruce.mjs | 99 -
.../src/linedrawings/carlita.mjs | 375 -
.../src/linedrawings/carlton.mjs | 357 -
.../src/linedrawings/cathrin.mjs | 752 -
.../src/linedrawings/charlie.mjs | 285 -
.../src/linedrawings/cornelius.mjs | 480 -
.../src/linedrawings/diana.mjs | 99 -
.../src/linedrawings/florence.mjs | 58 -
.../src/linedrawings/florent.mjs | 103 -
.../src/linedrawings/gozer.mjs | 181 -
.../react-components/src/linedrawings/hi.mjs | 122 -
.../src/linedrawings/holmes.mjs | 157 -
.../src/linedrawings/hortensia.mjs | 53 -
.../src/linedrawings/huey.mjs | 99 -
.../src/linedrawings/hugo.mjs | 99 -
.../src/linedrawings/index.mjs | 143 -
.../src/linedrawings/lucy.mjs | 80 -
.../src/linedrawings/lumina.mjs | 161 -
.../src/linedrawings/lumira.mjs | 179 -
.../src/linedrawings/lunetius.mjs | 58 -
.../src/linedrawings/noble.mjs | 99 -
.../src/linedrawings/shared.mjs | 51 -
.../src/linedrawings/simon.mjs | 140 -
.../src/linedrawings/teagan.mjs | 99 -
.../src/linedrawings/tristan.mjs | 89 -
.../react-components/src/linedrawings/uma.mjs | 89 -
.../src/linedrawings/umbra.mjs | 170 -
.../src/linedrawings/wahid.mjs | 117 -
.../src/pattern-xray/index.mjs | 72 -
.../src/pattern-xray/path.mjs | 46 -
.../src/pattern-xray/point.mjs | 21 -
.../react-components/src/pattern/index.mjs | 90 -
.../react-components/src/pattern/path.mjs | 23 -
.../react-components/src/pattern/point.mjs | 22 -
.../react-components/src/pattern/stack.mjs | 17 -
.../react-components/src/pattern/text.mjs | 56 -
.../react-components/src/pattern/utils.mjs | 79 -
packages/react-components/src/popout.mjs | 8 -
packages/react-components/src/utils.mjs | 37 -
packages/react/CHANGELOG.md | 23 +
packages/react/README.md | 143 +
packages/react/components/Account/Apikeys.mjs | 350 +
packages/react/components/Account/Avatar.mjs | 111 +
packages/react/components/Account/Bio.mjs | 92 +
.../react/components/Account/Bookmarks.mjs | 316 +
packages/react/components/Account/Compare.mjs | 120 +
packages/react/components/Account/Consent.mjs | 206 +
packages/react/components/Account/Control.mjs | 94 +
packages/react/components/Account/Email.mjs | 159 +
packages/react/components/Account/Export.mjs | 53 +
packages/react/components/Account/Github.mjs | 64 +
packages/react/components/Account/Id.mjs | 22 +
packages/react/components/Account/Import.mjs | 101 +
.../react/components/Account/Instagram.mjs | 64 +
packages/react/components/Account/Links.mjs | 365 +
packages/react/components/Account/Mfa.mjs | 224 +
.../react/components/Account/Newsletter.mjs | 130 +
.../react/components/Account/Password.mjs | 78 +
packages/react/components/Account/Pattern.mjs | 404 +
.../react/components/Account/Patterns.mjs | 183 +
.../react/components/Account/Platform.mjs | 78 +
packages/react/components/Account/Reload.mjs | 50 +
packages/react/components/Account/Remove.mjs | 81 +
.../react/components/Account/Restrict.mjs | 98 +
packages/react/components/Account/Role.mjs | 12 +
packages/react/components/Account/Set.mjs | 921 +
packages/react/components/Account/Sets.mjs | 285 +
packages/react/components/Account/Status.mjs | 16 +
packages/react/components/Account/Units.mjs | 103 +
.../react/components/Account/Username.mjs | 122 +
packages/react/components/Account/index.mjs | 71 +
packages/react/components/Account/shared.mjs | 87 +
packages/react/components/Admin/index.mjs | 347 +
.../react/components/Breadcrumbs/index.mjs | 45 +
packages/react/components/Button/index.mjs | 34 +
.../react/components/Collection/index.mjs | 952 +
packages/react/components/Control/index.mjs | 16 +
.../CopyToClipboardButton/index.mjs | 48 +
packages/react/components/Design/index.mjs | 139 +
.../react/components/DiffViewer/index.mjs | 8 +
.../react/components/Docusaurus/index.mjs | 147 +
packages/react/components/Echart/index.mjs | 21 +
.../Editor/components/Accordion.mjs | 67 +
.../Editor/components/AsideViewMenu.mjs | 115 +
.../components/Editor/components/Flag.mjs | 149 +
.../Editor/components/HeaderMenu.mjs | 715 +
.../components/Editor/components/HtmlSpan.mjs | 3 +
.../Editor/components/LoadingStatus.mjs | 77 +
.../Editor/components/MeasurementsEditor.mjs | 59 +
.../Editor/components/MovablePattern.mjs | 488 +
.../Editor/components/PatternLayout.mjs | 58 +
.../components/Editor/components/Set.mjs | 265 +
.../components/Editor/components/Tooltip.mjs | 15 +
.../Editor/components/ZoomablePattern.mjs | 110 +
.../Editor/components/menus/Container.mjs | 362 +
.../components/menus/CoreSettingsMenu.mjs | 148 +
.../components/menus/DesignOptionsMenu.mjs | 130 +
.../Editor/components/menus/DraftMenu.mjs | 58 +
.../Editor/components/menus/Input.mjs | 482 +
.../Editor/components/menus/LayoutMenu.mjs | 123 +
.../Editor/components/menus/TestMenu.mjs | 105 +
.../components/menus/UiPreferencesMenu.mjs | 56 +
.../Editor/components/menus/Value.mjs | 171 +
.../Editor/components/views/DesignsView.mjs | 22 +
.../Editor/components/views/DocsView.mjs | 51 +
.../Editor/components/views/DraftView.mjs | 81 +
.../components/views/EditSettingsView.mjs | 146 +
.../Editor/components/views/ExportView.mjs | 162 +
.../Editor/components/views/InspectView.mjs | 78 +
.../Editor/components/views/LayoutView.mjs | 40 +
.../Editor/components/views/LogView.mjs | 64 +
.../components/views/MeasurementsView.mjs | 268 +
.../Editor/components/views/SaveView.mjs | 181 +
.../Editor/components/views/TestView.mjs | 206 +
.../Editor/components/views/TimingView.mjs | 148 +
.../Editor/components/views/UndosView.mjs | 140 +
.../Editor/components/views/ViewPicker.mjs | 114 +
.../Editor/components/views/index.mjs | 144 +
.../react/components/Editor/config/index.mjs | 153 +
.../Editor/hooks/useEditorState.mjs | 86 +
packages/react/components/Editor/index.mjs | 205 +
.../components/Editor/lib/core-settings.mjs | 248 +
.../components/Editor/lib/design-options.mjs | 129 +
.../react/components/Editor/lib/editor.mjs | 783 +
.../Editor/lib/export}/export-worker.js | 18 +-
.../components/Editor/lib/export/index.mjs | 203 +
.../Editor/lib/export}/pdf-maker.mjs | 2 +-
.../components/Editor/lib/export/pdf.mjs | 59 +
.../Editor/lib/export/plugin-tiler.mjs | 432 +
.../Editor/lib/export}/single-pdf-maker.mjs | 0
.../components/Editor/lib/formatting.mjs | 229 +
.../react/components/Editor/lib/index.mjs | 123 +
.../components/Editor/lib/layout-settings.mjs | 116 +
.../components/Editor/lib/measurements.mjs | 36 +
.../components/Editor/lib/ui-preferences.mjs | 119 +
packages/react/components/Heading/index.mjs | 37 +
packages/react/components/Highlight/index.mjs | 56 +
packages/react/components/Icon/index.mjs | 842 +
packages/react/components/Input/index.mjs | 735 +
packages/react/components/Json/index.mjs | 11 +
packages/react/components/KeyVal/index.mjs | 147 +
packages/react/components/Layout/index.mjs | 102 +
.../react/components/LineDrawing/aaron.mjs | 94 +
.../react/components/LineDrawing/albert.mjs | 94 +
packages/react/components/LineDrawing/bee.mjs | 49 +
.../react/components/LineDrawing/bella.mjs | 98 +
.../react/components/LineDrawing/benjamin.mjs | 45 +
.../react/components/LineDrawing/bent.mjs | 98 +
.../react/components/LineDrawing/bibi.mjs | 98 +
packages/react/components/LineDrawing/bob.mjs | 88 +
.../react/components/LineDrawing/breanna.mjs | 100 +
.../react/components/LineDrawing/brian.mjs | 98 +
.../react/components/LineDrawing/bruce.mjs | 100 +
.../react/components/LineDrawing/carlita.mjs | 374 +
.../react/components/LineDrawing/carlton.mjs | 356 +
.../react/components/LineDrawing/cathrin.mjs | 751 +
.../react/components/LineDrawing/charlie.mjs | 284 +
.../components/LineDrawing/cornelius.mjs | 479 +
.../react/components/LineDrawing/diana.mjs | 98 +
.../react/components/LineDrawing/florence.mjs | 47 +
.../react/components/LineDrawing/florent.mjs | 92 +
.../react/components/LineDrawing/gozer.mjs | 180 +
packages/react/components/LineDrawing/hi.mjs | 111 +
.../react/components/LineDrawing/holmes.mjs | 146 +
.../components/LineDrawing/hortensia.mjs | 42 +
.../react/components/LineDrawing/huey.mjs | 98 +
.../react/components/LineDrawing/hugo.mjs | 98 +
.../react/components/LineDrawing/index.mjs | 304 +
.../react/components/LineDrawing/lucy.mjs | 69 +
.../react/components/LineDrawing/lumina.mjs | 160 +
.../react/components/LineDrawing/lumira.mjs | 178 +
.../react/components/LineDrawing/lunetius.mjs | 47 +
.../react/components/LineDrawing/missing.mjs | 30 +
.../react/components/LineDrawing/noble.mjs | 98 +
.../react/components/LineDrawing/shared.mjs | 51 +
.../react/components/LineDrawing/simon.mjs | 139 +
.../react/components/LineDrawing/teagan.mjs | 98 +
.../react/components/LineDrawing/tristan.mjs | 88 +
packages/react/components/LineDrawing/uma.mjs | 88 +
.../react/components/LineDrawing/umbra.mjs | 169 +
.../react/components/LineDrawing/wahid.mjs | 119 +
packages/react/components/Link/index.mjs | 82 +
packages/react/components/Logo/index.mjs | 30 +
packages/react/components/Markdown/index.mjs | 4 +
packages/react/components/Mini/index.mjs | 35 +
packages/react/components/Modal/index.mjs | 96 +
packages/react/components/New/NewLinks.mjs | 92 +
packages/react/components/New/index.mjs | 3 +
.../react/components/Newsletter/index.mjs | 120 +
packages/react/components/Null/index.mjs | 6 +
packages/react/components/Number/index.mjs | 11 +
packages/react/components/Patrons/index.mjs | 309 +
.../components/Pattern}/circle.mjs | 2 -
.../components/Pattern}/defs.mjs | 1 -
.../components/Pattern}/grid.mjs | 0
.../components/Pattern}/group.mjs | 0
packages/react/components/Pattern/index.mjs | 104 +
.../components/Pattern}/part.mjs | 13 +-
packages/react/components/Pattern/path.mjs | 22 +
packages/react/components/Pattern/point.mjs | 23 +
.../components/Pattern}/snippet.mjs | 0
packages/react/components/Pattern/stack.mjs | 15 +
.../components/Pattern}/svg.mjs | 1 -
packages/react/components/Pattern/text.mjs | 55 +
packages/react/components/Pattern/utils.mjs | 82 +
packages/react/components/Popout/index.mjs | 108 +
packages/react/components/Profile/index.mjs | 120 +
packages/react/components/Role/index.mjs | 276 +
packages/react/components/SignIn/index.mjs | 430 +
packages/react/components/SignUp/index.mjs | 247 +
packages/react/components/Spinner/index.mjs | 27 +
packages/react/components/Stats/index.mjs | 165 +
packages/react/components/Tab/index.mjs | 81 +
packages/react/components/Table/index.mjs | 9 +
packages/react/components/Time/index.mjs | 58 +
packages/react/components/Uuid/index.mjs | 34 +
packages/react/components/Ux/index.mjs | 21 +
packages/react/components/Xray/index.mjs | 67 +
packages/react/components/Xray/path.mjs | 226 +
packages/react/components/Xray/point.mjs | 108 +
packages/react/components/Yaml/index.mjs | 20 +
packages/react/config/freesewing/index.mjs | 167 +
.../react/context/LoadingStatus/index.mjs | 122 +
packages/react/context/Modal/index.mjs | 33 +
packages/react/hooks/useAccount/index.mjs | 103 +
packages/react/hooks/useBackend/index.mjs | 830 +
packages/react/hooks/useControl/index.mjs | 46 +
packages/react/hooks/useDesign/index.mjs | 125 +
.../hooks/useDesignTranslation/index.mjs | 122 +
packages/react/hooks/useSelection/index.mjs | 40 +
packages/react/hooks/useStateObject/index.mjs | 48 +
packages/react/lib/RestClient/index.mjs | 136 +
packages/react/lib/collection/index.mjs | 121 +
packages/react/lib/force-tailwind.mjs | 14 +
packages/react/package.json | 133 +
packages/rehype-highlight-lines/CHANGELOG.md | 17 -
packages/rehype-highlight-lines/README.md | 162 -
packages/rehype-highlight-lines/data.mjs | 4 -
packages/rehype-highlight-lines/package.json | 52 -
packages/rehype-highlight-lines/src/index.mjs | 155 -
packages/rehype-jargon/CHANGELOG.md | 17 -
packages/rehype-jargon/README.md | 288 -
packages/rehype-jargon/build.mjs | 49 -
packages/rehype-jargon/data.mjs | 4 -
packages/rehype-jargon/example.png | Bin 57644 -> 0 bytes
packages/rehype-jargon/info.md | 126 -
packages/rehype-jargon/package.json | 59 -
packages/rehype-jargon/src/index.mjs | 46 -
packages/snapseries/README.md | 63 +-
packages/snapseries/build.mjs | 35 -
packages/snapseries/data.mjs | 4 -
packages/snapseries/package.json | 27 +-
packages/studio/CHANGELOG.md | 23 +
packages/studio/README.md | 143 +
packages/studio/index.mjs | 17 +
packages/studio/lib/banner.mjs | 74 +
packages/{new-design => studio}/lib/cli.mjs | 0
packages/studio/lib/config.mjs | 10 +
packages/studio/lib/utils.mjs | 264 +
packages/studio/package.json | 52 +
packages/{new-design => studio}/prebuild.mjs | 0
packages/studio/template/.gitignore | 2 +
.../designs/.base/about.json.mustache | 11 +
.../designs/.base/i18n/en.json.mustache | 9 +
.../template/designs/.base/i18n/index.mjs | 3 +
.../designs/.base/src/box.mjs.mustache | 47 +
.../designs/.base/src/index.mjs.mustache | 13 +
.../designs/.bella/about.json.mustache | 11 +
.../designs/.bella/i18n/en.json.mustache | 10 +
.../template/designs/.bella/i18n/index.mjs | 3 +
.../designs/.bella/src/back.mjs.mustache | 11 +
.../designs/.bella/src/front.mjs.mustache | 12 +
.../designs/.bella/src/index.mjs.mustache | 18 +
.../designs/.bent/about.json.mustache | 11 +
.../designs/.bent/i18n/en.json.mustache | 12 +
.../template/designs/.bent/i18n/index.mjs | 3 +
.../designs/.bent/src/back.mjs.mustache | 11 +
.../designs/.bent/src/front.mjs.mustache | 12 +
.../designs/.bent/src/index.mjs.mustache | 20 +
.../designs/.bent/src/topsleeve.mjs.mustache | 12 +
.../.bent/src/undersleeve.mjs.mustache | 12 +
.../designs/.breanna/about.json.mustache | 11 +
.../designs/.breanna/i18n/en.json.mustache | 11 +
.../template/designs/.breanna/i18n/index.mjs | 3 +
.../designs/.breanna/src/back.mjs.mustache | 11 +
.../designs/.breanna/src/front.mjs.mustache | 12 +
.../designs/.breanna/src/index.mjs.mustache | 19 +
.../designs/.breanna/src/sleeve.mjs.mustache | 12 +
.../designs/.brian/about.json.mustache | 11 +
.../designs/.brian/i18n/en.json.mustache | 12 +
.../template/designs/.brian/i18n/index.mjs | 3 +
.../designs/.brian/src/back.mjs.mustache | 11 +
.../designs/.brian/src/front.mjs.mustache | 12 +
.../designs/.brian/src/index.mjs.mustache | 19 +
.../designs/.brian/src/sleeve.mjs.mustache | 12 +
.../designs/.titan/about.json.mustache | 11 +
.../designs/.titan/i18n/en.json.mustache | 10 +
.../template/designs/.titan/i18n/index.mjs | 3 +
.../designs/.titan/src/back.mjs.mustache | 11 +
.../designs/.titan/src/front.mjs.mustache | 12 +
.../designs/.titan/src/index.mjs.mustache | 18 +
.../docs/account/about/avatar/index.mdx | 14 +
.../template/docs/account/about/bio/index.mdx | 14 +
.../docs/account/about/email/index.mdx | 14 +
.../template/docs/account/about/index.mdx | 32 +
.../docs/account/about/username/index.mdx | 14 +
.../docs/account/actions/import/index.mdx | 24 +
.../template/docs/account/actions/index.mdx | 4 +
.../docs/account/actions/reload/index.mdx | 14 +
.../docs/account/actions/remove/index.mdx | 15 +
.../docs/account/actions/restrict/index.mdx | 15 +
.../docs/account/data/bookmarks/index.mdx | 15 +
.../template/docs/account/data/index.mdx | 28 +
.../docs/account/data/patterns/index.mdx | 15 +
.../docs/account/data/patterns/pattern.mdx | 17 +
.../template/docs/account/data/sets/index.mdx | 15 +
.../template/docs/account/data/sets/set.mdx | 16 +
.../studio/template/docs/account/index.mdx | 12 +
.../account/preferences/compare/index.mdx | 13 +
.../account/preferences/consent/index.mdx | 14 +
.../account/preferences/control/index.mdx | 13 +
.../docs/account/preferences/index.mdx | 12 +
.../account/preferences/newsletter/index.mdx | 14 +
.../docs/account/preferences/units/index.mdx | 14 +
.../docs/account/security/apikeys/index.mdx | 15 +
.../template/docs/account/security/index.mdx | 4 +
.../docs/account/security/mfa/index.mdx | 14 +
.../docs/account/security/password/index.mdx | 14 +
.../docs/account/social/github/index.mdx | 14 +
.../template/docs/account/social/index.mdx | 53 +
.../docs/account/social/instagram/index.mdx | 14 +
.../docs/account/social/mastodon/index.mdx | 14 +
.../docs/account/social/reddit/index.mdx | 14 +
.../docs/account/social/tiktok/index.mdx | 14 +
.../docs/account/social/twitch/index.mdx | 14 +
.../docs/account/social/website/index.mdx | 14 +
packages/studio/template/docs/add.mdx | 13 +
packages/studio/template/docs/collection.mdx | 8 +
packages/studio/template/docs/local.mdx | 16 +
packages/studio/template/docs/support.mdx | 32 +
.../studio/template/docusaurus.config.mjs | 140 +
packages/studio/template/package.json | 67 +
.../studio/template/scripts/add-design.mjs | 5 +
packages/studio/template/scripts/lib.mjs | 150 +
packages/studio/template/scripts/prebuild.mjs | 3 +
packages/studio/template/sidebars.js | 10 +
.../template/src/components/bare-layout.mjs | 46 +
.../studio/template/src/css}/code.css | 0
packages/studio/template/src/css/custom.css | 307 +
packages/studio/template/src/css/patterns.css | 560 +
.../studio/template/src/local-designs.mjs | 5 +
packages/studio/template/src/pages/editor.js | 27 +
packages/studio/template/src/pages/index.js | 92 +
.../template}/src/theme/MDXComponents/A.js | 0
.../template}/src/theme/MDXComponents/Code.js | 0
.../src/theme/MDXComponents/Details.js | 0
.../src/theme/MDXComponents/Heading.js | 0
.../src/theme/MDXComponents/Img/index.js | 0
.../theme/MDXComponents/Img/styles.module.css | 0
.../template}/src/theme/MDXComponents/Li.js | 0
.../template}/src/theme/MDXComponents/Pre.js | 0
.../src/theme/MDXComponents/Ul/index.js | 0
.../theme/MDXComponents/Ul/styles.module.css | 0
.../template/src/theme/MDXComponents/index.js | 41 +
.../src/theme/NavbarItem/ComponentTypes.js | 9 +
.../studio/template}/static/favicon.ico | Bin
.../studio/template}/static/img/favicon.ico | Bin
.../static/img/freesewing-social-card.png | Bin
.../template/static/img/lineup-backdrop.svg | 54 +
.../template}/static/img/logo-white.svg | 0
.../studio/template}/static/img/logo.svg | 0
packages/studio/template/tailwind-force.html | 66 +
packages/studio/template/tailwind.config.mjs | 30 +
packages/studio/template/themes/dark.mjs | 70 +
packages/studio/template/themes/index.mjs | 4 +
packages/studio/template/themes/light.mjs | 262 +
packages/utils/CHANGELOG.md | 144 +
packages/utils/README.md | 143 +
packages/utils/package.json | 47 +
packages/utils/src/index.mjs | 691 +
packages/utils/src/loading-messages.mjs | 27 +
plugins/core-plugins/README.md | 63 +-
plugins/core-plugins/about.json | 4 +
plugins/core-plugins/build.mjs | 45 -
plugins/core-plugins/package.json | 44 +-
plugins/core-plugins/src/index.mjs | 20 +-
plugins/plugin-annotations/README.md | 63 +-
plugins/plugin-annotations/about.json | 4 +
plugins/plugin-annotations/build.mjs | 35 -
plugins/plugin-annotations/i18n/en.json | 49 +-
plugins/plugin-annotations/i18n/index.mjs | 7 +-
plugins/plugin-annotations/package.json | 29 +-
plugins/plugin-annotations/src/index.mjs | 5 +-
plugins/plugin-annotations/src/logo.mjs | 3 +-
plugins/plugin-bin-pack/README.md | 63 +-
plugins/plugin-bin-pack/about.json | 4 +
plugins/plugin-bin-pack/build.mjs | 35 -
plugins/plugin-bin-pack/package.json | 29 +-
plugins/plugin-bin-pack/src/index.mjs | 5 +-
plugins/plugin-bust/CHANGELOG.md | 12 +
plugins/plugin-bust/README.md | 63 +-
plugins/plugin-bust/about.json | 4 +
plugins/plugin-bust/build.mjs | 35 -
plugins/plugin-bust/package.json | 29 +-
plugins/plugin-bust/src/index.mjs | 5 +-
plugins/plugin-flip/README.md | 63 +-
plugins/plugin-flip/about.json | 4 +
plugins/plugin-flip/build.mjs | 35 -
plugins/plugin-flip/package.json | 29 +-
plugins/plugin-flip/src/index.mjs | 5 +-
plugins/plugin-gore/README.md | 63 +-
plugins/plugin-gore/about.json | 4 +
plugins/plugin-gore/build.mjs | 35 -
plugins/plugin-gore/package.json | 29 +-
plugins/plugin-gore/src/index.mjs | 5 +-
plugins/plugin-i18n/README.md | 63 +-
plugins/plugin-i18n/about.json | 4 +
plugins/plugin-i18n/build.mjs | 35 -
plugins/plugin-i18n/package.json | 29 +-
plugins/plugin-i18n/src/index.mjs | 9 +-
plugins/plugin-measurements/README.md | 63 +-
plugins/plugin-measurements/about.json | 4 +
plugins/plugin-measurements/build.mjs | 35 -
plugins/plugin-measurements/package.json | 29 +-
plugins/plugin-measurements/src/index.mjs | 5 +-
plugins/plugin-mirror/README.md | 63 +-
plugins/plugin-mirror/about.json | 4 +
plugins/plugin-mirror/build.mjs | 35 -
plugins/plugin-mirror/package.json | 29 +-
plugins/plugin-mirror/src/index.mjs | 5 +-
plugins/plugin-ringsector/README.md | 63 +-
plugins/plugin-ringsector/about.json | 4 +
plugins/plugin-ringsector/build.mjs | 35 -
plugins/plugin-ringsector/package.json | 29 +-
plugins/plugin-ringsector/src/index.mjs | 5 +-
plugins/plugin-round/README.md | 63 +-
plugins/plugin-round/about.json | 4 +
plugins/plugin-round/build.mjs | 35 -
plugins/plugin-round/package.json | 29 +-
plugins/plugin-round/src/index.mjs | 5 +-
plugins/plugin-sprinkle/README.md | 63 +-
plugins/plugin-sprinkle/about.json | 4 +
plugins/plugin-sprinkle/build.mjs | 35 -
plugins/plugin-sprinkle/package.json | 29 +-
plugins/plugin-sprinkle/src/index.mjs | 5 +-
plugins/plugin-svgattr/README.md | 63 +-
plugins/plugin-svgattr/about.json | 4 +
plugins/plugin-svgattr/build.mjs | 35 -
plugins/plugin-svgattr/package.json | 29 +-
plugins/plugin-svgattr/src/index.mjs | 5 +-
plugins/plugin-theme/README.md | 63 +-
plugins/plugin-theme/about.json | 4 +
plugins/plugin-theme/build.mjs | 35 -
plugins/plugin-theme/package.json | 29 +-
plugins/plugin-theme/src/index.mjs | 5 +-
plugins/plugin-timing/README.md | 63 +-
plugins/plugin-timing/about.json | 4 +
plugins/plugin-timing/build.mjs | 35 -
plugins/plugin-timing/package.json | 29 +-
plugins/plugin-timing/src/index.mjs | 5 +-
plugins/plugin-versionfree-svg/README.md | 63 +-
plugins/plugin-versionfree-svg/about.json | 4 +
plugins/plugin-versionfree-svg/build.mjs | 35 -
plugins/plugin-versionfree-svg/package.json | 29 +-
plugins/plugin-versionfree-svg/src/index.mjs | 5 +-
scripts/add-software.mjs | 16 +-
scripts/help.mjs | 19 +-
scripts/newsletter-lib.mjs | 40 +-
scripts/reconfigure.mjs | 80 +-
scripts/reversion.mjs | 29 +
scripts/sync-dependencies.mjs | 61 -
scripts/workbenches.js | 26 -
scripts/yarn.lock | 955 -
sites/backend/package.json | 6 +-
sites/backend/src/config.mjs | 104 +-
sites/backend/src/controllers/info.mjs | 4 +-
sites/backend/src/controllers/oidc.mjs | 92 +
sites/backend/src/controllers/subscribers.mjs | 19 +
sites/backend/src/index.mjs | 8 +
sites/backend/src/models/subscriber.mjs | 36 +-
sites/backend/src/routes/index.mjs | 2 +
sites/backend/src/routes/oidc.mjs | 13 +
sites/backend/src/routes/subscribers.mjs | 5 +-
sites/backend/src/templates/email/de.json | 10 -
sites/backend/src/templates/email/de.yaml | 9 -
.../src/templates/email/emailchange.mjs | 21 +
.../src/templates/email/emailchange/de.json | 8 -
.../src/templates/email/emailchange/de.yaml | 6 -
.../src/templates/email/emailchange/en.json | 8 -
.../src/templates/email/emailchange/en.yaml | 6 -
.../src/templates/email/emailchange/es.json | 8 -
.../src/templates/email/emailchange/es.yaml | 6 -
.../src/templates/email/emailchange/fr.json | 8 -
.../src/templates/email/emailchange/fr.yaml | 6 -
.../src/templates/email/emailchange/index.mjs | 20 -
.../src/templates/email/emailchange/nl.json | 8 -
.../src/templates/email/emailchange/nl.yaml | 6 -
.../src/templates/email/emailchange/uk.json | 8 -
.../src/templates/email/emailchange/uk.yaml | 6 -
sites/backend/src/templates/email/en.json | 10 -
sites/backend/src/templates/email/en.yaml | 9 -
sites/backend/src/templates/email/es.json | 10 -
sites/backend/src/templates/email/es.yaml | 9 -
sites/backend/src/templates/email/fr.json | 10 -
sites/backend/src/templates/email/fr.yaml | 9 -
sites/backend/src/templates/email/goodbye.mjs | 39 +
.../src/templates/email/goodbye/de.json | 7 -
.../src/templates/email/goodbye/de.yaml | 5 -
.../src/templates/email/goodbye/en.json | 7 -
.../src/templates/email/goodbye/en.yaml | 5 -
.../src/templates/email/goodbye/es.json | 7 -
.../src/templates/email/goodbye/es.yaml | 5 -
.../src/templates/email/goodbye/fr.json | 7 -
.../src/templates/email/goodbye/fr.yaml | 5 -
.../src/templates/email/goodbye/index.mjs | 39 -
.../src/templates/email/goodbye/nl.json | 7 -
.../src/templates/email/goodbye/nl.yaml | 5 -
.../src/templates/email/goodbye/uk.json | 7 -
.../src/templates/email/goodbye/uk.yaml | 5 -
sites/backend/src/templates/email/index.mjs | 61 +-
.../src/templates/email/langsuggest/index.mjs | 19 -
.../src/templates/email/newslettersub/de.yaml | 5 -
.../src/templates/email/newslettersub/en.yaml | 5 -
.../src/templates/email/newslettersub/es.yaml | 5 -
.../src/templates/email/newslettersub/fr.yaml | 5 -
.../src/templates/email/newslettersub/nl.yaml | 5 -
.../src/templates/email/newslettersub/uk.yaml | 5 -
sites/backend/src/templates/email/nl.json | 10 -
sites/backend/src/templates/email/nl.yaml | 9 -
sites/backend/src/templates/email/nlsub.mjs | 28 +
.../backend/src/templates/email/nlsub/de.json | 9 -
.../backend/src/templates/email/nlsub/en.json | 9 -
.../backend/src/templates/email/nlsub/es.json | 9 -
.../backend/src/templates/email/nlsub/fr.json | 9 -
.../src/templates/email/nlsub/index.mjs | 25 -
.../backend/src/templates/email/nlsub/nl.json | 9 -
.../backend/src/templates/email/nlsub/uk.json | 9 -
.../backend/src/templates/email/nlsubact.mjs | 23 +
.../src/templates/email/nlsubact/de.json | 6 -
.../src/templates/email/nlsubact/en.json | 6 -
.../src/templates/email/nlsubact/es.json | 6 -
.../src/templates/email/nlsubact/fr.json | 6 -
.../src/templates/email/nlsubact/index.mjs | 23 -
.../src/templates/email/nlsubact/nl.json | 6 -
.../src/templates/email/nlsubact/uk.json | 6 -
.../src/templates/email/nlsubinact.mjs | 28 +
.../src/templates/email/nlsubinact/de.json | 9 -
.../src/templates/email/nlsubinact/en.json | 9 -
.../src/templates/email/nlsubinact/es.json | 9 -
.../src/templates/email/nlsubinact/fr.json | 9 -
.../src/templates/email/nlsubinact/index.mjs | 25 -
.../src/templates/email/nlsubinact/nl.json | 9 -
.../src/templates/email/nlsubinact/uk.json | 9 -
sites/backend/src/templates/email/nlunsub.mjs | 29 +
.../src/templates/email/passwordreset.mjs | 38 +
.../src/templates/email/passwordreset/de.json | 7 -
.../src/templates/email/passwordreset/de.yaml | 5 -
.../src/templates/email/passwordreset/en.json | 7 -
.../src/templates/email/passwordreset/en.yaml | 5 -
.../src/templates/email/passwordreset/es.json | 7 -
.../src/templates/email/passwordreset/es.yaml | 5 -
.../src/templates/email/passwordreset/fr.json | 7 -
.../src/templates/email/passwordreset/fr.yaml | 5 -
.../templates/email/passwordreset/index.mjs | 38 -
.../src/templates/email/passwordreset/nl.json | 7 -
.../src/templates/email/passwordreset/nl.yaml | 5 -
.../src/templates/email/passwordreset/uk.json | 7 -
.../src/templates/email/passwordreset/uk.yaml | 5 -
.../src/templates/email/shared/blocks.mjs | 8 +-
.../templates/email/shared/replacements.mjs | 9 +
.../src/templates/email/signinlink.mjs | 34 +
.../src/templates/email/signinlink/de.json | 8 -
.../src/templates/email/signinlink/de.yaml | 6 -
.../src/templates/email/signinlink/en.json | 8 -
.../src/templates/email/signinlink/en.yaml | 6 -
.../src/templates/email/signinlink/es.json | 8 -
.../src/templates/email/signinlink/es.yaml | 6 -
.../src/templates/email/signinlink/fr.json | 8 -
.../src/templates/email/signinlink/fr.yaml | 6 -
.../src/templates/email/signinlink/index.mjs | 33 -
.../src/templates/email/signinlink/nl.json | 8 -
.../src/templates/email/signinlink/nl.yaml | 6 -
.../src/templates/email/signinlink/uk.json | 8 -
.../src/templates/email/signinlink/uk.yaml | 6 -
.../src/templates/email/signup-aea.mjs | 39 +
.../src/templates/email/signup-aea/de.json | 9 -
.../src/templates/email/signup-aea/de.yaml | 7 -
.../src/templates/email/signup-aea/en.json | 9 -
.../src/templates/email/signup-aea/en.yaml | 7 -
.../src/templates/email/signup-aea/es.json | 9 -
.../src/templates/email/signup-aea/es.yaml | 7 -
.../src/templates/email/signup-aea/fr.json | 9 -
.../src/templates/email/signup-aea/fr.yaml | 7 -
.../src/templates/email/signup-aea/index.mjs | 36 -
.../src/templates/email/signup-aea/nl.json | 9 -
.../src/templates/email/signup-aea/nl.yaml | 7 -
.../src/templates/email/signup-aea/uk.json | 9 -
.../src/templates/email/signup-aea/uk.yaml | 7 -
.../src/templates/email/signup-aed.mjs | 25 +
.../src/templates/email/signup-aed/de.json | 7 -
.../src/templates/email/signup-aed/de.yaml | 5 -
.../src/templates/email/signup-aed/en.json | 7 -
.../src/templates/email/signup-aed/en.yaml | 5 -
.../src/templates/email/signup-aed/es.json | 7 -
.../src/templates/email/signup-aed/es.yaml | 5 -
.../src/templates/email/signup-aed/fr.json | 7 -
.../src/templates/email/signup-aed/fr.yaml | 5 -
.../src/templates/email/signup-aed/index.mjs | 24 -
.../src/templates/email/signup-aed/nl.json | 7 -
.../src/templates/email/signup-aed/nl.yaml | 5 -
.../src/templates/email/signup-aed/uk.json | 7 -
.../src/templates/email/signup-aed/uk.yaml | 5 -
sites/backend/src/templates/email/signup.mjs | 35 +
.../src/templates/email/signup/de.json | 8 -
.../src/templates/email/signup/de.yaml | 6 -
.../src/templates/email/signup/en.json | 8 -
.../src/templates/email/signup/en.yaml | 6 -
.../src/templates/email/signup/es.json | 8 -
.../src/templates/email/signup/es.yaml | 6 -
.../src/templates/email/signup/fr.json | 8 -
.../src/templates/email/signup/fr.yaml | 6 -
.../src/templates/email/signup/index.mjs | 33 -
.../src/templates/email/signup/nl.json | 8 -
.../src/templates/email/signup/nl.yaml | 6 -
.../src/templates/email/signup/uk.json | 8 -
.../src/templates/email/signup/uk.yaml | 6 -
.../src/templates/email/transinvite/de.json | 8 -
.../src/templates/email/transinvite/de.yaml | 6 -
.../src/templates/email/transinvite/en.json | 8 -
.../src/templates/email/transinvite/en.yaml | 6 -
.../src/templates/email/transinvite/es.json | 8 -
.../src/templates/email/transinvite/es.yaml | 6 -
.../src/templates/email/transinvite/fr.json | 8 -
.../src/templates/email/transinvite/fr.yaml | 6 -
.../src/templates/email/transinvite/index.mjs | 33 -
.../src/templates/email/transinvite/nl.json | 8 -
.../src/templates/email/transinvite/nl.yaml | 6 -
.../src/templates/email/transinvite/uk.json | 8 -
.../src/templates/email/transinvite/uk.yaml | 6 -
sites/backend/src/templates/email/uk.json | 10 -
sites/backend/src/templates/email/uk.yaml | 9 -
sites/backend/src/utils/crypto.mjs | 25 +
sites/backend/src/utils/email.mjs | 11 +-
sites/backend/src/utils/index.mjs | 7 +-
sites/backend/src/utils/oidc-provider.mjs | 97 +
.../docs/reference/api/point/dist/readme.mdx | 35 +
sites/dev/docusaurus.config.mjs | 2 +-
sites/dev/package.json | 13 +-
sites/dev/src/theme/MDXComponents/example.mjs | 23 +-
sites/org/authors.json | 345 +
sites/org/babel.config.mjs | 7 +
.../blog/2-20-for-dolls/index.mdx | 0
.../blog/2019-yearly-report/index.mdx | 0
.../blog/2021-wrapup/index.mdx | 0
.../blog/a-call-for-help/index.mdx | 0
.../blog/albert-apron/index.mdx | 0
.../blog/all-contributors/index.mdx | 0
.../blog/annnouncing-yuri/index.mdx | 0
.../blog/announcing-carlita/index.mdx | 0
.../announcing-carlton-and-bent/index.mdx | 0
.../blog/announcing-charlie/index.mdx | 0
.../announcing-freesewing-library/index.mdx | 0
.../announcing-freesewing-social/index.mdx | 0
.../blog/announcing-freesewing-v30/index.mdx | 0
.../blog/announcing-freesewing/index.mdx | 0
.../blog/announcing-hortensia/index.mdx | 0
.../blog/announcing-penelope/index.mdx | 0
.../blog/announcing-sandy/index.mdx | 0
.../blog/announcing-shin/index.mdx | 0
.../blog/announcing-sven/index.mdx | 0
.../blog/announcing-teagan/index.mdx | 0
.../blog/announcing-ursula/index.mdx | 0
sites/org/blog/announcing-v2/index.mdx | 86 +
.../blog/bella-bodice-block/index.mdx | 0
.../blog/benjamin-bow-tie-beta/index.mdx | 0
.../index.mdx | 156 +
.../{orgdocs => org}/blog/bye-2020/index.mdx | 0
.../blog/calling-all-patrons/index.mdx | 0
.../index.mdx | 0
.../core-1-8-jaeger-across-back/index.mdx | 0
.../blog/core-v1-3-0-is-out/index.mdx | 0
.../blog/cornelius-cycling-breeches/index.mdx | 0
.../email-breakdown-post-mortem/index.mdx | 0
.../blog/email-spam-problems/index.mdx | 0
.../blog/facemask-frenzy/index.mdx | 0
.../blog/florence-face-mask/index.mdx | 0
.../blog/florent-flat-cap-beta/index.mdx | 0
.../blog/freesewing-2-19/index.mdx | 0
.../blog/freesewing-2-21/index.mdx | 0
.../blog/freesewing-goes-jamstack/index.mdx | 0
.../index.mdx | 0
.../blog/freesewing-v2-1/index.mdx | 0
.../blog/freesewing-v2-7/index.mdx | 0
sites/org/blog/freesewing-v3-1/index.mdx | 63 +
.../{orgdocs => org}/blog/gdpr-plan/index.mdx | 0
.../blog/gdpr-ready/index.mdx | 0
.../blog/halloween-cosplays-2021/index.mdx | 0
.../blog/halloween-ideas-2021/index.mdx | 0
.../blog/holmes-deerstalker-hat/index.mdx | 0
.../blog/huey-hoodie-beta/index.mdx | 0
.../blog/lets-meet-up-in-2019/index.mdx | 0
.../{orgdocs => org}/blog/meet-paco/index.mdx | 0
.../blog/open-backend-api/index.mdx | 0
.../blog/open-for-business/index.mdx | 0
.../index.mdx | 0
.../blog/privacy-choices/index.mdx | 0
.../{orgdocs => org}/blog/react-17/index.mdx | 0
.../blog/roundup-2017-09/index.mdx | 0
.../blog/roundup-2017-10/index.mdx | 0
.../blog/roundup-2017-11/index.mdx | 0
.../blog/roundup-2017-12/index.mdx | 0
.../blog/roundup-2018-01/index.mdx | 0
.../blog/roundup-2018-02/index.mdx | 0
.../blog/roundup-2018-03/index.mdx | 0
.../blog/roundup-2018-04/index.mdx | 0
.../blog/roundup-2018-05/index.mdx | 0
.../blog/roundup-2018-06/index.mdx | 0
.../blog/roundup-2018-07/index.mdx | 0
.../blog/roundup-2018-09/index.mdx | 0
.../blog/roundup-2018-10/index.mdx | 0
.../blog/roundup-2018-11/index.mdx | 0
.../blog/roundup-2019-01/index.mdx | 0
.../blog/the-refashioners-2017/index.mdx | 0
.../blog/v2-22-then-v3/index.mdx | 0
sites/{orgdocs => org}/blog/v3-2-0/index.mdx | 0
.../blog/v3-umbrella-post/index.mdx | 0
.../blog/welcome-to-freesewining-3/index.mdx | 103 +
sites/{orgdocs => org}/broken | 0
sites/org/components/crowdin/status.mjs | 103 -
.../components/crowdin/suggest-language.mjs | 189 -
.../components/crowdin/translator-invite.mjs | 97 -
sites/org/components/crowdin/translators.mjs | 141 -
sites/org/components/curate/de.yaml | 4 -
sites/org/components/curate/en.yaml | 4 -
sites/org/components/curate/es.yaml | 4 -
sites/org/components/curate/fr.yaml | 4 -
sites/org/components/curate/nl.yaml | 4 -
sites/org/components/curate/uk.yaml | 4 -
sites/org/components/design-examples.mjs | 3 -
sites/org/components/design.mjs | 110 -
sites/org/components/feeds.mjs | 81 -
sites/org/components/footer/de.yaml | 7 -
sites/org/components/footer/en.yaml | 7 -
sites/org/components/footer/es.yaml | 7 -
sites/org/components/footer/fr.yaml | 7 -
sites/org/components/footer/nl.yaml | 7 -
sites/org/components/footer/uk.yaml | 7 -
sites/org/components/genimg/de.yaml | 19 -
sites/org/components/genimg/en.yaml | 19 -
sites/org/components/genimg/es.yaml | 19 -
sites/org/components/genimg/fr.yaml | 19 -
sites/org/components/genimg/index.mjs | 116 -
sites/org/components/genimg/nl.yaml | 19 -
sites/org/components/genimg/uk.yaml | 19 -
sites/org/components/github/create-post.mjs | 543 -
sites/org/components/github/design-picker.mjs | 44 -
sites/org/components/github/inputs.mjs | 190 -
sites/org/components/header/de.yaml | 12 -
sites/org/components/header/en.yaml | 12 -
sites/org/components/header/es.yaml | 12 -
sites/org/components/header/fr.yaml | 12 -
sites/org/components/header/index.mjs | 138 -
sites/org/components/header/nl.yaml | 12 -
sites/org/components/header/uk.yaml | 12 -
sites/org/components/layouts/bare.mjs | 3 -
sites/org/components/layouts/default.mjs | 24 -
sites/org/components/layouts/docs.mjs | 64 -
sites/org/components/layouts/editor.mjs | 1 -
sites/org/components/layouts/post.mjs | 305 -
sites/org/components/layouts/workbench.mjs | 7 -
sites/org/components/mdx/index.mjs | 1 -
sites/org/components/mdx/pattern-docs.mjs | 56 -
.../components/mdx/pattern-measurements.mjs | 42 -
sites/org/components/mdx/pattern-options.mjs | 64 -
sites/org/components/mdx/posts/author.mjs | 78 -
.../org/components/navigation/modal-menu.mjs | 58 -
.../components/navigation/sections-menu.mjs | 46 -
sites/org/components/search.mjs | 72 -
sites/org/docs/account/about/avatar/index.mdx | 14 +
sites/org/docs/account/about/bio/index.mdx | 14 +
sites/org/docs/account/about/email/index.mdx | 14 +
sites/org/docs/account/about/index.mdx | 32 +
.../org/docs/account/about/username/index.mdx | 14 +
.../org/docs/account/actions/import/index.mdx | 24 +
sites/org/docs/account/actions/index.mdx | 4 +
.../org/docs/account/actions/reload/index.mdx | 14 +
.../org/docs/account/actions/remove/index.mdx | 15 +
.../docs/account/actions/restrict/index.mdx | 15 +
.../org/docs/account/data/bookmarks/index.mdx | 15 +
sites/org/docs/account/data/index.mdx | 28 +
.../org/docs/account/data/patterns/index.mdx | 15 +
.../docs/account/data/patterns/pattern.mdx | 17 +
sites/org/docs/account/data/sets/index.mdx | 15 +
sites/org/docs/account/data/sets/set.mdx | 16 +
sites/org/docs/account/index.mdx | 12 +
.../account/preferences/compare/index.mdx | 13 +
.../account/preferences/consent/index.mdx | 14 +
.../account/preferences/control/index.mdx | 13 +
sites/org/docs/account/preferences/index.mdx | 12 +
.../account/preferences/newsletter/index.mdx | 14 +
.../docs/account/preferences/units/index.mdx | 14 +
.../docs/account/security/apikeys/index.mdx | 15 +
sites/org/docs/account/security/index.mdx | 4 +
sites/org/docs/account/security/mfa/index.mdx | 14 +
.../docs/account/security/password/index.mdx | 14 +
.../org/docs/account/social/github/index.mdx | 14 +
sites/org/docs/account/social/index.mdx | 53 +
.../docs/account/social/instagram/index.mdx | 14 +
.../docs/account/social/mastodon/index.mdx | 14 +
.../org/docs/account/social/reddit/index.mdx | 14 +
.../org/docs/account/social/tiktok/index.mdx | 14 +
.../org/docs/account/social/twitch/index.mdx | 14 +
.../org/docs/account/social/website/index.mdx | 14 +
sites/org/docs/admin/index.mdx | 17 +
sites/org/docs/admin/subscribers.mdx | 17 +
sites/org/docs/designs/index.mdx | 9 +
.../docs}/docs/_aboutbriansleevecap.mdx | 1 -
.../docs}/docs/_controltip.mdx | 0
.../docs/about/community-standards/readme.mdx | 0
sites/org/docs/docs/about/editor/readme.mdx | 5 +
.../docs/about/faq/commercial-use/readme.mdx | 0
.../docs/about/faq/email-trouble/readme.mdx | 24 +
.../faq/measurements-issues/highbust.jpg | Bin
.../faq/measurements-issues/highbust2.jpg | Bin
.../about/faq/measurements-issues/hps.jpg | Bin
.../about/faq/measurements-issues/hps2.jpg | Bin
.../about/faq/measurements-issues/readme.mdx | 155 +
.../faq/measurements-issues/waisttoarmpit.jpg | Bin
.../docs/docs/about/faq/newsletter/readme.mdx | 7 +
.../why-subscribe-multiple-clicks/readme.mdx | 67 +
.../readme.mdx | 37 +
.../docs}/docs/about/faq/notches/readme.mdx | 0
.../docs/about/faq/printing-issues/readme.mdx | 57 +
sites/org/docs/docs/about/faq/readme.mdx | 7 +
.../docs/about/faq/seam-allowance/readme.mdx | 7 +
.../faq/standard-measurements/readme.mdx | 9 +
.../docs/about/faq/tapering-seams/readme.mdx | 7 +
.../about/faq/womenswear-blocks/readme.mdx | 0
.../docs}/docs/about/guide/readme.mdx | 0
sites/org/docs/docs/about/notation/readme.mdx | 224 +
.../docs/about/pledge/motivation/readme.mdx | 94 +
sites/org/docs/docs/about/pledge/readme.mdx | 32 +
sites/org/docs/docs/about/privacy/readme.mdx | 167 +
sites/org/docs/docs/about/readme.mdx | 7 +
sites/org/docs/docs/about/rights/readme.mdx | 96 +
.../docs}/docs/about/site/account/readme.mdx | 0
.../docs}/docs/about/site/apikeys/readme.mdx | 0
.../docs/about/site/bookmarks/readme.mdx | 0
.../docs}/docs/about/site/csets/cset1.jpg | Bin
.../docs}/docs/about/site/csets/cset2.jpg | Bin
.../docs}/docs/about/site/csets/joost.png | Bin
.../docs}/docs/about/site/csets/readme.mdx | 0
.../docs}/docs/about/site/draft/editor.png | Bin
.../org/docs/docs/about/site/draft/readme.mdx | 251 +
.../docs}/docs/about/site/patterns/readme.mdx | 0
sites/org/docs/docs/about/site/readme.mdx | 103 +
.../docs}/docs/about/site/sets/readme.mdx | 0
sites/org/docs/docs/about/terms/readme.mdx | 29 +
sites/org/docs/docs/designs/aaron/_notes.mdx | 21 +
.../designs/aaron/instructions/finished.gif | Bin
.../designs/aaron/instructions/readme.mdx | 0
.../designs/aaron/instructions/step01.png | Bin
.../designs/aaron/instructions/step02.png | Bin
.../designs/aaron/instructions/step03a.png | Bin
.../designs/aaron/instructions/step03b.png | Bin
.../designs/aaron/instructions/step03c.png | Bin
.../designs/aaron/instructions/step03d.png | Bin
.../designs/aaron/instructions/step03e.png | Bin
.../designs/aaron/instructions/step03f.png | Bin
.../designs/aaron/instructions/step03g.png | Bin
.../designs/aaron/instructions/step03h.png | Bin
.../designs/aaron/instructions/step04a.png | Bin
.../designs/aaron/instructions/step04b.png | Bin
.../designs/aaron/instructions/step05.png | Bin
.../armholedepth/armholedepthfactor.svg | 0
.../aaron/options/armholedepth/readme.mdx | 0
.../aaron/options/armholedrop/armholedrop.svg | 0
.../aaron/options/armholedrop/readme.mdx | 9 +
.../options/backlinebend/backlinebend.svg | 0
.../aaron/options/backlinebend/readme.mdx | 9 +
.../aaron/options/chestease/chestease.svg | 0
.../aaron/options/chestease/readme.mdx | 16 +
.../options/draftforhighbust/readme.mdx | 0
.../aaron/options/hipsease/hipsease.svg | 0
.../designs/aaron/options/hipsease/readme.mdx | 14 +
.../aaron/options/knitbindingwidth/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 11 +
.../aaron/options/lengthbonus/lengthbonus.svg | 0
.../aaron/options/lengthbonus/readme.mdx | 11 +
.../options/necklinebend/necklinebend.svg | 0
.../aaron/options/necklinebend/readme.mdx | 9 +
.../options/necklinedrop/necklinedrop.svg | 0
.../aaron/options/necklinedrop/readme.mdx | 9 +
.../docs/designs/aaron/options/readme.mdx | 161 +
.../options/shoulderstrapplacement/readme.mdx | 9 +
.../shoulderstrapplacement.svg | 0
.../options/shoulderstrapwidth/readme.mdx | 7 +
.../shoulderstrapwidth/shoulderstrapwidth.svg | 0
.../aaron/options/stretchfactor/readme.mdx | 15 +
.../options/stretchfactor/stretchfactor.svg | 0
sites/org/docs/docs/designs/aaron/readme.mdx | 65 +
sites/org/docs/docs/designs/albert/_notes.mdx | 10 +
.../designs/albert/instructions/readme.mdx | 0
.../albert/options/backopening/readme.mdx | 0
.../albert/options/biblength/readme.mdx | 0
.../albert/options/bibwidth/readme.mdx | 0
.../albert/options/chestdepth/readme.mdx | 0
.../albert/options/lengthbonus/readme.mdx | 0
.../docs/designs/albert/options/readme.mdx | 75 +
.../albert/options/strapwidth/readme.mdx | 0
sites/org/docs/docs/designs/albert/readme.mdx | 39 +
sites/org/docs/docs/designs/bee/_notes.mdx | 9 +
.../docs/designs/bee/instructions/readme.mdx | 0
.../bee/options/armholedepth/readme.mdx | 0
.../bee/options/backdartheight/readme.mdx | 0
.../designs/bee/options/bandlength/readme.mdx | 0
.../bee/options/bandtielength/readme.mdx | 0
.../bee/options/bandtiewidth/readme.mdx | 0
.../designs/bee/options/bellaguide/readme.mdx | 0
.../bee/options/bottomcupdepth/readme.mdx | 0
.../bee/options/bustspanease/readme.mdx | 0
.../designs/bee/options/chestease/readme.mdx | 0
.../bee/options/crossbackties/readme.mdx | 0
.../bee/options/duocolorties/readme.mdx | 0
.../options/frontarmholepitchdepth/readme.mdx | 0
.../designs/bee/options/frontcurve/readme.mdx | 0
.../bee/options/frontshoulderwidth/readme.mdx | 0
.../options/fullchesteasereduction/readme.mdx | 0
.../bee/options/highbustwidth/readme.mdx | 0
.../bee/options/necktielength/readme.mdx | 0
.../bee/options/necktiewidth/readme.mdx | 0
.../bee/options/pointedtieends/readme.mdx | 0
.../docs/docs/designs/bee/options/readme.mdx | 284 +
.../designs/bee/options/reversible/readme.mdx | 0
.../options/shouldertoshoulderease/readme.mdx | 0
.../designs/bee/options/sidecurve/readme.mdx | 0
.../designs/bee/options/sidedepth/readme.mdx | 0
.../docs/designs/bee/options/ties/readme.mdx | 0
.../designs/bee/options/topdepth/readme.mdx | 0
.../designs/bee/options/waistease/readme.mdx | 0
sites/org/docs/docs/designs/bee/readme.mdx | 79 +
sites/org/docs/docs/designs/bella/_notes.mdx | 15 +
.../designs/bella/instructions/readme.mdx | 0
.../bella/options/armholedepth/readme.mdx | 0
.../bella/options/armholedepth/sample.png | Bin
.../options/backarmholecurvature/readme.mdx | 0
.../options/backarmholecurvature/sample.png | Bin
.../options/backarmholepitchdepth/readme.mdx | 0
.../options/backarmholepitchdepth/sample.png | Bin
.../bella/options/backarmholeslant/readme.mdx | 0
.../bella/options/backarmholeslant/sample.png | Bin
.../bella/options/backdartheight/readme.mdx | 0
.../bella/options/backdartheight/sample.png | Bin
.../bella/options/backhemslope/readme.mdx | 0
.../bella/options/backhemslope/sample.png | Bin
.../bella/options/backneckcutout/readme.mdx | 0
.../bella/options/backneckcutout/sample.png | Bin
.../bella/options/bustdartangle/readme.mdx | 0
.../bella/options/bustdartcurve/readme.mdx | 0
.../bella/options/bustdartcurve/sample.png | Bin
.../bella/options/bustdartlength/readme.mdx | 0
.../bella/options/bustdartlength/sample.png | Bin
.../options/bustdartminimumfabric/readme.mdx | 0
.../bella/options/bustspanease/readme.mdx | 0
.../bella/options/bustspanease/sample.png | Bin
.../bella/options/chestease/readme.mdx | 0
.../bella/options/chestease/sample.png | Bin
.../options/frontarmholecurvature/readme.mdx | 0
.../options/frontarmholepitchdepth/readme.mdx | 0
.../options/frontarmholepitchdepth/sample.png | Bin
.../options/frontshoulderwidth/readme.mdx | 0
.../options/frontshoulderwidth/sample.png | Bin
.../options/fullchesteasereduction/readme.mdx | 0
.../bella/options/highbustwidth/readme.mdx | 0
.../bella/options/highbustwidth/sample.png | Bin
.../docs/designs/bella/options/readme.mdx | 253 +
.../options/shouldertoshoulderease/readme.mdx | 0
.../bella/options/waistdartcurve/readme.mdx | 0
.../bella/options/waistdartlength/readme.mdx | 0
.../bella/options/waistdartlength/sample.png | Bin
.../bella/options/waistease/readme.mdx | 0
.../bella/options/waistease/sample.png | Bin
sites/org/docs/docs/designs/bella/readme.mdx | 71 +
.../org/docs/docs/designs/benjamin/_notes.mdx | 17 +
.../benjamin/instructions/finished.gif | Bin
.../designs/benjamin/instructions/layout1.svg | 0
.../designs/benjamin/instructions/layout2.svg | 0
.../designs/benjamin/instructions/readme.mdx | 0
.../designs/benjamin/instructions/step12.png | Bin
.../designs/benjamin/instructions/step13.png | Bin
.../designs/benjamin/instructions/step14.png | Bin
.../designs/benjamin/instructions/step15.png | Bin
.../designs/benjamin/instructions/step22.png | Bin
.../designs/benjamin/instructions/step23.png | Bin
.../designs/benjamin/instructions/step25.png | Bin
.../adjustmentribbon/adjustmentribbon.svg | 0
.../options/adjustmentribbon/readme.mdx | 0
.../benjamin/options/bowlength/bowlength.svg | 0
.../benjamin/options/bowlength/readme.mdx | 0
.../benjamin/options/bowstyle/bowstyle.svg | 0
.../benjamin/options/bowstyle/readme.mdx | 0
.../options/collarbandheight/readme.mdx | 0
.../options/collarease/collarease.svg | 0
.../benjamin/options/collarease/readme.mdx | 0
.../benjamin/options/endstyle/endstyle.svg | 0
.../benjamin/options/endstyle/readme.mdx | 0
.../benjamin/options/knotwidth/knotwidth.svg | 0
.../benjamin/options/knotwidth/readme.mdx | 0
.../docs/designs/benjamin/options/readme.mdx | 100 +
.../benjamin/options/tipwidth/readme.mdx | 0
.../benjamin/options/tipwidth/tipwidth.svg | 0
.../org/docs/docs/designs/benjamin/readme.mdx | 94 +
sites/org/docs/docs/designs/bent/_notes.mdx | 11 +
.../docs/designs/bent/instructions/layout.svg | 0
.../docs/designs/bent/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../bent/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../bent/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../options/backneckcutout/backneckcutout.svg | 0
.../bent/options/backneckcutout/readme.mdx | 0
.../bent/options/bicepsease/readme.mdx | 0
.../designs/bent/options/chestease/readme.mdx | 0
.../bent/options/collarease/readme.mdx | 0
.../designs/bent/options/cuffease/readme.mdx | 0
.../bent}/options/draftforhighbust/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../bent/options/lengthbonus/readme.mdx | 0
.../docs/docs/designs/bent/options/readme.mdx | 227 +
.../designs/bent/options/s3armhole/readme.mdx | 0
.../designs/bent/options/s3collar/readme.mdx | 0
.../bent/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../bent/options/sleevebend/readme.mdx | 0
.../bent/options/sleevecapease/readme.mdx | 0
.../bent/options/sleevecapheight/readme.mdx | 0
.../bent/options/sleevelengthbonus/readme.mdx | 0
sites/org/docs/docs/designs/bent/readme.mdx | 66 +
sites/org/docs/docs/designs/bibi/_notes.mdx | 48 +
.../docs/designs/bibi/instructions/dart.svg | 0
.../docs/designs/bibi/instructions/gather.svg | 0
.../bibi/instructions/knitbinding_a.svg | 0
.../bibi/instructions/knitbinding_b.svg | 0
.../bibi/instructions/knitbinding_c.svg | 0
.../bibi/instructions/knitbinding_d.svg | 0
.../bibi/instructions/knitbinding_e.svg | 0
.../docs/designs/bibi/instructions/readme.mdx | 0
.../designs/bibi/instructions/ribbing.svg | 0
.../designs/bibi/instructions/shoulders.svg | 0
.../designs/bibi/instructions/sideseam.svg | 0
.../docs/designs/bibi/instructions/sleeve.svg | 0
.../designs/bibi/instructions/sleeve2.svg | 0
.../bibi/options/acrossbackfactor/readme.mdx | 0
.../bibi/options/armholecurveback/readme.mdx | 0
.../bibi/options/armholecurvefront/readme.mdx | 0
.../bibi/options/armholedepth/readme.mdx | 0
.../bibi/options/armholedropback/readme.mdx | 0
.../bibi/options/backneckbend/readme.mdx | 0
.../bibi/options/backneckcutout/readme.mdx | 0
.../bibi/options/bicepsease/bicepsease.svg | 0
.../bibi/options/bicepsease/readme.mdx | 0
.../bibi/options/bindingheight/readme.mdx | 0
.../designs/bibi/options/bustease/readme.mdx | 0
.../designs/bibi/options/chestease/readme.mdx | 0
.../designs/bibi/options/cuffease/readme.mdx | 0
.../options/curvatureadjustment/readme.mdx | 0
.../docs/designs/bibi/options/dart/readme.mdx | 0
.../bibi/options/draftforhighbust/readme.mdx | 0
.../designs/bibi/options/fitwaist/readme.mdx | 0
.../designs/bibi/options/flare/readme.mdx | 0
.../designs/bibi/options/hipsease/readme.mdx | 0
.../designs/bibi/options/length/readme.mdx | 0
.../bibi/options/lengthadjustment/readme.mdx | 0
.../bibi/options/lengthbonus/readme.mdx | 0
.../bibi/options/necklinebend/readme.mdx | 0
.../bibi/options/necklinedepth/readme.mdx | 0
.../bibi/options/necklinewidth/readme.mdx | 0
.../docs/docs/designs/bibi/options/readme.mdx | 612 +
.../bibi/options/ribbingheight/readme.mdx | 0
.../bibi/options/ribbingstretch/readme.mdx | 0
.../options/seatbackadjustment/readme.mdx | 0
.../designs/bibi/options/seatease/readme.mdx | 0
.../bibi/options/shoulderease/readme.mdx | 0
.../options/shoulderease/shoulderease.svg | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../bibi/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../bibi/options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../bibi/options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../bibi/options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../bibi/options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../bibi/options/sleeveease/readme.mdx | 0
.../bibi/options/sleevelength/readme.mdx | 0
.../designs/bibi/options/sleeves/readme.mdx | 0
.../bibi/options/strapwidth/readme.mdx | 0
.../bibi/options/usecuffribbing/readme.mdx | 0
.../bibi/options/usewaistribbing/readme.mdx | 0
.../bibi/options/waistadjustment/readme.mdx | 0
.../designs/bibi/options/waistease/readme.mdx | 0
sites/org/docs/docs/designs/bibi/readme.mdx | 92 +
sites/org/docs/docs/designs/bob/_notes.mdx | 12 +
.../docs/designs/bob/instructions/readme.mdx | 0
.../designs/bob/options/headsize/readme.mdx | 0
.../bob/options/lengthratio/readme.mdx | 0
.../designs/bob/options/neckratio/readme.mdx | 0
.../docs/docs/designs/bob/options/readme.mdx | 53 +
.../designs/bob/options/widthratio/readme.mdx | 0
sites/org/docs/docs/designs/bob/readme.mdx | 41 +
.../org/docs/docs/designs/breanna/_notes.mdx | 14 +
.../designs/breanna/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../breanna/options/backneckcutout/readme.mdx | 0
.../breanna/options/bicepsease/bicepsease.svg | 0
.../breanna/options/bicepsease/readme.mdx | 0
.../breanna/options/chestease/chestease.svg | 0
.../breanna/options/chestease/readme.mdx | 0
.../breanna/options/collarease/readme.mdx | 0
.../breanna/options/cuffease/cuffease.svg | 0
.../breanna/options/cuffease/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../breanna/options/frontscyedart/readme.mdx | 0
.../options/primarybustdart/readme.mdx | 0
.../options/primarybustdartlength/readme.mdx | 0
.../options/primarybustdartshaping/readme.mdx | 0
.../docs/designs/breanna/options/readme.mdx | 521 +
.../options/secondarybustdart/readme.mdx | 0
.../secondarybustdartlength/readme.mdx | 0
.../breanna/options/shoulderdart/readme.mdx | 0
.../options/shoulderdartlength/readme.mdx | 0
.../options/shoulderdartsize/readme.mdx | 0
.../breanna/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../breanna/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../breanna/options/sleevelengthbonus/de.md | 0
.../breanna/options/sleevelengthbonus/en.md | 0
.../breanna/options/sleevelengthbonus/es.md | 0
.../breanna/options/sleevelengthbonus/fr.md | 0
.../breanna/options/sleevelengthbonus/nl.md | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../breanna/options/sleevelengthbonus/uk.md | 0
.../breanna/options/verticalease/readme.mdx | 0
.../breanna/options/waistdart/readme.mdx | 0
.../options/waistdartlength/readme.mdx | 0
.../breanna/options/waistdartsize/readme.mdx | 0
.../breanna/options/waistease/readme.mdx | 0
.../org/docs/docs/designs/breanna/readme.mdx | 62 +
sites/org/docs/docs/designs/brian/_notes.mdx | 16 +
.../designs/brian/instructions/finished.gif | Bin
.../designs/brian/instructions/readme.mdx | 75 +
.../designs/brian/instructions/step01.png | Bin
.../designs/brian/instructions/step02.png | Bin
.../designs/brian/instructions/step03a.png | Bin
.../designs/brian/instructions/step03b.png | Bin
.../designs/brian/instructions/step03c.png | Bin
.../designs/brian/instructions/step03d.png | Bin
.../designs/brian/instructions/step03e.png | Bin
.../designs/brian/instructions/step03f.png | Bin
.../designs/brian/instructions/step03g.png | Bin
.../designs/brian/instructions/step03h.png | Bin
.../designs/brian/instructions/step04a.png | Bin
.../designs/brian/instructions/step04b.png | Bin
.../designs/brian/instructions/step05.png | Bin
.../acrossbackfactor/acrossbackfactor.svg | 0
.../brian/options/acrossbackfactor/readme.mdx | 8 +
.../armholedepth/armholedepthfactor.svg | 0
.../brian/options/armholedepth/readme.mdx | 13 +
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 7 +
.../options/backneckcutout/backneckcutout.svg | 0
.../brian}/options/backneckcutout/readme.mdx | 0
.../brian/options/bicepsease/bicepsease.svg | 0
.../brian/options/bicepsease/readme.mdx | 7 +
.../brian/options/chestease/chestease.svg | 0
.../brian/options/chestease/readme.mdx | 7 +
.../brian/options/collarease/collarease.svg | 0
.../brian/options/collarease/readme.mdx | 7 +
.../brian/options/cuffease/cuffease.svg | 0
.../designs/brian/options/cuffease/readme.mdx | 7 +
.../options/draftforhighbust/readme.mdx | 0
.../frontarmholedeeper/frontarmholedeeper.svg | 0
.../options/frontarmholedeeper/readme.mdx | 11 +
.../options/legacyarmholedepth/readme.mdx | 15 +
.../brian/options/lengthbonus/lengthbonus.svg | 0
.../brian/options/lengthbonus/readme.mdx | 12 +
.../docs/designs/brian/options/readme.mdx | 415 +
.../brian}/options/s3armhole/readme.mdx | 0
.../brian}/options/s3collar/readme.mdx | 0
.../brian/options/shoulderease/readme.mdx | 11 +
.../options/shoulderease/shoulderease.svg | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../shoulderslopereduction.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 13 +
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 12 +
.../sleevecapbackfactory.svg | 0
.../brian/options/sleevecapease/readme.mdx | 14 +
.../options/sleevecapfrontfactorx/readme.mdx | 13 +
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 11 +
.../sleevecapfrontfactory.svg | 0
.../options/sleevecapq1offset/readme.mdx | 11 +
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 11 +
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 11 +
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 11 +
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 11 +
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 11 +
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 11 +
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 11 +
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 11 +
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 11 +
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 11 +
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 11 +
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 11 +
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 11 +
.../sleevecaptopfactory.svg | 0
.../options/sleevelengthbonus/readme.mdx | 7 +
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 0
sites/org/docs/docs/designs/brian/readme.mdx | 243 +
.../docs}/docs/designs/brian/sleevecap.svg | 0
.../docs/designs/brian/sleevecapanchor.svg | 0
.../designs/brian/sleevecapinflection.svg | 0
.../docs/designs/brian/sleevecapspread.svg | 0
.../docs}/docs/designs/brian/sleevecaptop.svg | 0
sites/org/docs/docs/designs/bruce/_notes.mdx | 9 +
.../designs/bruce/instructions/readme.mdx | 0
.../designs/bruce/instructions/step01.png | Bin
.../designs/bruce/instructions/step02.png | Bin
.../designs/bruce/instructions/step03-a.png | Bin
.../designs/bruce/instructions/step03-b.png | Bin
.../designs/bruce/instructions/step03-c.png | Bin
.../designs/bruce/instructions/step03-d.png | Bin
.../designs/bruce/instructions/step05.png | Bin
.../designs/bruce/instructions/step06.jpg | Bin
.../designs/bruce/instructions/step07.png | Bin
.../designs/bruce/instructions/step08.png | Bin
.../designs/bruce/instructions/step10.png | Bin
.../designs/bruce/instructions/step11.png | Bin
.../designs/bruce/instructions/step12.png | Bin
.../designs/bruce/instructions/step13.png | Bin
.../designs/bruce/instructions/step14.png | Bin
.../designs/bruce/instructions/step15.png | Bin
.../bruce/options/backrise/backrise.svg | 0
.../designs/bruce/options/backrise/readme.mdx | 0
.../designs/bruce/options/bulge/bulge.svg | 0
.../designs/bruce/options/bulge/readme.mdx | 0
.../bruce/options/legbonus/legbonus.svg | 0
.../designs/bruce/options/legbonus/readme.mdx | 0
.../bruce/options/legstretch/legstretch.svg | 0
.../bruce/options/legstretch/readme.mdx | 0
.../docs/designs/bruce/options/readme.mdx | 75 +
.../designs/bruce/options/rise/readme.mdx | 0
.../docs/designs/bruce/options/rise/rise.svg | 0
.../designs/bruce/options/stretch/readme.mdx | 0
.../designs/bruce/options/stretch/stretch.svg | 0
sites/org/docs/docs/designs/bruce/readme.mdx | 53 +
.../org/docs/docs/designs/carlita/_notes.mdx | 11 +
.../apply-fusible-interfacing.svg | 0
.../instructions/attach-canvas-to-front.svg | 0
.../instructions/close-the-back-darts.svg | 0
.../instructions/construct-the-belt.svg | 0
...oin-chest-canvas-piece-to-front-canvas.svg | 0
.../designs/carlita/instructions/layout.svg | 0
.../instructions/pad-stitch-lapels.svg | 0
.../prepare-the-inner-pocket-tab.svg | 0
.../designs/carlita/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../carlita/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../carlita/options/backneckcutout/readme.mdx | 0
.../carlita/options/beltwidth/beltwidth.svg | 0
.../carlita/options/beltwidth/readme.mdx | 0
.../carlita/options/bicepsease/bicepsease.svg | 0
.../carlita/options/bicepsease/readme.mdx | 0
.../buttonspacinghorizontal/readme.mdx | 0
.../carlita/options/chestease/chestease.svg | 0
.../carlita/options/chestease/readme.mdx | 0
.../chestpocketangle/chestpocketangle.svg | 0
.../options/chestpocketangle/readme.mdx | 0
.../chestpocketheight/chestpocketheight.svg | 0
.../options/chestpocketheight/readme.mdx | 0
.../chestpocketplacement.svg | 0
.../options/chestpocketplacement/readme.mdx | 0
.../chestpocketwidth/chestpocketwidth.svg | 0
.../options/chestpocketwidth/readme.mdx | 0
.../carlita/options/collarflare/readme.mdx | 0
.../options/collarheight/collarheight.svg | 0
.../carlita/options/collarheight/readme.mdx | 0
.../carlita/options/collarspread/readme.mdx | 0
.../carlita/options/contour/readme.mdx | 0
.../carlita/options/cuffease/cuffease.svg | 0
.../carlita/options/cuffease/readme.mdx | 0
.../carlita/options/cufflength/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../carlita/options/frontoverlap/readme.mdx | 0
.../options/innerpocketdepth/readme.mdx | 0
.../options/innerpocketplacement/readme.mdx | 0
.../options/innerpocketweltheight/readme.mdx | 0
.../options/innerpocketwidth/readme.mdx | 0
.../carlita/options/lapelreduction/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../designs/carlita/options/length/length.svg | 0
.../designs/carlita/options/length/readme.mdx | 0
.../pocketflapradius/pocketflapradius.svg | 0
.../options/pocketflapradius/pocketradius.svg | 0
.../options/pocketflapradius/readme.mdx | 0
.../carlita/options/pocketheight/readme.mdx | 0
.../pocketplacementhorizontal/readme.mdx | 0
.../pocketplacementvertical/readme.mdx | 0
.../options/pocketradius/pocketradius.svg | 0
.../carlita/options/pocketradius/readme.mdx | 0
.../carlita/options/pocketwidth/readme.mdx | 0
.../docs/designs/carlita/options/readme.mdx | 473 +
.../carlita}/options/s3armhole/readme.mdx | 0
.../carlita}/options/s3collar/readme.mdx | 0
.../carlita/options/seatease/readme.mdx | 0
.../carlita/options/seatease/seatease.svg | 0
.../carlita/options/shoulderease/readme.mdx | 0
.../options/shoulderease/shoulderease.svg | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../carlita/options/sleevebend/readme.mdx | 0
.../carlita/options/sleevebend/sleevebend.svg | 0
.../carlita/options/sleevecapease/readme.mdx | 0
.../options/sleevecapease/sleevecapease.svg | 0
.../options/sleevecapheight/readme.mdx | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../carlita/options/waistease/readme.mdx | 0
.../carlita/options/waistease/waistease.svg | 0
.../org/docs/docs/designs/carlita/readme.mdx | 157 +
.../org/docs/docs/designs/carlton/_notes.mdx | 16 +
.../apply-fusible-interfacing.svg | 0
.../instructions/attach-canvas-to-front.svg | 0
.../instructions/close-the-back-darts.svg | 0
.../instructions/construct-the-belt.svg | 0
...oin-chest-canvas-piece-to-front-canvas.svg | 0
.../designs/carlton/instructions/layout.svg | 0
.../instructions/pad-stitch-lapels.svg | 0
.../prepare-the-inner-pocket-tab.svg | 0
.../designs/carlton/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../carlton/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../carlton/options/backneckcutout/readme.mdx | 0
.../carlton/options/beltwidth/beltwidth.svg | 0
.../carlton/options/beltwidth/readme.mdx | 0
.../carlton/options/bicepsease/bicepsease.svg | 0
.../carlton/options/bicepsease/readme.mdx | 0
.../buttonspacinghorizontal/readme.mdx | 0
.../carlton/options/chestease/chestease.svg | 0
.../carlton/options/chestease/readme.mdx | 0
.../chestpocketangle/chestpocketangle.svg | 0
.../options/chestpocketangle/readme.mdx | 0
.../chestpocketheight/chestpocketheight.svg | 0
.../options/chestpocketheight/readme.mdx | 0
.../chestpocketplacement.svg | 0
.../options/chestpocketplacement/readme.mdx | 0
.../chestpocketwidth/chestpocketwidth.svg | 0
.../options/chestpocketwidth/readme.mdx | 0
.../carlton/options/collarflare/readme.mdx | 0
.../options/collarheight/collarheight.svg | 0
.../carlton/options/collarheight/readme.mdx | 0
.../carlton/options/collarspread/readme.mdx | 0
.../carlton/options/cuffease/cuffease.svg | 0
.../carlton/options/cuffease/readme.mdx | 0
.../carlton/options/cufflength/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../carlton/options/frontoverlap/readme.mdx | 0
.../options/innerpocketdepth/readme.mdx | 0
.../options/innerpocketplacement/readme.mdx | 0
.../options/innerpocketweltheight/readme.mdx | 0
.../options/innerpocketwidth/readme.mdx | 0
.../carlton/options/lapelreduction/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../designs/carlton/options/length/length.svg | 0
.../designs/carlton/options/length/readme.mdx | 0
.../pocketflapradius/pocketflapradius.svg | 0
.../options/pocketflapradius/pocketradius.svg | 0
.../options/pocketflapradius/readme.mdx | 0
.../carlton/options/pocketheight/readme.mdx | 0
.../pocketplacementhorizontal/readme.mdx | 0
.../pocketplacementvertical/readme.mdx | 0
.../options/pocketradius/pocketradius.svg | 0
.../carlton/options/pocketradius/readme.mdx | 0
.../carlton/options/pocketwidth/readme.mdx | 0
.../docs/designs/carlton/options/readme.mdx | 482 +
.../carlton}/options/s3armhole/readme.mdx | 0
.../carlton}/options/s3collar/readme.mdx | 0
.../carlton/options/seatease/readme.mdx | 0
.../carlton/options/seatease/seatease.svg | 0
.../carlton/options/shoulderease/readme.mdx | 0
.../options/shoulderease/shoulderease.svg | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../carlton/options/sleevebend/readme.mdx | 0
.../carlton/options/sleevebend/sleevebend.svg | 0
.../carlton/options/sleevecapease/readme.mdx | 0
.../options/sleevecapease/sleevecapease.svg | 0
.../options/sleevecapheight/readme.mdx | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../carlton/options/waistease/readme.mdx | 0
.../carlton/options/waistease/waistease.svg | 0
.../org/docs/docs/designs/carlton/readme.mdx | 186 +
.../org/docs/docs/designs/cathrin/_notes.mdx | 14 +
.../designs/cathrin/instructions/readme.mdx | 0
.../designs/cathrin/instructions/step01.png | Bin
.../designs/cathrin/instructions/step02.png | Bin
.../designs/cathrin/instructions/step03.png | Bin
.../designs/cathrin/instructions/step04.png | Bin
.../designs/cathrin/instructions/step05.png | Bin
.../designs/cathrin/instructions/step06.png | Bin
.../designs/cathrin/instructions/step06b.png | Bin
.../designs/cathrin/instructions/step07.png | Bin
.../designs/cathrin/instructions/step07b.png | Bin
.../cathrin/options/backdrop/backdrop.svg | 0
.../cathrin/options/backdrop/readme.mdx | 0
.../options/backopening/backopening.svg | 0
.../cathrin/options/backopening/readme.mdx | 0
.../cathrin/options/backrise/backrise.svg | 0
.../cathrin/options/backrise/readme.mdx | 0
.../cathrin/options/frontdrop/frontdrop.svg | 0
.../cathrin/options/frontdrop/readme.mdx | 0
.../cathrin/options/frontrise/frontrise.svg | 0
.../cathrin/options/frontrise/readme.mdx | 0
.../cathrin/options/hiprise/hiprise.svg | 0
.../cathrin/options/hiprise/readme.mdx | 0
.../designs/cathrin/options/panels/panels.svg | 0
.../designs/cathrin/options/panels/readme.mdx | 0
.../docs/designs/cathrin/options/readme.mdx | 98 +
.../cathrin/options/waistreduction/readme.mdx | 0
.../options/waistreduction/waistreduction.svg | 0
.../org/docs/docs/designs/cathrin/readme.mdx | 79 +
.../org/docs/docs/designs/charlie/_notes.mdx | 17 +
.../AttachExtensionToRightLeg.svg | 0
.../charlie/instructions/AttachFacing.svg | 0
.../instructions/AttachFacingToZipper.svg | 0
.../instructions/AttachZipperToExtension.svg | 0
.../charlie/instructions/BasteZipper.svg | 0
.../charlie/instructions/CloseCrossseam.svg | 0
.../instructions/CloseExtensionAndSerge.svg | 0
.../charlie/instructions/FinishFacing.svg | 0
.../charlie/instructions/FinishLoopEdges.svg | 0
.../charlie/instructions/SewTheJSeam.svg | 0
.../instructions/StitchAndCutLoops.svg | 0
.../designs/charlie/instructions/readme.mdx | 0
.../designs/charlie/instructions/step01.svg | 0
.../designs/charlie/instructions/step03.svg | 0
.../designs/charlie/instructions/step04a.svg | 0
.../designs/charlie/instructions/step04b.svg | 0
.../designs/charlie/instructions/step04c.svg | 0
.../designs/charlie/instructions/step04d.svg | 0
.../designs/charlie/instructions/step05a.svg | 0
.../designs/charlie/instructions/step05b.svg | 0
.../designs/charlie/instructions/step06a.svg | 0
.../designs/charlie/instructions/step06b.svg | 0
.../designs/charlie/instructions/step07.svg | 0
.../designs/charlie/instructions/step08.svg | 0
.../options/backpocketdepth/readme.mdx | 0
.../options/backpocketfacing/readme.mdx | 0
.../backpockethorizontalplacement/readme.mdx | 0
.../backpocketverticalplacement/readme.mdx | 0
.../options/backpocketwidth/readme.mdx | 0
.../charlie/options/beltloops/readme.mdx | 0
.../options/crossseamcurveangle/readme.mdx | 0
.../options/crossseamcurvebend/readme.mdx | 0
.../options/crossseamcurvestart/readme.mdx | 0
.../charlie/options/crotchdrop/readme.mdx | 0
.../options/crotchseamcurveangle/readme.mdx | 0
.../options/crotchseamcurvebend/readme.mdx | 0
.../options/crotchseamcurvestart/readme.mdx | 0
.../charlie/options/flycurve/readme.mdx | 0
.../charlie/options/flylength/readme.mdx | 0
.../charlie/options/flywidth/readme.mdx | 0
.../options/frontpocketdepth/readme.mdx | 0
.../options/frontpocketfacing/readme.mdx | 0
.../options/frontpocketslantbend/readme.mdx | 0
.../options/frontpocketslantdepth/readme.mdx | 0
.../options/frontpocketslantround/readme.mdx | 0
.../options/frontpocketslantwidth/readme.mdx | 0
.../options/frontpocketwidth/readme.mdx | 0
.../options/grainlineposition/readme.mdx | 0
.../charlie/options/kneeease/readme.mdx | 0
.../charlie/options/legbalance/readme.mdx | 0
.../charlie/options/lengthbonus/readme.mdx | 0
.../docs/designs/charlie/options/readme.mdx | 399 +
.../charlie/options/seatease/readme.mdx | 0
.../options/usewaistanglefor/readme.mdx | 0
.../charlie/options/waistangle/readme.mdx | 0
.../charlie/options/waistbalance/readme.mdx | 0
.../charlie/options/waistbandcurve/readme.mdx | 0
.../charlie/options/waistbandwidth/readme.mdx | 0
.../charlie/options/waistease/readme.mdx | 0
.../charlie/options/waistheight/readme.mdx | 0
.../org/docs/docs/designs/charlie/readme.mdx | 81 +
.../docs/docs/designs/cornelius/_notes.mdx | 21 +
.../designs/cornelius/instructions/readme.mdx | 0
.../options/bandbelowknee/readme.mdx | 0
.../cornelius/options/cuffstyle/readme.mdx | 0
.../cornelius/options/cuffwidth/readme.mdx | 0
.../cornelius/options/flywidth/readme.mdx | 0
.../cornelius/options/fullness/readme.mdx | 0
.../cornelius/options/kneetobelow/readme.mdx | 0
.../docs/designs/cornelius/options/readme.mdx | 111 +
.../cornelius/options/ventlength/readme.mdx | 0
.../options/waistbandbelowwaist/readme.mdx | 0
.../options/waistreduction/readme.mdx | 0
.../docs/docs/designs/cornelius/readme.mdx | 118 +
sites/org/docs/docs/designs/diana/_notes.mdx | 16 +
.../designs/diana/instructions/neckline.jpg | Bin
.../designs/diana/instructions/readme.mdx | 0
.../diana/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../diana/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../diana/options/bicepsease/bicepsease.svg | 0
.../diana/options/bicepsease/readme.mdx | 0
.../diana/options/chestease/chestease.svg | 0
.../diana/options/chestease/readme.mdx | 0
.../designs/diana/options/cuffease/readme.mdx | 0
.../diana/options/draftforhighbust/readme.mdx | 7 +
.../diana/options/drapeangle/drapeangle.svg | 0
.../diana/options/drapeangle/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../diana/options/hipsease/hipsease.svg | 0
.../designs/diana/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../diana/options/lengthbonus/lengthbonus.svg | 0
.../diana/options/lengthbonus/readme.mdx | 0
.../docs/designs/diana/options/readme.mdx | 403 +
.../diana/options/shoulderease/hipsease.svg | 0
.../diana/options/shoulderease/readme.mdx | 0
.../options/shoulderease/shoulderease.svg | 0
.../options/shoulderseamlength/readme.mdx | 0
.../shoulderseamlength/shoulderseamlength.svg | 0
.../docs/designs/diana/options/sleevecap.svg | 0
.../designs/diana/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../diana/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../diana/options/sleevecapinflection.svg | 0
.../options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../designs/diana/options/sleevecapspread.svg | 0
.../designs/diana/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../options/sleevelengthbonus/hipsease.svg | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/shoulderease.svg | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 0
.../diana/options/waistease/hipsease.svg | 0
.../diana/options/waistease/readme.mdx | 0
.../diana/options/waistease/waistease.svg | 0
sites/org/docs/docs/designs/diana/readme.mdx | 48 +
.../org/docs/docs/designs/florence/_notes.mdx | 16 +
.../designs/florence/instructions/readme.mdx | 0
.../designs/florence/instructions/step1.svg | 0
.../designs/florence/instructions/step3.svg | 0
.../designs/florence/instructions/step6.svg | 0
.../designs/florence/options/curve/curve.svg | 0
.../designs/florence/options/curve/readme.mdx | 0
.../florence/options/height/height.svg | 0
.../florence/options/height/readme.mdx | 0
.../florence/options/length/length.svg | 0
.../florence/options/length/readme.mdx | 0
.../docs/designs/florence/options/readme.mdx | 41 +
.../org/docs/docs/designs/florence/readme.mdx | 58 +
.../org/docs/docs/designs/florent/_notes.mdx | 17 +
.../designs/florent/instructions/finished.gif | Bin
.../designs/florent/instructions/readme.mdx | 0
.../designs/florent/instructions/step01.jpg | Bin
.../designs/florent/instructions/step02.jpg | Bin
.../designs/florent/instructions/step03.jpg | Bin
.../designs/florent/instructions/step04.jpg | Bin
.../designs/florent/instructions/step05.jpg | Bin
.../designs/florent/instructions/step06.jpg | Bin
.../designs/florent/instructions/step07.jpg | Bin
.../designs/florent/instructions/step08.jpg | Bin
.../designs/florent/instructions/step09.jpg | Bin
.../designs/florent/instructions/step10.jpg | Bin
.../designs/florent/instructions/step11.jpg | Bin
.../designs/florent/instructions/step12.jpg | Bin
.../designs/florent/instructions/step13.jpg | Bin
.../designs/florent/instructions/step14.jpg | Bin
.../designs/florent/instructions/step15.jpg | Bin
.../designs/florent/instructions/step16.svg | 0
.../florent/options/headease/readme.mdx | 0
.../docs/designs/florent/options/readme.mdx | 19 +
.../org/docs/docs/designs/florent/readme.mdx | 71 +
sites/org/docs/docs/designs/gozer/_notes.mdx | 8 +
.../designs/gozer/instructions/readme.mdx | 0
sites/org/docs/docs/designs/gozer/readme.mdx | 36 +
sites/org/docs/docs/designs/hi/_notes.mdx | 26 +
.../docs/designs/hi/instructions/readme.mdx | 0
.../designs/hi/options/aggressive/readme.mdx | 0
.../docs/designs/hi/options/hungry/readme.mdx | 0
.../hi/options/nosepointiness/readme.mdx | 0
.../docs/docs/designs/hi/options/readme.mdx | 50 +
.../docs/designs/hi/options/size/readme.mdx | 0
sites/org/docs/docs/designs/hi/readme.mdx | 85 +
sites/org/docs/docs/designs/holmes/_notes.mdx | 15 +
.../designs/holmes/instructions/readme.mdx | 0
.../holmes/options/buttonhole/readme.mdx | 0
.../holmes/options/earlength/readme.mdx | 0
.../holmes/options/earwidth/readme.mdx | 0
.../designs/holmes/options/gores/gores.svg | 0
.../designs/holmes/options/gores/readme.mdx | 0
.../holmes/options/headease/readme.mdx | 0
.../options/lengthratio/lengthratio.svg | 0
.../holmes/options/lengthratio/readme.mdx | 0
.../docs/designs/holmes/options/readme.mdx | 107 +
.../holmes/options/visorangle/brimangle.svg | 0
.../holmes/options/visorangle/readme.mdx | 0
.../holmes/options/visorlength/readme.mdx | 0
.../holmes/options/visorwidth/brimwidth.svg | 0
.../holmes/options/visorwidth/readme.mdx | 0
sites/org/docs/docs/designs/holmes/readme.mdx | 147 +
.../docs/docs/designs/hortensia/_notes.mdx | 5 +
.../designs/hortensia/instructions/readme.mdx | 0
.../hortensia/options/handlewidth/readme.mdx | 0
.../docs/designs/hortensia/options/readme.mdx | 59 +
.../designs/hortensia/options/size/readme.mdx | 0
.../hortensia/options/straplength/readme.mdx | 0
.../hortensia/options/zippersize/readme.mdx | 0
.../docs/docs/designs/hortensia/readme.mdx | 95 +
sites/org/docs/docs/designs/huey/_notes.mdx | 7 +
.../docs/designs/huey/instructions/layout.svg | 0
.../docs/designs/huey/instructions/readme.mdx | 0
.../huey/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../huey/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../huey/options/backneckcutout/readme.mdx | 0
.../huey/options/bicepsease/readme.mdx | 0
.../designs/huey/options/chestease/readme.mdx | 0
.../huey/options/collarease/readme.mdx | 0
.../designs/huey/options/cuffease/readme.mdx | 0
.../huey}/options/draftforhighbust/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../huey/options/hipsease/hipsease.svg | 0
.../designs/huey/options/hipsease/readme.mdx | 0
.../huey/options/hoodangle/hoodangle.svg | 0
.../designs/huey/options/hoodangle/readme.mdx | 0
.../huey/options/hoodclosure/hoodclosure.svg | 0
.../huey/options/hoodclosure/readme.mdx | 0
.../huey/options/hoodcutback/hoodcutback.svg | 0
.../huey/options/hoodcutback/readme.mdx | 0
.../huey/options/hooddepth/hooddepth.svg | 0
.../designs/huey/options/hooddepth/readme.mdx | 0
.../huey/options/hoodheight/hoodheight.svg | 0
.../huey/options/hoodheight/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../huey/options/lengthbonus/readme.mdx | 0
.../designs/huey/options/pocket/pocket.svg | 0
.../designs/huey/options/pocket/readme.mdx | 0
.../options/pocketheight/pocketheight.svg | 0
.../huey/options/pocketheight/readme.mdx | 0
.../huey/options/pocketopening/readme.mdx | 0
.../huey/options/pocketwidth/pocketwidth.svg | 0
.../huey/options/pocketwidth/readme.mdx | 0
.../docs/docs/designs/huey/options/readme.mdx | 554 +
.../designs/huey/options/ribbing/readme.mdx | 0
.../designs/huey/options/ribbing/ribbing.svg | 0
.../huey/options/ribbingheight/readme.mdx | 0
.../options/ribbingheight/ribbingheight.svg | 0
.../huey/options/ribbingstretch/readme.mdx | 0
.../options/ribbingstretch/ribbingstretch.svg | 0
.../huey}/options/s3armhole/readme.mdx | 0
.../designs/huey}/options/s3collar/readme.mdx | 0
.../huey/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../docs/designs/huey/options/sleevecap.svg | 0
.../designs/huey/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../huey/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../huey/options/sleevecapinflection.svg | 0
.../huey/options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../huey/options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../huey/options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../huey/options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../designs/huey/options/sleevecapspread.svg | 0
.../designs/huey/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../huey/options/sleevelengthbonus/readme.mdx | 0
.../options/sleevewidthguarantee/readme.mdx | 0
sites/org/docs/docs/designs/huey/readme.mdx | 63 +
sites/org/docs/docs/designs/hugo/_notes.mdx | 7 +
.../docs/designs/hugo/instructions/readme.mdx | 0
.../hugo/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../hugo/options/armholedepth/readme.mdx | 0
.../hugo/options/backneckcutout/readme.mdx | 0
.../hugo/options/bicepsease/readme.mdx | 0
.../designs/hugo/options/chestease/readme.mdx | 0
.../designs/hugo/options/cuffease/readme.mdx | 0
.../hugo}/options/draftforhighbust/readme.mdx | 0
.../designs/hugo/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../hugo/options/lengthbonus/readme.mdx | 0
.../hugo/options/pocketwidth/readme.mdx | 0
.../docs/docs/designs/hugo/options/readme.mdx | 161 +
.../hugo/options/ribbingheight/readme.mdx | 0
.../hugo/options/ribbingstretch/readme.mdx | 0
.../options/ribbingstretch/ribbingstretch.svg | 0
.../hugo/options/sleevelengthbonus/readme.mdx | 0
sites/org/docs/docs/designs/hugo/readme.mdx | 71 +
sites/org/docs/docs/designs/jaeger/_notes.mdx | 12 +
.../docs/designs/jaeger/cuttingCaveat.svg | 0
.../instructions/attachChestPocketBag.svg | 0
.../instructions/attachChestPocketWelt.svg | 0
.../jaeger/instructions/basteChestPocket.svg | 0
.../designs/jaeger/instructions/closeBack.svg | 0
.../jaeger/instructions/closeFrontDarts.svg | 0
.../jaeger/instructions/closeShoulders.svg | 0
.../jaeger/instructions/closeSides.svg | 0
.../jaeger/instructions/collarCuts.svg | 44 +
.../jaeger/instructions/collarMarkings.svg | 12 +
.../jaeger/instructions/collarWithCanvas.svg | 5 +
.../jaeger/instructions/finishChestPocket.svg | 0
.../instructions/foldChestPocketWelt.svg | 0
.../designs/jaeger/instructions/front.svg | 0
.../jaeger/instructions/padAndTape.svg | 0
.../jaeger/instructions/prepareCanvas.svg | 0
.../jaeger/instructions/pressChestPocket.svg | 0
.../designs/jaeger/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../jaeger/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../jaeger/options/backneckcutout/readme.mdx | 0
.../jaeger/options/backvent/backvent.svg | 0
.../jaeger/options/backvent/readme.mdx | 0
.../options/backventlength/backventlength.svg | 0
.../jaeger/options/backventlength/readme.mdx | 0
.../jaeger/options/bicepsease/readme.mdx | 0
.../jaeger/options/buttonlength/readme.mdx | 0
.../designs/jaeger/options/buttons/readme.mdx | 0
.../options/centerbackdart/centerbackdart.svg | 0
.../jaeger/options/centerbackdart/readme.mdx | 0
.../centerfronthemdrop/centerfronthemdrop.svg | 0
.../options/centerfronthemdrop/readme.mdx | 0
.../jaeger/options/chestease/chestease.svg | 0
.../jaeger/options/chestease/readme.mdx | 0
.../chestpocketangle/chestpocketangle.svg | 0
.../options/chestpocketangle/readme.mdx | 0
.../options/chestpocketdepth/readme.mdx | 0
.../chestpocketplacement.svg | 0
.../options/chestpocketplacement/readme.mdx | 0
.../chestpocketweltsize.svg | 0
.../options/chestpocketweltsize/readme.mdx | 0
.../chestpocketwidth/chestpocketwidth.svg | 0
.../options/chestpocketwidth/readme.mdx | 0
.../options/chestshaping/chestshaping.svg | 0
.../jaeger/options/chestshaping/readme.mdx | 0
.../jaeger/options/collarease/readme.mdx | 0
.../options/collarheight/collarheight.svg | 0
.../jaeger/options/collarheight/readme.mdx | 0
.../collarnotchangle/collarnotchangle.svg | 0
.../options/collarnotchangle/readme.mdx | 0
.../collarnotchdepth/collarnotchdepth.svg | 0
.../options/collarnotchdepth/readme.mdx | 0
.../collarnotchreturn/collarnotchreturn.svg | 0
.../options/collarnotchreturn/readme.mdx | 0
.../jaeger/options/collarroll/readme.mdx | 0
.../jaeger/options/collarspread/readme.mdx | 0
.../jaeger/options/cuffease/cuffease.svg | 0
.../jaeger/options/cuffease/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../frontcutawayangle/frontcutawayangle.svg | 0
.../options/frontcutawayangle/readme.mdx | 0
.../jaeger/options/frontcutawayend/readme.mdx | 0
.../frontcutawaystart/frontcutawaystart.svg | 0
.../options/frontcutawaystart/readme.mdx | 0
.../frontdartplacement/frontdartplacement.svg | 0
.../options/frontdartplacement/readme.mdx | 0
.../jaeger/options/frontoverlap/readme.mdx | 0
.../frontpocketdepth/frontpocketdepth.svg | 0
.../options/frontpocketdepth/readme.mdx | 0
.../frontpocketplacement.svg | 0
.../options/frontpocketplacement/readme.mdx | 0
.../options/frontpocketradius/readme.mdx | 0
.../frontpocketwidth/frontpocketwidth.svg | 0
.../options/frontpocketwidth/readme.mdx | 0
.../jaeger/options/hemradius/readme.mdx | 0
.../jaeger/options/hipsease/hipsease.svg | 0
.../jaeger/options/hipsease/readme.mdx | 0
.../options/innerpocketdepth/readme.mdx | 0
.../options/innerpocketplacement/readme.mdx | 0
.../options/innerpocketweltheight/readme.mdx | 0
.../options/innerpocketwidth/readme.mdx | 0
.../jaeger/options/lapelreduction/readme.mdx | 0
.../jaeger/options/lapelstart/lapelstart.svg | 0
.../jaeger/options/lapelstart/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../options/lengthbonus/lengthbonus.svg | 0
.../jaeger/options/lengthbonus/readme.mdx | 0
.../jaeger/options/pocketfoldover/readme.mdx | 0
.../docs/designs/jaeger/options/readme.mdx | 661 +
.../options/rolllinecollarheight/readme.mdx | 0
.../rolllinecollarheight.svg | 0
.../jaeger/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../shoulderslopereduction.svg | 0
.../options/sidefrontplacement/readme.mdx | 0
.../sidefrontplacement/sidefrontplacement.svg | 0
.../jaeger/options/sleevebend/readme.mdx | 0
.../jaeger/options/sleevebend/sleevebend.svg | 0
.../jaeger/options/sleevecapease/readme.mdx | 0
.../options/sleevecapease/sleevecapease.svg | 0
.../jaeger/options/sleevecapheight/readme.mdx | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleeveventlength/readme.mdx | 0
.../jaeger/options/sleeveventwidth/readme.mdx | 0
.../jaeger/options/waistease/readme.mdx | 0
.../jaeger/options/waistease/waistease.svg | 0
sites/org/docs/docs/designs/jaeger/readme.mdx | 148 +
sites/org/docs/docs/designs/jane/_notes.mdx | 17 +
.../docs/designs/jane/instructions/readme.mdx | 0
.../jane/options/bicepsease/readme.mdx | 0
.../designs/jane/options/bodyease/readme.mdx | 0
.../jane/options/gussetsize/readme.mdx | 0
.../jane/options/neckdepthback/readme.mdx | 0
.../jane/options/neckdepthfront/readme.mdx | 0
.../designs/jane/options/neckwidth/readme.mdx | 0
.../docs/docs/designs/jane/options/readme.mdx | 97 +
.../jane/options/shiftlength/readme.mdx | 0
.../jane/options/sleevelength/readme.mdx | 0
sites/org/docs/docs/designs/jane/readme.mdx | 126 +
sites/org/docs/docs/designs/lily/_notes.mdx | 10 +
.../docs/designs/lily/instructions/readme.mdx | 0
.../options/crossseamcurveangle/readme.mdx | 0
.../options/crossseamcurvebend/readme.mdx | 0
.../options/crossseamcurvestart/readme.mdx | 0
.../lily/options/crotchdrop/readme.mdx | 0
.../options/crotchseamcurveangle/readme.mdx | 0
.../options/crotchseamcurvebend/readme.mdx | 0
.../options/crotchseamcurvestart/readme.mdx | 0
.../lily/options/fabricstretch/readme.mdx | 0
.../designs/lily/options/fitguides/readme.mdx | 0
.../lily/options/grainlineposition/readme.mdx | 0
.../designs/lily/options/kneeease/readme.mdx | 0
.../lily/options/lengthreduction/readme.mdx | 0
.../docs/docs/designs/lily/options/readme.mdx | 208 +
.../designs/lily/options/seatease/readme.mdx | 0
.../lily/options/usewaistanglefor/readme.mdx | 0
.../lily/options/waistangle/readme.mdx | 0
.../lily/options/waistbandwidth/readme.mdx | 0
.../designs/lily/options/waistease/readme.mdx | 0
.../lily/options/waistheight/readme.mdx | 0
sites/org/docs/docs/designs/lily/readme.mdx | 43 +
sites/org/docs/docs/designs/lucy/_notes.mdx | 33 +
.../docs/designs/lucy/instructions/readme.mdx | 0
.../docs/designs/lucy/options/edge/readme.mdx | 0
.../designs/lucy/options/length/readme.mdx | 0
.../docs/docs/designs/lucy/options/readme.mdx | 41 +
.../designs/lucy/options/width/readme.mdx | 0
sites/org/docs/docs/designs/lucy/readme.mdx | 71 +
sites/org/docs/docs/designs/lumina/_notes.mdx | 22 +
.../designs/lumina/instructions/readme.mdx | 0
.../designs/lumina/options/ease/readme.mdx | 0
.../lumina/options/fixedsidepanel/readme.mdx | 0
.../designs/lumina/options/length/readme.mdx | 0
.../options/lowerwaistbandback/readme.mdx | 0
.../designs/lumina/options/pocket/readme.mdx | 0
.../lumina/options/pocketdepth/readme.mdx | 0
.../docs/designs/lumina/options/readme.mdx | 135 +
.../lumina/options/sidepanel/readme.mdx | 0
.../lumina/options/smoothing/readme.mdx | 0
.../lumina/options/waistband/readme.mdx | 0
.../lumina/options/waistbandsize/readme.mdx | 0
.../lumina/options/waistlowering/readme.mdx | 0
.../lumina/options/waistreduction/readme.mdx | 0
sites/org/docs/docs/designs/lumina/readme.mdx | 71 +
sites/org/docs/docs/designs/lumira/_notes.mdx | 19 +
.../designs/lumira/instructions/readme.mdx | 0
.../lumira/options/backgusset/readme.mdx | 0
.../lumira/options/backgussetwidth/readme.mdx | 0
.../lumira/options/buttlift/readme.mdx | 0
.../lumira/options/cyclingchamois/readme.mdx | 0
.../designs/lumira/options/ease/readme.mdx | 0
.../lumira/options/frontbulge/readme.mdx | 0
.../lumira/options/frontbulgesize/readme.mdx | 0
.../options/frontgussetlength/readme.mdx | 0
.../lumira/options/gussetwidth/readme.mdx | 0
.../lumira/options/leglength/readme.mdx | 0
.../docs/designs/lumira/options/readme.mdx | 156 +
.../lumira/options/waistband/readme.mdx | 0
.../lumira/options/waistbandsize/readme.mdx | 0
.../lumira/options/waistlowering/readme.mdx | 0
.../lumira/options/waistreduction/readme.mdx | 0
sites/org/docs/docs/designs/lumira/readme.mdx | 71 +
.../org/docs/docs/designs/lunetius/_notes.mdx | 43 +
.../designs/lunetius/instructions/readme.mdx | 0
.../lunetius/options/length/readme.mdx | 0
.../lunetius/options/lengthratio/readme.mdx | 0
.../docs/designs/lunetius/options/readme.mdx | 45 +
.../lunetius/options/widthratio/readme.mdx | 0
.../org/docs/docs/designs/lunetius/readme.mdx | 22 +
sites/org/docs/docs/designs/noble/_notes.mdx | 9 +
.../designs/noble/instructions/readme.mdx | 0
.../options/armholedartposition/readme.mdx | 0
.../noble/options/armholedepth/readme.mdx | 0
.../options/backarmholecurvature/readme.mdx | 0
.../options/backarmholepitchdepth/readme.mdx | 0
.../noble/options/backarmholeslant/readme.mdx | 0
.../noble/options/backdartheight/readme.mdx | 0
.../noble/options/backhemslope/readme.mdx | 0
.../noble/options/backneckcutout/readme.mdx | 0
.../noble/options/bustspanease/readme.mdx | 0
.../noble/options/chestease/readme.mdx | 0
.../noble/options/dartposition/readme.mdx | 0
.../options/frontarmholecurvature/readme.mdx | 0
.../options/frontarmholepitchdepth/readme.mdx | 0
.../options/frontshoulderwidth/readme.mdx | 0
.../options/fullchesteasereduction/readme.mdx | 0
.../noble/options/highbustwidth/readme.mdx | 0
.../docs/designs/noble/options/readme.mdx | 266 +
.../options/shoulderdartcurvature/readme.mdx | 0
.../options/shoulderdartposition/readme.mdx | 0
.../options/shouldertoshoulderease/readme.mdx | 0
.../noble/options/upperdartlength/readme.mdx | 0
.../noble/options/waistdartlength/readme.mdx | 0
.../options/waistdartposition/readme.mdx | 0
.../noble/options/waistease/readme.mdx | 0
sites/org/docs/docs/designs/noble/readme.mdx | 69 +
.../docs/docs/designs/octoplushy/_notes.mdx | 19 +
.../octoplushy/instructions/readme.mdx | 0
.../octoplushy/options/armlength/readme.mdx | 0
.../octoplushy/options/armtaper/readme.mdx | 0
.../octoplushy/options/armwidth/readme.mdx | 0
.../options/bottomarmreduction/readme.mdx | 0
.../bottomarmreductionplushy/readme.mdx | 0
.../options/bottomtoparmratio/readme.mdx | 0
.../octoplushy/options/neckwidth/readme.mdx | 0
.../designs/octoplushy/options/readme.mdx | 110 +
.../octoplushy/options/size/readme.mdx | 0
.../octoplushy/options/type/readme.mdx | 0
.../docs/docs/designs/octoplushy/readme.mdx | 96 +
sites/org/docs/docs/designs/onyx/_notes.mdx | 32 +
.../docs/designs/onyx/instructions/readme.mdx | 0
.../onyx/options/armpitease/readme.mdx | 0
.../onyx/options/backonfold/readme.mdx | 0
.../onyx/options/centerseamease/readme.mdx | 0
.../designs/onyx/options/chestease/readme.mdx | 0
.../onyx/options/crotchgussetwidth/readme.mdx | 0
.../onyx/options/frontonfold/readme.mdx | 0
.../designs/onyx/options/hipsease/readme.mdx | 0
.../designs/onyx/options/hooddepth/readme.mdx | 0
.../onyx/options/hoodfrontbonus/readme.mdx | 0
.../onyx/options/hoodfrontdip/readme.mdx | 0
.../options/hoodfrontpiecesize/readme.mdx | 0
.../onyx/options/hoodheight/readme.mdx | 0
.../designs/onyx/options/hoodhem/readme.mdx | 0
.../designs/onyx/options/leghem/readme.mdx | 0
.../onyx/options/leghemease/readme.mdx | 0
.../designs/onyx/options/leglength/readme.mdx | 0
.../onyx/options/legribbing/readme.mdx | 0
.../onyx/options/legribbinglength/readme.mdx | 0
.../onyx/options/legribbingwidth/readme.mdx | 0
.../onyx/options/legtaperposition/readme.mdx | 0
.../onyx/options/neckbalance/readme.mdx | 0
.../onyx/options/neckbandlength/readme.mdx | 0
.../onyx/options/neckbandwidth/readme.mdx | 0
.../designs/onyx/options/neckease/readme.mdx | 0
.../onyx/options/neckguardlength/readme.mdx | 0
.../designs/onyx/options/neckstyle/readme.mdx | 0
.../onyx/options/outseamease/readme.mdx | 0
.../onyx/options/raglanscooplength/readme.mdx | 0
.../options/raglanscoopmagnitude/readme.mdx | 0
.../docs/docs/designs/onyx/options/readme.mdx | 522 +
.../designs/onyx/options/seatease/readme.mdx | 0
.../designs/onyx/options/skirt/readme.mdx | 0
.../designs/onyx/options/skirthem/readme.mdx | 0
.../onyx/options/skirtlength/readme.mdx | 0
.../onyx/options/skirtwaistband/readme.mdx | 0
.../onyx/options/skirtwidth/readme.mdx | 0
.../onyx/options/sleeveease/readme.mdx | 0
.../designs/onyx/options/sleevehem/readme.mdx | 0
.../onyx/options/sleevelength/readme.mdx | 0
.../onyx/options/sleeveribbing/readme.mdx | 0
.../options/sleeveribbinglength/readme.mdx | 0
.../options/sleeveribbingwidth/readme.mdx | 0
.../onyx/options/upperlegease/readme.mdx | 0
.../designs/onyx/options/waistease/readme.mdx | 0
.../designs/onyx/options/wristease/readme.mdx | 0
.../onyx/options/zipperguardwidth/readme.mdx | 0
.../onyx/options/zipperlength/readme.mdx | 0
.../onyx/options/zipperposition/readme.mdx | 0
sites/org/docs/docs/designs/onyx/readme.mdx | 71 +
sites/org/docs/docs/designs/opal/_notes.mdx | 16 +
.../docs/designs/opal/instructions/readme.mdx | 0
.../opal/options/backbibbaseangle/readme.mdx | 0
.../opal/options/backbibbasecurve/readme.mdx | 0
.../options/backbibhexagonheight/readme.mdx | 0
.../backbibhexagonsideheight/readme.mdx | 0
.../backbibhexagonverticalposition/readme.mdx | 0
.../options/backbibhexagonwidth/readme.mdx | 0
.../designs/opal/options/bibheight/readme.mdx | 0
.../opal/options/bibplacketlayers/readme.mdx | 0
.../opal/options/bibplacketwidth/readme.mdx | 0
.../opal/options/bibpocketonfold/readme.mdx | 0
.../opal/options/bibwaistdrop/readme.mdx | 0
.../designs/opal/options/bibwidth/readme.mdx | 0
.../options/crossseamcurveangle/readme.mdx | 0
.../options/crossseamcurvebend/readme.mdx | 0
.../options/crossseamcurvestart/readme.mdx | 0
.../opal/options/crotchdrop/readme.mdx | 0
.../opal/options/crotchease/readme.mdx | 0
.../opal/options/crotchforkbalance/readme.mdx | 0
.../options/crotchseamcurveangle/readme.mdx | 0
.../options/crotchseamcurvebend/readme.mdx | 0
.../options/crotchseamcurvestart/readme.mdx | 0
.../opal/options/hammerloop/readme.mdx | 0
.../opal/options/hammerloopcornerx/readme.mdx | 0
.../opal/options/hammerloopcornery/readme.mdx | 0
.../opal/options/hammerloopcurve/readme.mdx | 0
.../options/hammerloopfirstfold/readme.mdx | 0
.../opal/options/hammerloopoutseam/readme.mdx | 0
.../options/hammerloopsecondfold/readme.mdx | 0
.../opal/options/hammerloopwidth/readme.mdx | 0
.../opal/options/hemallowance/readme.mdx | 0
.../opal/options/legbalance/readme.mdx | 0
.../opal/options/leghemallowance/readme.mdx | 0
.../opal/options/leghemease/readme.mdx | 0
.../designs/opal/options/leglength/readme.mdx | 0
.../opal/options/outseamheight/readme.mdx | 0
.../opal/options/pocketback/readme.mdx | 0
.../options/pocketbackcornerheight/readme.mdx | 0
.../options/pocketbackcornerwidth/readme.mdx | 0
.../opal/options/pocketbackheight/readme.mdx | 0
.../options/pocketbackpositionx/readme.mdx | 0
.../options/pocketbackpositiony/readme.mdx | 0
.../opal/options/pocketbackwidth/readme.mdx | 0
.../designs/opal/options/pocketbib/readme.mdx | 0
.../options/pocketbibfeaturecurve/readme.mdx | 0
.../options/pocketbibfeatureheight/readme.mdx | 0
.../options/pocketbibfeaturewidth/readme.mdx | 0
.../opal/options/pocketbibheight/readme.mdx | 0
.../opal/options/pocketbibonfold/readme.mdx | 0
.../opal/options/pocketbibstyle/readme.mdx | 0
.../pocketbibverticalposition/readme.mdx | 0
.../opal/options/pocketbibwidth/readme.mdx | 0
.../opal/options/pocketcarpenter/readme.mdx | 0
.../pocketcarpenteranchorwidth/readme.mdx | 0
.../options/pocketcarpenteranchorx/readme.mdx | 0
.../options/pocketcarpenteranchory/readme.mdx | 0
.../options/pocketcarpenterextra/readme.mdx | 0
.../pocketcarpenterextraheight/readme.mdx | 0
.../options/pocketcarpenterheight/readme.mdx | 0
.../pocketcarpenteropeningheight/readme.mdx | 0
.../opal/options/pocketslash/readme.mdx | 0
.../opal/options/pocketslashheight/readme.mdx | 0
.../pocketslashopeningcurve/readme.mdx | 0
.../pocketslashopeningheight/readme.mdx | 0
.../pocketslashopeningwidth/readme.mdx | 0
.../pocketslashshieldoverlap/readme.mdx | 0
.../opal/options/pocketslashwidth/readme.mdx | 0
.../docs/docs/designs/opal/options/readme.mdx | 859 +
.../opal/options/seatbalance/readme.mdx | 0
.../designs/opal/options/seatease/readme.mdx | 0
.../opal/options/straplength/readme.mdx | 0
.../opal/options/strapposition/readme.mdx | 0
.../opal/options/straptapercurve/readme.mdx | 0
.../options/straptaperposition/readme.mdx | 0
.../opal/options/strapwidth/readme.mdx | 0
.../opal/options/thighshape/readme.mdx | 0
.../opal/options/waistbalance/readme.mdx | 0
.../opal/options/waistbandlayers/readme.mdx | 0
.../opal/options/waistbandwidth/readme.mdx | 0
.../designs/opal/options/waistease/readme.mdx | 0
.../opal/options/waistposition/readme.mdx | 0
sites/org/docs/docs/designs/opal/readme.mdx | 66 +
sites/org/docs/docs/designs/otis/_notes.mdx | 19 +
.../docs/designs/otis/instructions/readme.mdx | 0
.../designs/otis/options/binding/readme.mdx | 0
.../docs/designs/otis/options/ease/readme.mdx | 0
.../docs/designs/otis/options/hem/readme.mdx | 0
.../docs/docs/designs/otis/options/readme.mdx | 66 +
.../otis/options/sleevetype/readme.mdx | 0
.../otis/options/snapplacket/readme.mdx | 0
sites/org/docs/docs/designs/otis/readme.mdx | 59 +
sites/org/docs/docs/designs/paco/_notes.mdx | 7 +
.../docs/designs/paco/instructions/readme.mdx | 0
.../docs/designs/paco/instructions/step02.jpg | Bin
.../docs/designs/paco/instructions/step02.svg | 0
.../designs/paco/instructions/step02b.jpg | Bin
.../docs/designs/paco/instructions/step03.jpg | Bin
.../docs/designs/paco/instructions/step03.svg | 0
.../designs/paco/instructions/step03b.jpg | Bin
.../designs/paco/instructions/step03b.svg | 0
.../designs/paco/instructions/step03c.jpg | Bin
.../designs/paco/instructions/step03c.svg | 0
.../docs/designs/paco/instructions/step04.jpg | Bin
.../designs/paco/instructions/step04b.jpg | Bin
.../docs/designs/paco/instructions/step05.jpg | Bin
.../docs/designs/paco/instructions/step05.svg | 0
.../designs/paco/instructions/step05b.jpg | Bin
.../designs/paco/instructions/step05c.jpg | Bin
.../docs/designs/paco/instructions/step06.jpg | Bin
.../docs/designs/paco/instructions/step06.svg | 0
.../designs/paco/instructions/step06b.jpg | Bin
.../designs/paco/instructions/step06c.jpg | Bin
.../docs/designs/paco/instructions/step07.jpg | Bin
.../docs/designs/paco/instructions/step07.svg | 0
.../docs/designs/paco/instructions/step08.svg | 0
.../docs/designs/paco/instructions/step09.svg | 0
.../docs/designs/paco/instructions/step10.svg | 0
.../docs/designs/paco/instructions/step11.jpg | Bin
.../docs/designs/paco/instructions/step11.svg | 0
.../docs/designs/paco/instructions/step12.jpg | Bin
.../docs/designs/paco/instructions/step12.svg | 0
.../docs/designs/paco/instructions/step13.svg | 0
.../designs/paco/instructions/step13b.svg | 0
.../designs/paco/instructions/step13c.svg | 0
.../designs/paco/instructions/step13d.jpg | Bin
.../designs/paco/instructions/step13e.jpg | Bin
.../docs/designs/paco/instructions/step14.jpg | Bin
.../docs/designs/paco/instructions/step14.svg | 0
.../docs/designs/paco/instructions/step15.jpg | Bin
.../docs/designs/paco/instructions/step15.svg | 0
.../docs/designs/paco/instructions/step16.svg | 0
.../designs/paco/instructions/step16b.svg | 0
.../designs/paco/instructions/step16c.svg | 0
.../designs/paco/instructions/step16d.jpg | Bin
.../designs/paco/instructions/step16e.jpg | Bin
.../designs/paco/instructions/step16f.jpg | Bin
.../docs/designs/paco/instructions/step17.svg | 0
.../docs/designs/paco/instructions/step18.svg | 0
.../paco/options/ankleelastic/readme.mdx | 0
.../paco/options/backpockets/readme.mdx | 0
.../options/crossseamcurveangle/readme.mdx | 0
.../options/crossseamcurvebend/readme.mdx | 0
.../options/crossseamcurvestart/readme.mdx | 0
.../paco/options/crotchdrop/readme.mdx | 0
.../options/crotchseamcurveangle/readme.mdx | 0
.../options/crotchseamcurvebend/readme.mdx | 0
.../options/crotchseamcurvestart/readme.mdx | 0
.../paco/options/elasticatedcuff/readme.mdx | 0
.../options/frontpocketflapsize/readme.mdx | 0
.../paco/options/frontpockets/readme.mdx | 0
.../paco/options/grainlineposition/readme.mdx | 0
.../designs/paco/options/heelease/readme.mdx | 0
.../paco/options/legbalance/readme.mdx | 0
.../paco/options/lengthbonus/readme.mdx | 0
.../docs/docs/designs/paco/options/readme.mdx | 251 +
.../designs/paco/options/seatease/readme.mdx | 0
.../paco/options/usewaistanglefor/readme.mdx | 0
.../paco/options/waistangle/readme.mdx | 0
.../paco/options/waistbalance/readme.mdx | 0
.../paco/options/waistbandwidth/readme.mdx | 0
.../designs/paco/options/waistease/readme.mdx | 0
.../paco/options/waistheight/readme.mdx | 0
sites/org/docs/docs/designs/paco/readme.mdx | 84 +
.../org/docs/docs/designs/penelope/_notes.mdx | 13 +
.../designs/penelope/instructions/readme.mdx | 0
.../options/backdartdepthfactor/readme.mdx | 0
.../penelope/options/backvent/readme.mdx | 0
.../options/backventlength/readme.mdx | 0
.../penelope/options/curveddarts/readme.mdx | 0
.../options/darttosideseamfactor/readme.mdx | 0
.../options/frontdartdepthfactor/readme.mdx | 0
.../designs/penelope/options/hem/readme.mdx | 0
.../penelope/options/hembonus/readme.mdx | 0
.../penelope/options/lengthbonus/readme.mdx | 0
.../penelope/options/nrofdarts/readme.mdx | 0
.../docs/designs/penelope/options/readme.mdx | 182 +
.../penelope/options/seatease/readme.mdx | 0
.../penelope/options/waistband/readme.mdx | 0
.../options/waistbandoverlap/readme.mdx | 0
.../options/waistbandwidth/readme.mdx | 0
.../penelope/options/waistease/readme.mdx | 0
.../options/zipperlocation/readme.mdx | 0
.../org/docs/docs/designs/penelope/readme.mdx | 85 +
sites/org/docs/docs/designs/readme.mdx | 21 +
sites/org/docs/docs/designs/sandy/_notes.mdx | 11 +
.../designs/sandy/instructions/readme.mdx | 0
.../sandy/options/circleratio/circleratio.svg | 0
.../sandy/options/circleratio/readme.mdx | 0
.../sandy/options/gathering/gathering.svg | 0
.../sandy/options/gathering/readme.mdx | 0
.../sandy/options/hemwidth/hemwidth.svg | 0
.../designs/sandy/options/hemwidth/readme.mdx | 0
.../sandy/options/lengthbonus/lengthbonus.svg | 0
.../sandy/options/lengthbonus/readme.mdx | 0
.../designs/sandy/options/panels/panels.svg | 0
.../designs/sandy/options/panels/readme.mdx | 0
.../docs/designs/sandy/options/readme.mdx | 119 +
.../options/seamlessfullcircle/readme.mdx | 0
.../seamlessfullcircle/seamlessfullcircle.svg | 0
.../sandy/options/waistbandoverlap/readme.mdx | 0
.../waistbandoverlap/waistbandoverlap.svg | 0
.../options/waistbandposition/readme.mdx | 0
.../waistbandposition/waistbandposition.svg | 0
.../sandy/options/waistbandshape/readme.mdx | 0
.../options/waistbandshape/waistbandshape.svg | 0
.../sandy/options/waistbandwidth/readme.mdx | 0
.../options/waistbandwidth/waistbandwidth.svg | 0
sites/org/docs/docs/designs/sandy/readme.mdx | 105 +
sites/org/docs/docs/designs/shelly/_notes.mdx | 21 +
.../designs/shelly/instructions/readme.mdx | 0
.../shelly/options/armpitease/readme.mdx | 0
.../designs/shelly/options/bodyhem/readme.mdx | 0
.../shelly/options/bodylength/readme.mdx | 0
.../shelly/options/chestease/readme.mdx | 0
.../shelly/options/hemwidth/readme.mdx | 0
.../shelly/options/hipsease/readme.mdx | 0
.../shelly/options/neckbalance/readme.mdx | 0
.../shelly/options/neckbandlength/readme.mdx | 0
.../shelly/options/neckbandwidth/readme.mdx | 0
.../shelly/options/neckease/readme.mdx | 0
.../options/raglanscooplength/readme.mdx | 0
.../options/raglanscoopmagnitude/readme.mdx | 0
.../docs/designs/shelly/options/readme.mdx | 196 +
.../shelly/options/sideshape/readme.mdx | 0
.../shelly/options/sleeveease/readme.mdx | 0
.../shelly/options/sleevehem/readme.mdx | 0
.../shelly/options/sleevelength/readme.mdx | 0
.../shelly/options/straightsides/readme.mdx | 0
.../shelly/options/wristease/readme.mdx | 0
sites/org/docs/docs/designs/shelly/readme.mdx | 60 +
sites/org/docs/docs/designs/shin/_notes.mdx | 4 +
.../docs/designs/shin/instructions/readme.mdx | 0
.../designs/shin/options/backrise/readme.mdx | 0
.../designs/shin/options/bulge/readme.mdx | 0
.../shin/options/elasticwidth/readme.mdx | 0
.../shin/options/legreduction/readme.mdx | 0
.../docs/docs/designs/shin/options/readme.mdx | 75 +
.../docs/designs/shin/options/rise/readme.mdx | 0
.../designs/shin/options/stretch/readme.mdx | 0
sites/org/docs/docs/designs/shin/readme.mdx | 63 +
sites/org/docs/docs/designs/simon/_notes.mdx | 15 +
.../docs/designs/simon/instructions/10a.png | Bin
.../docs/designs/simon/instructions/10b.png | Bin
.../docs/designs/simon/instructions/10c.png | Bin
.../docs/designs/simon/instructions/10d.png | Bin
.../docs/designs/simon/instructions/10e.png | Bin
.../docs/designs/simon/instructions/10f.png | Bin
.../docs/designs/simon/instructions/10g.png | Bin
.../docs/designs/simon/instructions/10h.png | Bin
.../docs/designs/simon/instructions/11a.png | Bin
.../docs/designs/simon/instructions/11b.png | Bin
.../docs/designs/simon/instructions/11c.png | Bin
.../docs/designs/simon/instructions/11d.png | Bin
.../docs/designs/simon/instructions/11e.png | Bin
.../docs/designs/simon/instructions/12.png | Bin
.../docs/designs/simon/instructions/13a.png | Bin
.../docs/designs/simon/instructions/13b.png | Bin
.../docs/designs/simon/instructions/13c.png | Bin
.../docs/designs/simon/instructions/13d.png | Bin
.../docs/designs/simon/instructions/13e.png | Bin
.../docs/designs/simon/instructions/13f.png | Bin
.../docs/designs/simon/instructions/13g.png | Bin
.../docs/designs/simon/instructions/14a.png | Bin
.../docs/designs/simon/instructions/14b.png | Bin
.../docs/designs/simon/instructions/14c.png | Bin
.../docs/designs/simon/instructions/15a.png | Bin
.../docs/designs/simon/instructions/15b.png | Bin
.../docs/designs/simon/instructions/15c.png | Bin
.../docs/designs/simon/instructions/16a.png | Bin
.../docs/designs/simon/instructions/16b.png | Bin
.../docs/designs/simon/instructions/18a.png | Bin
.../docs/designs/simon/instructions/18b.png | Bin
.../docs/designs/simon/instructions/18c.png | Bin
.../docs/designs/simon/instructions/19a.png | Bin
.../docs/designs/simon/instructions/19b.png | Bin
.../docs/designs/simon/instructions/19c.png | Bin
.../docs/designs/simon/instructions/19d.png | Bin
.../docs/designs/simon/instructions/19e.png | Bin
.../docs/designs/simon/instructions/1a.png | Bin
.../docs/designs/simon/instructions/1b.png | Bin
.../docs/designs/simon/instructions/20a.png | Bin
.../docs/designs/simon/instructions/20b.png | Bin
.../docs/designs/simon/instructions/20c.png | Bin
.../docs/designs/simon/instructions/2a.png | Bin
.../docs/designs/simon/instructions/2b.png | Bin
.../docs/designs/simon/instructions/2c.png | Bin
.../docs/designs/simon/instructions/2d.png | Bin
.../docs/designs/simon/instructions/3a.png | Bin
.../docs/designs/simon/instructions/3b.png | Bin
.../docs/designs/simon/instructions/3c.png | Bin
.../docs/designs/simon/instructions/3d.png | Bin
.../docs/designs/simon/instructions/4a.png | Bin
.../docs/designs/simon/instructions/4b.png | Bin
.../docs/designs/simon/instructions/4c.png | Bin
.../docs/designs/simon/instructions/5.png | Bin
.../docs/designs/simon/instructions/6a.png | Bin
.../docs/designs/simon/instructions/6b.png | Bin
.../docs/designs/simon/instructions/7.png | Bin
.../docs/designs/simon/instructions/8a.png | Bin
.../docs/designs/simon/instructions/8b.png | Bin
.../docs/designs/simon/instructions/8c.png | Bin
.../docs/designs/simon/instructions/9a.png | Bin
.../docs/designs/simon/instructions/9b.png | Bin
.../docs/designs/simon/instructions/9c.png | Bin
.../docs/designs/simon/instructions/9d.png | Bin
.../docs/designs/simon/instructions/9e.png | Bin
.../designs/simon/instructions/finished.gif | Bin
.../designs/simon/instructions/layout.svg | 0
.../designs/simon/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../simon/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../simon/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../simon/options/backdarts/readme.mdx | 0
.../simon/options/backdartshaping/readme.mdx | 0
.../simon/options/backneckcutout/readme.mdx | 0
.../barrelcuffnarrowbutton.svg | 0
.../options/barrelcuffnarrowbutton/readme.mdx | 0
.../simon/options/bicepsease/bicepsease.svg | 0
.../simon/options/bicepsease/readme.mdx | 0
.../designs/simon/options/boxpleat/readme.mdx | 0
.../simon/options/boxpleatfold/readme.mdx | 0
.../simon/options/boxpleatwidth/readme.mdx | 0
.../buttonfreelength/buttonfreelength.svg | 0
.../simon/options/buttonfreelength/readme.mdx | 0
.../buttonholeplacketfoldwidth.svg | 0
.../buttonholeplacketfoldwidth/readme.mdx | 0
.../buttonholeplacketstyle.svg | 0
.../options/buttonholeplacketstyle/readme.mdx | 0
.../buttonholeplacketwidth.svg | 0
.../options/buttonholeplacketwidth/readme.mdx | 0
.../buttonplacketstyle/buttonplacketstyle.svg | 0
.../options/buttonplacketstyle/readme.mdx | 0
.../buttonplacketwidth/buttonplacketwidth.svg | 0
.../options/buttonplacketwidth/readme.mdx | 0
.../designs/simon/options/buttons/buttons.svg | 0
.../designs/simon/options/buttons/readme.mdx | 0
.../simon/options/chestease/chestease.svg | 0
.../simon/options/chestease/readme.mdx | 0
.../simon/options/collarangle/collarangle.svg | 0
.../simon/options/collarangle/readme.mdx | 0
.../simon/options/collarbend/collarbend.svg | 0
.../simon/options/collarbend/readme.mdx | 0
.../simon/options/collarease/collarease.svg | 0
.../simon/options/collarease/readme.mdx | 0
.../simon/options/collarflare/collarflare.svg | 0
.../simon/options/collarflare/readme.mdx | 0
.../simon/options/collargap/collargap.svg | 0
.../simon/options/collargap/readme.mdx | 0
.../simon/options/collarroll/collarroll.svg | 0
.../simon/options/collarroll/readme.mdx | 0
.../collarstandbend/collarstandbend.svg | 0
.../simon/options/collarstandbend/readme.mdx | 0
.../collarstandcurve/collarstandcurve.svg | 0
.../simon/options/collarstandcurve/readme.mdx | 0
.../collarstandwidth/collarstandwidth.svg | 0
.../simon/options/collarstandwidth/readme.mdx | 0
.../simon/options/collarwidth/readme.mdx | 0
.../options/cuffbuttonrows/cuffbuttonrows.svg | 0
.../simon/options/cuffbuttonrows/readme.mdx | 0
.../simon/options/cuffdrape/cuffdrape.svg | 0
.../simon/options/cuffdrape/readme.mdx | 0
.../simon/options/cuffease/cuffease.svg | 0
.../designs/simon/options/cuffease/readme.mdx | 0
.../simon/options/cufflength/cufflength.svg | 0
.../simon/options/cufflength/readme.mdx | 0
.../simon/options/cuffstyle/cuffstyle.svg | 0
.../simon/options/cuffstyle/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../simon/options/extratopbutton/readme.mdx | 0
.../designs/simon/options/ffsa/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../simon/options/hemcurve/hemcurve.svg | 0
.../designs/simon/options/hemcurve/readme.mdx | 0
.../simon/options/hemstyle/hemstyle.svg | 0
.../designs/simon/options/hemstyle/readme.mdx | 0
.../simon/options/hipsease/hipsease.svg | 0
.../designs/simon/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../simon/options/lengthbonus/lengthbonus.svg | 0
.../simon/options/lengthbonus/readme.mdx | 0
.../docs/designs/simon/options/readme.mdx | 846 +
.../simon/options/roundback/readme.mdx | 0
.../simon}/options/s3armhole/readme.mdx | 0
.../simon}/options/s3collar/readme.mdx | 0
.../separatebuttonholeplacket/readme.mdx | 0
.../separatebuttonholeplacket.svg | 0
.../options/separatebuttonplacket/readme.mdx | 0
.../simon/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../docs/designs/simon/options/sleevecap.svg | 0
.../designs/simon/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../simon/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../simon/options/sleevecapinflection.svg | 0
.../options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../designs/simon/options/sleevecapspread.svg | 0
.../designs/simon/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleeveplacketlength/readme.mdx | 0
.../sleeveplacketlength.svg | 0
.../options/sleeveplacketwidth/readme.mdx | 0
.../sleeveplacketwidth/sleeveplacketwidth.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 0
.../simon/options/splityoke/readme.mdx | 0
.../simon/options/splityoke/splityoke.svg | 0
.../simon/options/waistease/readme.mdx | 0
.../simon/options/waistease/waistease.svg | 0
.../simon/options/yokeheight/readme.mdx | 0
sites/org/docs/docs/designs/simon/readme.mdx | 141 +
sites/org/docs/docs/designs/simone/_notes.mdx | 10 +
.../designs/simone/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../simone/options/armholedepth/readme.mdx | 0
.../armholedepthfactor/armholedepthfactor.svg | 0
.../options/armholedepthfactor/readme.mdx | 0
.../simone/options/backdarts/readme.mdx | 0
.../simone/options/backdartshaping/readme.mdx | 0
.../simone/options/backneckcutout/readme.mdx | 0
.../barrelcuffnarrowbutton.svg | 0
.../options/barrelcuffnarrowbutton/readme.mdx | 0
.../simone/options/bicepsease/bicepsease.svg | 0
.../simone/options/bicepsease/readme.mdx | 0
.../simone/options/boxpleat/readme.mdx | 0
.../simone/options/boxpleatfold/readme.mdx | 0
.../simone/options/boxpleatwidth/readme.mdx | 0
.../options/bustalignedbuttons/readme.mdx | 0
.../simone/options/bustdartangle/readme.mdx | 0
.../simone/options/bustdartlength/readme.mdx | 0
.../buttonfreelength/buttonfreelength.svg | 0
.../options/buttonfreelength/readme.mdx | 0
.../buttonholeplacketfoldwidth.svg | 0
.../buttonholeplacketfoldwidth/readme.mdx | 0
.../buttonholeplacketstyle.svg | 0
.../options/buttonholeplacketstyle/readme.mdx | 0
.../buttonholeplacketwidth.svg | 0
.../options/buttonholeplacketwidth/readme.mdx | 0
.../buttonplacketstyle/buttonplacketstyle.svg | 0
.../options/buttonplacketstyle/readme.mdx | 0
.../buttonplacketwidth/buttonplacketwidth.svg | 0
.../options/buttonplacketwidth/readme.mdx | 0
.../simone/options/buttons/buttons.svg | 0
.../designs/simone/options/buttons/readme.mdx | 0
.../simone/options/chestease/chestease.svg | 0
.../simone/options/chestease/readme.mdx | 0
.../options/collarangle/collarangle.svg | 0
.../simone/options/collarangle/readme.mdx | 0
.../simone/options/collarbend/collarbend.svg | 0
.../simone/options/collarbend/readme.mdx | 0
.../simone/options/collarease/collarease.svg | 0
.../simone/options/collarease/readme.mdx | 0
.../options/collarflare/collarflare.svg | 0
.../simone/options/collarflare/readme.mdx | 0
.../simone/options/collargap/collargap.svg | 0
.../simone/options/collargap/readme.mdx | 0
.../simone/options/collarroll/collarroll.svg | 0
.../simone/options/collarroll/readme.mdx | 0
.../collarstandbend/collarstandbend.svg | 0
.../simone/options/collarstandbend/readme.mdx | 0
.../collarstandcurve/collarstandcurve.svg | 0
.../options/collarstandcurve/readme.mdx | 0
.../collarstandwidth/collarstandwidth.svg | 0
.../options/collarstandwidth/readme.mdx | 0
.../simone/options/collarwidth/readme.mdx | 0
.../designs/simone/options/contour/readme.mdx | 0
.../options/cuffbuttonrows/cuffbuttonrows.svg | 0
.../simone/options/cuffbuttonrows/readme.mdx | 0
.../simone/options/cuffdrape/cuffdrape.svg | 0
.../simone/options/cuffdrape/readme.mdx | 0
.../simone/options/cuffease/cuffease.svg | 0
.../simone/options/cuffease/readme.mdx | 0
.../simone/options/cufflength/cufflength.svg | 0
.../simone/options/cufflength/readme.mdx | 0
.../simone/options/cuffstyle/cuffstyle.svg | 0
.../simone/options/cuffstyle/readme.mdx | 0
.../simone/options/extratopbutton/readme.mdx | 0
.../designs/simone/options/ffsa/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../simone/options/frontdartlength/readme.mdx | 0
.../simone/options/frontdarts/readme.mdx | 0
.../simone/options/hemcurve/hemcurve.svg | 0
.../simone/options/hemcurve/readme.mdx | 0
.../simone/options/hemstyle/hemstyle.svg | 0
.../simone/options/hemstyle/readme.mdx | 0
.../simone/options/hipsease/hipsease.svg | 0
.../simone/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../options/lengthbonus/lengthbonus.svg | 0
.../simone/options/lengthbonus/readme.mdx | 0
.../docs/designs/simone/options/readme.mdx | 903 +
.../simone/options/roundback/readme.mdx | 0
.../simone}/options/s3armhole/readme.mdx | 0
.../simone}/options/s3collar/readme.mdx | 0
.../separatebuttonholeplacket/readme.mdx | 0
.../options/separatebuttonplacket/readme.mdx | 0
.../simone/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../docs/designs/simone/options/sleevecap.svg | 0
.../simone/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../simone/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../simone/options/sleevecapinflection.svg | 0
.../options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../simone/options/sleevecapspread.svg | 0
.../designs/simone/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleeveplacketlength/readme.mdx | 0
.../sleeveplacketlength.svg | 0
.../options/sleeveplacketwidth/readme.mdx | 0
.../sleeveplacketwidth/sleeveplacketwidth.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 0
.../simone/options/splityoke/readme.mdx | 0
.../simone/options/splityoke/splityoke.svg | 0
.../simone/options/waistease/readme.mdx | 0
.../simone/options/waistease/waistease.svg | 0
.../simone/options/yokeheight/readme.mdx | 0
sites/org/docs/docs/designs/simone/readme.mdx | 46 +
sites/org/docs/docs/designs/skully/_notes.mdx | 29 +
.../designs/skully/instructions/readme.mdx | 0
.../docs/designs/skully/options/readme.mdx | 19 +
.../designs/skully/options/size/readme.mdx | 0
sites/org/docs/docs/designs/skully/readme.mdx | 80 +
sites/org/docs/docs/designs/sven/_notes.mdx | 8 +
.../docs/designs/sven/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../sven/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../sven/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../sven/options/backneckcutout/readme.mdx | 0
.../sven/options/bicepsease/bicepsease.svg | 0
.../sven/options/bicepsease/readme.mdx | 0
.../sven/options/chestease/chestease.svg | 0
.../designs/sven/options/chestease/readme.mdx | 0
.../sven/options/collarease/readme.mdx | 0
.../sven/options/cuffease/cuffease.svg | 0
.../designs/sven/options/cuffease/readme.mdx | 0
.../sven}/options/draftforhighbust/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../designs/sven/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../sven/options/lengthbonus/lengthbonus.svg | 0
.../sven/options/lengthbonus/readme.mdx | 0
.../docs/docs/designs/sven/options/readme.mdx | 457 +
.../designs/sven/options/ribbing/readme.mdx | 0
.../designs/sven/options/ribbing/ribbing.svg | 0
.../sven/options/ribbingheight/readme.mdx | 0
.../options/ribbingheight/ribbingheight.svg | 0
.../sven/options/ribbingstretch/readme.mdx | 0
.../options/ribbingstretch/ribbingstretch.svg | 0
.../sven}/options/s3armhole/readme.mdx | 0
.../designs/sven}/options/s3collar/readme.mdx | 0
.../sven/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../docs/designs/sven/options/sleevecap.svg | 0
.../designs/sven/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../sven/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../sven/options/sleevecapinflection.svg | 0
.../sven/options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../sven/options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../sven/options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../sven/options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../designs/sven/options/sleevecapspread.svg | 0
.../designs/sven/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../sven/options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 0
sites/org/docs/docs/designs/sven/readme.mdx | 60 +
sites/org/docs/docs/designs/tamiko/_notes.mdx | 4 +
.../designs/tamiko/instructions/readme.mdx | 0
.../designs/tamiko/instructions/step03.png | Bin
.../designs/tamiko/instructions/step04.png | Bin
.../options/armholedepthfactor/readme.mdx | 0
.../tamiko/options/chestease/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../designs/tamiko/options/flare/readme.mdx | 0
.../options/lengthbonus/lengthbonus.svg | 0
.../tamiko/options/lengthbonus/readme.mdx | 0
.../docs/designs/tamiko/options/readme.mdx | 73 +
.../options/shoulderseamlength/readme.mdx | 0
sites/org/docs/docs/designs/tamiko/readme.mdx | 46 +
sites/org/docs/docs/designs/teagan/_notes.mdx | 8 +
.../designs/teagan/instructions/readme.mdx | 0
.../designs/teagan/instructions/step01.svg | 0
.../designs/teagan/instructions/step02.svg | 0
.../designs/teagan/instructions/step03a.svg | 0
.../designs/teagan/instructions/step03b.svg | 0
.../designs/teagan/instructions/step03c.svg | 0
.../designs/teagan/instructions/step03d.svg | 0
.../designs/teagan/instructions/step03e.svg | 0
.../designs/teagan/instructions/step03f.svg | 0
.../designs/teagan/instructions/step03g.svg | 0
.../designs/teagan/instructions/step03h.svg | 0
.../designs/teagan/instructions/step03i.svg | 0
.../designs/teagan/instructions/step04.svg | 0
.../designs/teagan/instructions/step05.svg | 0
.../options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../teagan/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../teagan/options/backneckcutout/readme.mdx | 0
.../teagan/options/chestease/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../teagan/options/fitwaist/readme.mdx | 0
.../options/frontarmholedeeper/readme.mdx | 0
.../teagan/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../teagan/options/lengthbonus/readme.mdx | 0
.../teagan/options/necklinebend/readme.mdx | 0
.../teagan/options/necklinedepth/readme.mdx | 0
.../teagan/options/necklinewidth/readme.mdx | 0
.../docs/designs/teagan/options/readme.mdx | 391 +
.../options/shoulderslopereduction/readme.mdx | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../teagan/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../teagan/options/sleeveease/readme.mdx | 0
.../teagan/options/sleevelength/readme.mdx | 0
.../options/sleevewidthguarantee/readme.mdx | 0
.../teagan/options/waistease/readme.mdx | 0
sites/org/docs/docs/designs/teagan/readme.mdx | 64 +
.../org/docs/docs/designs/tiberius/_notes.mdx | 24 +
.../designs/tiberius/instructions/readme.mdx | 0
.../tiberius/options/armholedrop/readme.mdx | 0
.../designs/tiberius/options/clavi/readme.mdx | 0
.../options/clavuslocation/readme.mdx | 0
.../tiberius/options/clavuswidth/readme.mdx | 0
.../tiberius/options/forcewidth/readme.mdx | 0
.../tiberius/options/headratio/readme.mdx | 0
.../tiberius/options/length/readme.mdx | 0
.../tiberius/options/lengthbonus/readme.mdx | 0
.../docs/designs/tiberius/options/readme.mdx | 121 +
.../designs/tiberius/options/width/readme.mdx | 0
.../tiberius/options/widthbonus/readme.mdx | 0
.../org/docs/docs/designs/tiberius/readme.mdx | 60 +
sites/org/docs/docs/designs/titan/_notes.mdx | 13 +
.../designs/titan/instructions/readme.mdx | 0
.../options/crossseamcurveangle/readme.mdx | 0
.../options/crossseamcurvebend/readme.mdx | 0
.../options/crossseamcurvestart/readme.mdx | 0
.../titan/options/crotchdrop/readme.mdx | 0
.../options/crotchseamcurveangle/readme.mdx | 0
.../options/crotchseamcurvebend/readme.mdx | 0
.../options/crotchseamcurvestart/readme.mdx | 0
.../designs/titan/options/fitknee/readme.mdx | 0
.../options/grainlineposition/readme.mdx | 0
.../designs/titan/options/kneeease/readme.mdx | 0
.../titan/options/legbalance/readme.mdx | 0
.../titan/options/lengthbonus/readme.mdx | 0
.../docs/designs/titan/options/readme.mdx | 219 +
.../designs/titan/options/seatease/readme.mdx | 0
.../titan/options/usewaistanglefor/readme.mdx | 0
.../titan/options/waistangle/readme.mdx | 0
.../titan/options/waistbalance/readme.mdx | 0
.../titan/options/waistbandwidth/readme.mdx | 0
.../titan/options/waistease/readme.mdx | 0
.../titan/options/waistheight/readme.mdx | 0
sites/org/docs/docs/designs/titan/readme.mdx | 69 +
.../org/docs/docs/designs/trayvon/_notes.mdx | 17 +
.../designs/trayvon/instructions/readme.mdx | 0
.../designs/trayvon/instructions/step01.png | Bin
.../designs/trayvon/instructions/step02.png | Bin
.../designs/trayvon/instructions/step03.png | Bin
.../designs/trayvon/instructions/step04.png | Bin
.../designs/trayvon/instructions/step09.png | Bin
.../designs/trayvon/instructions/step10.png | Bin
.../designs/trayvon/instructions/step11.png | Bin
.../designs/trayvon/instructions/step12.png | Bin
.../designs/trayvon/instructions/step13.png | Bin
.../designs/trayvon/instructions/step14.png | Bin
.../designs/trayvon/instructions/step15.png | Bin
.../designs/trayvon/instructions/step16.png | Bin
.../designs/trayvon/instructions/step17.png | Bin
.../trayvon/options/knotwidth/knotwidth.svg | 0
.../trayvon/options/knotwidth/readme.mdx | 0
.../trayvon/options/lengthbonus/readme.mdx | 0
.../docs/designs/trayvon/options/readme.mdx | 41 +
.../trayvon/options/tipwidth/readme.mdx | 0
.../trayvon/options/tipwidth/tipwidth.svg | 0
.../org/docs/docs/designs/trayvon/readme.mdx | 123 +
.../docs}/docs/designs/trayvon/tie-grain.png | Bin
.../org/docs/docs/designs/tristan/_notes.mdx | 21 +
.../designs/tristan/instructions/readme.mdx | 0
.../designs/tristan/instructions/step01.png | Bin
.../designs/tristan/instructions/step02.png | Bin
.../designs/tristan/instructions/step03.png | Bin
.../designs/tristan/instructions/step04.png | Bin
.../designs/tristan/instructions/step05.png | Bin
.../designs/tristan/instructions/step05b.png | Bin
.../designs/tristan/instructions/step06.png | Bin
.../designs/tristan/instructions/step07.png | Bin
.../designs/tristan/instructions/step08.png | Bin
.../designs/tristan/instructions/step09.png | Bin
.../designs/tristan/instructions/step10.png | Bin
.../designs/tristan/instructions/step14.png | Bin
.../tristan/options/armholedepth/readme.mdx | 0
.../tristan/options/bustspanease/readme.mdx | 0
.../tristan/options/chestease/readme.mdx | 0
.../tristan/options/cutdepthback/readme.mdx | 0
.../tristan/options/cutdepthfront/readme.mdx | 0
.../options/cutroundnessback/readme.mdx | 0
.../options/cutroundnessfront/readme.mdx | 0
.../options/frontshoulderwidth/readme.mdx | 0
.../options/fullchesteasereduction/readme.mdx | 0
.../designs/tristan/options/hem/readme.mdx | 0
.../tristan/options/hemsize/readme.mdx | 0
.../tristan/options/highbustwidth/readme.mdx | 0
.../designs/tristan/options/lacing/readme.mdx | 0
.../tristan/options/lacinglocation/readme.mdx | 0
.../tristan/options/lacingwidth/readme.mdx | 0
.../designs/tristan/options/peplum/readme.mdx | 0
.../tristan/options/peplumfullness/readme.mdx | 0
.../tristan/options/peplumsize/readme.mdx | 0
.../docs/designs/tristan/options/readme.mdx | 307 +
.../options/shoulderdartcurvature/readme.mdx | 0
.../options/shoulderdartposition/readme.mdx | 0
.../options/shouldertoshoulderease/readme.mdx | 0
.../tristan/options/strapwidth/readme.mdx | 0
.../options/upperdartlength/readme.mdx | 0
.../options/waistdartlength/readme.mdx | 0
.../options/waistdartposition/readme.mdx | 0
.../tristan/options/waistease/readme.mdx | 0
.../tristan/options/zipperlocation/readme.mdx | 0
.../org/docs/docs/designs/tristan/readme.mdx | 90 +
sites/org/docs/docs/designs/uma/_notes.mdx | 18 +
.../docs/designs/uma/instructions/readme.mdx | 0
.../docs/designs/uma/instructions/step01.png | Bin
.../docs/designs/uma/instructions/step02.png | Bin
.../docs/designs/uma/instructions/step03.png | Bin
.../docs/designs/uma/instructions/step04.png | Bin
.../docs/designs/uma/instructions/step05.png | Bin
.../docs/designs/uma/instructions/step06.png | Bin
.../docs/designs/uma/instructions/step07.png | Bin
.../docs/designs/uma/instructions/step08.png | Bin
.../docs/designs/uma/instructions/step08b.png | Bin
.../docs/designs/uma/instructions/step09.png | Bin
.../docs/designs/uma/instructions/step10.png | Bin
.../designs/uma/options/backdip/readme.mdx | 0
.../uma/options/backexposure/readme.mdx | 0
.../docs/designs/uma/options/bulge/readme.mdx | 0
.../designs/uma/options/frontdip/readme.mdx | 0
.../uma/options/frontexposure/readme.mdx | 0
.../uma/options/gussetlength/readme.mdx | 0
.../uma/options/gussetposition/readme.mdx | 0
.../uma/options/gussetwidth/readme.mdx | 0
.../designs/uma/options/legrise/readme.mdx | 0
.../docs/docs/designs/uma/options/readme.mdx | 141 +
.../docs/designs/uma/options/rise/readme.mdx | 0
.../designs/uma/options/xstretch/readme.mdx | 0
.../designs/uma/options/ystretch/readme.mdx | 0
sites/org/docs/docs/designs/uma/readme.mdx | 80 +
sites/org/docs/docs/designs/umbra/_notes.mdx | 55 +
.../designs/umbra/instructions/readme.mdx | 0
.../designs/umbra/instructions/step01.svg | 0
.../designs/umbra/instructions/step02.svg | 0
.../designs/umbra/instructions/step03.svg | 0
.../designs/umbra/instructions/step04.svg | 0
.../designs/umbra/instructions/step05.svg | 0
.../designs/umbra/instructions/step06.svg | 0
.../designs/umbra/instructions/step08.svg | 0
.../designs/umbra/instructions/step09.svg | 0
.../designs/umbra/instructions/step10.svg | 0
.../designs/umbra/options/backdip/readme.mdx | 0
.../umbra/options/backdipshape/readme.mdx | 0
.../umbra/options/backexposure/readme.mdx | 0
.../designs/umbra/options/bulge/readme.mdx | 0
.../umbra/options/bulgefullness/readme.mdx | 0
.../umbra/options/elasticstretch/readme.mdx | 0
.../designs/umbra/options/flipback/readme.mdx | 0
.../designs/umbra/options/frontdip/readme.mdx | 0
.../umbra/options/frontdipshape/readme.mdx | 0
.../umbra/options/frontexposure/readme.mdx | 0
.../umbra/options/frontreduction/readme.mdx | 0
.../umbra/options/gussetposition/readme.mdx | 0
.../umbra/options/gussetwidth/readme.mdx | 0
.../designs/umbra/options/legrise/readme.mdx | 0
.../umbra/options/minfabricwidth/readme.mdx | 0
.../umbra/options/pocketgap/readme.mdx | 0
.../umbra/options/pocketheight/readme.mdx | 0
.../designs/umbra/options/pockets/readme.mdx | 0
.../docs/designs/umbra/options/readme.mdx | 253 +
.../designs/umbra/options/rise/readme.mdx | 0
.../umbra/options/splitposition/readme.mdx | 0
.../designs/umbra/options/xstretch/readme.mdx | 0
.../designs/umbra/options/ystretch/readme.mdx | 0
sites/org/docs/docs/designs/umbra/readme.mdx | 101 +
sites/org/docs/docs/designs/wahid/_notes.mdx | 7 +
.../docs/designs/wahid/instructions/01.png | Bin
.../docs/designs/wahid/instructions/01a.png | Bin
.../docs/designs/wahid/instructions/01b.png | Bin
.../docs/designs/wahid/instructions/02a.png | Bin
.../docs/designs/wahid/instructions/03a.png | Bin
.../docs/designs/wahid/instructions/04a.png | Bin
.../docs/designs/wahid/instructions/05a.png | Bin
.../docs/designs/wahid/instructions/05b.png | Bin
.../docs/designs/wahid/instructions/05c.png | Bin
.../docs/designs/wahid/instructions/05d.png | Bin
.../docs/designs/wahid/instructions/05e.png | Bin
.../docs/designs/wahid/instructions/05f.png | Bin
.../docs/designs/wahid/instructions/05g.png | Bin
.../docs/designs/wahid/instructions/05h.png | Bin
.../docs/designs/wahid/instructions/05i.png | Bin
.../docs/designs/wahid/instructions/05j.png | Bin
.../docs/designs/wahid/instructions/05k.png | Bin
.../docs/designs/wahid/instructions/05l.png | Bin
.../docs/designs/wahid/instructions/05m.png | Bin
.../docs/designs/wahid/instructions/06a.png | Bin
.../docs/designs/wahid/instructions/07a.png | Bin
.../docs/designs/wahid/instructions/08a.png | Bin
.../docs/designs/wahid/instructions/09a.png | Bin
.../docs/designs/wahid/instructions/09b.png | Bin
.../docs/designs/wahid/instructions/09c.png | Bin
.../docs/designs/wahid/instructions/09d.png | Bin
.../docs/designs/wahid/instructions/10a.png | Bin
.../docs/designs/wahid/instructions/10b.png | Bin
.../docs/designs/wahid/instructions/10c.png | Bin
.../docs/designs/wahid/instructions/11a.png | Bin
.../docs/designs/wahid/instructions/12a.png | Bin
.../docs/designs/wahid/instructions/13a.png | Bin
.../docs/designs/wahid/instructions/14a.png | Bin
.../designs/wahid/instructions/layout.svg | 0
.../designs/wahid/instructions/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../wahid/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../wahid/options/backinset/backinset.svg | 0
.../wahid/options/backinset/readme.mdx | 0
.../options/backneckcutout/backneckcutout.svg | 0
.../wahid/options/backneckcutout/readme.mdx | 8 +
.../options/backscyedart/backscyedart.svg | 0
.../wahid/options/backscyedart/readme.mdx | 0
.../designs/wahid/options/buttons/buttons.svg | 0
.../designs/wahid/options/buttons/readme.mdx | 0
.../options/centerbackdart/centerbackdart.svg | 0
.../wahid/options/centerbackdart/readme.mdx | 0
.../wahid/options/chestease/chestease.svg | 0
.../wahid/options/chestease/readme.mdx | 0
.../options/draftforhighbust/readme.mdx | 0
.../wahid/options/frontinset/frontinset.svg | 0
.../wahid/options/frontinset/readme.mdx | 0
.../options/frontscyedart/frontscyedart.svg | 0
.../wahid/options/frontscyedart/readme.mdx | 0
.../wahid/options/frontstyle/frontstyle.svg | 0
.../wahid/options/frontstyle/readme.mdx | 0
.../wahid/options/hemradius/hemradius.svg | 0
.../wahid/options/hemradius/readme.mdx | 0
.../wahid/options/hemstyle/hemstyle.svg | 0
.../designs/wahid/options/hemstyle/readme.mdx | 0
.../wahid/options/hipsease/hipsease.svg | 0
.../designs/wahid/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../wahid/options/lengthbonus/lengthbonus.svg | 0
.../wahid/options/lengthbonus/readme.mdx | 0
.../wahid/options/neckinset/neckinset.svg | 0
.../wahid/options/neckinset/readme.mdx | 0
.../options/necklinedrop/necklinedrop.svg | 0
.../wahid/options/necklinedrop/readme.mdx | 0
.../wahid/options/pocketangle/readme.mdx | 0
.../wahid/options/pocketlocation/readme.mdx | 0
.../wahid/options/pocketwidth/readme.mdx | 0
.../docs/designs/wahid/options/readme.mdx | 296 +
.../wahid/options/shoulderinset/readme.mdx | 0
.../options/shoulderinset/shoulderinset.svg | 0
.../options/shoulderslopereduction/readme.mdx | 7 +
.../shoulderslopereduction.svg | 0
.../wahid/options/waistease/readme.mdx | 0
.../wahid/options/waistease/waistease.svg | 0
.../wahid/options/weltheight/readme.mdx | 0
sites/org/docs/docs/designs/wahid/readme.mdx | 62 +
.../org/docs/docs/designs/walburga/_notes.mdx | 48 +
.../designs/walburga/instructions/readme.mdx | 0
.../walburga/options/headratio/readme.mdx | 0
.../walburga/options/length/readme.mdx | 0
.../walburga/options/lengthbonus/readme.mdx | 0
.../walburga/options/neckline/readme.mdx | 0
.../walburga/options/neckoratio/readme.mdx | 0
.../docs/designs/walburga/options/readme.mdx | 75 +
.../walburga/options/widthbonus/readme.mdx | 0
.../org/docs/docs/designs/walburga/readme.mdx | 51 +
.../org/docs/docs/designs/waralee/_notes.mdx | 17 +
.../designs/waralee/instructions/readme.mdx | 0
.../waralee-crotch-seam-no-pockets.png | Bin
.../waralee-hem-sides-and-bottom.png | Bin
.../waralee-waist-band-no-pockets.png | Bin
.../waralee/options/backpocket/readme.mdx | 0
.../waralee/options/backraise/readme.mdx | 0
.../waralee/options/crotchback/readme.mdx | 0
.../options/crotchfactorbackhor/readme.mdx | 0
.../options/crotchfactorbackver/readme.mdx | 0
.../options/crotchfactorfronthor/readme.mdx | 0
.../options/crotchfactorfrontver/readme.mdx | 0
.../waralee/options/crotchfront/readme.mdx | 0
.../waralee/options/fitwaist/readme.mdx | 0
.../waralee/options/frontpocket/readme.mdx | 0
.../options/frontpocketstyle/readme.mdx | 0
.../waralee/options/hemwidth/readme.mdx | 0
.../waralee/options/knotinfront/readme.mdx | 0
.../waralee/options/knotplacement/readme.mdx | 0
.../waralee/options/legshortening/readme.mdx | 0
.../waralee/options/legsize/readme.mdx | 0
.../docs/designs/waralee/options/readme.mdx | 203 +
.../options/separatewaistband/readme.mdx | 0
.../waralee/options/showmini/readme.mdx | 0
.../waralee/options/waistbandwidth/readme.mdx | 0
.../waralee/options/waistoverlap/readme.mdx | 0
.../waralee/options/waistraise/readme.mdx | 0
.../org/docs/docs/designs/waralee/readme.mdx | 93 +
sites/org/docs/docs/designs/yuri/_notes.mdx | 18 +
.../docs/designs/yuri/instructions/readme.mdx | 0
.../acrossbackfactor/acrossbackfactor.svg | 0
.../yuri/options/acrossbackfactor/readme.mdx | 0
.../armholedepth/armholedepthfactor.svg | 0
.../yuri/options/armholedepth/readme.mdx | 0
.../options/armholedepthfactor/readme.mdx | 0
.../yuri/options/backneckcutout/readme.mdx | 0
.../yuri/options/bicepsease/bicepsease.svg | 0
.../yuri/options/bicepsease/readme.mdx | 0
.../yuri/options/chestease/chestease.svg | 0
.../designs/yuri/options/chestease/readme.mdx | 0
.../yuri/options/collarease/readme.mdx | 0
.../yuri/options/cuffease/cuffease.svg | 0
.../designs/yuri/options/cuffease/readme.mdx | 0
.../yuri/options/draftforhighbust/readme.mdx | 5 +
.../options/frontarmholedeeper/readme.mdx | 0
.../designs/yuri/options/hipsease/readme.mdx | 0
.../options/legacyarmholedepth/readme.mdx | 0
.../yuri/options/lengthbonus/lengthbonus.svg | 0
.../yuri/options/lengthbonus/readme.mdx | 0
.../docs/docs/designs/yuri/options/readme.mdx | 426 +
.../designs/yuri/options/ribbing/readme.mdx | 0
.../designs/yuri/options/ribbing/ribbing.svg | 0
.../yuri/options/ribbingheight/readme.mdx | 0
.../options/ribbingheight/ribbingheight.svg | 0
.../yuri/options/ribbingstretch/readme.mdx | 0
.../options/ribbingstretch/ribbingstretch.svg | 0
.../designs/yuri/options/s3armhole/readme.mdx | 8 +
.../designs/yuri/options/s3collar/readme.mdx | 8 +
.../yuri/options/shoulderease/readme.mdx | 0
.../options/shoulderslopereduction/readme.mdx | 0
.../docs/designs/yuri/options/sleevecap.svg | 0
.../designs/yuri/options/sleevecapanchor.svg | 0
.../options/sleevecapbackfactorx/readme.mdx | 0
.../sleevecapbackfactorx.svg | 0
.../options/sleevecapbackfactory/readme.mdx | 0
.../sleevecapbackfactory.svg | 0
.../yuri/options/sleevecapease/readme.mdx | 0
.../options/sleevecapfrontfactorx/readme.mdx | 0
.../sleevecapfrontfactorx.svg | 0
.../options/sleevecapfrontfactory/readme.mdx | 0
.../sleevecapfrontfactory.svg | 0
.../yuri/options/sleevecapinflection.svg | 0
.../yuri/options/sleevecapq1offset/readme.mdx | 0
.../sleevecapq1offset/sleevecapq1offset.svg | 0
.../options/sleevecapq1spread1/readme.mdx | 0
.../sleevecapq1downwardspread.svg | 0
.../options/sleevecapq1spread2/readme.mdx | 0
.../sleevecapq1spread2/sleevecapq1spread2.svg | 0
.../yuri/options/sleevecapq2offset/readme.mdx | 0
.../sleevecapq2offset/sleevecapq2offset.svg | 0
.../options/sleevecapq2spread1/readme.mdx | 0
.../sleevecapq2spread1/sleevecapq2spread1.svg | 0
.../options/sleevecapq2spread2/readme.mdx | 0
.../sleevecapq2spread2/sleevecapq2spread2.svg | 0
.../yuri/options/sleevecapq3offset/readme.mdx | 0
.../sleevecapq3offset/sleevecapq3offset.svg | 0
.../options/sleevecapq3spread1/readme.mdx | 0
.../sleevecapq3spread1/sleevecapq3spread1.svg | 0
.../options/sleevecapq3spread2/readme.mdx | 0
.../sleevecapq3spread2/sleevecapq3spread2.svg | 0
.../yuri/options/sleevecapq4offset/readme.mdx | 0
.../sleevecapq4offset/sleevecapq4offset.svg | 0
.../options/sleevecapq4spread1/readme.mdx | 0
.../sleevecapq4spread1/sleevecapq4spread1.svg | 0
.../options/sleevecapq4spread2/readme.mdx | 0
.../sleevecapq4spread2/sleevecapq4spread2.svg | 0
.../designs/yuri/options/sleevecapspread.svg | 0
.../designs/yuri/options/sleevecaptop.svg | 0
.../options/sleevecaptopfactorx/readme.mdx | 0
.../sleevecaptopfactorx.svg | 0
.../options/sleevecaptopfactory/readme.mdx | 0
.../sleevecaptopfactory.svg | 0
.../yuri/options/sleevelengthbonus/readme.mdx | 0
.../sleevelengthbonus/sleevelengthbonus.svg | 0
.../options/sleevewidthguarantee/readme.mdx | 17 +
sites/org/docs/docs/designs/yuri/readme.mdx | 65 +
.../docs}/docs/measurements/ankle/readme.mdx | 0
.../docs}/docs/measurements/biceps/readme.mdx | 0
.../docs/measurements/bustfront/readme.mdx | 0
.../bustpointtounderbust/readme.mdx | 0
.../docs/measurements/bustspan/readme.mdx | 0
.../docs}/docs/measurements/chest/readme.mdx | 0
.../docs/measurements/crossseam/readme.mdx | 0
.../measurements/crossseamfront/readme.mdx | 0
.../docs/measurements/crotchdepth/readme.mdx | 0
.../docs}/docs/measurements/head/readme.mdx | 0
.../docs}/docs/measurements/heel/readme.mdx | 0
.../docs/measurements/highbust/readme.mdx | 0
.../measurements/highbustfront/readme.mdx | 0
.../docs}/docs/measurements/hips/readme.mdx | 0
.../docs/measurements/hpstobust/readme.mdx | 0
.../measurements/hpstowaistback/readme.mdx | 0
.../measurements/hpstowaistfront/readme.mdx | 0
.../docs}/docs/measurements/inseam/readme.mdx | 0
.../docs}/docs/measurements/knee/readme.mdx | 0
.../docs}/docs/measurements/neck/readme.mdx | 0
sites/org/docs/docs/measurements/readme.mdx | 22 +
.../docs}/docs/measurements/seat/readme.mdx | 0
.../docs/measurements/seatback/readme.mdx | 0
.../measurements/shoulderslope/readme.mdx | 0
.../measurements/shouldertoelbow/readme.mdx | 0
.../shouldertoshoulder/readme.mdx | 0
.../measurements/shouldertowrist/readme.mdx | 0
.../docs/measurements/underbust/readme.mdx | 0
.../docs/measurements/upperleg/readme.mdx | 0
.../docs}/docs/measurements/waist/readme.mdx | 0
.../docs/measurements/waistback/readme.mdx | 0
.../measurements/waisttoarmpit/readme.mdx | 0
.../docs/measurements/waisttofloor/readme.mdx | 0
.../docs/measurements/waisttohips/readme.mdx | 0
.../docs/measurements/waisttoknee/readme.mdx | 0
.../docs/measurements/waisttoseat/readme.mdx | 0
.../measurements/waisttounderbust/readme.mdx | 0
.../measurements/waisttoupperleg/readme.mdx | 0
.../docs}/docs/measurements/wrist/readme.mdx | 0
sites/org/docs/docs/readme.mdx | 37 +
.../sewing/basic-sewing-supplies/readme.mdx | 0
.../docs}/docs/sewing/basting/basting.jpg | Bin
.../docs}/docs/sewing/basting/readme.mdx | 0
.../docs/sewing/coverlock/coverlock-hem.jpg | Bin
.../docs}/docs/sewing/coverlock/coverlock.jpg | Bin
.../docs/sewing/coverlock/janome-coverpro.jpg | Bin
.../docs}/docs/sewing/coverlock/readme.mdx | 0
.../docs}/docs/sewing/cutting/cutting.jpg | Bin
.../docs}/docs/sewing/cutting/readme.mdx | 0
.../docs}/docs/sewing/darts/dart.jpg | Bin
.../docs}/docs/sewing/darts/readme.mdx | 0
.../sewing/double-welt-pockets/readme.mdx | 0
.../sewing/double-welt-pockets/step01.png | Bin
.../sewing/double-welt-pockets/step02.png | Bin
.../sewing/double-welt-pockets/step03.png | Bin
.../sewing/double-welt-pockets/step04.png | Bin
.../sewing/double-welt-pockets/step05.png | Bin
.../sewing/double-welt-pockets/step06.png | Bin
.../sewing/double-welt-pockets/step07a.png | Bin
.../sewing/double-welt-pockets/step07b.png | Bin
.../sewing/double-welt-pockets/step08.png | Bin
.../sewing/double-welt-pockets/step09.png | Bin
.../sewing/double-welt-pockets/step10.png | Bin
.../sewing/double-welt-pockets/step11a.png | Bin
.../sewing/double-welt-pockets/step11b.png | Bin
.../sewing/double-welt-pockets/step11c.png | Bin
.../sewing/double-welt-pockets/step12.png | Bin
.../docs}/docs/sewing/ease/ease-min.jpg | Bin
.../docs}/docs/sewing/ease/ease-plus.jpg | Bin
.../docs}/docs/sewing/ease/readme.mdx | 0
.../sewing/edgestitching/edgestitching.jpg | Bin
.../docs/sewing/edgestitching/readme.mdx | 0
.../docs/sewing/fabric-grain/fabric-grain.jpg | Bin
.../docs}/docs/sewing/fabric-grain/readme.mdx | 0
.../cutting-good-sides-together.jpg | Bin
.../sewing/good-sides-together/readme.mdx | 0
.../sewing-good-sides-together.jpg | Bin
.../docs/sewing/hemming/coverlock-hem.jpg | Bin
.../docs}/docs/sewing/hemming/readme.mdx | 0
.../docs}/docs/sewing/hps/readme.mdx | 0
.../docs}/docs/sewing/jersey/knit-fabric.jpg | Bin
.../docs}/docs/sewing/jersey/readme.mdx | 0
.../docs/sewing/knit-binding/knit_band.jpg | Bin
.../docs/sewing/knit-binding/knit_binding.jpg | Bin
.../docs/sewing/knit-binding/knitbinding1.png | Bin
.../docs/sewing/knit-binding/knitbinding2.png | Bin
.../docs/sewing/knit-binding/knitbinding3.png | Bin
.../docs}/docs/sewing/knit-binding/readme.mdx | 0
.../docs}/docs/sewing/knit-fabric/fabric.jpg | Bin
.../docs}/docs/sewing/knit-fabric/readme.mdx | 0
.../cutting-good-sides-together.jpg | Bin
.../docs/docs/sewing/on-the-fold/readme.mdx | 19 +
.../sewing-good-sides-together.jpg | Bin
.../docs/sewing/pinning/fabric-pinning.jpg | Bin
.../docs}/docs/sewing/pinning/readme.mdx | 0
.../docs}/docs/sewing/pinning/sewing-pins.jpg | Bin
.../docs}/docs/sewing/rayon/rayon.jpg | Bin
.../docs}/docs/sewing/rayon/readme.mdx | 0
sites/org/docs/docs/sewing/readme.mdx | 7 +
.../docs/sewing/seam-allowance/readme.mdx | 0
.../docs/sewing/seam-allowance/zig-zag.jpg | Bin
.../docs}/docs/sewing/serger/readme.mdx | 0
.../docs}/docs/sewing/serger/serged-seam.jpg | Bin
.../docs}/docs/sewing/serger/serger.jpg | Bin
.../docs}/docs/sewing/slipstitch/readme.mdx | 0
.../docs/sewing/slipstitch/slipstitch.jpg | Bin
.../docs}/docs/sewing/topstitching/readme.mdx | 0
.../sewing/topstitching/topstitch-needles.jpg | Bin
.../docs/sewing/topstitching/topstitching.jpg | Bin
.../docs}/docs/sewing/trimming/readme.mdx | 0
.../docs}/docs/sewing/trimming/trimming.jpg | Bin
.../docs}/docs/sewing/twin-needle/readme.mdx | 0
.../docs/sewing/twin-needle/twin-needle.gif | Bin
.../docs/sewing/twin-needle/twin-needle.jpg | Bin
.../docs/sewing/zig-zag-stitch/readme.mdx | 0
.../docs/sewing/zig-zag-stitch/zig-zag.jpg | Bin
sites/org/docs/donate.mdx | 8 +
sites/org/docs/id.mdx | 20 +
sites/org/docs/patrons/index.mdx | 8 +
sites/org/docs/patrons/join.mdx | 8 +
sites/org/docs/profile.mdx | 14 +
sites/org/docs/stats.mdx | 9 +
sites/org/docs/support.mdx | 32 +
sites/org/docs/users.mdx | 14 +
sites/org/docusaurus.config.mjs | 313 +
sites/org/example.env | 1 -
sites/org/hooks/use-bugsnag.mjs | 48 -
sites/org/hooks/use-design.mjs | 127 -
.../newsletter/2021q2/index.mdx | 0
.../newsletter/2021q3/index.mdx | 0
.../newsletter/2021q4/index.mdx | 0
.../newsletter/2022q1/index.mdx | 0
.../newsletter/2022q2/index.mdx | 0
.../newsletter/2022q3/index.mdx | 0
.../newsletter/2022q4/index.mdx | 0
.../newsletter/2023q1/index.mdx | 0
.../newsletter/2023q2/index.mdx | 0
.../newsletter/2023q3/index.mdx | 0
.../newsletter/2023q4/index.mdx | 0
.../newsletter/2024q1/index.mdx | 0
.../newsletter/2024q2/index.mdx | 0
.../newsletter/2024q3/index.mdx | 0
.../newsletter/2024q4/index.mdx | 0
sites/org/newsletter/2025q1/index.mdx | 120 +
sites/org/next-i18next.config.js | 16 -
sites/org/next.config.mjs | 37 -
sites/org/package.json | 128 +-
sites/org/page-templates/edit-pattern.mjs | 86 -
sites/org/page-templates/new-pattern.mjs | 41 -
sites/org/pages/-/index.mjs | 48 -
sites/org/pages/404.mjs | 37 -
sites/org/pages/_app.mjs | 25 -
sites/org/pages/account/[platform].mjs | 84 -
sites/org/pages/account/apikeys/index.mjs | 94 -
sites/org/pages/account/bio.mjs | 59 -
sites/org/pages/account/bookmark.mjs | 81 -
sites/org/pages/account/bookmarks.mjs | 59 -
sites/org/pages/account/compare.mjs | 59 -
sites/org/pages/account/consent.mjs | 52 -
sites/org/pages/account/control.mjs | 59 -
sites/org/pages/account/email.mjs | 59 -
sites/org/pages/account/export.mjs | 59 -
sites/org/pages/account/github.mjs | 53 -
sites/org/pages/account/img.mjs | 59 -
sites/org/pages/account/import.mjs | 59 -
sites/org/pages/account/index.mjs | 52 -
sites/org/pages/account/language.mjs | 66 -
sites/org/pages/account/mfa.mjs | 59 -
sites/org/pages/account/newsletter.mjs | 59 -
sites/org/pages/account/password.mjs | 59 -
sites/org/pages/account/pattern.mjs | 66 -
.../org/pages/account/patterns/aaron/edit.mjs | 86 -
.../pages/account/patterns/albert/edit.mjs | 86 -
sites/org/pages/account/patterns/bee/edit.mjs | 86 -
.../org/pages/account/patterns/bella/edit.mjs | 86 -
.../pages/account/patterns/benjamin/edit.mjs | 86 -
.../org/pages/account/patterns/bent/edit.mjs | 86 -
.../org/pages/account/patterns/bibi/edit.mjs | 86 -
sites/org/pages/account/patterns/bob/edit.mjs | 86 -
.../pages/account/patterns/breanna/edit.mjs | 86 -
.../org/pages/account/patterns/brian/edit.mjs | 86 -
.../org/pages/account/patterns/bruce/edit.mjs | 86 -
.../pages/account/patterns/carlita/edit.mjs | 86 -
.../pages/account/patterns/carlton/edit.mjs | 86 -
.../pages/account/patterns/cathrin/edit.mjs | 86 -
.../pages/account/patterns/charlie/edit.mjs | 86 -
.../pages/account/patterns/cornelius/edit.mjs | 86 -
.../org/pages/account/patterns/diana/edit.mjs | 86 -
.../pages/account/patterns/florence/edit.mjs | 86 -
.../pages/account/patterns/florent/edit.mjs | 86 -
.../org/pages/account/patterns/gozer/edit.mjs | 86 -
sites/org/pages/account/patterns/hi/edit.mjs | 86 -
.../pages/account/patterns/holmes/edit.mjs | 86 -
.../pages/account/patterns/hortensia/edit.mjs | 86 -
.../org/pages/account/patterns/huey/edit.mjs | 86 -
.../org/pages/account/patterns/hugo/edit.mjs | 86 -
sites/org/pages/account/patterns/index.mjs | 59 -
.../pages/account/patterns/jaeger/edit.mjs | 86 -
.../org/pages/account/patterns/jane/edit.mjs | 86 -
.../org/pages/account/patterns/lily/edit.mjs | 86 -
.../org/pages/account/patterns/lucy/edit.mjs | 86 -
.../pages/account/patterns/lumina/edit.mjs | 86 -
.../pages/account/patterns/lumira/edit.mjs | 86 -
.../pages/account/patterns/lunetius/edit.mjs | 86 -
.../org/pages/account/patterns/noble/edit.mjs | 86 -
.../account/patterns/octoplushy/edit.mjs | 86 -
.../org/pages/account/patterns/onyx/edit.mjs | 86 -
.../org/pages/account/patterns/opal/edit.mjs | 86 -
.../org/pages/account/patterns/otis/edit.mjs | 86 -
.../org/pages/account/patterns/paco/edit.mjs | 86 -
.../pages/account/patterns/penelope/edit.mjs | 86 -
.../org/pages/account/patterns/sandy/edit.mjs | 86 -
.../pages/account/patterns/shelly/edit.mjs | 86 -
.../org/pages/account/patterns/shin/edit.mjs | 86 -
.../org/pages/account/patterns/simon/edit.mjs | 86 -
.../pages/account/patterns/simone/edit.mjs | 86 -
.../pages/account/patterns/skully/edit.mjs | 86 -
.../org/pages/account/patterns/sven/edit.mjs | 86 -
.../pages/account/patterns/tamiko/edit.mjs | 86 -
.../pages/account/patterns/teagan/edit.mjs | 86 -
.../pages/account/patterns/tiberius/edit.mjs | 86 -
.../org/pages/account/patterns/titan/edit.mjs | 86 -
.../pages/account/patterns/trayvon/edit.mjs | 86 -
.../pages/account/patterns/tristan/edit.mjs | 86 -
sites/org/pages/account/patterns/uma/edit.mjs | 86 -
.../org/pages/account/patterns/umbra/edit.mjs | 86 -
.../org/pages/account/patterns/wahid/edit.mjs | 86 -
.../pages/account/patterns/walburga/edit.mjs | 86 -
.../pages/account/patterns/waralee/edit.mjs | 86 -
.../org/pages/account/patterns/yuri/edit.mjs | 86 -
sites/org/pages/account/privacy.mjs | 7 -
sites/org/pages/account/reload.mjs | 59 -
sites/org/pages/account/remove.mjs | 59 -
sites/org/pages/account/restrict.mjs | 59 -
sites/org/pages/account/set.mjs | 66 -
sites/org/pages/account/sets.mjs | 59 -
sites/org/pages/account/units.mjs | 59 -
sites/org/pages/account/username.mjs | 59 -
sites/org/pages/admin/cset.mjs | 45 -
sites/org/pages/admin/csets.mjs | 32 -
sites/org/pages/admin/index.mjs | 96 -
sites/org/pages/admin/subscribers.mjs | 111 -
sites/org/pages/admin/user.mjs | 41 -
sites/org/pages/apikeys.mjs | 52 -
sites/org/pages/blog/[dir].mjs | 57 -
sites/org/pages/blog/index.mjs | 110 -
sites/org/pages/community/index.mjs | 36 -
sites/org/pages/confirm/emailchange.mjs | 113 -
sites/org/pages/confirm/signin.mjs | 133 -
sites/org/pages/confirm/signup-aea.mjs | 79 -
sites/org/pages/confirm/signup.mjs | 103 -
sites/org/pages/curate/index.mjs | 59 -
sites/org/pages/curate/set.mjs | 45 -
sites/org/pages/curate/sets/[id].mjs | 46 -
sites/org/pages/curate/sets/index.mjs | 51 -
.../org/pages/curate/sets/suggested/[id].mjs | 55 -
sites/org/pages/curated-set.mjs | 50 -
sites/org/pages/curated-sets/[id].mjs | 50 -
sites/org/pages/curated-sets/index.mjs | 42 -
sites/org/pages/designs/[design].mjs | 59 -
sites/org/pages/designs/index.mjs | 49 -
sites/org/pages/docs/[...slug].mjs | 88 -
sites/org/pages/docs/index.mjs | 55 -
sites/org/pages/donate/index.mjs | 41 -
sites/org/pages/donate/thanks.mjs | 46 -
sites/org/pages/id.mjs | 60 -
sites/org/pages/index.mjs | 198 -
sites/org/pages/migrate.mjs | 35 -
sites/org/pages/new/aaron.mjs | 41 -
sites/org/pages/new/albert.mjs | 41 -
sites/org/pages/new/apikey.mjs | 59 -
sites/org/pages/new/bee.mjs | 41 -
sites/org/pages/new/bella.mjs | 41 -
sites/org/pages/new/benjamin.mjs | 41 -
sites/org/pages/new/bent.mjs | 41 -
sites/org/pages/new/bibi.mjs | 41 -
sites/org/pages/new/blog.mjs | 45 -
sites/org/pages/new/bob.mjs | 41 -
sites/org/pages/new/bookmark.mjs | 59 -
sites/org/pages/new/breanna.mjs | 41 -
sites/org/pages/new/brian.mjs | 41 -
sites/org/pages/new/bruce.mjs | 41 -
sites/org/pages/new/carlita.mjs | 41 -
sites/org/pages/new/carlton.mjs | 41 -
sites/org/pages/new/cathrin.mjs | 41 -
sites/org/pages/new/charlie.mjs | 41 -
sites/org/pages/new/cornelius.mjs | 41 -
sites/org/pages/new/cset.mjs | 59 -
sites/org/pages/new/diana.mjs | 41 -
sites/org/pages/new/florence.mjs | 41 -
sites/org/pages/new/florent.mjs | 41 -
sites/org/pages/new/gozer.mjs | 41 -
sites/org/pages/new/hi.mjs | 41 -
sites/org/pages/new/holmes.mjs | 41 -
sites/org/pages/new/hortensia.mjs | 41 -
sites/org/pages/new/huey.mjs | 41 -
sites/org/pages/new/hugo.mjs | 41 -
sites/org/pages/new/img.mjs | 42 -
sites/org/pages/new/index.mjs | 152 -
sites/org/pages/new/jaeger.mjs | 41 -
sites/org/pages/new/jane.mjs | 41 -
sites/org/pages/new/lily.mjs | 41 -
sites/org/pages/new/lucy.mjs | 41 -
sites/org/pages/new/lumina.mjs | 41 -
sites/org/pages/new/lumira.mjs | 41 -
sites/org/pages/new/lunetius.mjs | 41 -
sites/org/pages/new/noble.mjs | 41 -
sites/org/pages/new/octoplushy.mjs | 41 -
sites/org/pages/new/onyx.mjs | 41 -
sites/org/pages/new/opack.mjs | 59 -
sites/org/pages/new/opal.mjs | 41 -
sites/org/pages/new/otis.mjs | 41 -
sites/org/pages/new/paco.mjs | 41 -
sites/org/pages/new/pattern.mjs | 47 -
sites/org/pages/new/penelope.mjs | 41 -
sites/org/pages/new/sandy.mjs | 41 -
sites/org/pages/new/set.mjs | 59 -
sites/org/pages/new/shelly.mjs | 41 -
sites/org/pages/new/shin.mjs | 41 -
sites/org/pages/new/showcase.mjs | 45 -
sites/org/pages/new/simon.mjs | 41 -
sites/org/pages/new/simone.mjs | 41 -
sites/org/pages/new/skully.mjs | 41 -
sites/org/pages/new/sven.mjs | 41 -
sites/org/pages/new/tamiko.mjs | 41 -
sites/org/pages/new/teagan.mjs | 41 -
sites/org/pages/new/tiberius.mjs | 41 -
sites/org/pages/new/titan.mjs | 41 -
sites/org/pages/new/trayvon.mjs | 41 -
sites/org/pages/new/tristan.mjs | 41 -
sites/org/pages/new/uma.mjs | 41 -
sites/org/pages/new/umbra.mjs | 41 -
sites/org/pages/new/wahid.mjs | 41 -
sites/org/pages/new/walburga.mjs | 41 -
sites/org/pages/new/waralee.mjs | 41 -
sites/org/pages/new/yuri.mjs | 41 -
sites/org/pages/newsletter/[dir].mjs | 62 -
sites/org/pages/newsletter/index.mjs | 44 -
sites/org/pages/newsletter/subscribe.mjs | 113 -
sites/org/pages/newsletter/unsubscribe.mjs | 100 -
sites/org/pages/patrons/index.mjs | 43 -
sites/org/pages/patrons/join.mjs | 41 -
sites/org/pages/patrons/thanks.mjs | 65 -
sites/org/pages/pattern.mjs | 59 -
sites/org/pages/profile.mjs | 63 -
sites/org/pages/search.mjs | 60 -
sites/org/pages/set.mjs | 54 -
sites/org/pages/sets/[id].mjs | 55 -
sites/org/pages/showcase/[dir].mjs | 62 -
sites/org/pages/showcase/index.mjs | 122 -
.../org/pages/signin/callback/[provider].mjs | 92 -
sites/org/pages/signin/index.mjs | 41 -
sites/org/pages/signup/index.mjs | 35 -
sites/org/pages/sitemap.mjs | 35 -
sites/org/pages/stats.mjs | 141 -
sites/org/pages/support.mjs | 191 -
sites/org/pages/translation/de.yaml | 29 -
sites/org/pages/translation/en.yaml | 29 -
sites/org/pages/translation/es.yaml | 29 -
sites/org/pages/translation/fr.yaml | 29 -
sites/org/pages/translation/index.mjs | 130 -
sites/org/pages/translation/join.mjs | 57 -
sites/org/pages/translation/nl.yaml | 29 -
.../pages/translation/suggest-language.mjs | 60 -
sites/org/pages/translation/uk.yaml | 29 -
sites/org/pages/typography.mjs | 174 -
sites/org/pages/users/index.mjs | 76 -
sites/org/pages/users/user.mjs | 89 -
sites/org/pages/welcome/bio.mjs | 49 -
sites/org/pages/welcome/compare.mjs | 49 -
sites/org/pages/welcome/img.mjs | 49 -
sites/org/pages/welcome/index.mjs | 58 -
sites/org/pages/welcome/newsletter.mjs | 49 -
sites/org/pages/welcome/units.mjs | 49 -
sites/org/pages/welcome/username.mjs | 49 -
sites/org/postcss.config.js | 4 -
sites/org/prebuild.mjs | 102 -
sites/org/prebuild/.gitkeep | 0
sites/org/public/brands/algolia.svg | 1 -
sites/org/public/brands/bugsnag.svg | 15 -
sites/org/public/brands/crowdin.svg | 61 -
sites/org/public/brands/netlify.svg | 85 -
sites/org/public/brands/vercel.svg | 6 -
sites/org/public/feeds/.gitkeep | 0
sites/org/public/img/designs/aaron.png | Bin 203413 -> 0 bytes
sites/org/public/img/designs/albert.png | Bin 235943 -> 0 bytes
sites/org/public/img/designs/benjamin.png | Bin 341857 -> 0 bytes
sites/org/public/img/designs/bruce.png | Bin 272768 -> 0 bytes
sites/org/public/img/designs/cathrin.png | Bin 241770 -> 0 bytes
sites/org/public/img/designs/charlie.png | Bin 203779 -> 0 bytes
sites/org/public/img/designs/cornelius.png | Bin 236920 -> 0 bytes
sites/org/public/img/designs/diana.png | Bin 333805 -> 0 bytes
sites/org/public/img/designs/florence.png | Bin 375494 -> 0 bytes
sites/org/public/img/designs/florent.png | Bin 293938 -> 0 bytes
sites/org/public/img/designs/huey.png | Bin 355085 -> 0 bytes
sites/org/public/img/designs/hugo.png | Bin 298423 -> 0 bytes
sites/org/public/img/designs/jaeger.png | Bin 215119 -> 0 bytes
sites/org/public/img/designs/penelope.png | Bin 226748 -> 0 bytes
sites/org/public/img/designs/sandy.png | Bin 391853 -> 0 bytes
sites/org/public/img/designs/shin.png | Bin 322989 -> 0 bytes
sites/org/public/img/designs/simon.png | Bin 274082 -> 0 bytes
sites/org/public/img/designs/sven.png | Bin 361646 -> 0 bytes
sites/org/public/img/designs/tamiko.png | Bin 304096 -> 0 bytes
sites/org/public/img/designs/teagan.png | Bin 339922 -> 0 bytes
sites/org/public/img/designs/theo.png | Bin 204001 -> 0 bytes
sites/org/public/img/designs/titan.png | Bin 205165 -> 0 bytes
sites/org/public/img/designs/trayvon.png | Bin 276534 -> 0 bytes
sites/org/public/img/designs/ursula.png | Bin 297774 -> 0 bytes
sites/org/public/img/designs/wahid.png | Bin 313069 -> 0 bytes
sites/org/public/img/designs/waralee.png | Bin 235414 -> 0 bytes
sites/org/public/img/lineup-backdrop.svg | 54 -
sites/org/public/img/og/.gitkeep | 0
sites/org/public/support.jpg | Bin 320202 -> 0 bytes
.../scripts/prebuild-step1.mjs | 2 +-
sites/org/scripts/prebuild-step2.mjs | 204 +
sites/org/scripts/prebuild-step3.mjs | 97 +
sites/org/showcase-tags.mjs | 1 +
.../index.mdx | 0
.../showcase/3d-skully/index.mdx | 0
.../showcase/a-casual-test-of-noble/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/a-flat-fronted-bruce/index.mdx | 0
.../index.mdx | 0
.../a-handsome-simon-by-ogredandy/index.mdx | 0
.../a-jaeger-and-charlie-set/index.mdx | 0
.../showcase/a-jersey-huey-hoodie/index.mdx | 0
.../index.mdx | 0
.../showcase/a-lovely-lucy/index.mdx | 0
.../index.mdx | 0
.../a-mini-hi-with-embroidered-eyes/index.mdx | 0
.../index.mdx | 0
.../showcase/a-modified-holmes/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/a-shortened-penelope/index.mdx | 0
.../index.mdx | 0
.../a-squid-friend-for-octopus/index.mdx | 0
.../index.mdx | 0
.../showcase/a-tamiko-top/index.mdx | 0
.../showcase/a-tiny-albert-apron/index.mdx | 0
.../index.mdx | 0
.../showcase/a-very-modified-yuri/index.mdx | 0
.../a-warm-weather-pair-of-waralees/index.mdx | 0
.../a-wearable-sandy-muslin/index.mdx | 0
.../aaron-a-shirt-by-gaelle/index.mdx | 0
.../aaron-a-shirt-by-pecatrix/index.mdx | 0
.../showcase/aaron-by-joost/index.mdx | 0
.../showcase/aaron-dress-by-ts/index.mdx | 0
.../index.mdx | 0
.../showcase/airline-blanket-sven/index.mdx | 0
.../albert-apron-by-brady376/index.mdx | 0
.../albert-apron-by-links147/index.mdx | 0
.../albert-apron-by-saber007s-son/index.mdx | 0
.../showcase/albert-by-wouter/index.mdx | 0
.../index.mdx | 0
.../an-early-bee-bikini-top/index.mdx | 0
.../showcase/an-early-uma/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/anneke-huey-black/index.mdx | 0
.../showcase/anneke-huey-grey/index.mdx | 0
.../showcase/anneke-huey/index.mdx | 0
.../another-day-another-bruce/index.mdx | 0
.../showcase/another-splendid-simon/index.mdx | 0
.../showcase/aorion-diana/index.mdx | 0
.../index.mdx | 0
.../showcase/audreyyy-teagan-titan/index.mdx | 0
.../showcase/baby-paco-pants/index.mdx | 0
.../showcase/baby-sven-sweatshirt/index.mdx | 0
.../showcase/bee-by-ts/index.mdx | 0
.../showcase/bee-teagan/index.mdx | 0
.../showcase/bella-block/index.mdx | 0
.../showcase/bella-by-bumblebunch/index.mdx | 0
.../showcase/bella-by-deby/index.mdx | 0
.../showcase/bella-by-karen/index.mdx | 0
.../showcase/bella-sandy-by-ts/index.mdx | 0
.../showcase/benjamin-by-anto/index.mdx | 0
.../showcase/benjamin-by-rika/index.mdx | 0
.../showcase/black-bruce/index.mdx | 0
.../showcase/black-hugo/index.mdx | 0
.../showcase/bleach-dyed-bruce/index.mdx | 0
.../showcase/blue-geometric-simon/index.mdx | 0
.../showcase/blue-simon/index.mdx | 0
.../showcase/blue-theo/index.mdx | 0
.../showcase/blue-wahid-by-bjeppson/index.mdx | 0
.../showcase/bob-bibs-by-duck/index.mdx | 0
.../showcase/bob3000-chore-coat/index.mdx | 0
.../showcase/bound-wahid/index.mdx | 0
.../brazenedminstrel-double-ws/index.mdx | 0
.../breanna-dress-by-andrea-cretu/index.mdx | 0
.../showcase/brian-by-eric/index.mdx | 0
.../showcase/brian-by-stefan-1/index.mdx | 0
.../showcase/brian-by-stefan-2/index.mdx | 0
.../showcase/brian-by-stefan-3/index.mdx | 0
.../showcase/brian-by-stefan-4/index.mdx | 0
.../showcase/brown-geometric-simon/index.mdx | 0
.../index.mdx | 0
.../bruce-boxer-briefs-by-gaelle/index.mdx | 0
.../showcase/bruce-by-bjeppson/index.mdx | 0
.../showcase/bruce-by-clolimb/index.mdx | 0
.../showcase/bruce-by-ferdi/index.mdx | 0
.../showcase/bruce-by-victoria/index.mdx | 0
.../showcase/bruce-by-william/index.mdx | 0
.../showcase/bruce-on-doll/index.mdx | 0
.../showcase/bruce-three-pack/index.mdx | 0
.../index.mdx | 0
.../showcase/bruces-by-paul/index.mdx | 0
.../showcase/bulbasaur-huey/index.mdx | 0
.../showcase/burgundy-florent/index.mdx | 0
.../showcase/carlton-by-boris/index.mdx | 0
.../showcase/carlton-by-charlotte/index.mdx | 0
.../showcase/carlton-by-em/index.mdx | 0
.../showcase/carlton-by-rudy/index.mdx | 0
.../showcase/carlton-by-sanulleh/index.mdx | 0
.../carlton-coat-by-sewingdentist/index.mdx | 0
.../showcase/carlton-coat/index.mdx | 0
.../showcase/casual-pink-simon/index.mdx | 0
.../showcase/charlie-by-bob/index.mdx | 0
.../showcase/charlie-by-joost-2/index.mdx | 0
.../showcase/charlie-by-joost/index.mdx | 0
.../showcase/charlie-by-karen/index.mdx | 0
.../index.mdx | 0
.../showcase/charlie-on-sorcha/index.mdx | 0
.../showcase/charlie-shorts/index.mdx | 0
.../showcase/claire-does-sven/index.mdx | 0
.../showcase/colorful-hi-by-zag/index.mdx | 0
.../showcase/comixminx-shins/index.mdx | 0
.../showcase/corduroy-theo/index.mdx | 0
.../cornelius-by-atightshipwreck/index.mdx | 0
.../showcase/cornelius-by-drew/index.mdx | 0
.../showcase/cornelius-by-wouter/index.mdx | 0
.../index.mdx | 0
.../danyuljohnson-wahid-benjamin/index.mdx | 0
.../showcase/diana-by-deby/index.mdx | 0
.../showcase/doll-cathrin/index.mdx | 0
.../showcase/doll-hugo/index.mdx | 0
.../showcase/doll-simone/index.mdx | 0
.../showcase/doll-waralee-pants/index.mdx | 0
.../showcase/drop-shoulder-sven/index.mdx | 0
.../showcase/duvet-trousers-ahoy/index.mdx | 0
.../showcase/ellafay-simon-shirt/index.mdx | 0
.../embroidered-opal-shortalls/index.mdx | 0
.../showcase/fantastic-four-hugo/index.mdx | 0
.../ferdis-first-simon-shirt/index.mdx | 0
.../showcase/fifi-simone/index.mdx | 0
.../showcase/fifis-paco-pjs/index.mdx | 0
.../showcase/fifis-second-simone/index.mdx | 0
.../showcase/fighter-hoodie/index.mdx | 0
.../showcase/fintastic-simon/index.mdx | 0
.../first-version-dona-simone/index.mdx | 0
.../showcase/flat-front-bruces/index.mdx | 0
.../showcase/floral-aaron/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/florence-jv/index.mdx | 0
.../showcase/florence/index.mdx | 0
.../showcase/florent-by-alberto/index.mdx | 0
.../showcase/florent-by-alexandre/index.mdx | 0
.../showcase/florent-by-elske/index.mdx | 0
.../showcase/florent-by-enno/index.mdx | 0
.../showcase/florent-by-michele/index.mdx | 0
.../showcase/florent-by-wim/index.mdx | 0
.../showcase/florent-by-wouter/index.mdx | 0
.../showcase/florent-cap-by-ferdi/index.mdx | 0
.../index.mdx | 0
.../showcase/flowery-hawaiian-simon/index.mdx | 0
.../showcase/formal-aaron/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/foxy-sven/index.mdx | 0
.../showcase/french-terry-sven/index.mdx | 0
.../showcase/gender-euphoric-bruces/index.mdx | 0
.../showcase/green-cathrin/index.mdx | 0
.../showcase/green-charlie-wahid/index.mdx | 0
.../showcase/green-wahid/index.mdx | 0
.../showcase/grey-sven/index.mdx | 0
.../showcase/guin-gingham-simon/index.mdx | 0
.../hand-sewn-test-of-florence/index.mdx | 0
.../index.mdx | 0
.../showcase/hellgys-hugo-hoodie/index.mdx | 0
.../showcase/hi-by-amelie/index.mdx | 0
.../showcase/hi-by-gaelle/index.mdx | 0
.../showcase/hi-by-halbmoki/index.mdx | 0
.../showcase/hi-by-nisaea/index.mdx | 0
.../hi-the-shark-has-our-hearts/index.mdx | 0
.../showcase/high-vis-yuri/index.mdx | 0
.../showcase/hortensia-by-saber/index.mdx | 0
.../showcase/hortensia-by-wouter/index.mdx | 0
.../showcase/houseoflief-lucy/index.mdx | 0
.../huey-by-hellgy-dinosaurs/index.mdx | 0
.../showcase/huey-by-minty/index.mdx | 0
.../showcase/huey-by-paul/index.mdx | 0
.../showcase/hugo-by-alan/index.mdx | 0
.../showcase/hugo-by-gaelle/index.mdx | 0
.../hugo-by-hellgy-shuttlecock/index.mdx | 0
.../showcase/hugo-by-karin/index.mdx | 0
.../showcase/hugo-by-lainey/index.mdx | 0
.../showcase/hugo-saul/index.mdx | 0
.../showcase/hugo-teagan-mashup/index.mdx | 0
.../showcase/hugo-with-cats/index.mdx | 0
.../showcase/husband-hugo/index.mdx | 0
.../showcase/jaeger-by-roberta/index.mdx | 0
.../johnnygaijins-simon-shirt/index.mdx | 0
.../joosts-most-recent-simon/index.mdx | 0
.../just-another-simon-shirt/index.mdx | 0
.../showcase/just-peachy-shin-bee/index.mdx | 0
.../lasermonkeys-modded-bruces/index.mdx | 0
.../showcase/latex-ursulas/index.mdx | 0
.../showcase/liberty-trayvon/index.mdx | 0
.../lightweight-waralees-for-summer/index.mdx | 0
.../showcase/linnen-jaeger-by-paul/index.mdx | 0
.../showcase/linnen-theo/index.mdx | 0
.../showcase/lower-rise-ursula/index.mdx | 0
.../showcase/lucy-by-xhex/index.mdx | 0
.../index.mdx | 0
.../showcase/lunetius-the-lacerna/index.mdx | 0
.../index.mdx | 0
.../magicantace-breanna-sandy/index.mdx | 0
.../showcase/mark-wears-simon/index.mdx | 0
.../showcase/matching-florents/index.mdx | 0
.../showcase/matching-simon/index.mdx | 0
.../showcase/meet-octoplushy/index.mdx | 0
.../showcase/meine-erste-badehose/index.mdx | 0
.../index.mdx | 0
.../showcase/microhi/index.mdx | 0
.../showcase/mini-shin-swim-trunks/index.mdx | 0
.../modified-tamiko-nursing-cover/index.mdx | 0
.../showcase/more-shin-swim-shorts/index.mdx | 0
.../showcase/more-wahid-by-adam/index.mdx | 0
.../my-fisrt-sewing-project/index.mdx | 0
.../showcase/nani-hugo/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/nsfw-bruce/index.mdx | 0
.../octopus-variant-octoplushy/index.mdx | 0
.../showcase/onyx-by-thrunic/index.mdx | 0
.../showcase/onyx-full-body-unisuit/index.mdx | 0
.../index.mdx | 0
.../outfit-wahid-theo-simon-by-paul/index.mdx | 0
.../index.mdx | 0
.../showcase/paco-by-joost/index.mdx | 0
.../showcase/paco-by-karen/index.mdx | 0
.../showcase/paco-by-stefan/index.mdx | 0
.../showcase/paco-pj-shorts/index.mdx | 0
.../showcase/pirate-bruce/index.mdx | 0
.../showcase/pregnant-lady-penelope/index.mdx | 0
.../printed-charlies-by-william/index.mdx | 0
.../showcase/purple-bruce/index.mdx | 0
.../showcase/purple-huey/index.mdx | 0
.../showcase/pyjama-paco-by-gaelle/index.mdx | 0
.../showcase/quentin-carlita/index.mdx | 0
.../showcase/quilted-jersey-huey/index.mdx | 0
.../showcase/ramoth-cathrin-corset/index.mdx | 0
.../ramoth-short-sleeve-simon/index.mdx | 0
.../showcase/ramoth-simon-flannel/index.mdx | 0
.../showcase/red-button-simon/index.mdx | 0
.../showcase/red-theo/index.mdx | 0
.../redblaquegolden-simon-sandy/index.mdx | 0
.../index.mdx | 0
.../showcase/ricos-huey/index.mdx | 0
.../showcase/ricos-sven/index.mdx | 0
.../index.mdx | 0
.../showcase/rostic-wahid/index.mdx | 0
.../rowan-reversible-florence/index.mdx | 0
.../rowans-leaf-print-florence/index.mdx | 0
.../showcase/sample-wahid/index.mdx | 0
.../showcase/sandy-by-adam/index.mdx | 0
.../showcase/sandy-by-anneke/index.mdx | 0
.../showcase/sandy-by-jv/index.mdx | 0
.../showcase/sandy-by-karin/index.mdx | 0
.../showcase/sandy-by-sunshine/index.mdx | 0
.../showcase/scifaeries-simon-shirt/index.mdx | 0
.../showcase/sebastiansew-paco-2/index.mdx | 0
.../showcase/sebastiansew-paco/index.mdx | 0
.../short-sleeve-shelly-rash-guard/index.mdx | 0
.../index.mdx | 0
.../showcase/shorts/index.mdx | 0
.../showcase/simon-as-overshirt/index.mdx | 0
.../showcase/simon-by-alan/index.mdx | 0
.../showcase/simon-by-anna/index.mdx | 0
.../showcase/simon-by-deby/index.mdx | 0
.../showcase/simon-by-julian/index.mdx | 0
.../index.mdx | 0
.../showcase/simon-by-mick/index.mdx | 0
.../showcase/simon-by-ramoth/index.mdx | 0
.../showcase/simon-by-sewandrew/index.mdx | 0
.../showcase/simon-by-stefan/index.mdx | 0
.../showcase/simon-for-schorsch/index.mdx | 0
.../showcase/simon-on-snook/index.mdx | 0
.../simon-shirt-by-sewingdentist/index.mdx | 0
.../simon-shirt-by-solstice/index.mdx | 0
.../showcase/simon-white-stripe/index.mdx | 0
.../showcase/simone-by-gaelle/index.mdx | 0
.../showcase/simone-by-jackseye/index.mdx | 0
.../index.mdx | 0
.../index.mdx | 0
.../showcase/speckles-simon/index.mdx | 0
.../showcase/sterling42-wahid/index.mdx | 0
.../showcase/stripey-teagan/index.mdx | 0
.../{orgdocs => org}/showcase/suit/index.mdx | 0
.../index.mdx | 0
.../showcase/sven-nr1/index.mdx | 0
.../showcase/sven-nr2/index.mdx | 0
.../showcase/sven-nr3/index.mdx | 0
.../showcase/tamiko-by-gaelle/index.mdx | 0
.../showcase/tartan-fu-mask/index.mdx | 0
.../showcase/teagan-by-daryl/index.mdx | 0
.../showcase/teagan-by-karen/index.mdx | 0
.../showcase/teagan-karen/index.mdx | 0
.../showcase/teagans-for-swimming/index.mdx | 0
.../the-bella-block-by-rockerkitten/index.mdx | 0
.../showcase/theo-by-theodore/index.mdx | 0
.../showcase/theo-jeroen/index.mdx | 0
.../showcase/tiberius-the-tunica/index.mdx | 0
.../showcase/tight-aaron/index.mdx | 0
.../showcase/titan-by-deby/index.mdx | 0
.../index.mdx | 0
.../showcase/trans-hi-by-halbmoki/index.mdx | 0
.../trayvon-tie-by-aneconradie/index.mdx | 0
.../showcase/trayvon-tie-square/index.mdx | 0
.../showcase/two-bruce-boxer-briefs/index.mdx | 0
.../showcase/two-non-binary-hi/index.mdx | 0
.../index.mdx | 0
.../showcase/two-tone-teagan/index.mdx | 0
.../showcase/ursula-and-bee/index.mdx | 0
.../showcase/ursula-by-karen/index.mdx | 0
.../showcase/ursula-by-starf/index.mdx | 0
.../showcase/ursula-test-pairs/index.mdx | 0
.../ursula-undies-by-cakeymcdoodle/index.mdx | 0
.../showcase/ursulas-with-lace/index.mdx | 0
.../showcase/wahid-by-adam/index.mdx | 0
.../showcase/wahid-by-minty/index.mdx | 0
.../showcase/wahid-by-ogredandy/index.mdx | 0
.../showcase/wahid-by-pho/index.mdx | 0
.../showcase/wahid-grey-windowpane/index.mdx | 0
.../showcase/wahid-jeroen/index.mdx | 0
.../showcase/wahid-kaena/index.mdx | 0
.../wahid-waistcoat-by-womp/index.mdx | 0
.../walburga-the-wappenrock/index.mdx | 0
.../showcase/waralee-by-wouter/index.mdx | 0
.../waralee-shorts-by-space/index.mdx | 0
.../waralee-with-pocket-by-nael/index.mdx | 0
.../waralee-wrap-pants-by-wouter/index.mdx | 0
.../showcase/waralees-by-gaelle/index.mdx | 0
.../index.mdx | 0
.../watermelon-charlie-chinos/index.mdx | 0
.../index.mdx | 0
.../showcase/wonder-warrior-jacket/index.mdx | 0
.../showcase/wonder-woman-simon/index.mdx | 0
.../wonderful-waralees-by-tuesday/index.mdx | 0
.../showcase/woolen-wahid/index.mdx | 0
.../xl-octoplushy-by-lasermonkey12/index.mdx | 0
.../showcase/yellow-button-simon/index.mdx | 0
.../showcase/yoga-set-by-paul/index.mdx | 0
.../showcase/yuri-by-its-designer/index.mdx | 0
.../showcase/zees-lunetius-lacerna/index.mdx | 0
sites/org/sidebars.js | 10 +
sites/org/site.config.mjs | 39 -
sites/org/skip_build.mjs | 2 +-
sites/org/src/components/DesignExamples.mjs | 35 +
sites/org/src/components/bare-layout.mjs | 46 +
sites/org/src/css/code.css | 161 +
sites/org/src/css/custom.css | 307 +
sites/org/src/css/patterns.css | 560 +
sites/org/src/lib/designinfo.mjs | 5 +
sites/org/src/lib/designs.mjs | 12 +
sites/org/src/lib/i18n.mjs | 9 +
sites/{orgdocs => org}/src/lib/plugins.mjs | 0
sites/org/src/lib/utils.mjs | 65 +
sites/org/src/pages/confirm/emailchange.js | 26 +
sites/org/src/pages/confirm/signin.js | 26 +
sites/org/src/pages/confirm/signup.js | 26 +
sites/org/src/pages/editor.js | 26 +
sites/org/src/pages/index.js | 383 +
sites/org/src/pages/oidc-flow/index.js | 162 +
sites/org/src/pages/signin/index.js | 25 +
sites/org/src/pages/signup/index.js | 25 +
sites/org/src/pages/typography.js | 114 +
sites/org/src/pages/welcome/bio.js | 20 +
sites/org/src/pages/welcome/compare.js | 28 +
sites/org/src/pages/welcome/img.js | 20 +
sites/org/src/pages/welcome/index.js | 20 +
sites/org/src/pages/welcome/newsletter.js | 20 +
sites/org/src/pages/welcome/units.js | 24 +
sites/org/src/pages/welcome/username.js | 20 +
sites/org/src/theme/BlogPostItem/index.js | 78 +
sites/org/src/theme/BlogPostItems/index.js | 209 +
sites/org/src/theme/MDXComponents/A.js | 5 +
sites/org/src/theme/MDXComponents/Code.js | 16 +
sites/org/src/theme/MDXComponents/Details.js | 14 +
sites/org/src/theme/MDXComponents/Heading.js | 5 +
.../org/src/theme/MDXComponents/Img/index.js | 20 +
.../theme/MDXComponents/Img/styles.module.css | 3 +
sites/org/src/theme/MDXComponents/Li.js | 7 +
sites/org/src/theme/MDXComponents/Pre.js | 6 +
sites/org/src/theme/MDXComponents/Ul/index.js | 19 +
.../theme/MDXComponents/Ul/styles.module.css | 7 +
.../src/theme/MDXComponents/design-info.mjs | 2 +-
.../src/theme/MDXComponents/example.mjs | 22 +-
sites/org/src/theme/MDXComponents/index.js | 53 +
sites/org/src/theme/MDXComponents/legend.mjs | 24 +
.../theme/MDXComponents/measurement-image.mjs | 0
.../theme/MDXComponents/sarah/acrossback.svg | 0
.../src/theme/MDXComponents/sarah/ankle.svg | 0
.../src/theme/MDXComponents/sarah/biceps.svg | 0
.../theme/MDXComponents/sarah/bustfront.svg | 0
.../sarah/bustpointtounderbust.svg | 0
.../theme/MDXComponents/sarah/bustspan.svg | 0
.../src/theme/MDXComponents/sarah/chest.svg | 0
.../theme/MDXComponents/sarah/crossseam.svg | 0
.../MDXComponents/sarah/crossseamfront.svg | 0
.../theme/MDXComponents/sarah/crotchdepth.svg | 0
.../src/theme/MDXComponents/sarah/head.svg | 0
.../src/theme/MDXComponents/sarah/heel.svg | 0
.../theme/MDXComponents/sarah/highbust.svg | 0
.../MDXComponents/sarah/highbustfront.svg | 0
.../src/theme/MDXComponents/sarah/hips.svg | 0
.../MDXComponents/sarah/hipstoupperleg.svg | 0
.../theme/MDXComponents/sarah/hpstobust.svg | 0
.../MDXComponents/sarah/hpstowaistback.svg | 0
.../MDXComponents/sarah/hpstowaistfront.svg | 0
.../src/theme/MDXComponents/sarah/index.mjs | 0
.../src/theme/MDXComponents/sarah/inseam.svg | 0
.../src/theme/MDXComponents/sarah/knee.svg | 0
.../src/theme/MDXComponents/sarah/neck.svg | 0
.../src/theme/MDXComponents/sarah/seat.svg | 0
.../theme/MDXComponents/sarah/seatback.svg | 0
.../MDXComponents/sarah/shoulderslope.svg | 0
.../MDXComponents/sarah/shouldertoelbow.svg | 0
.../sarah/shouldertoshoulder.svg | 0
.../MDXComponents/sarah/shouldertowrist.svg | 0
.../theme/MDXComponents/sarah/underbust.svg | 0
.../theme/MDXComponents/sarah/upperleg.svg | 0
.../src/theme/MDXComponents/sarah/waist.svg | 0
.../theme/MDXComponents/sarah/waistback.svg | 0
.../MDXComponents/sarah/waisttoarmpit.svg | 0
.../MDXComponents/sarah/waisttofloor.svg | 0
.../theme/MDXComponents/sarah/waisttohips.svg | 0
.../theme/MDXComponents/sarah/waisttoknee.svg | 0
.../theme/MDXComponents/sarah/waisttoseat.svg | 0
.../MDXComponents/sarah/waisttounderbust.svg | 0
.../MDXComponents/sarah/waisttoupperleg.svg | 0
.../src/theme/MDXComponents/sarah/wrist.svg | 0
.../theme/MDXComponents/tim/acrossback.svg | 0
.../src/theme/MDXComponents/tim/ankle.svg | 0
.../src/theme/MDXComponents/tim/biceps.svg | 0
.../src/theme/MDXComponents/tim/bustfront.svg | 0
.../tim/bustpointtounderbust.svg | 0
.../src/theme/MDXComponents/tim/bustspan.svg | 0
.../src/theme/MDXComponents/tim/chest.svg | 0
.../src/theme/MDXComponents/tim/crossseam.svg | 0
.../MDXComponents/tim/crossseamfront.svg | 0
.../theme/MDXComponents/tim/crotchdepth.svg | 0
.../src/theme/MDXComponents/tim/head.svg | 0
.../src/theme/MDXComponents/tim/heel.svg | 0
.../src/theme/MDXComponents/tim/highbust.svg | 0
.../theme/MDXComponents/tim/highbustfront.svg | 0
.../src/theme/MDXComponents/tim/hips.svg | 0
.../MDXComponents/tim/hipstoupperleg.svg | 0
.../src/theme/MDXComponents/tim/hpstobust.svg | 0
.../MDXComponents/tim/hpstowaistback.svg | 0
.../MDXComponents/tim/hpstowaistfront.svg | 0
.../src/theme/MDXComponents/tim/index.mjs | 0
.../src/theme/MDXComponents/tim/inseam.svg | 0
.../src/theme/MDXComponents/tim/knee.svg | 0
.../src/theme/MDXComponents/tim/neck.svg | 0
.../src/theme/MDXComponents/tim/seat.svg | 0
.../src/theme/MDXComponents/tim/seatback.svg | 0
.../theme/MDXComponents/tim/shoulderslope.svg | 0
.../MDXComponents/tim/shouldertoelbow.svg | 0
.../MDXComponents/tim/shouldertoshoulder.svg | 0
.../MDXComponents/tim/shouldertowrist.svg | 0
.../src/theme/MDXComponents/tim/underbust.svg | 0
.../src/theme/MDXComponents/tim/upperleg.svg | 0
.../src/theme/MDXComponents/tim/waist.svg | 0
.../src/theme/MDXComponents/tim/waistback.svg | 0
.../theme/MDXComponents/tim/waisttoarmpit.svg | 0
.../theme/MDXComponents/tim/waisttofloor.svg | 0
.../theme/MDXComponents/tim/waisttohips.svg | 0
.../theme/MDXComponents/tim/waisttoknee.svg | 0
.../theme/MDXComponents/tim/waisttoseat.svg | 0
.../MDXComponents/tim/waisttounderbust.svg | 0
.../MDXComponents/tim/waisttoupperleg.svg | 0
.../src/theme/MDXComponents/tim/wrist.svg | 0
.../src/theme/MDXComponents/youtube.mjs | 0
.../src/theme/NavbarItem/ComponentTypes.js | 9 +
sites/{orgdocs => org}/static/.nojekyll | 0
.../favicon => org/static}/favicon.ico | Bin
sites/org/static/img/favicon.ico | Bin 0 -> 15086 bytes
.../org/static/img/freesewing-social-card.png | Bin 0 -> 305118 bytes
sites/org/static/img/lineup-backdrop.svg | 54 +
sites/org/static/img/logo-white.svg | 7 +
sites/org/static/img/logo.svg | 13 +
.../{public => static}/img/models/model-0.png | Bin
.../{public => static}/img/models/model-1.png | Bin
.../{public => static}/img/models/model-2.png | Bin
.../{public => static}/img/models/model-3.png | Bin
.../{public => static}/img/models/model-4.png | Bin
.../{public => static}/img/models/model-5.png | Bin
.../{public => static}/img/models/model-6.png | Bin
.../{public => static}/img/models/model-7.png | Bin
.../{public => static}/img/sarah-seated.jpg | Bin
.../{public => static}/img/sarah-standing.jpg | Bin
.../org/{public => static}/img/tim-seated.jpg | Bin
.../{public => static}/img/tim-standing.jpg | Bin
.../static/img/undraw_docusaurus_mountain.svg | 0
.../static/img/undraw_docusaurus_react.svg | 0
.../static/img/undraw_docusaurus_tree.svg | 0
sites/org/tailwind-force.html | 66 +
sites/org/tailwind.config.mjs | 32 +-
sites/org/themes/dark.mjs | 70 +
sites/org/themes/index.mjs | 4 +
sites/org/themes/light.mjs | 262 +
sites/org/utils.mjs | 17 -
sites/org/vercel.json | 9 -
sites/orgdocs/babel.config.js | 4 -
sites/orgdocs/blog/announcing-v2/index.mdx | 86 -
.../index.mdx | 156 -
sites/orgdocs/blog/freesewing-v3-1/index.mdx | 63 -
.../blog/welcome-to-freesewining-3/index.mdx | 103 -
.../docs/about/faq/email-trouble/readme.mdx | 25 -
.../about/faq/measurements-issues/readme.mdx | 155 -
.../docs/about/faq/newsletter/readme.mdx | 5 -
.../why-subscribe-multiple-clicks/readme.mdx | 71 -
.../readme.mdx | 41 -
.../docs/about/faq/printing-issues/readme.mdx | 57 -
sites/orgdocs/docs/about/faq/readme.mdx | 5 -
.../docs/about/faq/seam-allowance/readme.mdx | 7 -
.../faq/standard-measurements/readme.mdx | 9 -
.../docs/about/faq/tapering-seams/readme.mdx | 8 -
sites/orgdocs/docs/about/notation/readme.mdx | 227 -
.../docs/about/pledge/motivation/readme.mdx | 94 -
sites/orgdocs/docs/about/pledge/readme.mdx | 31 -
sites/orgdocs/docs/about/privacy/readme.mdx | 175 -
sites/orgdocs/docs/about/readme.mdx | 5 -
sites/orgdocs/docs/about/rights/readme.mdx | 97 -
.../orgdocs/docs/about/site/draft/readme.mdx | 241 -
sites/orgdocs/docs/about/site/readme.mdx | 103 -
sites/orgdocs/docs/about/terms/readme.mdx | 30 -
.../aaron/options/armholedrop/readme.mdx | 13 -
.../aaron/options/backlinebend/readme.mdx | 13 -
.../aaron/options/chestease/readme.mdx | 20 -
.../aaron/options/draftforhighbust/readme.mdx | 9 -
.../designs/aaron/options/hipsease/readme.mdx | 18 -
.../options/legacyarmholedepth/readme.mdx | 11 -
.../aaron/options/lengthbonus/readme.mdx | 12 -
.../aaron/options/necklinebend/readme.mdx | 13 -
.../aaron/options/necklinedrop/readme.mdx | 13 -
.../options/shoulderstrapplacement/readme.mdx | 13 -
.../options/shoulderstrapwidth/readme.mdx | 11 -
.../aaron/options/stretchfactor/readme.mdx | 15 -
sites/orgdocs/docs/designs/aaron/readme.mdx | 79 -
sites/orgdocs/docs/designs/albert/readme.mdx | 42 -
sites/orgdocs/docs/designs/bee/readme.mdx | 83 -
sites/orgdocs/docs/designs/bella/readme.mdx | 64 -
.../orgdocs/docs/designs/benjamin/readme.mdx | 104 -
sites/orgdocs/docs/designs/bent/readme.mdx | 60 -
sites/orgdocs/docs/designs/bibi/readme.mdx | 141 -
sites/orgdocs/docs/designs/bob/readme.mdx | 46 -
sites/orgdocs/docs/designs/breanna/readme.mdx | 69 -
.../designs/brian/instructions/readme.mdx | 74 -
.../brian/options/acrossbackfactor/readme.mdx | 9 -
.../brian/options/armholedepth/readme.mdx | 14 -
.../options/armholedepthfactor/readme.mdx | 9 -
.../brian/options/backneckcutout/readme.mdx | 9 -
.../brian/options/bicepsease/readme.mdx | 8 -
.../brian/options/chestease/readme.mdx | 8 -
.../brian/options/collarease/readme.mdx | 8 -
.../designs/brian/options/cuffease/readme.mdx | 8 -
.../brian/options/draftforhighbust/readme.mdx | 8 -
.../options/frontarmholedeeper/readme.mdx | 12 -
.../options/legacyarmholedepth/readme.mdx | 15 -
.../brian/options/lengthbonus/readme.mdx | 14 -
.../brian/options/s3armhole/readme.mdx | 9 -
.../designs/brian/options/s3collar/readme.mdx | 9 -
.../brian/options/shoulderease/readme.mdx | 12 -
.../options/shoulderslopereduction/readme.mdx | 11 -
.../options/sleevecapbackfactorx/readme.mdx | 14 -
.../options/sleevecapbackfactory/readme.mdx | 13 -
.../brian/options/sleevecapease/readme.mdx | 15 -
.../options/sleevecapfrontfactorx/readme.mdx | 14 -
.../options/sleevecapfrontfactory/readme.mdx | 12 -
.../options/sleevecapq1offset/readme.mdx | 12 -
.../options/sleevecapq1spread1/readme.mdx | 12 -
.../options/sleevecapq1spread2/readme.mdx | 12 -
.../options/sleevecapq2offset/readme.mdx | 13 -
.../options/sleevecapq2spread1/readme.mdx | 12 -
.../options/sleevecapq2spread2/readme.mdx | 12 -
.../options/sleevecapq3offset/readme.mdx | 12 -
.../options/sleevecapq3spread1/readme.mdx | 12 -
.../options/sleevecapq3spread2/readme.mdx | 12 -
.../options/sleevecapq4offset/readme.mdx | 12 -
.../options/sleevecapq4spread1/readme.mdx | 12 -
.../options/sleevecapq4spread2/readme.mdx | 12 -
.../options/sleevecaptopfactorx/readme.mdx | 12 -
.../options/sleevecaptopfactory/readme.mdx | 12 -
.../options/sleevelengthbonus/readme.mdx | 8 -
.../options/sleevewidthguarantee/readme.mdx | 18 -
sites/orgdocs/docs/designs/brian/readme.mdx | 242 -
sites/orgdocs/docs/designs/bruce/readme.mdx | 55 -
sites/orgdocs/docs/designs/carlita/readme.mdx | 161 -
sites/orgdocs/docs/designs/carlton/readme.mdx | 163 -
sites/orgdocs/docs/designs/cathrin/readme.mdx | 86 -
sites/orgdocs/docs/designs/charlie/readme.mdx | 91 -
.../docs/designs/cornelius/options/readme.mdx | 111 -
.../orgdocs/docs/designs/cornelius/readme.mdx | 132 -
sites/orgdocs/docs/designs/diana/readme.mdx | 57 -
.../orgdocs/docs/designs/florence/readme.mdx | 67 -
sites/orgdocs/docs/designs/florent/readme.mdx | 81 -
sites/orgdocs/docs/designs/gozer/readme.mdx | 37 -
.../docs/designs/hi/options/readme.mdx | 50 -
sites/orgdocs/docs/designs/hi/readme.mdx | 102 -
sites/orgdocs/docs/designs/holmes/readme.mdx | 155 -
.../docs/designs/hortensia/options/readme.mdx | 59 -
.../orgdocs/docs/designs/hortensia/readme.mdx | 91 -
sites/orgdocs/docs/designs/huey/readme.mdx | 63 -
sites/orgdocs/docs/designs/hugo/readme.mdx | 71 -
.../jaeger/instructions/collarCuts.svg | 43 -
.../jaeger/instructions/collarMarkings.svg | 11 -
.../jaeger/instructions/collarWithCanvas.svg | 4 -
sites/orgdocs/docs/designs/jaeger/readme.mdx | 150 -
sites/orgdocs/docs/designs/jane/readme.mdx | 136 -
sites/orgdocs/docs/designs/lily/readme.mdx | 33 -
sites/orgdocs/docs/designs/lucy/readme.mdx | 97 -
.../docs/designs/lumina/options/readme.mdx | 135 -
sites/orgdocs/docs/designs/lumina/readme.mdx | 86 -
.../docs/designs/lumira/options/readme.mdx | 156 -
sites/orgdocs/docs/designs/lumira/readme.mdx | 83 -
.../orgdocs/docs/designs/lunetius/readme.mdx | 58 -
.../docs/designs/noble/options/readme.mdx | 266 -
sites/orgdocs/docs/designs/noble/readme.mdx | 71 -
.../designs/octoplushy/options/readme.mdx | 110 -
.../docs/designs/octoplushy/readme.mdx | 108 -
sites/orgdocs/docs/designs/onyx/readme.mdx | 96 -
sites/orgdocs/docs/designs/opal/readme.mdx | 75 -
.../docs/designs/otis/options/readme.mdx | 66 -
sites/orgdocs/docs/designs/otis/readme.mdx | 71 -
sites/orgdocs/docs/designs/paco/readme.mdx | 84 -
.../docs/designs/penelope/options/readme.mdx | 182 -
.../orgdocs/docs/designs/penelope/readme.mdx | 91 -
sites/orgdocs/docs/designs/readme.mdx | 5 -
sites/orgdocs/docs/designs/sandy/readme.mdx | 109 -
sites/orgdocs/docs/designs/shelly/readme.mdx | 74 -
sites/orgdocs/docs/designs/shin/readme.mdx | 60 -
sites/orgdocs/docs/designs/simon/readme.mdx | 149 -
sites/orgdocs/docs/designs/simone/readme.mdx | 49 -
.../docs/designs/skully/options/readme.mdx | 19 -
sites/orgdocs/docs/designs/skully/readme.mdx | 102 -
sites/orgdocs/docs/designs/sven/readme.mdx | 61 -
sites/orgdocs/docs/designs/tamiko/readme.mdx | 45 -
sites/orgdocs/docs/designs/teagan/readme.mdx | 65 -
.../orgdocs/docs/designs/tiberius/readme.mdx | 104 -
sites/orgdocs/docs/designs/titan/readme.mdx | 59 -
sites/orgdocs/docs/designs/trayvon/readme.mdx | 133 -
sites/orgdocs/docs/designs/tristan/readme.mdx | 104 -
sites/orgdocs/docs/designs/uma/readme.mdx | 91 -
sites/orgdocs/docs/designs/umbra/readme.mdx | 122 -
sites/orgdocs/docs/designs/wahid/readme.mdx | 62 -
.../orgdocs/docs/designs/walburga/readme.mdx | 92 -
sites/orgdocs/docs/designs/waralee/readme.mdx | 103 -
sites/orgdocs/docs/designs/yuri/readme.mdx | 76 -
sites/orgdocs/docs/measurements/readme.mdx | 5 -
.../docs/sewing/on-the-fold/readme.mdx | 20 -
sites/orgdocs/docs/sewing/readme.mdx | 5 -
sites/orgdocs/docusaurus.config.mjs | 328 -
sites/orgdocs/package.json | 55 -
sites/orgdocs/scripts/prebuild-step2.mjs | 176 -
sites/orgdocs/scripts/prebuild-step3.mjs | 76 -
sites/orgdocs/sidebars.js | 33 -
sites/orgdocs/skip_build.mjs | 3 -
sites/orgdocs/src/components/doc-list.js | 19 -
sites/orgdocs/src/components/todo.mjs | 13 -
sites/orgdocs/src/css/custom.css | 257 -
sites/orgdocs/src/css/patterns.css | 448 -
sites/orgdocs/src/lib/utils.mjs | 65 -
sites/orgdocs/src/pages/_new-design.md | 3 -
sites/orgdocs/src/pages/_setup-monorepo.md | 5 -
sites/orgdocs/src/pages/account/index.md | 1 -
sites/orgdocs/src/pages/designs/aaron.md | 1 -
sites/orgdocs/src/pages/designs/albert.md | 1 -
sites/orgdocs/src/pages/designs/bee.md | 1 -
sites/orgdocs/src/pages/designs/bella.md | 1 -
sites/orgdocs/src/pages/designs/benjamin.md | 1 -
sites/orgdocs/src/pages/designs/bent.md | 1 -
sites/orgdocs/src/pages/designs/bibi.md | 1 -
sites/orgdocs/src/pages/designs/bob.md | 1 -
sites/orgdocs/src/pages/designs/breanna.md | 1 -
sites/orgdocs/src/pages/designs/brian.md | 1 -
sites/orgdocs/src/pages/designs/bruce.md | 1 -
sites/orgdocs/src/pages/designs/carlita.md | 1 -
sites/orgdocs/src/pages/designs/carlton.md | 1 -
sites/orgdocs/src/pages/designs/cathrin.md | 1 -
sites/orgdocs/src/pages/designs/charlie.md | 1 -
sites/orgdocs/src/pages/designs/cornelius.md | 1 -
sites/orgdocs/src/pages/designs/diana.md | 1 -
sites/orgdocs/src/pages/designs/florence.md | 1 -
sites/orgdocs/src/pages/designs/florent.md | 1 -
sites/orgdocs/src/pages/designs/gozer.md | 1 -
sites/orgdocs/src/pages/designs/hi.md | 1 -
sites/orgdocs/src/pages/designs/holmes.md | 1 -
sites/orgdocs/src/pages/designs/hortensia.md | 1 -
sites/orgdocs/src/pages/designs/huey.md | 1 -
sites/orgdocs/src/pages/designs/hugo.md | 1 -
sites/orgdocs/src/pages/designs/index.md | 1 -
sites/orgdocs/src/pages/designs/jaeger.md | 1 -
sites/orgdocs/src/pages/designs/jane.md | 1 -
sites/orgdocs/src/pages/designs/lily.md | 1 -
sites/orgdocs/src/pages/designs/lucy.md | 1 -
sites/orgdocs/src/pages/designs/lumina.md | 1 -
sites/orgdocs/src/pages/designs/lumira.md | 1 -
sites/orgdocs/src/pages/designs/lunetius.md | 1 -
sites/orgdocs/src/pages/designs/noble.md | 1 -
sites/orgdocs/src/pages/designs/octoplushy.md | 1 -
sites/orgdocs/src/pages/designs/onyx.md | 1 -
sites/orgdocs/src/pages/designs/opal.md | 1 -
sites/orgdocs/src/pages/designs/otis.md | 1 -
sites/orgdocs/src/pages/designs/paco.md | 1 -
sites/orgdocs/src/pages/designs/penelope.md | 1 -
sites/orgdocs/src/pages/designs/sandy.md | 1 -
sites/orgdocs/src/pages/designs/shelly.md | 1 -
sites/orgdocs/src/pages/designs/shin.md | 1 -
sites/orgdocs/src/pages/designs/simon.md | 1 -
sites/orgdocs/src/pages/designs/simone.md | 1 -
sites/orgdocs/src/pages/designs/skully.md | 1 -
sites/orgdocs/src/pages/designs/sven.md | 1 -
sites/orgdocs/src/pages/designs/tamiko.md | 1 -
sites/orgdocs/src/pages/designs/teagan.md | 1 -
sites/orgdocs/src/pages/designs/tiberius.md | 1 -
sites/orgdocs/src/pages/designs/titan.md | 1 -
sites/orgdocs/src/pages/designs/trayvon.md | 1 -
sites/orgdocs/src/pages/designs/tristan.md | 1 -
sites/orgdocs/src/pages/designs/uma.md | 1 -
sites/orgdocs/src/pages/designs/umbra.md | 1 -
sites/orgdocs/src/pages/designs/wahid.md | 1 -
sites/orgdocs/src/pages/designs/walburga.md | 1 -
sites/orgdocs/src/pages/designs/waralee.md | 1 -
sites/orgdocs/src/pages/designs/yuri.md | 1 -
sites/orgdocs/src/pages/docs.js | 84 -
sites/orgdocs/src/pages/editor/index.md | 1 -
sites/orgdocs/src/pages/id.md | 1 -
sites/orgdocs/src/pages/index.js | 84 -
sites/orgdocs/src/pages/new/index.md | 1 -
sites/orgdocs/src/pages/new/showcase.md | 1 -
sites/orgdocs/src/pages/patrons/index.md | 0
sites/orgdocs/src/pages/patrons/join.md | 0
sites/orgdocs/src/pages/profile.md | 1 -
sites/orgdocs/src/pages/share.md | 1 -
sites/orgdocs/src/pages/support.md | 1 -
sites/orgdocs/src/pages/users/user.md | 1 -
sites/orgdocs/src/pages/welcome.md | 1 -
sites/orgdocs/src/theme/BlogPostItem/index.js | 78 -
.../orgdocs/src/theme/BlogPostItems/index.js | 189 -
.../orgdocs/src/theme/MDXComponents/index.js | 55 -
.../src/theme/MDXComponents/legend.mjs | 24 -
.../src/theme/MDXComponents/readmore.js | 9 -
sites/orgdocs/static/img/sarah-seated.jpg | Bin 95232 -> 0 bytes
sites/orgdocs/static/img/sarah-standing.jpg | Bin 159308 -> 0 bytes
sites/orgdocs/static/img/tim-seated.jpg | Bin 78944 -> 0 bytes
sites/orgdocs/static/img/tim-standing.jpg | Bin 125744 -> 0 bytes
sites/orgdocs/tailwind.config.mjs | 23 -
sites/orgdocs/themes/dark.mjs | 90 -
sites/orgdocs/themes/index.mjs | 4 -
sites/orgdocs/themes/light.mjs | 258 -
sites/sde/README.md | 5 -
sites/sde/components/design-examples.mjs | 3 -
sites/sde/components/dynamic-org-docs.mjs | 13 -
sites/sde/components/feeds.mjs | 6 -
sites/sde/components/header/design-picker.mjs | 36 -
sites/sde/components/header/index.mjs | 102 -
sites/sde/components/layouts/bare.mjs | 3 -
sites/sde/components/layouts/default.mjs | 5 -
sites/sde/components/layouts/workbench.mjs | 7 -
.../sde/components/navigation/modal-menu.mjs | 28 -
sites/sde/components/search.mjs | 2 -
sites/sde/components/wrappers/page.mjs | 45 -
sites/sde/design/from-bella/en.json | 7 -
sites/sde/design/from-bella/i18n/de.json | 7 -
sites/sde/design/from-bella/i18n/en.json | 7 -
sites/sde/design/from-bella/i18n/es.json | 7 -
sites/sde/design/from-bella/i18n/fr.json | 7 -
sites/sde/design/from-bella/i18n/index.mjs | 8 -
sites/sde/design/from-bella/i18n/nl.json | 7 -
sites/sde/design/from-bella/i18n/uk.json | 7 -
sites/sde/design/from-bella/src/back.mjs | 14 -
sites/sde/design/from-bella/src/front.mjs | 16 -
sites/sde/design/from-bella/src/index.mjs | 23 -
sites/sde/design/from-bent/i18n/de.json | 7 -
sites/sde/design/from-bent/i18n/en.json | 7 -
sites/sde/design/from-bent/i18n/es.json | 7 -
sites/sde/design/from-bent/i18n/fr.json | 7 -
sites/sde/design/from-bent/i18n/index.mjs | 8 -
sites/sde/design/from-bent/i18n/nl.json | 7 -
sites/sde/design/from-bent/i18n/uk.json | 7 -
sites/sde/design/from-bent/src/back.mjs | 14 -
sites/sde/design/from-bent/src/front.mjs | 16 -
sites/sde/design/from-bent/src/index.mjs | 25 -
sites/sde/design/from-bent/src/top-sleeve.mjs | 16 -
.../sde/design/from-bent/src/under-sleeve.mjs | 16 -
sites/sde/design/from-breanna/i18n/de.json | 7 -
sites/sde/design/from-breanna/i18n/en.json | 7 -
sites/sde/design/from-breanna/i18n/es.json | 7 -
sites/sde/design/from-breanna/i18n/fr.json | 7 -
sites/sde/design/from-breanna/i18n/index.mjs | 8 -
sites/sde/design/from-breanna/i18n/nl.json | 7 -
sites/sde/design/from-breanna/i18n/uk.json | 7 -
sites/sde/design/from-breanna/src/back.mjs | 14 -
sites/sde/design/from-breanna/src/front.mjs | 16 -
sites/sde/design/from-breanna/src/index.mjs | 24 -
sites/sde/design/from-breanna/src/sleeve.mjs | 16 -
sites/sde/design/from-brian/i18n/de.json | 7 -
sites/sde/design/from-brian/i18n/en.json | 7 -
sites/sde/design/from-brian/i18n/es.json | 7 -
sites/sde/design/from-brian/i18n/fr.json | 7 -
sites/sde/design/from-brian/i18n/index.mjs | 8 -
sites/sde/design/from-brian/i18n/nl.json | 7 -
sites/sde/design/from-brian/i18n/uk.json | 7 -
sites/sde/design/from-brian/src/back.mjs | 14 -
sites/sde/design/from-brian/src/front.mjs | 16 -
sites/sde/design/from-brian/src/index.mjs | 24 -
sites/sde/design/from-brian/src/sleeve.mjs | 14 -
sites/sde/design/from-scratch/i18n/de.json | 7 -
sites/sde/design/from-scratch/i18n/en.json | 9 -
sites/sde/design/from-scratch/i18n/es.json | 7 -
sites/sde/design/from-scratch/i18n/fr.json | 7 -
sites/sde/design/from-scratch/i18n/index.mjs | 8 -
sites/sde/design/from-scratch/i18n/nl.json | 7 -
sites/sde/design/from-scratch/i18n/uk.json | 7 -
sites/sde/design/from-scratch/src/bib.mjs | 8 -
sites/sde/design/from-scratch/src/index.mjs | 16 -
sites/sde/design/from-titan/i18n/de.json | 7 -
sites/sde/design/from-titan/i18n/en.json | 7 -
sites/sde/design/from-titan/i18n/es.json | 7 -
sites/sde/design/from-titan/i18n/fr.json | 7 -
sites/sde/design/from-titan/i18n/index.mjs | 8 -
sites/sde/design/from-titan/i18n/nl.json | 7 -
sites/sde/design/from-titan/i18n/uk.json | 7 -
sites/sde/design/from-titan/src/back.mjs | 19 -
sites/sde/design/from-titan/src/front.mjs | 19 -
sites/sde/design/from-titan/src/index.mjs | 23 -
sites/sde/design/tutorial/i18n/de.json | 31 -
sites/sde/design/tutorial/i18n/en.json | 31 -
sites/sde/design/tutorial/i18n/es.json | 31 -
sites/sde/design/tutorial/i18n/fr.json | 31 -
sites/sde/design/tutorial/i18n/index.mjs | 8 -
sites/sde/design/tutorial/i18n/nl.json | 31 -
sites/sde/design/tutorial/i18n/uk.json | 31 -
sites/sde/design/tutorial/src/bib.mjs | 316 -
sites/sde/design/tutorial/src/index.mjs | 16 -
sites/sde/env.local | 2 -
sites/sde/hooks/use-design.mjs | 21 -
sites/sde/i18n.config.mjs | 3 -
sites/sde/mock/designs.mjs | 1 -
sites/sde/mock/docs-helpers.mjs | 2 -
sites/sde/mock/highlight.mjs | 1 -
sites/sde/mock/http.mjs | 2 -
sites/sde/mock/info.mjs | 1 -
sites/sde/mock/legend.mjs | 1 -
sites/sde/mock/linedrawings.mjs | 1 -
sites/sde/mock/read-more.mjs | 1 -
sites/sde/mock/tabbed-example.mjs | 1 -
sites/sde/mock/youtube.mjs | 1 -
sites/sde/next-i18next.config.js | 15 -
sites/sde/next.config.mjs | 61 -
sites/sde/package.json | 95 -
sites/sde/pages/_app.mjs | 11 -
sites/sde/pages/account.mjs | 48 -
sites/sde/pages/design.mjs | 50 -
sites/sde/pages/design/[design].mjs | 50 -
sites/sde/pages/index.mjs | 66 -
sites/sde/pages/sde/de.yaml | 27 -
sites/sde/pages/sde/en.yaml | 27 -
sites/sde/pages/sde/es.yaml | 27 -
sites/sde/pages/sde/fr.yaml | 27 -
sites/sde/pages/sde/index.mjs | 42 -
sites/sde/pages/sde/nl.yaml | 27 -
sites/sde/pages/sde/uk.yaml | 27 -
.../sde/pages/signin/callback/[provider].mjs | 92 -
sites/sde/pages/signin/index.mjs | 41 -
sites/sde/pages/signup/index.mjs | 35 -
sites/sde/pkgs/.gitkeep | 0
sites/sde/postcss.config.js | 4 -
sites/sde/prebuild.mjs | 26 -
sites/sde/prebuild/.gitkeep | 0
sites/sde/prebuild/sitenav.de.mjs | 5 -
sites/sde/prebuild/sitenav.en.mjs | 5 -
sites/sde/prebuild/sitenav.es.mjs | 5 -
sites/sde/prebuild/sitenav.fr.mjs | 5 -
sites/sde/prebuild/sitenav.mjs | 11 -
sites/sde/prebuild/sitenav.nl.mjs | 5 -
sites/sde/prebuild/sitenav.uk.mjs | 5 -
sites/sde/prebuild/sluglut.mjs | 5 -
sites/sde/public/brands/algolia.svg | 1 -
sites/sde/public/brands/bugsnag.svg | 15 -
sites/sde/public/brands/crowdin.svg | 61 -
sites/sde/public/brands/netlify.svg | 85 -
sites/sde/public/brands/vercel.svg | 6 -
sites/sde/public/img/lineup-backdrop.svg | 54 -
sites/sde/public/locales/de/account.json | 1 -
sites/sde/public/locales/de/auth.json | 1 -
sites/sde/public/locales/de/bella.json | 1 -
sites/sde/public/locales/de/bent.json | 1 -
sites/sde/public/locales/de/breanna.json | 1 -
sites/sde/public/locales/de/brian.json | 1 -
sites/sde/public/locales/de/common.json | 1 -
.../sde/public/locales/de/core-settings.json | 1 -
sites/sde/public/locales/de/curate.json | 1 -
sites/sde/public/locales/de/cut.json | 1 -
.../sde/public/locales/de/design-options.json | 1 -
sites/sde/public/locales/de/designs.json | 1 -
sites/sde/public/locales/de/docs.json | 1 -
sites/sde/public/locales/de/errors.json | 1 -
sites/sde/public/locales/de/flag.json | 1 -
sites/sde/public/locales/de/footer.json | 1 -
sites/sde/public/locales/de/frombella.json | 1 -
sites/sde/public/locales/de/frombent.json | 1 -
sites/sde/public/locales/de/frombreanna.json | 1 -
sites/sde/public/locales/de/frombrian.json | 1 -
sites/sde/public/locales/de/fromscratch.json | 1 -
sites/sde/public/locales/de/fromtitan.json | 1 -
sites/sde/public/locales/de/gdpr.json | 1 -
sites/sde/public/locales/de/header.json | 1 -
sites/sde/public/locales/de/hodl.json | 1 -
sites/sde/public/locales/de/homepage.json | 1 -
sites/sde/public/locales/de/lab.json | 1 -
sites/sde/public/locales/de/locales.json | 1 -
sites/sde/public/locales/de/logs.json | 1 -
sites/sde/public/locales/de/measurements.json | 1 -
sites/sde/public/locales/de/modal.json | 1 -
sites/sde/public/locales/de/newsletter.json | 1 -
sites/sde/public/locales/de/patrons.json | 1 -
.../public/locales/de/plugin-annotations.json | 1 -
sites/sde/public/locales/de/plugins.json | 1 -
sites/sde/public/locales/de/popout.json | 1 -
sites/sde/public/locales/de/print.json | 1 -
sites/sde/public/locales/de/roles.json | 1 -
sites/sde/public/locales/de/sde.json | 1 -
sites/sde/public/locales/de/sections.json | 1 -
sites/sde/public/locales/de/sets.json | 1 -
sites/sde/public/locales/de/sponsors.json | 1 -
sites/sde/public/locales/de/stats.json | 1 -
sites/sde/public/locales/de/status.json | 1 -
sites/sde/public/locales/de/submissions.json | 1 -
sites/sde/public/locales/de/support.json | 1 -
sites/sde/public/locales/de/susi.json | 1 -
sites/sde/public/locales/de/tags.json | 1 -
sites/sde/public/locales/de/techniques.json | 1 -
sites/sde/public/locales/de/themes.json | 1 -
sites/sde/public/locales/de/timeago.json | 1 -
sites/sde/public/locales/de/titan.json | 1 -
sites/sde/public/locales/de/tutorial.json | 1 -
sites/sde/public/locales/de/ui-settings.json | 1 -
sites/sde/public/locales/de/workbench.json | 1 -
sites/sde/public/locales/en/account.json | 1 -
sites/sde/public/locales/en/auth.json | 1 -
sites/sde/public/locales/en/bella.json | 1 -
sites/sde/public/locales/en/bent.json | 1 -
sites/sde/public/locales/en/breanna.json | 1 -
sites/sde/public/locales/en/brian.json | 1 -
sites/sde/public/locales/en/common.json | 1 -
.../sde/public/locales/en/core-settings.json | 1 -
sites/sde/public/locales/en/curate.json | 1 -
sites/sde/public/locales/en/cut.json | 1 -
.../sde/public/locales/en/design-options.json | 1 -
sites/sde/public/locales/en/designs.json | 1 -
sites/sde/public/locales/en/docs.json | 1 -
sites/sde/public/locales/en/errors.json | 1 -
sites/sde/public/locales/en/flag.json | 1 -
sites/sde/public/locales/en/footer.json | 1 -
sites/sde/public/locales/en/frombella.json | 1 -
sites/sde/public/locales/en/frombent.json | 1 -
sites/sde/public/locales/en/frombreanna.json | 1 -
sites/sde/public/locales/en/frombrian.json | 1 -
sites/sde/public/locales/en/fromscratch.json | 1 -
sites/sde/public/locales/en/fromtitan.json | 1 -
sites/sde/public/locales/en/gdpr.json | 1 -
sites/sde/public/locales/en/header.json | 1 -
sites/sde/public/locales/en/hodl.json | 1 -
sites/sde/public/locales/en/homepage.json | 1 -
sites/sde/public/locales/en/lab.json | 1 -
sites/sde/public/locales/en/locales.json | 1 -
sites/sde/public/locales/en/logs.json | 1 -
sites/sde/public/locales/en/measurements.json | 1 -
sites/sde/public/locales/en/modal.json | 1 -
sites/sde/public/locales/en/newsletter.json | 1 -
sites/sde/public/locales/en/patrons.json | 1 -
.../public/locales/en/plugin-annotations.json | 1 -
sites/sde/public/locales/en/plugins.json | 1 -
sites/sde/public/locales/en/popout.json | 1 -
sites/sde/public/locales/en/print.json | 1 -
sites/sde/public/locales/en/roles.json | 1 -
sites/sde/public/locales/en/sde.json | 1 -
sites/sde/public/locales/en/sections.json | 1 -
sites/sde/public/locales/en/sets.json | 1 -
sites/sde/public/locales/en/sponsors.json | 1 -
sites/sde/public/locales/en/stats.json | 1 -
sites/sde/public/locales/en/status.json | 1 -
sites/sde/public/locales/en/submissions.json | 1 -
sites/sde/public/locales/en/support.json | 1 -
sites/sde/public/locales/en/susi.json | 1 -
sites/sde/public/locales/en/tags.json | 1 -
sites/sde/public/locales/en/techniques.json | 1 -
sites/sde/public/locales/en/themes.json | 1 -
sites/sde/public/locales/en/timeago.json | 1 -
sites/sde/public/locales/en/titan.json | 1 -
sites/sde/public/locales/en/tutorial.json | 1 -
sites/sde/public/locales/en/ui-settings.json | 1 -
sites/sde/public/locales/en/workbench.json | 1 -
sites/sde/public/locales/es/account.json | 1 -
sites/sde/public/locales/es/auth.json | 1 -
sites/sde/public/locales/es/bella.json | 1 -
sites/sde/public/locales/es/bent.json | 1 -
sites/sde/public/locales/es/breanna.json | 1 -
sites/sde/public/locales/es/brian.json | 1 -
sites/sde/public/locales/es/common.json | 1 -
.../sde/public/locales/es/core-settings.json | 1 -
sites/sde/public/locales/es/curate.json | 1 -
sites/sde/public/locales/es/cut.json | 1 -
.../sde/public/locales/es/design-options.json | 1 -
sites/sde/public/locales/es/designs.json | 1 -
sites/sde/public/locales/es/docs.json | 1 -
sites/sde/public/locales/es/errors.json | 1 -
sites/sde/public/locales/es/flag.json | 1 -
sites/sde/public/locales/es/footer.json | 1 -
sites/sde/public/locales/es/frombella.json | 1 -
sites/sde/public/locales/es/frombent.json | 1 -
sites/sde/public/locales/es/frombreanna.json | 1 -
sites/sde/public/locales/es/frombrian.json | 1 -
sites/sde/public/locales/es/fromscratch.json | 1 -
sites/sde/public/locales/es/fromtitan.json | 1 -
sites/sde/public/locales/es/gdpr.json | 1 -
sites/sde/public/locales/es/header.json | 1 -
sites/sde/public/locales/es/hodl.json | 1 -
sites/sde/public/locales/es/homepage.json | 1 -
sites/sde/public/locales/es/lab.json | 1 -
sites/sde/public/locales/es/locales.json | 1 -
sites/sde/public/locales/es/logs.json | 1 -
sites/sde/public/locales/es/measurements.json | 1 -
sites/sde/public/locales/es/modal.json | 1 -
sites/sde/public/locales/es/newsletter.json | 1 -
sites/sde/public/locales/es/patrons.json | 1 -
.../public/locales/es/plugin-annotations.json | 1 -
sites/sde/public/locales/es/plugins.json | 1 -
sites/sde/public/locales/es/popout.json | 1 -
sites/sde/public/locales/es/print.json | 1 -
sites/sde/public/locales/es/roles.json | 1 -
sites/sde/public/locales/es/sde.json | 1 -
sites/sde/public/locales/es/sections.json | 1 -
sites/sde/public/locales/es/sets.json | 1 -
sites/sde/public/locales/es/sponsors.json | 1 -
sites/sde/public/locales/es/stats.json | 1 -
sites/sde/public/locales/es/status.json | 1 -
sites/sde/public/locales/es/submissions.json | 1 -
sites/sde/public/locales/es/support.json | 1 -
sites/sde/public/locales/es/susi.json | 1 -
sites/sde/public/locales/es/tags.json | 1 -
sites/sde/public/locales/es/techniques.json | 1 -
sites/sde/public/locales/es/themes.json | 1 -
sites/sde/public/locales/es/timeago.json | 1 -
sites/sde/public/locales/es/titan.json | 1 -
sites/sde/public/locales/es/tutorial.json | 1 -
sites/sde/public/locales/es/ui-settings.json | 1 -
sites/sde/public/locales/es/workbench.json | 1 -
sites/sde/public/locales/fr/account.json | 1 -
sites/sde/public/locales/fr/auth.json | 1 -
sites/sde/public/locales/fr/bella.json | 1 -
sites/sde/public/locales/fr/bent.json | 1 -
sites/sde/public/locales/fr/breanna.json | 1 -
sites/sde/public/locales/fr/brian.json | 1 -
sites/sde/public/locales/fr/common.json | 1 -
.../sde/public/locales/fr/core-settings.json | 1 -
sites/sde/public/locales/fr/curate.json | 1 -
sites/sde/public/locales/fr/cut.json | 1 -
.../sde/public/locales/fr/design-options.json | 1 -
sites/sde/public/locales/fr/designs.json | 1 -
sites/sde/public/locales/fr/docs.json | 1 -
sites/sde/public/locales/fr/errors.json | 1 -
sites/sde/public/locales/fr/flag.json | 1 -
sites/sde/public/locales/fr/footer.json | 1 -
sites/sde/public/locales/fr/frombella.json | 1 -
sites/sde/public/locales/fr/frombent.json | 1 -
sites/sde/public/locales/fr/frombreanna.json | 1 -
sites/sde/public/locales/fr/frombrian.json | 1 -
sites/sde/public/locales/fr/fromscratch.json | 1 -
sites/sde/public/locales/fr/fromtitan.json | 1 -
sites/sde/public/locales/fr/gdpr.json | 1 -
sites/sde/public/locales/fr/header.json | 1 -
sites/sde/public/locales/fr/hodl.json | 1 -
sites/sde/public/locales/fr/homepage.json | 1 -
sites/sde/public/locales/fr/lab.json | 1 -
sites/sde/public/locales/fr/locales.json | 1 -
sites/sde/public/locales/fr/logs.json | 1 -
sites/sde/public/locales/fr/measurements.json | 1 -
sites/sde/public/locales/fr/modal.json | 1 -
sites/sde/public/locales/fr/newsletter.json | 1 -
sites/sde/public/locales/fr/patrons.json | 1 -
.../public/locales/fr/plugin-annotations.json | 1 -
sites/sde/public/locales/fr/plugins.json | 1 -
sites/sde/public/locales/fr/popout.json | 1 -
sites/sde/public/locales/fr/print.json | 1 -
sites/sde/public/locales/fr/roles.json | 1 -
sites/sde/public/locales/fr/sde.json | 1 -
sites/sde/public/locales/fr/sections.json | 1 -
sites/sde/public/locales/fr/sets.json | 1 -
sites/sde/public/locales/fr/sponsors.json | 1 -
sites/sde/public/locales/fr/stats.json | 1 -
sites/sde/public/locales/fr/status.json | 1 -
sites/sde/public/locales/fr/submissions.json | 1 -
sites/sde/public/locales/fr/support.json | 1 -
sites/sde/public/locales/fr/susi.json | 1 -
sites/sde/public/locales/fr/tags.json | 1 -
sites/sde/public/locales/fr/techniques.json | 1 -
sites/sde/public/locales/fr/themes.json | 1 -
sites/sde/public/locales/fr/timeago.json | 1 -
sites/sde/public/locales/fr/titan.json | 1 -
sites/sde/public/locales/fr/tutorial.json | 1 -
sites/sde/public/locales/fr/ui-settings.json | 1 -
sites/sde/public/locales/fr/workbench.json | 1 -
sites/sde/public/locales/nl/account.json | 1 -
sites/sde/public/locales/nl/auth.json | 1 -
sites/sde/public/locales/nl/bella.json | 1 -
sites/sde/public/locales/nl/bent.json | 1 -
sites/sde/public/locales/nl/breanna.json | 1 -
sites/sde/public/locales/nl/brian.json | 1 -
sites/sde/public/locales/nl/common.json | 1 -
.../sde/public/locales/nl/core-settings.json | 1 -
sites/sde/public/locales/nl/curate.json | 1 -
sites/sde/public/locales/nl/cut.json | 1 -
.../sde/public/locales/nl/design-options.json | 1 -
sites/sde/public/locales/nl/designs.json | 1 -
sites/sde/public/locales/nl/docs.json | 1 -
sites/sde/public/locales/nl/errors.json | 1 -
sites/sde/public/locales/nl/flag.json | 1 -
sites/sde/public/locales/nl/footer.json | 1 -
sites/sde/public/locales/nl/frombella.json | 1 -
sites/sde/public/locales/nl/frombent.json | 1 -
sites/sde/public/locales/nl/frombreanna.json | 1 -
sites/sde/public/locales/nl/frombrian.json | 1 -
sites/sde/public/locales/nl/fromscratch.json | 1 -
sites/sde/public/locales/nl/fromtitan.json | 1 -
sites/sde/public/locales/nl/gdpr.json | 1 -
sites/sde/public/locales/nl/header.json | 1 -
sites/sde/public/locales/nl/hodl.json | 1 -
sites/sde/public/locales/nl/homepage.json | 1 -
sites/sde/public/locales/nl/lab.json | 1 -
sites/sde/public/locales/nl/locales.json | 1 -
sites/sde/public/locales/nl/logs.json | 1 -
sites/sde/public/locales/nl/measurements.json | 1 -
sites/sde/public/locales/nl/modal.json | 1 -
sites/sde/public/locales/nl/newsletter.json | 1 -
sites/sde/public/locales/nl/patrons.json | 1 -
.../public/locales/nl/plugin-annotations.json | 1 -
sites/sde/public/locales/nl/plugins.json | 1 -
sites/sde/public/locales/nl/popout.json | 1 -
sites/sde/public/locales/nl/print.json | 1 -
sites/sde/public/locales/nl/roles.json | 1 -
sites/sde/public/locales/nl/sde.json | 1 -
sites/sde/public/locales/nl/sections.json | 1 -
sites/sde/public/locales/nl/sets.json | 1 -
sites/sde/public/locales/nl/sponsors.json | 1 -
sites/sde/public/locales/nl/stats.json | 1 -
sites/sde/public/locales/nl/status.json | 1 -
sites/sde/public/locales/nl/submissions.json | 1 -
sites/sde/public/locales/nl/support.json | 1 -
sites/sde/public/locales/nl/susi.json | 1 -
sites/sde/public/locales/nl/tags.json | 1 -
sites/sde/public/locales/nl/techniques.json | 1 -
sites/sde/public/locales/nl/themes.json | 1 -
sites/sde/public/locales/nl/timeago.json | 1 -
sites/sde/public/locales/nl/titan.json | 1 -
sites/sde/public/locales/nl/tutorial.json | 1 -
sites/sde/public/locales/nl/ui-settings.json | 1 -
sites/sde/public/locales/nl/workbench.json | 1 -
sites/sde/public/locales/uk/account.json | 1 -
sites/sde/public/locales/uk/auth.json | 1 -
sites/sde/public/locales/uk/bella.json | 1 -
sites/sde/public/locales/uk/bent.json | 1 -
sites/sde/public/locales/uk/breanna.json | 1 -
sites/sde/public/locales/uk/brian.json | 1 -
sites/sde/public/locales/uk/common.json | 1 -
.../sde/public/locales/uk/core-settings.json | 1 -
sites/sde/public/locales/uk/curate.json | 1 -
sites/sde/public/locales/uk/cut.json | 1 -
.../sde/public/locales/uk/design-options.json | 1 -
sites/sde/public/locales/uk/designs.json | 1 -
sites/sde/public/locales/uk/docs.json | 1 -
sites/sde/public/locales/uk/errors.json | 1 -
sites/sde/public/locales/uk/flag.json | 1 -
sites/sde/public/locales/uk/footer.json | 1 -
sites/sde/public/locales/uk/frombella.json | 1 -
sites/sde/public/locales/uk/frombent.json | 1 -
sites/sde/public/locales/uk/frombreanna.json | 1 -
sites/sde/public/locales/uk/frombrian.json | 1 -
sites/sde/public/locales/uk/fromscratch.json | 1 -
sites/sde/public/locales/uk/fromtitan.json | 1 -
sites/sde/public/locales/uk/gdpr.json | 1 -
sites/sde/public/locales/uk/header.json | 1 -
sites/sde/public/locales/uk/hodl.json | 1 -
sites/sde/public/locales/uk/homepage.json | 1 -
sites/sde/public/locales/uk/lab.json | 1 -
sites/sde/public/locales/uk/locales.json | 1 -
sites/sde/public/locales/uk/logs.json | 1 -
sites/sde/public/locales/uk/measurements.json | 1 -
sites/sde/public/locales/uk/modal.json | 1 -
sites/sde/public/locales/uk/newsletter.json | 1 -
sites/sde/public/locales/uk/patrons.json | 1 -
.../public/locales/uk/plugin-annotations.json | 1 -
sites/sde/public/locales/uk/plugins.json | 1 -
sites/sde/public/locales/uk/popout.json | 1 -
sites/sde/public/locales/uk/print.json | 1 -
sites/sde/public/locales/uk/roles.json | 1 -
sites/sde/public/locales/uk/sde.json | 1 -
sites/sde/public/locales/uk/sections.json | 1 -
sites/sde/public/locales/uk/sets.json | 1 -
sites/sde/public/locales/uk/sponsors.json | 1 -
sites/sde/public/locales/uk/stats.json | 1 -
sites/sde/public/locales/uk/status.json | 1 -
sites/sde/public/locales/uk/submissions.json | 1 -
sites/sde/public/locales/uk/support.json | 1 -
sites/sde/public/locales/uk/susi.json | 1 -
sites/sde/public/locales/uk/tags.json | 1 -
sites/sde/public/locales/uk/techniques.json | 1 -
sites/sde/public/locales/uk/themes.json | 1 -
sites/sde/public/locales/uk/timeago.json | 1 -
sites/sde/public/locales/uk/titan.json | 1 -
sites/sde/public/locales/uk/tutorial.json | 1 -
sites/sde/public/locales/uk/ui-settings.json | 1 -
sites/sde/public/locales/uk/workbench.json | 1 -
sites/sde/site.config.mjs | 4 -
sites/sde/tailwind.config.mjs | 32 -
sites/shared/components/accordion.mjs | 65 -
sites/shared/components/account/apikeys.mjs | 408 -
sites/shared/components/account/bio.mjs | 98 -
sites/shared/components/account/bookmarks.mjs | 246 -
sites/shared/components/account/compare.mjs | 98 -
sites/shared/components/account/consent.mjs | 116 -
sites/shared/components/account/control.mjs | 105 -
sites/shared/components/account/de.yaml | 319 -
sites/shared/components/account/email.mjs | 76 -
sites/shared/components/account/en.yaml | 355 -
sites/shared/components/account/es.yaml | 319 -
sites/shared/components/account/export.mjs | 49 -
.../account/force-account-check.mjs | 35 -
sites/shared/components/account/fr.yaml | 319 -
sites/shared/components/account/github.mjs | 62 -
sites/shared/components/account/img.mjs | 88 -
sites/shared/components/account/imperial.mjs | 90 -
sites/shared/components/account/import.mjs | 101 -
sites/shared/components/account/language.mjs | 66 -
sites/shared/components/account/links.mjs | 300 -
sites/shared/components/account/mfa.mjs | 187 -
.../shared/components/account/newsletter.mjs | 107 -
sites/shared/components/account/nl.yaml | 319 -
sites/shared/components/account/overview.mjs | 3 -
sites/shared/components/account/password.mjs | 66 -
sites/shared/components/account/patterns.mjs | 725 -
sites/shared/components/account/platform.mjs | 55 -
sites/shared/components/account/profile.mjs | 54 -
sites/shared/components/account/reload.mjs | 40 -
sites/shared/components/account/remove.mjs | 42 -
sites/shared/components/account/restrict.mjs | 43 -
sites/shared/components/account/role.mjs | 28 -
sites/shared/components/account/sets.mjs | 1253 -
sites/shared/components/account/shared.mjs | 136 -
sites/shared/components/account/status.mjs | 22 -
sites/shared/components/account/uk.yaml | 319 -
sites/shared/components/account/username.mjs | 109 -
sites/shared/components/admin.mjs | 220 -
.../components/animations/freesewing.mjs | 174 -
.../animations/how-does-it-work.mjs | 160 -
.../components/animations/loading-bar.mjs | 18 -
sites/shared/components/base-layout.mjs | 38 -
sites/shared/components/bookmarks.mjs | 73 -
sites/shared/components/breadcrumbs.mjs | 27 -
sites/shared/components/bullet.mjs | 8 -
.../components/buttons/continue-button.mjs | 44 -
.../components/buttons/flex-button-text.mjs | 52 -
.../buttons/save-settings-button.mjs | 39 -
sites/shared/components/card-link.mjs | 15 -
sites/shared/components/choice-button.mjs | 29 -
sites/shared/components/choice-link.mjs | 30 -
sites/shared/components/code-box.mjs | 21 -
sites/shared/components/code.mjs | 3 -
sites/shared/components/collapse.mjs | 141 -
sites/shared/components/control/score.mjs | 13 -
sites/shared/components/control/tip.mjs | 28 -
sites/shared/components/copy-to-clipboard.mjs | 34 -
sites/shared/components/curated-sets.mjs | 579 -
.../components/designs/design-picker.mjs | 179 -
sites/shared/components/designs/design.mjs | 122 -
.../shared/components/designs/difficulty.mjs | 23 -
sites/shared/components/designs/info.mjs | 385 -
.../components/designs/linedrawings/aaron.mjs | 98 -
.../designs/linedrawings/albert.mjs | 98 -
.../components/designs/linedrawings/bee.mjs | 57 -
.../components/designs/linedrawings/bella.mjs | 98 -
.../designs/linedrawings/benjamin.mjs | 51 -
.../components/designs/linedrawings/bent.mjs | 98 -
.../components/designs/linedrawings/bibi.mjs | 98 -
.../components/designs/linedrawings/bob.mjs | 88 -
.../designs/linedrawings/breanna.mjs | 98 -
.../components/designs/linedrawings/brian.mjs | 98 -
.../components/designs/linedrawings/bruce.mjs | 98 -
.../designs/linedrawings/carlita.mjs | 374 -
.../designs/linedrawings/carlton.mjs | 356 -
.../designs/linedrawings/cathrin.mjs | 751 -
.../designs/linedrawings/charlie.mjs | 284 -
.../designs/linedrawings/cornelius.mjs | 475 -
.../components/designs/linedrawings/diana.mjs | 98 -
.../designs/linedrawings/florence.mjs | 57 -
.../designs/linedrawings/florent.mjs | 102 -
.../components/designs/linedrawings/gozer.mjs | 178 -
.../components/designs/linedrawings/hi.mjs | 119 -
.../designs/linedrawings/holmes.mjs | 156 -
.../designs/linedrawings/hortensia.mjs | 52 -
.../components/designs/linedrawings/huey.mjs | 98 -
.../components/designs/linedrawings/hugo.mjs | 98 -
.../components/designs/linedrawings/index.mjs | 171 -
.../components/designs/linedrawings/lucy.mjs | 78 -
.../designs/linedrawings/lumina.mjs | 160 -
.../designs/linedrawings/lumira.mjs | 178 -
.../designs/linedrawings/lunetius.mjs | 57 -
.../components/designs/linedrawings/noble.mjs | 98 -
.../designs/linedrawings/shared.mjs | 42 -
.../components/designs/linedrawings/simon.mjs | 139 -
.../designs/linedrawings/teagan.mjs | 98 -
.../designs/linedrawings/tristan.mjs | 86 -
.../components/designs/linedrawings/uma.mjs | 88 -
.../components/designs/linedrawings/umbra.mjs | 169 -
.../components/designs/linedrawings/wahid.mjs | 116 -
.../components/error/error-boundary.mjs | 67 -
.../shared/components/error/reset-buttons.mjs | 18 -
sites/shared/components/error/view.mjs | 77 -
sites/shared/components/errors/404.mjs | 36 -
sites/shared/components/errors/de.yaml | 16 -
sites/shared/components/errors/en.yaml | 16 -
sites/shared/components/errors/es.yaml | 16 -
sites/shared/components/errors/fr.yaml | 16 -
sites/shared/components/errors/nl.yaml | 16 -
sites/shared/components/errors/uk.yaml | 16 -
sites/shared/components/errors/vague.mjs | 23 -
sites/shared/components/fingerprint.mjs | 7 -
sites/shared/components/footer/de.yaml | 1 -
sites/shared/components/footer/en.yaml | 1 -
sites/shared/components/footer/es.yaml | 1 -
sites/shared/components/footer/fr.yaml | 1 -
sites/shared/components/footer/index.mjs | 59 -
sites/shared/components/footer/nl.yaml | 1 -
sites/shared/components/footer/uk.yaml | 1 -
sites/shared/components/gdpr/de.yaml | 38 -
sites/shared/components/gdpr/details.mjs | 30 -
sites/shared/components/gdpr/en.yaml | 38 -
sites/shared/components/gdpr/es.yaml | 38 -
sites/shared/components/gdpr/form.mjs | 85 -
sites/shared/components/gdpr/fr.yaml | 38 -
sites/shared/components/gdpr/nl.yaml | 38 -
sites/shared/components/gdpr/uk.yaml | 38 -
sites/shared/components/header.mjs | 37 -
sites/shared/components/hodl/de.yaml | 13 -
sites/shared/components/hodl/en.yaml | 13 -
sites/shared/components/hodl/es.yaml | 13 -
sites/shared/components/hodl/fr.yaml | 13 -
sites/shared/components/hodl/index.mjs | 77 -
sites/shared/components/hodl/nl.yaml | 13 -
sites/shared/components/hodl/uk.yaml | 13 -
sites/shared/components/icons.mjs | 876 -
sites/shared/components/icons/flip.js | 44 -
sites/shared/components/icons/rotate.js | 31 -
sites/shared/components/inputs.mjs | 692 -
sites/shared/components/jargon.mjs | 93 -
sites/shared/components/joost.mjs | 13 -
sites/shared/components/json.mjs | 9 -
sites/shared/components/lightbox.mjs | 52 -
sites/shared/components/link.mjs | 47 -
sites/shared/components/loader.mjs | 20 -
sites/shared/components/logos/cc-by.mjs | 9 -
sites/shared/components/logos/cc.mjs | 8 -
sites/shared/components/logos/freesewing.mjs | 34 -
sites/shared/components/logos/osi.mjs | 10 -
.../components/mdx/design-measurements.mjs | 61 -
.../shared/components/mdx/design-options.mjs | 12 -
sites/shared/components/mdx/docs-helpers.mjs | 29 -
sites/shared/components/mdx/dynamic.mjs | 68 -
sites/shared/components/mdx/figure.mjs | 25 -
sites/shared/components/mdx/highlight.mjs | 48 -
sites/shared/components/mdx/http.mjs | 41 -
sites/shared/components/mdx/index.mjs | 116 -
sites/shared/components/mdx/legend.mjs | 23 -
sites/shared/components/mdx/mermaid.mjs | 14 -
sites/shared/components/mdx/meta.mjs | 103 -
sites/shared/components/mdx/read-more.mjs | 117 -
.../shared/components/mdx/tabbed-example.mjs | 154 -
sites/shared/components/mdx/toc.mjs | 53 -
sites/shared/components/mdx/youtube.mjs | 11 -
.../shared/components/measurements/image.mjs | 55 -
.../measurements/sarah/acrossback.svg | 41 -
.../components/measurements/sarah/ankle.svg | 32 -
.../components/measurements/sarah/biceps.svg | 39 -
.../measurements/sarah/bustfront.svg | 31 -
.../sarah/bustpointtounderbust.svg | 32 -
.../measurements/sarah/bustspan.svg | 31 -
.../components/measurements/sarah/chest.svg | 31 -
.../measurements/sarah/crossseam.svg | 35 -
.../measurements/sarah/crossseamfront.svg | 35 -
.../measurements/sarah/crotchdepth.svg | 35 -
.../components/measurements/sarah/head.svg | 40 -
.../components/measurements/sarah/heel.svg | 32 -
.../measurements/sarah/highbust.svg | 34 -
.../measurements/sarah/highbustfront.svg | 34 -
.../components/measurements/sarah/hips.svg | 40 -
.../measurements/sarah/hipstoupperleg.svg | 52 -
.../measurements/sarah/hpstobust.svg | 35 -
.../measurements/sarah/hpstowaistback.svg | 35 -
.../measurements/sarah/hpstowaistfront.svg | 35 -
.../components/measurements/sarah/index.mjs | 84 -
.../components/measurements/sarah/inseam.svg | 50 -
.../components/measurements/sarah/knee.svg | 32 -
.../components/measurements/sarah/neck.svg | 40 -
.../components/measurements/sarah/seat.svg | 34 -
.../measurements/sarah/seatback.svg | 34 -
.../measurements/sarah/shoulderslope.svg | 19 -
.../measurements/sarah/shouldertoelbow.svg | 53 -
.../measurements/sarah/shouldertoshoulder.svg | 50 -
.../measurements/sarah/shouldertowrist.svg | 53 -
.../measurements/sarah/underbust.svg | 31 -
.../measurements/sarah/upperleg.svg | 40 -
.../components/measurements/sarah/waist.svg | 34 -
.../measurements/sarah/waistback.svg | 34 -
.../measurements/sarah/waisttoarmpit.svg | 53 -
.../measurements/sarah/waisttofloor.svg | 56 -
.../measurements/sarah/waisttohips.svg | 52 -
.../measurements/sarah/waisttoknee.svg | 56 -
.../measurements/sarah/waisttoseat.svg | 56 -
.../measurements/sarah/waisttounderbust.svg | 53 -
.../measurements/sarah/waisttoupperleg.svg | 56 -
.../components/measurements/sarah/wrist.svg | 40 -
.../measurements/tim/acrossback.svg | 41 -
.../components/measurements/tim/ankle.svg | 32 -
.../components/measurements/tim/biceps.svg | 39 -
.../components/measurements/tim/bustfront.svg | 31 -
.../measurements/tim/bustpointtounderbust.svg | 32 -
.../components/measurements/tim/bustspan.svg | 31 -
.../components/measurements/tim/chest.svg | 31 -
.../components/measurements/tim/crossseam.svg | 35 -
.../measurements/tim/crossseamfront.svg | 35 -
.../measurements/tim/crotchdepth.svg | 39 -
.../components/measurements/tim/head.svg | 40 -
.../components/measurements/tim/heel.svg | 32 -
.../components/measurements/tim/highbust.svg | 33 -
.../measurements/tim/highbustfront.svg | 33 -
.../components/measurements/tim/hips.svg | 40 -
.../measurements/tim/hipstoupperleg.svg | 53 -
.../components/measurements/tim/hpstobust.svg | 35 -
.../measurements/tim/hpstowaistback.svg | 39 -
.../measurements/tim/hpstowaistfront.svg | 39 -
.../components/measurements/tim/index.mjs | 84 -
.../components/measurements/tim/inseam.svg | 49 -
.../components/measurements/tim/knee.svg | 32 -
.../components/measurements/tim/neck.svg | 40 -
.../components/measurements/tim/seat.svg | 34 -
.../components/measurements/tim/seatback.svg | 34 -
.../measurements/tim/shoulderslope.svg | 20 -
.../measurements/tim/shouldertoelbow.svg | 52 -
.../measurements/tim/shouldertoshoulder.svg | 49 -
.../measurements/tim/shouldertowrist.svg | 52 -
.../components/measurements/tim/underbust.svg | 31 -
.../components/measurements/tim/upperleg.svg | 40 -
.../components/measurements/tim/waist.svg | 34 -
.../components/measurements/tim/waistback.svg | 34 -
.../measurements/tim/waisttoarmpit.svg | 50 -
.../measurements/tim/waisttofloor.svg | 56 -
.../measurements/tim/waisttohips.svg | 52 -
.../measurements/tim/waisttoknee.svg | 56 -
.../measurements/tim/waisttoseat.svg | 56 -
.../measurements/tim/waisttounderbust.svg | 53 -
.../measurements/tim/waisttoupperleg.svg | 56 -
.../components/measurements/tim/wrist.svg | 40 -
sites/shared/components/modal/de.yaml | 1 -
sites/shared/components/modal/en.yaml | 1 -
sites/shared/components/modal/es.yaml | 1 -
sites/shared/components/modal/fr.yaml | 1 -
.../shared/components/modal/locale-picker.mjs | 53 -
sites/shared/components/modal/modal.mjs | 20 -
sites/shared/components/modal/nl.yaml | 1 -
.../components/modal/problem-report.mjs | 191 -
sites/shared/components/modal/spinner.mjs | 8 -
.../shared/components/modal/theme-picker.mjs | 38 -
sites/shared/components/modal/uk.yaml | 1 -
sites/shared/components/navigation/aside.mjs | 29 -
.../components/navigation/pagination.mjs | 81 -
.../shared/components/navigation/primary.mjs | 333 -
.../components/navigation/sections-menu.mjs | 56 -
.../shared/components/navigation/sitenav.mjs | 150 -
sites/shared/components/newsletter/de.yaml | 22 -
sites/shared/components/newsletter/en.yaml | 22 -
sites/shared/components/newsletter/es.yaml | 22 -
sites/shared/components/newsletter/fr.yaml | 22 -
sites/shared/components/newsletter/index.mjs | 73 -
sites/shared/components/newsletter/nl.yaml | 22 -
sites/shared/components/newsletter/uk.yaml | 22 -
sites/shared/components/null.mjs | 1 -
sites/shared/components/patrons/de.yaml | 33 -
sites/shared/components/patrons/en.yaml | 34 -
sites/shared/components/patrons/es.yaml | 33 -
sites/shared/components/patrons/fr.yaml | 33 -
sites/shared/components/patrons/nl.yaml | 33 -
sites/shared/components/patrons/plea.mjs | 33 -
.../components/patrons/please-subscribe.mjs | 26 -
sites/shared/components/patrons/subscribe.mjs | 159 -
sites/shared/components/patrons/uk.yaml | 33 -
sites/shared/components/pattern/manage.mjs | 222 -
sites/shared/components/pattern/preview.mjs | 45 -
sites/shared/components/popout/de.yaml | 7 -
sites/shared/components/popout/en.yaml | 7 -
sites/shared/components/popout/es.yaml | 7 -
sites/shared/components/popout/fr.yaml | 7 -
sites/shared/components/popout/index.mjs | 92 -
sites/shared/components/popout/nl.yaml | 7 -
sites/shared/components/popout/uk.yaml | 7 -
sites/shared/components/prev-next.mjs | 93 -
sites/shared/components/raw-span.mjs | 1 -
sites/shared/components/robot/index.mjs | 16 -
sites/shared/components/robot/poses.mjs | 11 -
sites/shared/components/role.mjs | 7 -
sites/shared/components/row.mjs | 14 -
sites/shared/components/social/icons.mjs | 87 -
.../social/mastodon-verification.mjs | 23 -
sites/shared/components/spinner.mjs | 22 -
sites/shared/components/sponsors/algolia.mjs | 11 -
sites/shared/components/sponsors/bugsnag.mjs | 18 -
sites/shared/components/sponsors/crowdin.mjs | 14 -
sites/shared/components/sponsors/de.yaml | 4 -
sites/shared/components/sponsors/en.yaml | 4 -
sites/shared/components/sponsors/es.yaml | 4 -
sites/shared/components/sponsors/fr.yaml | 4 -
sites/shared/components/sponsors/index.mjs | 30 -
sites/shared/components/sponsors/nl.yaml | 4 -
sites/shared/components/sponsors/uk.yaml | 4 -
sites/shared/components/sponsors/vercel.mjs | 15 -
sites/shared/components/submissions/de.yaml | 4 -
sites/shared/components/submissions/en.yaml | 4 -
sites/shared/components/submissions/es.yaml | 4 -
sites/shared/components/submissions/fr.yaml | 4 -
sites/shared/components/submissions/index.mjs | 216 -
sites/shared/components/submissions/nl.yaml | 4 -
sites/shared/components/submissions/uk.yaml | 4 -
sites/shared/components/support/status.mjs | 332 -
sites/shared/components/support/support.mjs | 313 -
sites/shared/components/susi/de.yaml | 71 -
sites/shared/components/susi/en.yaml | 71 -
sites/shared/components/susi/es.yaml | 71 -
sites/shared/components/susi/fr.yaml | 71 -
sites/shared/components/susi/migrate.mjs | 141 -
sites/shared/components/susi/nl.yaml | 71 -
sites/shared/components/susi/sign-in.mjs | 281 -
sites/shared/components/susi/sign-up.mjs | 216 -
sites/shared/components/susi/uk.yaml | 71 -
sites/shared/components/tabs.mjs | 66 -
sites/shared/components/tag.mjs | 21 -
sites/shared/components/text-on-bg.mjs | 10 -
sites/shared/components/timeago/de.yaml | 13 -
sites/shared/components/timeago/en.yaml | 13 -
sites/shared/components/timeago/es.yaml | 13 -
sites/shared/components/timeago/fr.yaml | 13 -
sites/shared/components/timeago/index.mjs | 29 -
sites/shared/components/timeago/nl.yaml | 13 -
sites/shared/components/timeago/uk.yaml | 13 -
sites/shared/components/user-profile.mjs | 43 -
sites/shared/components/v3-wip.mjs | 12 -
sites/shared/components/wordmark.mjs | 45 -
sites/shared/components/workbench/de.yaml | 142 -
sites/shared/components/workbench/en.yaml | 142 -
sites/shared/components/workbench/es.yaml | 142 -
.../workbench/exporting/export-handler.mjs | 260 -
.../components/workbench/exporting/pdf.mjs | 46 -
sites/shared/components/workbench/fr.yaml | 142 -
sites/shared/components/workbench/gist.mjs | 58 -
sites/shared/components/workbench/header.mjs | 236 -
.../components/workbench/layout/default.mjs | 221 -
sites/shared/components/workbench/logs.mjs | 122 -
.../workbench/menus/core-settings/config.mjs | 148 -
.../core-settings/core-setting-sa-mm.mjs | 72 -
.../workbench/menus/core-settings/de.yaml | 61 -
.../workbench/menus/core-settings/en.yaml | 62 -
.../workbench/menus/core-settings/es.yaml | 61 -
.../workbench/menus/core-settings/fr.yaml | 61 -
.../workbench/menus/core-settings/index.mjs | 109 -
.../workbench/menus/core-settings/inputs.mjs | 84 -
.../workbench/menus/core-settings/nl.yaml | 61 -
.../workbench/menus/core-settings/uk.yaml | 61 -
.../workbench/menus/core-settings/values.mjs | 27 -
.../workbench/menus/design-options/de.yaml | 5 -
.../workbench/menus/design-options/en.yaml | 5 -
.../workbench/menus/design-options/es.yaml | 5 -
.../workbench/menus/design-options/fr.yaml | 5 -
.../workbench/menus/design-options/index.mjs | 110 -
.../workbench/menus/design-options/inputs.mjs | 45 -
.../workbench/menus/design-options/nl.yaml | 5 -
.../workbench/menus/design-options/uk.yaml | 5 -
.../workbench/menus/design-options/values.mjs | 56 -
.../workbench/menus/mobile-menubar.mjs | 95 -
.../workbench/menus/shared/index.mjs | 66 -
.../workbench/menus/shared/inputs.mjs | 519 -
.../workbench/menus/shared/menu-item.mjs | 279 -
.../workbench/menus/shared/menu-wrapper.mjs | 43 -
.../workbench/menus/shared/values.mjs | 63 -
.../workbench/menus/ui-settings/config.mjs | 47 -
.../workbench/menus/ui-settings/de.yaml | 55 -
.../workbench/menus/ui-settings/en.yaml | 58 -
.../workbench/menus/ui-settings/es.yaml | 55 -
.../workbench/menus/ui-settings/fr.yaml | 55 -
.../workbench/menus/ui-settings/index.mjs | 54 -
.../workbench/menus/ui-settings/inputs.mjs | 23 -
.../workbench/menus/ui-settings/list.mjs | 165 -
.../workbench/menus/ui-settings/nl.yaml | 55 -
.../workbench/menus/ui-settings/uk.yaml | 55 -
.../workbench/menus/ui-settings/values.mjs | 9 -
sites/shared/components/workbench/new.mjs | 258 -
sites/shared/components/workbench/nl.yaml | 142 -
.../components/workbench/pan-zoom-pattern.mjs | 87 -
.../workbench/pattern/movable/index.mjs | 101 -
.../workbench/pattern/movable/stack.mjs | 271 -
.../pattern/movable/transform-buttons.mjs | 122 -
.../workbench/pattern/pan-zoom-context.mjs | 47 -
.../components/workbench/pattern/snippet.mjs | 80 -
.../components/workbench/pattern/stack.mjs | 15 -
.../components/workbench/pattern/text.mjs | 141 -
.../components/workbench/pattern/utils.mjs | 54 -
.../components/workbench/preloaders.mjs | 29 -
sites/shared/components/workbench/uk.yaml | 142 -
.../components/workbench/views/cut/de.yaml | 26 -
.../components/workbench/views/cut/en.yaml | 26 -
.../components/workbench/views/cut/es.yaml | 26 -
.../components/workbench/views/cut/fr.yaml | 26 -
.../components/workbench/views/cut/hooks.mjs | 78 -
.../components/workbench/views/cut/index.mjs | 138 -
.../components/workbench/views/cut/menu.mjs | 66 -
.../components/workbench/views/cut/nl.yaml | 26 -
.../workbench/views/cut/settings.mjs | 72 -
.../components/workbench/views/cut/uk.yaml | 26 -
.../components/workbench/views/docs/index.mjs | 37 -
.../workbench/views/draft/header.mjs | 298 -
.../workbench/views/draft/index.mjs | 76 -
.../components/workbench/views/draft/menu.mjs | 98 -
.../components/workbench/views/edit/index.mjs | 91 -
.../views/edit/settings-validator.mjs | 92 -
.../workbench/views/exporting/index.mjs | 81 -
.../components/workbench/views/flags.mjs | 146 -
.../workbench/views/inspect/index.mjs | 106 -
.../views/inspect/inspector/menu.mjs | 180 -
.../views/inspect/inspector/path.mjs | 157 -
.../views/inspect/inspector/pattern.mjs | 21 -
.../views/inspect/inspector/point.mjs | 163 -
.../views/inspect/inspector/shared.mjs | 29 -
.../views/inspect/inspector/stack.mjs | 98 -
.../workbench/views/inspect/menu.mjs | 50 -
.../components/workbench/views/logs/de.yaml | 13 -
.../components/workbench/views/logs/en.yaml | 13 -
.../workbench/views/logs/errors.mjs | 132 -
.../components/workbench/views/logs/es.yaml | 13 -
.../components/workbench/views/logs/fr.yaml | 13 -
.../components/workbench/views/logs/index.mjs | 93 -
.../components/workbench/views/logs/nl.yaml | 13 -
.../components/workbench/views/logs/uk.yaml | 13 -
.../workbench/views/measies/editor.mjs | 62 -
.../workbench/views/measies/index.mjs | 137 -
.../workbench/views/pattern-with-menu.mjs | 47 -
.../workbench/views/print/actions.mjs | 82 -
.../workbench/views/print/config.mjs | 78 -
.../components/workbench/views/print/de.yaml | 40 -
.../components/workbench/views/print/en.yaml | 40 -
.../components/workbench/views/print/es.yaml | 40 -
.../components/workbench/views/print/fr.yaml | 40 -
.../workbench/views/print/index.mjs | 123 -
.../components/workbench/views/print/menu.mjs | 100 -
.../components/workbench/views/print/nl.yaml | 40 -
.../workbench/views/print/settings.mjs | 65 -
.../components/workbench/views/print/uk.yaml | 40 -
.../components/workbench/views/save/index.mjs | 235 -
.../components/workbench/views/test/index.mjs | 88 -
.../workbench/views/test/measurements.mjs | 30 -
.../components/workbench/views/test/menu.mjs | 115 -
.../workbench/views/test/options.mjs | 91 -
.../components/workbench/views/time/index.mjs | 211 -
sites/shared/components/worm.mjs | 48 -
sites/shared/components/wrappers/auth/de.yaml | 20 -
sites/shared/components/wrappers/auth/en.yaml | 20 -
sites/shared/components/wrappers/auth/es.yaml | 20 -
sites/shared/components/wrappers/auth/fr.yaml | 20 -
.../shared/components/wrappers/auth/index.mjs | 211 -
sites/shared/components/wrappers/auth/nl.yaml | 20 -
sites/shared/components/wrappers/auth/uk.yaml | 20 -
sites/shared/components/wrappers/chart.mjs | 19 -
sites/shared/components/wrappers/context.mjs | 15 -
sites/shared/components/wrappers/header.mjs | 12 -
sites/shared/components/wrappers/img.mjs | 2 -
sites/shared/components/wrappers/layout.mjs | 58 -
sites/shared/components/wrappers/mdx.mjs | 93 -
sites/shared/components/wrappers/modal.mjs | 98 -
sites/shared/components/wrappers/page.mjs | 105 -
sites/shared/components/wrappers/popout.mjs | 7 -
.../shared/components/wrappers/production.mjs | 4 -
sites/shared/components/wrappers/susi.mjs | 27 -
sites/shared/components/wrappers/swipes.mjs | 48 -
sites/shared/components/wrappers/table.mjs | 7 -
sites/shared/components/wrappers/welcome.mjs | 7 -
.../shared/components/wrappers/workbench.mjs | 191 -
sites/shared/components/yaml.mjs | 15 -
sites/shared/config/cloudflare.mjs | 7 -
sites/shared/config/designs.mjs | 28 -
sites/shared/config/freesewing.config.mjs | 133 -
sites/shared/config/i18n.config.mjs | 16 -
sites/shared/config/measurements.js | 4 -
sites/shared/config/next.mjs | 73 -
sites/shared/config/paypal.mjs | 110 -
sites/shared/config/postcss.config.js | 4 -
sites/shared/config/social.mjs | 11 -
sites/shared/config/tailwind-force.html | 159 -
sites/shared/config/tailwind.config.mjs | 33 -
.../shared/context/loading-status-context.mjs | 118 -
.../shared/context/mobile-menubar-context.mjs | 134 -
sites/shared/context/modal-context.mjs | 28 -
sites/shared/context/navigation-context.mjs | 99 -
sites/shared/designs/index.js | 113 -
.../shared/favicon/android-chrome-192x192.png | Bin 18779 -> 0 bytes
.../shared/favicon/android-chrome-384x384.png | Bin 58178 -> 0 bytes
sites/shared/favicon/apple-touch-icon.png | Bin 17114 -> 0 bytes
sites/shared/favicon/browserconfig.xml | 9 -
sites/shared/favicon/favicon-16x16.png | Bin 1059 -> 0 bytes
sites/shared/favicon/favicon-32x32.png | Bin 2098 -> 0 bytes
sites/shared/favicon/mstile-150x150.png | Bin 11965 -> 0 bytes
sites/shared/favicon/safari-pinned-tab.svg | 97 -
sites/shared/favicon/site.webmanifest | 19 -
sites/shared/hooks/use-account.mjs | 60 -
sites/shared/hooks/use-backend.mjs | 631 -
sites/shared/hooks/use-bugsnag.mjs | 36 -
sites/shared/hooks/use-dynamic-mdx.mjs | 31 -
sites/shared/hooks/use-evaled-mdx.mjs | 21 -
sites/shared/hooks/use-id.mjs | 7 -
sites/shared/hooks/use-language.mjs | 7 -
sites/shared/hooks/use-navigation-helpers.mjs | 36 -
sites/shared/hooks/use-pattern-settings.mjs | 7 -
sites/shared/hooks/use-theme.mjs | 24 -
sites/shared/hooks/use-view.mjs | 9 -
sites/shared/i18n/common/de.yaml | 5 -
sites/shared/i18n/common/en.yaml | 5 -
sites/shared/i18n/common/es.yaml | 5 -
sites/shared/i18n/common/fr.yaml | 5 -
sites/shared/i18n/common/nl.yaml | 5 -
sites/shared/i18n/common/uk.yaml | 5 -
sites/shared/i18n/curate/de.yaml | 15 -
sites/shared/i18n/curate/en.yaml | 15 -
sites/shared/i18n/curate/es.yaml | 15 -
sites/shared/i18n/curate/fr.yaml | 15 -
sites/shared/i18n/curate/nl.yaml | 15 -
sites/shared/i18n/curate/uk.yaml | 15 -
sites/shared/i18n/designs.mjs | 135 -
sites/shared/i18n/docs/de.yaml | 34 -
sites/shared/i18n/docs/en.yaml | 34 -
sites/shared/i18n/docs/es.yaml | 34 -
sites/shared/i18n/docs/fr.yaml | 34 -
sites/shared/i18n/docs/nl.yaml | 34 -
sites/shared/i18n/docs/uk.yaml | 34 -
sites/shared/i18n/flag/de.yaml | 19 -
sites/shared/i18n/flag/en.yaml | 19 -
sites/shared/i18n/flag/es.yaml | 19 -
sites/shared/i18n/flag/fr.yaml | 19 -
sites/shared/i18n/flag/nl.yaml | 19 -
sites/shared/i18n/flag/uk.yaml | 19 -
sites/shared/i18n/homepage/de.yaml | 23 -
sites/shared/i18n/homepage/en.yaml | 25 -
sites/shared/i18n/homepage/es.yaml | 23 -
sites/shared/i18n/homepage/fr.yaml | 23 -
sites/shared/i18n/homepage/nl.yaml | 23 -
sites/shared/i18n/homepage/uk.yaml | 23 -
sites/shared/i18n/lab/de.yaml | 13 -
sites/shared/i18n/lab/en.yaml | 13 -
sites/shared/i18n/lab/es.yaml | 13 -
sites/shared/i18n/lab/fr.yaml | 13 -
sites/shared/i18n/lab/nl.yaml | 13 -
sites/shared/i18n/lab/uk.yaml | 13 -
sites/shared/i18n/locales/de.yaml | 7 -
sites/shared/i18n/locales/en.yaml | 7 -
sites/shared/i18n/locales/es.yaml | 7 -
sites/shared/i18n/locales/fr.yaml | 7 -
sites/shared/i18n/locales/nl.yaml | 7 -
sites/shared/i18n/locales/uk.yaml | 7 -
sites/shared/i18n/measurements/de.yaml | 39 -
sites/shared/i18n/measurements/en.yaml | 39 -
sites/shared/i18n/measurements/es.yaml | 39 -
sites/shared/i18n/measurements/fr.yaml | 39 -
sites/shared/i18n/measurements/nl.yaml | 39 -
sites/shared/i18n/measurements/uk.yaml | 39 -
sites/shared/i18n/plugins.mjs | 5 -
sites/shared/i18n/roles/de.yaml | 11 -
sites/shared/i18n/roles/en.yaml | 11 -
sites/shared/i18n/roles/es.yaml | 11 -
sites/shared/i18n/roles/fr.yaml | 11 -
sites/shared/i18n/roles/nl.yaml | 11 -
sites/shared/i18n/roles/uk.yaml | 11 -
sites/shared/i18n/sde-designs.mjs | 27 -
sites/shared/i18n/sections/de.yaml | 39 -
sites/shared/i18n/sections/en.yaml | 39 -
sites/shared/i18n/sections/es.yaml | 39 -
sites/shared/i18n/sections/fr.yaml | 39 -
sites/shared/i18n/sections/nl.yaml | 39 -
sites/shared/i18n/sections/uk.yaml | 39 -
sites/shared/i18n/sets/de.yaml | 10 -
sites/shared/i18n/sets/en.yaml | 10 -
sites/shared/i18n/sets/es.yaml | 10 -
sites/shared/i18n/sets/fr.yaml | 10 -
sites/shared/i18n/sets/nl.yaml | 10 -
sites/shared/i18n/sets/uk.yaml | 10 -
sites/shared/i18n/stats/de.yaml | 13 -
sites/shared/i18n/stats/en.yaml | 13 -
sites/shared/i18n/stats/es.yaml | 13 -
sites/shared/i18n/stats/fr.yaml | 13 -
sites/shared/i18n/stats/nl.yaml | 13 -
sites/shared/i18n/stats/uk.yaml | 13 -
sites/shared/i18n/status/de.yaml | 15 -
sites/shared/i18n/status/en.yaml | 15 -
sites/shared/i18n/status/es.yaml | 15 -
sites/shared/i18n/status/fr.yaml | 15 -
sites/shared/i18n/status/nl.yaml | 15 -
sites/shared/i18n/status/uk.yaml | 15 -
sites/shared/i18n/support/de.yaml | 70 -
sites/shared/i18n/support/en.yaml | 70 -
sites/shared/i18n/support/es.yaml | 70 -
sites/shared/i18n/support/fr.yaml | 70 -
sites/shared/i18n/support/nl.yaml | 70 -
sites/shared/i18n/support/uk.yaml | 70 -
sites/shared/i18n/tags/de.yaml | 25 -
sites/shared/i18n/tags/en.yaml | 29 -
sites/shared/i18n/tags/es.yaml | 25 -
sites/shared/i18n/tags/fr.yaml | 25 -
sites/shared/i18n/tags/nl.yaml | 25 -
sites/shared/i18n/tags/uk.yaml | 25 -
sites/shared/i18n/techniques/de.yaml | 27 -
sites/shared/i18n/techniques/en.yaml | 27 -
sites/shared/i18n/techniques/es.yaml | 27 -
sites/shared/i18n/techniques/fr.yaml | 27 -
sites/shared/i18n/techniques/nl.yaml | 27 -
sites/shared/i18n/techniques/uk.yaml | 27 -
sites/shared/i18n/themes/de.yaml | 9 -
sites/shared/i18n/themes/en.yaml | 9 -
sites/shared/i18n/themes/es.yaml | 9 -
sites/shared/i18n/themes/fr.yaml | 9 -
sites/shared/i18n/themes/nl.yaml | 9 -
sites/shared/i18n/themes/uk.yaml | 9 -
sites/shared/mdx/browser-compile.mjs | 35 -
sites/shared/mdx/compile.mjs | 114 -
sites/shared/mdx/load.mjs | 69 -
sites/shared/mdx/rehype-jargon-transform.mjs | 16 -
sites/shared/mdx/remark-github-images.mjs | 29 -
.../mdx/remark-intro-as-frontmatter.mjs | 59 -
.../shared/mdx/remark-toc-as-frontmatter.mjs | 82 -
sites/shared/package.json | 69 -
.../page-templates/docs.dev.mjs.mustache | 68 -
.../page-templates/docs.org.mjs.mustache | 89 -
sites/shared/plugins/plugin-cut-layout.mjs | 190 -
sites/shared/plugins/plugin-layout-part.mjs | 434 -
sites/shared/prebuild/algolia.mjs | 119 -
sites/shared/prebuild/contributors.mjs | 45 -
sites/shared/prebuild/crowdin.mjs | 109 -
sites/shared/prebuild/data/.gitkeep | 0
.../prebuild/data/design-measurements.mjs | 3 -
sites/shared/prebuild/data/design-options.mjs | 3 -
sites/shared/prebuild/data/designs.mjs | 3 -
sites/shared/prebuild/designs.mjs | 63 -
sites/shared/prebuild/favicon.mjs | 29 -
sites/shared/prebuild/feed.mjs | 138 -
sites/shared/prebuild/git.mjs | 159 -
sites/shared/prebuild/i18n-only.mjs | 7 -
sites/shared/prebuild/i18n.mjs | 264 -
sites/shared/prebuild/jargon.mjs | 15 -
sites/shared/prebuild/lab.mjs | 28 -
sites/shared/prebuild/markdown.mjs | 344 -
sites/shared/prebuild/md-intro.mjs | 85 -
sites/shared/prebuild/navigation.mjs | 130 -
sites/shared/prebuild/og.mjs | 38 -
sites/shared/prebuild/org.mjs | 48 -
sites/shared/prebuild/patrons.mjs | 54 -
sites/shared/prebuild/runner.mjs | 118 -
sites/shared/prebuild/search.mjs | 124 -
sites/shared/prebuild/shared.mjs | 23 -
sites/shared/prebuild/sitenav-dev.mjs | 40 -
sites/shared/prebuild/sitenav-lab.mjs | 139 -
sites/shared/prebuild/sitenav-org.mjs | 257 -
sites/shared/prebuild/users.mjs | 20 -
sites/shared/styles/globals.css | 680 -
sites/shared/styles/svg-freesewing-draft.css | 352 -
sites/shared/themes/aqua.mjs | 123 -
sites/shared/themes/dark.mjs | 113 -
sites/shared/themes/hax0r.mjs | 109 -
sites/shared/themes/index.mjs | 84 -
sites/shared/themes/lgbtq.mjs | 137 -
sites/shared/themes/light.mjs | 300 -
sites/shared/themes/monochrome.mjs | 114 -
sites/shared/themes/pastel.mjs | 120 -
sites/shared/utils.mjs | 501 -
tests/designs/config.mjs | 121 +-
tests/designs/drafting.mjs | 74 +-
tests/designs/i18n.mjs | 124 +-
tests/designs/sampling.mjs | 130 +-
yarn.lock | 20066 -----
6626 files changed, 142053 insertions(+), 150606 deletions(-)
delete mode 100644 .github/workflows/dependabot-sync.yml
create mode 100644 artwork/stickers/sticker-2025.svg
delete mode 100644 config/authors.mjs
delete mode 100644 config/pattern-options.js
delete mode 100644 config/social.mjs
delete mode 100644 config/templates/build.dflt.mjs
delete mode 100644 config/templates/use-design.mjs.mustache
delete mode 100644 config/trustees.mjs
delete mode 100644 crowdin.yml
create mode 100644 designs/aaron/about.json
delete mode 100644 designs/aaron/data.mjs
delete mode 100644 designs/aaron/i18n/de.json
delete mode 100644 designs/aaron/i18n/es.json
delete mode 100644 designs/aaron/i18n/fr.json
delete mode 100644 designs/aaron/i18n/nl.json
delete mode 100644 designs/aaron/i18n/uk.json
create mode 100644 designs/albert/about.json
delete mode 100644 designs/albert/build.mjs
delete mode 100644 designs/albert/data.mjs
delete mode 100644 designs/albert/i18n/de.json
delete mode 100644 designs/albert/i18n/es.json
delete mode 100644 designs/albert/i18n/fr.json
delete mode 100644 designs/albert/i18n/nl.json
delete mode 100644 designs/albert/i18n/uk.json
create mode 100644 designs/bee/about.json
delete mode 100644 designs/bee/build.mjs
delete mode 100644 designs/bee/data.mjs
delete mode 100644 designs/bee/i18n/de.json
delete mode 100644 designs/bee/i18n/es.json
delete mode 100644 designs/bee/i18n/fr.json
delete mode 100644 designs/bee/i18n/nl.json
delete mode 100644 designs/bee/i18n/uk.json
create mode 100644 designs/bella/about.json
delete mode 100644 designs/bella/build.mjs
delete mode 100644 designs/bella/data.mjs
delete mode 100644 designs/bella/i18n/de.json
delete mode 100644 designs/bella/i18n/es.json
delete mode 100644 designs/bella/i18n/fr.json
delete mode 100644 designs/bella/i18n/nl.json
delete mode 100644 designs/bella/i18n/uk.json
create mode 100644 designs/benjamin/about.json
delete mode 100644 designs/benjamin/build.mjs
delete mode 100644 designs/benjamin/data.mjs
delete mode 100644 designs/benjamin/i18n/de.json
delete mode 100644 designs/benjamin/i18n/es.json
delete mode 100644 designs/benjamin/i18n/fr.json
delete mode 100644 designs/benjamin/i18n/nl.json
delete mode 100644 designs/benjamin/i18n/uk.json
create mode 100644 designs/bent/about.json
delete mode 100644 designs/bent/build.mjs
delete mode 100644 designs/bent/data.mjs
delete mode 100644 designs/bent/i18n/de.json
delete mode 100644 designs/bent/i18n/es.json
delete mode 100644 designs/bent/i18n/fr.json
delete mode 100644 designs/bent/i18n/nl.json
delete mode 100644 designs/bent/i18n/uk.json
create mode 100644 designs/bibi/about.json
delete mode 100644 designs/bibi/build.mjs
delete mode 100644 designs/bibi/data.mjs
delete mode 100644 designs/bibi/i18n/de.json
delete mode 100644 designs/bibi/i18n/es.json
delete mode 100644 designs/bibi/i18n/fr.json
delete mode 100644 designs/bibi/i18n/nl.json
delete mode 100644 designs/bibi/i18n/uk.json
create mode 100644 designs/bob/about.json
delete mode 100644 designs/bob/build.mjs
delete mode 100644 designs/bob/data.mjs
delete mode 100644 designs/bob/i18n/de.json
delete mode 100644 designs/bob/i18n/es.json
delete mode 100644 designs/bob/i18n/fr.json
delete mode 100644 designs/bob/i18n/nl.json
delete mode 100644 designs/bob/i18n/uk.json
create mode 100644 designs/bonny/CHANGELOG.md
create mode 100644 designs/bonny/README.md
create mode 100644 designs/bonny/about.json
rename designs/{aaron => bonny}/build.mjs (100%)
create mode 100644 designs/bonny/data.mjs
create mode 100644 designs/bonny/i18n/en.json
create mode 100644 designs/bonny/i18n/index.mjs
create mode 100644 designs/bonny/package.json
create mode 100644 designs/bonny/src/front.mjs
create mode 100644 designs/bonny/src/index.mjs
create mode 100644 designs/bonny/src/side.mjs
create mode 100644 designs/bonny/tests/shared.test.mjs
create mode 100644 designs/breanna/about.json
delete mode 100644 designs/breanna/build.mjs
delete mode 100644 designs/breanna/data.mjs
delete mode 100644 designs/breanna/i18n/de.json
delete mode 100644 designs/breanna/i18n/es.json
delete mode 100644 designs/breanna/i18n/fr.json
delete mode 100644 designs/breanna/i18n/nl.json
delete mode 100644 designs/breanna/i18n/uk.json
create mode 100644 designs/brian/about.json
delete mode 100644 designs/brian/build.mjs
delete mode 100644 designs/brian/data.mjs
delete mode 100644 designs/brian/i18n/de.json
delete mode 100644 designs/brian/i18n/es.json
delete mode 100644 designs/brian/i18n/fr.json
delete mode 100644 designs/brian/i18n/nl.json
delete mode 100644 designs/brian/i18n/uk.json
create mode 100644 designs/bruce/about.json
delete mode 100644 designs/bruce/build.mjs
delete mode 100644 designs/bruce/data.mjs
delete mode 100644 designs/bruce/i18n/de.json
delete mode 100644 designs/bruce/i18n/es.json
delete mode 100644 designs/bruce/i18n/fr.json
delete mode 100644 designs/bruce/i18n/nl.json
delete mode 100644 designs/bruce/i18n/uk.json
create mode 100644 designs/carlita/about.json
delete mode 100644 designs/carlita/build.mjs
delete mode 100644 designs/carlita/data.mjs
delete mode 100644 designs/carlita/i18n/de.json
delete mode 100644 designs/carlita/i18n/es.json
delete mode 100644 designs/carlita/i18n/fr.json
delete mode 100644 designs/carlita/i18n/nl.json
delete mode 100644 designs/carlita/i18n/uk.json
create mode 100644 designs/carlton/about.json
delete mode 100644 designs/carlton/build.mjs
delete mode 100644 designs/carlton/data.mjs
delete mode 100644 designs/carlton/i18n/de.json
delete mode 100644 designs/carlton/i18n/es.json
delete mode 100644 designs/carlton/i18n/fr.json
delete mode 100644 designs/carlton/i18n/nl.json
delete mode 100644 designs/carlton/i18n/uk.json
create mode 100644 designs/cathrin/about.json
delete mode 100644 designs/cathrin/build.mjs
delete mode 100644 designs/cathrin/data.mjs
delete mode 100644 designs/cathrin/i18n/de.json
delete mode 100644 designs/cathrin/i18n/es.json
delete mode 100644 designs/cathrin/i18n/fr.json
delete mode 100644 designs/cathrin/i18n/nl.json
delete mode 100644 designs/cathrin/i18n/uk.json
create mode 100644 designs/charlie/about.json
delete mode 100644 designs/charlie/build.mjs
delete mode 100644 designs/charlie/data.mjs
delete mode 100644 designs/charlie/i18n/de.json
delete mode 100644 designs/charlie/i18n/es.json
delete mode 100644 designs/charlie/i18n/fr.json
delete mode 100644 designs/charlie/i18n/nl.json
delete mode 100644 designs/charlie/i18n/uk.json
create mode 100644 designs/cornelius/about.json
delete mode 100644 designs/cornelius/build.mjs
delete mode 100644 designs/cornelius/data.mjs
delete mode 100644 designs/cornelius/i18n/de.json
delete mode 100644 designs/cornelius/i18n/es.json
delete mode 100644 designs/cornelius/i18n/fr.json
delete mode 100644 designs/cornelius/i18n/nl.json
delete mode 100644 designs/cornelius/i18n/uk.json
create mode 100644 designs/diana/about.json
delete mode 100644 designs/diana/build.mjs
delete mode 100644 designs/diana/data.mjs
delete mode 100644 designs/diana/i18n/de.json
delete mode 100644 designs/diana/i18n/es.json
delete mode 100644 designs/diana/i18n/fr.json
delete mode 100644 designs/diana/i18n/nl.json
delete mode 100644 designs/diana/i18n/uk.json
delete mode 100644 designs/examples/build.mjs
delete mode 100644 designs/examples/data.mjs
delete mode 100644 designs/examples/i18n/de.json
delete mode 100644 designs/examples/i18n/es.json
delete mode 100644 designs/examples/i18n/fr.json
delete mode 100644 designs/examples/i18n/nl.json
delete mode 100644 designs/examples/i18n/uk.json
create mode 100644 designs/florence/about.json
delete mode 100644 designs/florence/build.mjs
delete mode 100644 designs/florence/data.mjs
delete mode 100644 designs/florence/i18n/de.json
delete mode 100644 designs/florence/i18n/es.json
delete mode 100644 designs/florence/i18n/fr.json
delete mode 100644 designs/florence/i18n/nl.json
delete mode 100644 designs/florence/i18n/uk.json
create mode 100644 designs/florent/about.json
delete mode 100644 designs/florent/build.mjs
delete mode 100644 designs/florent/data.mjs
delete mode 100644 designs/florent/i18n/de.json
delete mode 100644 designs/florent/i18n/es.json
delete mode 100644 designs/florent/i18n/fr.json
delete mode 100644 designs/florent/i18n/nl.json
delete mode 100644 designs/florent/i18n/uk.json
create mode 100644 designs/gozer/about.json
delete mode 100644 designs/gozer/build.mjs
delete mode 100644 designs/gozer/data.mjs
delete mode 100644 designs/gozer/i18n/de.json
delete mode 100644 designs/gozer/i18n/es.json
delete mode 100644 designs/gozer/i18n/fr.json
delete mode 100644 designs/gozer/i18n/nl.json
delete mode 100644 designs/gozer/i18n/uk.json
create mode 100644 designs/hi/about.json
delete mode 100644 designs/hi/build.mjs
delete mode 100644 designs/hi/data.mjs
delete mode 100644 designs/hi/i18n/de.json
delete mode 100644 designs/hi/i18n/es.json
delete mode 100644 designs/hi/i18n/fr.json
delete mode 100644 designs/hi/i18n/nl.json
delete mode 100644 designs/hi/i18n/uk.json
create mode 100644 designs/holmes/about.json
delete mode 100644 designs/holmes/build.mjs
delete mode 100644 designs/holmes/data.mjs
delete mode 100644 designs/holmes/i18n/de.json
delete mode 100644 designs/holmes/i18n/es.json
delete mode 100644 designs/holmes/i18n/fr.json
delete mode 100644 designs/holmes/i18n/nl.json
delete mode 100644 designs/holmes/i18n/uk.json
create mode 100644 designs/hortensia/about.json
delete mode 100644 designs/hortensia/build.mjs
delete mode 100644 designs/hortensia/data.mjs
delete mode 100644 designs/hortensia/i18n/de.json
delete mode 100644 designs/hortensia/i18n/es.json
delete mode 100644 designs/hortensia/i18n/fr.json
delete mode 100644 designs/hortensia/i18n/nl.json
delete mode 100644 designs/hortensia/i18n/uk.json
create mode 100644 designs/huey/about.json
delete mode 100644 designs/huey/build.mjs
delete mode 100644 designs/huey/data.mjs
delete mode 100644 designs/huey/i18n/de.json
delete mode 100644 designs/huey/i18n/es.json
delete mode 100644 designs/huey/i18n/fr.json
delete mode 100644 designs/huey/i18n/nl.json
delete mode 100644 designs/huey/i18n/uk.json
create mode 100644 designs/hugo/about.json
delete mode 100644 designs/hugo/build.mjs
delete mode 100644 designs/hugo/data.mjs
delete mode 100644 designs/hugo/i18n/de.json
delete mode 100644 designs/hugo/i18n/es.json
delete mode 100644 designs/hugo/i18n/fr.json
delete mode 100644 designs/hugo/i18n/nl.json
delete mode 100644 designs/hugo/i18n/uk.json
create mode 100644 designs/jaeger/about.json
delete mode 100644 designs/jaeger/build.mjs
delete mode 100644 designs/jaeger/data.mjs
delete mode 100644 designs/jaeger/i18n/de.json
delete mode 100644 designs/jaeger/i18n/es.json
delete mode 100644 designs/jaeger/i18n/fr.json
delete mode 100644 designs/jaeger/i18n/nl.json
delete mode 100644 designs/jaeger/i18n/uk.json
create mode 100644 designs/jane/about.json
delete mode 100644 designs/jane/build.mjs
delete mode 100644 designs/jane/data.mjs
delete mode 100644 designs/jane/i18n/de.json
delete mode 100644 designs/jane/i18n/es.json
delete mode 100644 designs/jane/i18n/fr.json
delete mode 100644 designs/jane/i18n/nl.json
delete mode 100644 designs/jane/i18n/uk.json
delete mode 100644 designs/legend/build.mjs
delete mode 100644 designs/legend/data.mjs
delete mode 100644 designs/legend/i18n/de.json
delete mode 100644 designs/legend/i18n/es.json
delete mode 100644 designs/legend/i18n/fr.json
delete mode 100644 designs/legend/i18n/nl.json
delete mode 100644 designs/legend/i18n/uk.json
create mode 100644 designs/lily/about.json
delete mode 100644 designs/lily/build.mjs
delete mode 100644 designs/lily/data.mjs
delete mode 100644 designs/lily/i18n/de.json
delete mode 100644 designs/lily/i18n/es.json
delete mode 100644 designs/lily/i18n/fr.json
delete mode 100644 designs/lily/i18n/nl.json
delete mode 100644 designs/lily/i18n/uk.json
create mode 100644 designs/lucy/about.json
delete mode 100644 designs/lucy/build.mjs
delete mode 100644 designs/lucy/data.mjs
delete mode 100644 designs/lucy/i18n/de.json
delete mode 100644 designs/lucy/i18n/es.json
delete mode 100644 designs/lucy/i18n/fr.json
delete mode 100644 designs/lucy/i18n/nl.json
delete mode 100644 designs/lucy/i18n/uk.json
create mode 100644 designs/lumina/about.json
delete mode 100644 designs/lumina/build.mjs
delete mode 100644 designs/lumina/data.mjs
delete mode 100644 designs/lumina/i18n/de.json
delete mode 100644 designs/lumina/i18n/es.json
delete mode 100644 designs/lumina/i18n/fr.json
delete mode 100644 designs/lumina/i18n/nl.json
delete mode 100644 designs/lumina/i18n/uk.json
create mode 100644 designs/lumira/about.json
delete mode 100644 designs/lumira/build.mjs
delete mode 100644 designs/lumira/data.mjs
delete mode 100644 designs/lumira/i18n/de.json
delete mode 100644 designs/lumira/i18n/es.json
delete mode 100644 designs/lumira/i18n/fr.json
delete mode 100644 designs/lumira/i18n/nl.json
delete mode 100644 designs/lumira/i18n/uk.json
create mode 100644 designs/lunetius/about.json
delete mode 100644 designs/lunetius/build.mjs
delete mode 100644 designs/lunetius/data.mjs
delete mode 100644 designs/lunetius/i18n/de.json
delete mode 100644 designs/lunetius/i18n/es.json
delete mode 100644 designs/lunetius/i18n/fr.json
delete mode 100644 designs/lunetius/i18n/nl.json
delete mode 100644 designs/lunetius/i18n/uk.json
create mode 100644 designs/magde/about.json
delete mode 100644 designs/magde/build.mjs
delete mode 100644 designs/magde/data.mjs
delete mode 100644 designs/magde/i18n/de.json
delete mode 100644 designs/magde/i18n/es.json
delete mode 100644 designs/magde/i18n/fr.json
delete mode 100644 designs/magde/i18n/nl.json
delete mode 100644 designs/magde/i18n/uk.json
create mode 100644 designs/noble/about.json
delete mode 100644 designs/noble/build.mjs
delete mode 100644 designs/noble/data.mjs
delete mode 100644 designs/noble/i18n/de.json
delete mode 100644 designs/noble/i18n/es.json
delete mode 100644 designs/noble/i18n/fr.json
delete mode 100644 designs/noble/i18n/nl.json
delete mode 100644 designs/noble/i18n/uk.json
create mode 100644 designs/octoplushy/about.json
delete mode 100644 designs/octoplushy/build.mjs
delete mode 100644 designs/octoplushy/data.mjs
delete mode 100644 designs/octoplushy/i18n/de.json
delete mode 100644 designs/octoplushy/i18n/es.json
delete mode 100644 designs/octoplushy/i18n/fr.json
delete mode 100644 designs/octoplushy/i18n/nl.json
delete mode 100644 designs/octoplushy/i18n/uk.json
create mode 100644 designs/onyx/about.json
delete mode 100644 designs/onyx/build.mjs
delete mode 100644 designs/onyx/data.mjs
delete mode 100644 designs/onyx/i18n/de.json
delete mode 100644 designs/onyx/i18n/es.json
delete mode 100644 designs/onyx/i18n/fr.json
delete mode 100644 designs/onyx/i18n/nl.json
delete mode 100644 designs/onyx/i18n/uk.json
create mode 100644 designs/opal/about.json
delete mode 100644 designs/opal/build.mjs
delete mode 100644 designs/opal/data.mjs
delete mode 100644 designs/opal/i18n/de.json
delete mode 100644 designs/opal/i18n/es.json
delete mode 100644 designs/opal/i18n/fr.json
delete mode 100644 designs/opal/i18n/nl.json
delete mode 100644 designs/opal/i18n/uk.json
create mode 100644 designs/otis/about.json
delete mode 100644 designs/otis/build.mjs
delete mode 100644 designs/otis/data.mjs
delete mode 100644 designs/otis/i18n/de.json
delete mode 100644 designs/otis/i18n/es.json
delete mode 100644 designs/otis/i18n/fr.json
delete mode 100644 designs/otis/i18n/nl.json
delete mode 100644 designs/otis/i18n/uk.json
create mode 100644 designs/paco/about.json
delete mode 100644 designs/paco/build.mjs
delete mode 100644 designs/paco/data.mjs
delete mode 100644 designs/paco/i18n/de.json
delete mode 100644 designs/paco/i18n/es.json
delete mode 100644 designs/paco/i18n/fr.json
delete mode 100644 designs/paco/i18n/nl.json
delete mode 100644 designs/paco/i18n/uk.json
create mode 100644 designs/penelope/about.json
delete mode 100644 designs/penelope/build.mjs
delete mode 100644 designs/penelope/data.mjs
delete mode 100644 designs/penelope/i18n/de.json
delete mode 100644 designs/penelope/i18n/es.json
delete mode 100644 designs/penelope/i18n/fr.json
delete mode 100644 designs/penelope/i18n/nl.json
delete mode 100644 designs/penelope/i18n/uk.json
delete mode 100644 designs/plugintest/build.mjs
delete mode 100644 designs/plugintest/data.mjs
delete mode 100644 designs/plugintest/i18n/de.json
delete mode 100644 designs/plugintest/i18n/es.json
delete mode 100644 designs/plugintest/i18n/fr.json
delete mode 100644 designs/plugintest/i18n/nl.json
delete mode 100644 designs/plugintest/i18n/uk.json
delete mode 100644 designs/rendertest/build.mjs
delete mode 100644 designs/rendertest/data.mjs
delete mode 100644 designs/rendertest/i18n/de.json
delete mode 100644 designs/rendertest/i18n/es.json
delete mode 100644 designs/rendertest/i18n/fr.json
delete mode 100644 designs/rendertest/i18n/nl.json
delete mode 100644 designs/rendertest/i18n/uk.json
create mode 100644 designs/sandy/about.json
delete mode 100644 designs/sandy/build.mjs
delete mode 100644 designs/sandy/data.mjs
delete mode 100644 designs/sandy/i18n/de.json
delete mode 100644 designs/sandy/i18n/es.json
delete mode 100644 designs/sandy/i18n/fr.json
delete mode 100644 designs/sandy/i18n/nl.json
delete mode 100644 designs/sandy/i18n/uk.json
create mode 100644 designs/shelly/about.json
delete mode 100644 designs/shelly/build.mjs
delete mode 100644 designs/shelly/data.mjs
delete mode 100644 designs/shelly/i18n/de.json
delete mode 100644 designs/shelly/i18n/es.json
delete mode 100644 designs/shelly/i18n/fr.json
delete mode 100644 designs/shelly/i18n/nl.json
delete mode 100644 designs/shelly/i18n/uk.json
create mode 100644 designs/shin/about.json
delete mode 100644 designs/shin/build.mjs
delete mode 100644 designs/shin/data.mjs
delete mode 100644 designs/shin/i18n/de.json
delete mode 100644 designs/shin/i18n/es.json
delete mode 100644 designs/shin/i18n/fr.json
delete mode 100644 designs/shin/i18n/nl.json
delete mode 100644 designs/shin/i18n/uk.json
create mode 100644 designs/simon/about.json
delete mode 100644 designs/simon/build.mjs
delete mode 100644 designs/simon/data.mjs
delete mode 100644 designs/simon/i18n/de.json
delete mode 100644 designs/simon/i18n/es.json
delete mode 100644 designs/simon/i18n/fr.json
delete mode 100644 designs/simon/i18n/nl.json
delete mode 100644 designs/simon/i18n/uk.json
create mode 100644 designs/simone/about.json
delete mode 100644 designs/simone/build.mjs
delete mode 100644 designs/simone/data.mjs
delete mode 100644 designs/simone/i18n/de.json
delete mode 100644 designs/simone/i18n/es.json
delete mode 100644 designs/simone/i18n/fr.json
delete mode 100644 designs/simone/i18n/nl.json
delete mode 100644 designs/simone/i18n/uk.json
create mode 100644 designs/skully/about.json
delete mode 100644 designs/skully/build.mjs
delete mode 100644 designs/skully/data.mjs
delete mode 100644 designs/skully/i18n/de.json
delete mode 100644 designs/skully/i18n/es.json
delete mode 100644 designs/skully/i18n/fr.json
delete mode 100644 designs/skully/i18n/nl.json
delete mode 100644 designs/skully/i18n/uk.json
create mode 100644 designs/sven/about.json
delete mode 100644 designs/sven/build.mjs
delete mode 100644 designs/sven/data.mjs
delete mode 100644 designs/sven/i18n/de.json
delete mode 100644 designs/sven/i18n/es.json
delete mode 100644 designs/sven/i18n/fr.json
delete mode 100644 designs/sven/i18n/nl.json
delete mode 100644 designs/sven/i18n/uk.json
create mode 100644 designs/tamiko/about.json
delete mode 100644 designs/tamiko/build.mjs
delete mode 100644 designs/tamiko/data.mjs
delete mode 100644 designs/tamiko/i18n/de.json
delete mode 100644 designs/tamiko/i18n/es.json
delete mode 100644 designs/tamiko/i18n/fr.json
delete mode 100644 designs/tamiko/i18n/nl.json
delete mode 100644 designs/tamiko/i18n/uk.json
create mode 100644 designs/teagan/about.json
delete mode 100644 designs/teagan/build.mjs
delete mode 100644 designs/teagan/data.mjs
delete mode 100644 designs/teagan/i18n/de.json
delete mode 100644 designs/teagan/i18n/es.json
delete mode 100644 designs/teagan/i18n/fr.json
delete mode 100644 designs/teagan/i18n/nl.json
delete mode 100644 designs/teagan/i18n/uk.json
create mode 100644 designs/tiberius/about.json
delete mode 100644 designs/tiberius/build.mjs
delete mode 100644 designs/tiberius/data.mjs
delete mode 100644 designs/tiberius/i18n/de.json
delete mode 100644 designs/tiberius/i18n/es.json
delete mode 100644 designs/tiberius/i18n/fr.json
delete mode 100644 designs/tiberius/i18n/nl.json
delete mode 100644 designs/tiberius/i18n/uk.json
create mode 100644 designs/titan/about.json
delete mode 100644 designs/titan/build.mjs
delete mode 100644 designs/titan/data.mjs
delete mode 100644 designs/titan/i18n/de.json
delete mode 100644 designs/titan/i18n/es.json
delete mode 100644 designs/titan/i18n/fr.json
delete mode 100644 designs/titan/i18n/nl.json
delete mode 100644 designs/titan/i18n/uk.json
create mode 100644 designs/trayvon/about.json
delete mode 100644 designs/trayvon/build.mjs
delete mode 100644 designs/trayvon/data.mjs
delete mode 100644 designs/trayvon/i18n/de.json
delete mode 100644 designs/trayvon/i18n/es.json
delete mode 100644 designs/trayvon/i18n/fr.json
delete mode 100644 designs/trayvon/i18n/nl.json
delete mode 100644 designs/trayvon/i18n/uk.json
create mode 100644 designs/tristan/about.json
delete mode 100644 designs/tristan/build.mjs
delete mode 100644 designs/tristan/data.mjs
delete mode 100644 designs/tristan/i18n/de.json
delete mode 100644 designs/tristan/i18n/es.json
delete mode 100644 designs/tristan/i18n/fr.json
delete mode 100644 designs/tristan/i18n/nl.json
delete mode 100644 designs/tristan/i18n/uk.json
create mode 100644 designs/uma/about.json
delete mode 100644 designs/uma/build.mjs
delete mode 100644 designs/uma/data.mjs
delete mode 100644 designs/uma/i18n/de.json
delete mode 100644 designs/uma/i18n/es.json
delete mode 100644 designs/uma/i18n/fr.json
delete mode 100644 designs/uma/i18n/nl.json
delete mode 100644 designs/uma/i18n/uk.json
create mode 100644 designs/umbra/about.json
delete mode 100644 designs/umbra/build.mjs
delete mode 100644 designs/umbra/data.mjs
delete mode 100644 designs/umbra/i18n/de.json
delete mode 100644 designs/umbra/i18n/es.json
delete mode 100644 designs/umbra/i18n/fr.json
delete mode 100644 designs/umbra/i18n/nl.json
delete mode 100644 designs/umbra/i18n/uk.json
create mode 100644 designs/wahid/about.json
delete mode 100644 designs/wahid/build.mjs
delete mode 100644 designs/wahid/data.mjs
delete mode 100644 designs/wahid/i18n/de.json
delete mode 100644 designs/wahid/i18n/es.json
delete mode 100644 designs/wahid/i18n/fr.json
delete mode 100644 designs/wahid/i18n/nl.json
delete mode 100644 designs/wahid/i18n/uk.json
create mode 100644 designs/walburga/about.json
delete mode 100644 designs/walburga/build.mjs
delete mode 100644 designs/walburga/data.mjs
delete mode 100644 designs/walburga/i18n/de.json
delete mode 100644 designs/walburga/i18n/es.json
delete mode 100644 designs/walburga/i18n/fr.json
delete mode 100644 designs/walburga/i18n/nl.json
delete mode 100644 designs/walburga/i18n/uk.json
create mode 100644 designs/waralee/about.json
delete mode 100644 designs/waralee/build.mjs
delete mode 100644 designs/waralee/data.mjs
delete mode 100644 designs/waralee/i18n/de.json
delete mode 100644 designs/waralee/i18n/es.json
delete mode 100644 designs/waralee/i18n/fr.json
delete mode 100644 designs/waralee/i18n/nl.json
delete mode 100644 designs/waralee/i18n/uk.json
create mode 100644 designs/yuri/about.json
delete mode 100644 designs/yuri/build.mjs
delete mode 100644 designs/yuri/data.mjs
delete mode 100644 designs/yuri/i18n/de.json
delete mode 100644 designs/yuri/i18n/es.json
delete mode 100644 designs/yuri/i18n/fr.json
delete mode 100644 designs/yuri/i18n/nl.json
delete mode 100644 designs/yuri/i18n/uk.json
create mode 100644 package-lock.json
create mode 100644 packages/collection/CHANGELOG.md
create mode 100644 packages/collection/README.md
create mode 100644 packages/collection/package.json
rename {sites/shared/components/designs => packages/collection/src}/examples.mjs (85%)
create mode 100644 packages/collection/src/i18n.mjs
create mode 100644 packages/collection/src/index.mjs
create mode 100644 packages/config/CHANGELOG.md
create mode 100644 packages/config/README.md
create mode 100644 packages/config/package.json
create mode 100644 packages/config/src/apikeys.mjs
create mode 100644 packages/config/src/cloudflare.mjs
create mode 100644 packages/config/src/control.mjs
create mode 100644 packages/config/src/index.mjs
rename {config => packages/config/src}/logo.mjs (98%)
rename {config => packages/config/src}/measurements.mjs (100%)
rename {config => packages/config/src}/roles.mjs (77%)
rename config/sewing-techniques.mjs => packages/config/src/sewing.mjs (100%)
create mode 100644 packages/config/src/urls.mjs
create mode 100644 packages/config/src/wot.mjs
create mode 100644 packages/core/about.json
delete mode 100644 packages/core/build.mjs
delete mode 100644 packages/core/data.mjs
create mode 100644 packages/i18n/CHANGELOG.md
create mode 100644 packages/i18n/README.md
create mode 100644 packages/i18n/package.json
create mode 100644 packages/i18n/src/flags.mjs
create mode 100644 packages/i18n/src/index.mjs
create mode 100644 packages/i18n/src/measurements.mjs
delete mode 100644 packages/models/build.mjs
delete mode 100644 packages/models/data.mjs
delete mode 100644 packages/new-design/CHANGELOG.md
delete mode 100644 packages/new-design/README.md
delete mode 100644 packages/new-design/build.mjs
delete mode 100644 packages/new-design/data.mjs
delete mode 100644 packages/new-design/i18n/de.json
delete mode 100644 packages/new-design/i18n/en.json
delete mode 100644 packages/new-design/i18n/es.json
delete mode 100644 packages/new-design/i18n/fr.json
delete mode 100644 packages/new-design/i18n/nl.json
delete mode 100644 packages/new-design/i18n/uk.json
delete mode 100755 packages/new-design/index.mjs
delete mode 100644 packages/new-design/lib/config.mjs
delete mode 100644 packages/new-design/lib/download-list.mjs
delete mode 100644 packages/new-design/lib/utils.mjs
delete mode 100644 packages/new-design/package.json
delete mode 100644 packages/prettier-config/data.mjs
delete mode 100644 packages/react-components/CHANGELOG.md
delete mode 100644 packages/react-components/README.md
delete mode 100644 packages/react-components/build.mjs
delete mode 100644 packages/react-components/data.mjs
delete mode 100644 packages/react-components/package.json
delete mode 100644 packages/react-components/src/editor/components/view-wrapper.mjs
delete mode 100644 packages/react-components/src/editor/en.yaml
delete mode 100644 packages/react-components/src/editor/index.mjs
delete mode 100644 packages/react-components/src/editor/nl.yaml
delete mode 100644 packages/react-components/src/editor/props.md
delete mode 100644 packages/react-components/src/editor/swizzle/components/accordion.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/aside-view-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/auth-wrapper.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/curated-sets.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/designs-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/draft-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/dynamic-mdx.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/error-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/flags.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/header-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/html-span.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/icons.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/index.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/inputs.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/large-screen-only.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/link.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/loaders.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/loading-status.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/markdown.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/measurements-editor.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/measurements-set-card.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/measurements-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/containers.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/core-settings-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/design-options-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/draft-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/shared-inputs.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/shared-values.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/menus/ui-preferences-menu.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/null.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/pattern-layout.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/popout.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/save-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/sets.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/spinner.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/tabs.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/tooltip.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/undos-view.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/ux.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/view-picker.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/components/zoomable-pattern.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/config.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/hooks/index.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/hooks/use-account.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/hooks/use-backend.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/hooks/use-editor-state.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/core-settings.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/design-options.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/editor.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/formatting.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/index.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/measurements.mjs
delete mode 100644 packages/react-components/src/editor/swizzle/methods/ui-preferences.mjs
delete mode 100644 packages/react-components/src/editor/utils.mjs
delete mode 100644 packages/react-components/src/index.mjs
delete mode 100644 packages/react-components/src/linedrawings/aaron.mjs
delete mode 100644 packages/react-components/src/linedrawings/albert.mjs
delete mode 100644 packages/react-components/src/linedrawings/bee.mjs
delete mode 100644 packages/react-components/src/linedrawings/bella.mjs
delete mode 100644 packages/react-components/src/linedrawings/benjamin.mjs
delete mode 100644 packages/react-components/src/linedrawings/bent.mjs
delete mode 100644 packages/react-components/src/linedrawings/bibi.mjs
delete mode 100644 packages/react-components/src/linedrawings/bob.mjs
delete mode 100644 packages/react-components/src/linedrawings/breanna.mjs
delete mode 100644 packages/react-components/src/linedrawings/brian.mjs
delete mode 100644 packages/react-components/src/linedrawings/bruce.mjs
delete mode 100644 packages/react-components/src/linedrawings/carlita.mjs
delete mode 100644 packages/react-components/src/linedrawings/carlton.mjs
delete mode 100644 packages/react-components/src/linedrawings/cathrin.mjs
delete mode 100644 packages/react-components/src/linedrawings/charlie.mjs
delete mode 100644 packages/react-components/src/linedrawings/cornelius.mjs
delete mode 100644 packages/react-components/src/linedrawings/diana.mjs
delete mode 100644 packages/react-components/src/linedrawings/florence.mjs
delete mode 100644 packages/react-components/src/linedrawings/florent.mjs
delete mode 100644 packages/react-components/src/linedrawings/gozer.mjs
delete mode 100644 packages/react-components/src/linedrawings/hi.mjs
delete mode 100644 packages/react-components/src/linedrawings/holmes.mjs
delete mode 100644 packages/react-components/src/linedrawings/hortensia.mjs
delete mode 100644 packages/react-components/src/linedrawings/huey.mjs
delete mode 100644 packages/react-components/src/linedrawings/hugo.mjs
delete mode 100644 packages/react-components/src/linedrawings/index.mjs
delete mode 100644 packages/react-components/src/linedrawings/lucy.mjs
delete mode 100644 packages/react-components/src/linedrawings/lumina.mjs
delete mode 100644 packages/react-components/src/linedrawings/lumira.mjs
delete mode 100644 packages/react-components/src/linedrawings/lunetius.mjs
delete mode 100644 packages/react-components/src/linedrawings/noble.mjs
delete mode 100644 packages/react-components/src/linedrawings/shared.mjs
delete mode 100644 packages/react-components/src/linedrawings/simon.mjs
delete mode 100644 packages/react-components/src/linedrawings/teagan.mjs
delete mode 100644 packages/react-components/src/linedrawings/tristan.mjs
delete mode 100644 packages/react-components/src/linedrawings/uma.mjs
delete mode 100644 packages/react-components/src/linedrawings/umbra.mjs
delete mode 100644 packages/react-components/src/linedrawings/wahid.mjs
delete mode 100644 packages/react-components/src/pattern-xray/index.mjs
delete mode 100644 packages/react-components/src/pattern-xray/path.mjs
delete mode 100644 packages/react-components/src/pattern-xray/point.mjs
delete mode 100644 packages/react-components/src/pattern/index.mjs
delete mode 100644 packages/react-components/src/pattern/path.mjs
delete mode 100644 packages/react-components/src/pattern/point.mjs
delete mode 100644 packages/react-components/src/pattern/stack.mjs
delete mode 100644 packages/react-components/src/pattern/text.mjs
delete mode 100644 packages/react-components/src/pattern/utils.mjs
delete mode 100644 packages/react-components/src/popout.mjs
delete mode 100644 packages/react-components/src/utils.mjs
create mode 100644 packages/react/CHANGELOG.md
create mode 100644 packages/react/README.md
create mode 100644 packages/react/components/Account/Apikeys.mjs
create mode 100644 packages/react/components/Account/Avatar.mjs
create mode 100644 packages/react/components/Account/Bio.mjs
create mode 100644 packages/react/components/Account/Bookmarks.mjs
create mode 100644 packages/react/components/Account/Compare.mjs
create mode 100644 packages/react/components/Account/Consent.mjs
create mode 100644 packages/react/components/Account/Control.mjs
create mode 100644 packages/react/components/Account/Email.mjs
create mode 100644 packages/react/components/Account/Export.mjs
create mode 100644 packages/react/components/Account/Github.mjs
create mode 100644 packages/react/components/Account/Id.mjs
create mode 100644 packages/react/components/Account/Import.mjs
create mode 100644 packages/react/components/Account/Instagram.mjs
create mode 100644 packages/react/components/Account/Links.mjs
create mode 100644 packages/react/components/Account/Mfa.mjs
create mode 100644 packages/react/components/Account/Newsletter.mjs
create mode 100644 packages/react/components/Account/Password.mjs
create mode 100644 packages/react/components/Account/Pattern.mjs
create mode 100644 packages/react/components/Account/Patterns.mjs
create mode 100644 packages/react/components/Account/Platform.mjs
create mode 100644 packages/react/components/Account/Reload.mjs
create mode 100644 packages/react/components/Account/Remove.mjs
create mode 100644 packages/react/components/Account/Restrict.mjs
create mode 100644 packages/react/components/Account/Role.mjs
create mode 100644 packages/react/components/Account/Set.mjs
create mode 100644 packages/react/components/Account/Sets.mjs
create mode 100644 packages/react/components/Account/Status.mjs
create mode 100644 packages/react/components/Account/Units.mjs
create mode 100644 packages/react/components/Account/Username.mjs
create mode 100644 packages/react/components/Account/index.mjs
create mode 100644 packages/react/components/Account/shared.mjs
create mode 100644 packages/react/components/Admin/index.mjs
create mode 100644 packages/react/components/Breadcrumbs/index.mjs
create mode 100644 packages/react/components/Button/index.mjs
create mode 100644 packages/react/components/Collection/index.mjs
create mode 100644 packages/react/components/Control/index.mjs
create mode 100644 packages/react/components/CopyToClipboardButton/index.mjs
create mode 100644 packages/react/components/Design/index.mjs
create mode 100644 packages/react/components/DiffViewer/index.mjs
create mode 100644 packages/react/components/Docusaurus/index.mjs
create mode 100644 packages/react/components/Echart/index.mjs
create mode 100644 packages/react/components/Editor/components/Accordion.mjs
create mode 100644 packages/react/components/Editor/components/AsideViewMenu.mjs
create mode 100644 packages/react/components/Editor/components/Flag.mjs
create mode 100644 packages/react/components/Editor/components/HeaderMenu.mjs
create mode 100644 packages/react/components/Editor/components/HtmlSpan.mjs
create mode 100644 packages/react/components/Editor/components/LoadingStatus.mjs
create mode 100644 packages/react/components/Editor/components/MeasurementsEditor.mjs
create mode 100644 packages/react/components/Editor/components/MovablePattern.mjs
create mode 100644 packages/react/components/Editor/components/PatternLayout.mjs
create mode 100644 packages/react/components/Editor/components/Set.mjs
create mode 100644 packages/react/components/Editor/components/Tooltip.mjs
create mode 100644 packages/react/components/Editor/components/ZoomablePattern.mjs
create mode 100644 packages/react/components/Editor/components/menus/Container.mjs
create mode 100644 packages/react/components/Editor/components/menus/CoreSettingsMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/DesignOptionsMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/DraftMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/Input.mjs
create mode 100644 packages/react/components/Editor/components/menus/LayoutMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/TestMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/UiPreferencesMenu.mjs
create mode 100644 packages/react/components/Editor/components/menus/Value.mjs
create mode 100644 packages/react/components/Editor/components/views/DesignsView.mjs
create mode 100644 packages/react/components/Editor/components/views/DocsView.mjs
create mode 100644 packages/react/components/Editor/components/views/DraftView.mjs
create mode 100644 packages/react/components/Editor/components/views/EditSettingsView.mjs
create mode 100644 packages/react/components/Editor/components/views/ExportView.mjs
create mode 100644 packages/react/components/Editor/components/views/InspectView.mjs
create mode 100644 packages/react/components/Editor/components/views/LayoutView.mjs
create mode 100644 packages/react/components/Editor/components/views/LogView.mjs
create mode 100644 packages/react/components/Editor/components/views/MeasurementsView.mjs
create mode 100644 packages/react/components/Editor/components/views/SaveView.mjs
create mode 100644 packages/react/components/Editor/components/views/TestView.mjs
create mode 100644 packages/react/components/Editor/components/views/TimingView.mjs
create mode 100644 packages/react/components/Editor/components/views/UndosView.mjs
create mode 100644 packages/react/components/Editor/components/views/ViewPicker.mjs
create mode 100644 packages/react/components/Editor/components/views/index.mjs
create mode 100644 packages/react/components/Editor/config/index.mjs
create mode 100644 packages/react/components/Editor/hooks/useEditorState.mjs
create mode 100644 packages/react/components/Editor/index.mjs
create mode 100644 packages/react/components/Editor/lib/core-settings.mjs
create mode 100644 packages/react/components/Editor/lib/design-options.mjs
create mode 100644 packages/react/components/Editor/lib/editor.mjs
rename {sites/shared/components/workbench/exporting => packages/react/components/Editor/lib/export}/export-worker.js (76%)
create mode 100644 packages/react/components/Editor/lib/export/index.mjs
rename {sites/shared/components/workbench/exporting => packages/react/components/Editor/lib/export}/pdf-maker.mjs (99%)
create mode 100644 packages/react/components/Editor/lib/export/pdf.mjs
create mode 100644 packages/react/components/Editor/lib/export/plugin-tiler.mjs
rename {sites/shared/components/workbench/exporting => packages/react/components/Editor/lib/export}/single-pdf-maker.mjs (100%)
create mode 100644 packages/react/components/Editor/lib/formatting.mjs
create mode 100644 packages/react/components/Editor/lib/index.mjs
create mode 100644 packages/react/components/Editor/lib/layout-settings.mjs
create mode 100644 packages/react/components/Editor/lib/measurements.mjs
create mode 100644 packages/react/components/Editor/lib/ui-preferences.mjs
create mode 100644 packages/react/components/Heading/index.mjs
create mode 100644 packages/react/components/Highlight/index.mjs
create mode 100644 packages/react/components/Icon/index.mjs
create mode 100644 packages/react/components/Input/index.mjs
create mode 100644 packages/react/components/Json/index.mjs
create mode 100644 packages/react/components/KeyVal/index.mjs
create mode 100644 packages/react/components/Layout/index.mjs
create mode 100644 packages/react/components/LineDrawing/aaron.mjs
create mode 100644 packages/react/components/LineDrawing/albert.mjs
create mode 100644 packages/react/components/LineDrawing/bee.mjs
create mode 100644 packages/react/components/LineDrawing/bella.mjs
create mode 100644 packages/react/components/LineDrawing/benjamin.mjs
create mode 100644 packages/react/components/LineDrawing/bent.mjs
create mode 100644 packages/react/components/LineDrawing/bibi.mjs
create mode 100644 packages/react/components/LineDrawing/bob.mjs
create mode 100644 packages/react/components/LineDrawing/breanna.mjs
create mode 100644 packages/react/components/LineDrawing/brian.mjs
create mode 100644 packages/react/components/LineDrawing/bruce.mjs
create mode 100644 packages/react/components/LineDrawing/carlita.mjs
create mode 100644 packages/react/components/LineDrawing/carlton.mjs
create mode 100644 packages/react/components/LineDrawing/cathrin.mjs
create mode 100644 packages/react/components/LineDrawing/charlie.mjs
create mode 100644 packages/react/components/LineDrawing/cornelius.mjs
create mode 100644 packages/react/components/LineDrawing/diana.mjs
create mode 100644 packages/react/components/LineDrawing/florence.mjs
create mode 100644 packages/react/components/LineDrawing/florent.mjs
create mode 100644 packages/react/components/LineDrawing/gozer.mjs
create mode 100644 packages/react/components/LineDrawing/hi.mjs
create mode 100644 packages/react/components/LineDrawing/holmes.mjs
create mode 100644 packages/react/components/LineDrawing/hortensia.mjs
create mode 100644 packages/react/components/LineDrawing/huey.mjs
create mode 100644 packages/react/components/LineDrawing/hugo.mjs
create mode 100644 packages/react/components/LineDrawing/index.mjs
create mode 100644 packages/react/components/LineDrawing/lucy.mjs
create mode 100644 packages/react/components/LineDrawing/lumina.mjs
create mode 100644 packages/react/components/LineDrawing/lumira.mjs
create mode 100644 packages/react/components/LineDrawing/lunetius.mjs
create mode 100644 packages/react/components/LineDrawing/missing.mjs
create mode 100644 packages/react/components/LineDrawing/noble.mjs
create mode 100644 packages/react/components/LineDrawing/shared.mjs
create mode 100644 packages/react/components/LineDrawing/simon.mjs
create mode 100644 packages/react/components/LineDrawing/teagan.mjs
create mode 100644 packages/react/components/LineDrawing/tristan.mjs
create mode 100644 packages/react/components/LineDrawing/uma.mjs
create mode 100644 packages/react/components/LineDrawing/umbra.mjs
create mode 100644 packages/react/components/LineDrawing/wahid.mjs
create mode 100644 packages/react/components/Link/index.mjs
create mode 100644 packages/react/components/Logo/index.mjs
create mode 100644 packages/react/components/Markdown/index.mjs
create mode 100644 packages/react/components/Mini/index.mjs
create mode 100644 packages/react/components/Modal/index.mjs
create mode 100644 packages/react/components/New/NewLinks.mjs
create mode 100644 packages/react/components/New/index.mjs
create mode 100644 packages/react/components/Newsletter/index.mjs
create mode 100644 packages/react/components/Null/index.mjs
create mode 100644 packages/react/components/Number/index.mjs
create mode 100644 packages/react/components/Patrons/index.mjs
rename packages/{react-components/src/pattern => react/components/Pattern}/circle.mjs (81%)
rename packages/{react-components/src/pattern => react/components/Pattern}/defs.mjs (97%)
rename packages/{react-components/src/pattern => react/components/Pattern}/grid.mjs (100%)
rename packages/{react-components/src/pattern => react/components/Pattern}/group.mjs (100%)
create mode 100644 packages/react/components/Pattern/index.mjs
rename packages/{react-components/src/pattern => react/components/Pattern}/part.mjs (86%)
create mode 100644 packages/react/components/Pattern/path.mjs
create mode 100644 packages/react/components/Pattern/point.mjs
rename packages/{react-components/src/pattern => react/components/Pattern}/snippet.mjs (100%)
create mode 100644 packages/react/components/Pattern/stack.mjs
rename packages/{react-components/src/pattern => react/components/Pattern}/svg.mjs (92%)
create mode 100644 packages/react/components/Pattern/text.mjs
create mode 100644 packages/react/components/Pattern/utils.mjs
create mode 100644 packages/react/components/Popout/index.mjs
create mode 100644 packages/react/components/Profile/index.mjs
create mode 100644 packages/react/components/Role/index.mjs
create mode 100644 packages/react/components/SignIn/index.mjs
create mode 100644 packages/react/components/SignUp/index.mjs
create mode 100644 packages/react/components/Spinner/index.mjs
create mode 100644 packages/react/components/Stats/index.mjs
create mode 100644 packages/react/components/Tab/index.mjs
create mode 100644 packages/react/components/Table/index.mjs
create mode 100644 packages/react/components/Time/index.mjs
create mode 100644 packages/react/components/Uuid/index.mjs
create mode 100644 packages/react/components/Ux/index.mjs
create mode 100644 packages/react/components/Xray/index.mjs
create mode 100644 packages/react/components/Xray/path.mjs
create mode 100644 packages/react/components/Xray/point.mjs
create mode 100644 packages/react/components/Yaml/index.mjs
create mode 100644 packages/react/config/freesewing/index.mjs
create mode 100644 packages/react/context/LoadingStatus/index.mjs
create mode 100644 packages/react/context/Modal/index.mjs
create mode 100644 packages/react/hooks/useAccount/index.mjs
create mode 100644 packages/react/hooks/useBackend/index.mjs
create mode 100644 packages/react/hooks/useControl/index.mjs
create mode 100644 packages/react/hooks/useDesign/index.mjs
create mode 100644 packages/react/hooks/useDesignTranslation/index.mjs
create mode 100644 packages/react/hooks/useSelection/index.mjs
create mode 100644 packages/react/hooks/useStateObject/index.mjs
create mode 100644 packages/react/lib/RestClient/index.mjs
create mode 100644 packages/react/lib/collection/index.mjs
create mode 100644 packages/react/lib/force-tailwind.mjs
create mode 100644 packages/react/package.json
delete mode 100644 packages/rehype-highlight-lines/CHANGELOG.md
delete mode 100644 packages/rehype-highlight-lines/README.md
delete mode 100644 packages/rehype-highlight-lines/data.mjs
delete mode 100644 packages/rehype-highlight-lines/package.json
delete mode 100644 packages/rehype-highlight-lines/src/index.mjs
delete mode 100644 packages/rehype-jargon/CHANGELOG.md
delete mode 100644 packages/rehype-jargon/README.md
delete mode 100644 packages/rehype-jargon/build.mjs
delete mode 100644 packages/rehype-jargon/data.mjs
delete mode 100644 packages/rehype-jargon/example.png
delete mode 100644 packages/rehype-jargon/info.md
delete mode 100644 packages/rehype-jargon/package.json
delete mode 100644 packages/rehype-jargon/src/index.mjs
delete mode 100644 packages/snapseries/build.mjs
delete mode 100644 packages/snapseries/data.mjs
create mode 100644 packages/studio/CHANGELOG.md
create mode 100644 packages/studio/README.md
create mode 100755 packages/studio/index.mjs
create mode 100644 packages/studio/lib/banner.mjs
rename packages/{new-design => studio}/lib/cli.mjs (100%)
create mode 100644 packages/studio/lib/config.mjs
create mode 100644 packages/studio/lib/utils.mjs
create mode 100644 packages/studio/package.json
rename packages/{new-design => studio}/prebuild.mjs (100%)
create mode 100644 packages/studio/template/.gitignore
create mode 100644 packages/studio/template/designs/.base/about.json.mustache
create mode 100644 packages/studio/template/designs/.base/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.base/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.base/src/box.mjs.mustache
create mode 100644 packages/studio/template/designs/.base/src/index.mjs.mustache
create mode 100644 packages/studio/template/designs/.bella/about.json.mustache
create mode 100644 packages/studio/template/designs/.bella/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.bella/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.bella/src/back.mjs.mustache
create mode 100644 packages/studio/template/designs/.bella/src/front.mjs.mustache
create mode 100644 packages/studio/template/designs/.bella/src/index.mjs.mustache
create mode 100644 packages/studio/template/designs/.bent/about.json.mustache
create mode 100644 packages/studio/template/designs/.bent/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.bent/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.bent/src/back.mjs.mustache
create mode 100644 packages/studio/template/designs/.bent/src/front.mjs.mustache
create mode 100644 packages/studio/template/designs/.bent/src/index.mjs.mustache
create mode 100644 packages/studio/template/designs/.bent/src/topsleeve.mjs.mustache
create mode 100644 packages/studio/template/designs/.bent/src/undersleeve.mjs.mustache
create mode 100644 packages/studio/template/designs/.breanna/about.json.mustache
create mode 100644 packages/studio/template/designs/.breanna/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.breanna/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.breanna/src/back.mjs.mustache
create mode 100644 packages/studio/template/designs/.breanna/src/front.mjs.mustache
create mode 100644 packages/studio/template/designs/.breanna/src/index.mjs.mustache
create mode 100644 packages/studio/template/designs/.breanna/src/sleeve.mjs.mustache
create mode 100644 packages/studio/template/designs/.brian/about.json.mustache
create mode 100644 packages/studio/template/designs/.brian/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.brian/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.brian/src/back.mjs.mustache
create mode 100644 packages/studio/template/designs/.brian/src/front.mjs.mustache
create mode 100644 packages/studio/template/designs/.brian/src/index.mjs.mustache
create mode 100644 packages/studio/template/designs/.brian/src/sleeve.mjs.mustache
create mode 100644 packages/studio/template/designs/.titan/about.json.mustache
create mode 100644 packages/studio/template/designs/.titan/i18n/en.json.mustache
create mode 100644 packages/studio/template/designs/.titan/i18n/index.mjs
create mode 100644 packages/studio/template/designs/.titan/src/back.mjs.mustache
create mode 100644 packages/studio/template/designs/.titan/src/front.mjs.mustache
create mode 100644 packages/studio/template/designs/.titan/src/index.mjs.mustache
create mode 100644 packages/studio/template/docs/account/about/avatar/index.mdx
create mode 100644 packages/studio/template/docs/account/about/bio/index.mdx
create mode 100644 packages/studio/template/docs/account/about/email/index.mdx
create mode 100644 packages/studio/template/docs/account/about/index.mdx
create mode 100644 packages/studio/template/docs/account/about/username/index.mdx
create mode 100644 packages/studio/template/docs/account/actions/import/index.mdx
create mode 100644 packages/studio/template/docs/account/actions/index.mdx
create mode 100644 packages/studio/template/docs/account/actions/reload/index.mdx
create mode 100644 packages/studio/template/docs/account/actions/remove/index.mdx
create mode 100644 packages/studio/template/docs/account/actions/restrict/index.mdx
create mode 100644 packages/studio/template/docs/account/data/bookmarks/index.mdx
create mode 100644 packages/studio/template/docs/account/data/index.mdx
create mode 100644 packages/studio/template/docs/account/data/patterns/index.mdx
create mode 100644 packages/studio/template/docs/account/data/patterns/pattern.mdx
create mode 100644 packages/studio/template/docs/account/data/sets/index.mdx
create mode 100644 packages/studio/template/docs/account/data/sets/set.mdx
create mode 100644 packages/studio/template/docs/account/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/compare/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/consent/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/control/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/newsletter/index.mdx
create mode 100644 packages/studio/template/docs/account/preferences/units/index.mdx
create mode 100644 packages/studio/template/docs/account/security/apikeys/index.mdx
create mode 100644 packages/studio/template/docs/account/security/index.mdx
create mode 100644 packages/studio/template/docs/account/security/mfa/index.mdx
create mode 100644 packages/studio/template/docs/account/security/password/index.mdx
create mode 100644 packages/studio/template/docs/account/social/github/index.mdx
create mode 100644 packages/studio/template/docs/account/social/index.mdx
create mode 100644 packages/studio/template/docs/account/social/instagram/index.mdx
create mode 100644 packages/studio/template/docs/account/social/mastodon/index.mdx
create mode 100644 packages/studio/template/docs/account/social/reddit/index.mdx
create mode 100644 packages/studio/template/docs/account/social/tiktok/index.mdx
create mode 100644 packages/studio/template/docs/account/social/twitch/index.mdx
create mode 100644 packages/studio/template/docs/account/social/website/index.mdx
create mode 100644 packages/studio/template/docs/add.mdx
create mode 100644 packages/studio/template/docs/collection.mdx
create mode 100644 packages/studio/template/docs/local.mdx
create mode 100644 packages/studio/template/docs/support.mdx
create mode 100644 packages/studio/template/docusaurus.config.mjs
create mode 100644 packages/studio/template/package.json
create mode 100644 packages/studio/template/scripts/add-design.mjs
create mode 100644 packages/studio/template/scripts/lib.mjs
create mode 100644 packages/studio/template/scripts/prebuild.mjs
create mode 100644 packages/studio/template/sidebars.js
create mode 100644 packages/studio/template/src/components/bare-layout.mjs
rename {sites/shared/styles => packages/studio/template/src/css}/code.css (100%)
create mode 100644 packages/studio/template/src/css/custom.css
create mode 100644 packages/studio/template/src/css/patterns.css
create mode 100644 packages/studio/template/src/local-designs.mjs
create mode 100644 packages/studio/template/src/pages/editor.js
create mode 100644 packages/studio/template/src/pages/index.js
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/A.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Code.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Details.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Heading.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Img/index.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Img/styles.module.css (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Li.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Pre.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Ul/index.js (100%)
rename {sites/orgdocs => packages/studio/template}/src/theme/MDXComponents/Ul/styles.module.css (100%)
create mode 100644 packages/studio/template/src/theme/MDXComponents/index.js
create mode 100644 packages/studio/template/src/theme/NavbarItem/ComponentTypes.js
rename {sites/orgdocs => packages/studio/template}/static/favicon.ico (100%)
rename {sites/orgdocs => packages/studio/template}/static/img/favicon.ico (100%)
rename {sites/orgdocs => packages/studio/template}/static/img/freesewing-social-card.png (100%)
create mode 100644 packages/studio/template/static/img/lineup-backdrop.svg
rename {sites/orgdocs => packages/studio/template}/static/img/logo-white.svg (100%)
rename {sites/orgdocs => packages/studio/template}/static/img/logo.svg (100%)
create mode 100644 packages/studio/template/tailwind-force.html
create mode 100644 packages/studio/template/tailwind.config.mjs
create mode 100644 packages/studio/template/themes/dark.mjs
create mode 100644 packages/studio/template/themes/index.mjs
create mode 100644 packages/studio/template/themes/light.mjs
create mode 100644 packages/utils/CHANGELOG.md
create mode 100644 packages/utils/README.md
create mode 100644 packages/utils/package.json
create mode 100644 packages/utils/src/index.mjs
create mode 100644 packages/utils/src/loading-messages.mjs
create mode 100644 plugins/core-plugins/about.json
delete mode 100644 plugins/core-plugins/build.mjs
create mode 100644 plugins/plugin-annotations/about.json
delete mode 100644 plugins/plugin-annotations/build.mjs
create mode 100644 plugins/plugin-bin-pack/about.json
delete mode 100644 plugins/plugin-bin-pack/build.mjs
create mode 100644 plugins/plugin-bust/about.json
delete mode 100644 plugins/plugin-bust/build.mjs
create mode 100644 plugins/plugin-flip/about.json
delete mode 100644 plugins/plugin-flip/build.mjs
create mode 100644 plugins/plugin-gore/about.json
delete mode 100644 plugins/plugin-gore/build.mjs
create mode 100644 plugins/plugin-i18n/about.json
delete mode 100644 plugins/plugin-i18n/build.mjs
create mode 100644 plugins/plugin-measurements/about.json
delete mode 100644 plugins/plugin-measurements/build.mjs
create mode 100644 plugins/plugin-mirror/about.json
delete mode 100644 plugins/plugin-mirror/build.mjs
create mode 100644 plugins/plugin-ringsector/about.json
delete mode 100644 plugins/plugin-ringsector/build.mjs
create mode 100644 plugins/plugin-round/about.json
delete mode 100644 plugins/plugin-round/build.mjs
create mode 100644 plugins/plugin-sprinkle/about.json
delete mode 100644 plugins/plugin-sprinkle/build.mjs
create mode 100644 plugins/plugin-svgattr/about.json
delete mode 100644 plugins/plugin-svgattr/build.mjs
create mode 100644 plugins/plugin-theme/about.json
delete mode 100644 plugins/plugin-theme/build.mjs
create mode 100644 plugins/plugin-timing/about.json
delete mode 100644 plugins/plugin-timing/build.mjs
create mode 100644 plugins/plugin-versionfree-svg/about.json
delete mode 100644 plugins/plugin-versionfree-svg/build.mjs
create mode 100644 scripts/reversion.mjs
delete mode 100644 scripts/sync-dependencies.mjs
delete mode 100644 scripts/workbenches.js
delete mode 100644 scripts/yarn.lock
create mode 100644 sites/backend/src/controllers/oidc.mjs
create mode 100644 sites/backend/src/routes/oidc.mjs
delete mode 100644 sites/backend/src/templates/email/de.json
delete mode 100644 sites/backend/src/templates/email/de.yaml
create mode 100644 sites/backend/src/templates/email/emailchange.mjs
delete mode 100644 sites/backend/src/templates/email/emailchange/de.json
delete mode 100644 sites/backend/src/templates/email/emailchange/de.yaml
delete mode 100644 sites/backend/src/templates/email/emailchange/en.json
delete mode 100644 sites/backend/src/templates/email/emailchange/en.yaml
delete mode 100644 sites/backend/src/templates/email/emailchange/es.json
delete mode 100644 sites/backend/src/templates/email/emailchange/es.yaml
delete mode 100644 sites/backend/src/templates/email/emailchange/fr.json
delete mode 100644 sites/backend/src/templates/email/emailchange/fr.yaml
delete mode 100644 sites/backend/src/templates/email/emailchange/index.mjs
delete mode 100644 sites/backend/src/templates/email/emailchange/nl.json
delete mode 100644 sites/backend/src/templates/email/emailchange/nl.yaml
delete mode 100644 sites/backend/src/templates/email/emailchange/uk.json
delete mode 100644 sites/backend/src/templates/email/emailchange/uk.yaml
delete mode 100644 sites/backend/src/templates/email/en.json
delete mode 100644 sites/backend/src/templates/email/en.yaml
delete mode 100644 sites/backend/src/templates/email/es.json
delete mode 100644 sites/backend/src/templates/email/es.yaml
delete mode 100644 sites/backend/src/templates/email/fr.json
delete mode 100644 sites/backend/src/templates/email/fr.yaml
create mode 100644 sites/backend/src/templates/email/goodbye.mjs
delete mode 100644 sites/backend/src/templates/email/goodbye/de.json
delete mode 100644 sites/backend/src/templates/email/goodbye/de.yaml
delete mode 100644 sites/backend/src/templates/email/goodbye/en.json
delete mode 100644 sites/backend/src/templates/email/goodbye/en.yaml
delete mode 100644 sites/backend/src/templates/email/goodbye/es.json
delete mode 100644 sites/backend/src/templates/email/goodbye/es.yaml
delete mode 100644 sites/backend/src/templates/email/goodbye/fr.json
delete mode 100644 sites/backend/src/templates/email/goodbye/fr.yaml
delete mode 100644 sites/backend/src/templates/email/goodbye/index.mjs
delete mode 100644 sites/backend/src/templates/email/goodbye/nl.json
delete mode 100644 sites/backend/src/templates/email/goodbye/nl.yaml
delete mode 100644 sites/backend/src/templates/email/goodbye/uk.json
delete mode 100644 sites/backend/src/templates/email/goodbye/uk.yaml
delete mode 100644 sites/backend/src/templates/email/langsuggest/index.mjs
delete mode 100644 sites/backend/src/templates/email/newslettersub/de.yaml
delete mode 100644 sites/backend/src/templates/email/newslettersub/en.yaml
delete mode 100644 sites/backend/src/templates/email/newslettersub/es.yaml
delete mode 100644 sites/backend/src/templates/email/newslettersub/fr.yaml
delete mode 100644 sites/backend/src/templates/email/newslettersub/nl.yaml
delete mode 100644 sites/backend/src/templates/email/newslettersub/uk.yaml
delete mode 100644 sites/backend/src/templates/email/nl.json
delete mode 100644 sites/backend/src/templates/email/nl.yaml
create mode 100644 sites/backend/src/templates/email/nlsub.mjs
delete mode 100644 sites/backend/src/templates/email/nlsub/de.json
delete mode 100644 sites/backend/src/templates/email/nlsub/en.json
delete mode 100644 sites/backend/src/templates/email/nlsub/es.json
delete mode 100644 sites/backend/src/templates/email/nlsub/fr.json
delete mode 100644 sites/backend/src/templates/email/nlsub/index.mjs
delete mode 100644 sites/backend/src/templates/email/nlsub/nl.json
delete mode 100644 sites/backend/src/templates/email/nlsub/uk.json
create mode 100644 sites/backend/src/templates/email/nlsubact.mjs
delete mode 100644 sites/backend/src/templates/email/nlsubact/de.json
delete mode 100644 sites/backend/src/templates/email/nlsubact/en.json
delete mode 100644 sites/backend/src/templates/email/nlsubact/es.json
delete mode 100644 sites/backend/src/templates/email/nlsubact/fr.json
delete mode 100644 sites/backend/src/templates/email/nlsubact/index.mjs
delete mode 100644 sites/backend/src/templates/email/nlsubact/nl.json
delete mode 100644 sites/backend/src/templates/email/nlsubact/uk.json
create mode 100644 sites/backend/src/templates/email/nlsubinact.mjs
delete mode 100644 sites/backend/src/templates/email/nlsubinact/de.json
delete mode 100644 sites/backend/src/templates/email/nlsubinact/en.json
delete mode 100644 sites/backend/src/templates/email/nlsubinact/es.json
delete mode 100644 sites/backend/src/templates/email/nlsubinact/fr.json
delete mode 100644 sites/backend/src/templates/email/nlsubinact/index.mjs
delete mode 100644 sites/backend/src/templates/email/nlsubinact/nl.json
delete mode 100644 sites/backend/src/templates/email/nlsubinact/uk.json
create mode 100644 sites/backend/src/templates/email/nlunsub.mjs
create mode 100644 sites/backend/src/templates/email/passwordreset.mjs
delete mode 100644 sites/backend/src/templates/email/passwordreset/de.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/de.yaml
delete mode 100644 sites/backend/src/templates/email/passwordreset/en.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/en.yaml
delete mode 100644 sites/backend/src/templates/email/passwordreset/es.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/es.yaml
delete mode 100644 sites/backend/src/templates/email/passwordreset/fr.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/fr.yaml
delete mode 100644 sites/backend/src/templates/email/passwordreset/index.mjs
delete mode 100644 sites/backend/src/templates/email/passwordreset/nl.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/nl.yaml
delete mode 100644 sites/backend/src/templates/email/passwordreset/uk.json
delete mode 100644 sites/backend/src/templates/email/passwordreset/uk.yaml
create mode 100644 sites/backend/src/templates/email/shared/replacements.mjs
create mode 100644 sites/backend/src/templates/email/signinlink.mjs
delete mode 100644 sites/backend/src/templates/email/signinlink/de.json
delete mode 100644 sites/backend/src/templates/email/signinlink/de.yaml
delete mode 100644 sites/backend/src/templates/email/signinlink/en.json
delete mode 100644 sites/backend/src/templates/email/signinlink/en.yaml
delete mode 100644 sites/backend/src/templates/email/signinlink/es.json
delete mode 100644 sites/backend/src/templates/email/signinlink/es.yaml
delete mode 100644 sites/backend/src/templates/email/signinlink/fr.json
delete mode 100644 sites/backend/src/templates/email/signinlink/fr.yaml
delete mode 100644 sites/backend/src/templates/email/signinlink/index.mjs
delete mode 100644 sites/backend/src/templates/email/signinlink/nl.json
delete mode 100644 sites/backend/src/templates/email/signinlink/nl.yaml
delete mode 100644 sites/backend/src/templates/email/signinlink/uk.json
delete mode 100644 sites/backend/src/templates/email/signinlink/uk.yaml
create mode 100644 sites/backend/src/templates/email/signup-aea.mjs
delete mode 100644 sites/backend/src/templates/email/signup-aea/de.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/de.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aea/en.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/en.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aea/es.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/es.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aea/fr.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/fr.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aea/index.mjs
delete mode 100644 sites/backend/src/templates/email/signup-aea/nl.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/nl.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aea/uk.json
delete mode 100644 sites/backend/src/templates/email/signup-aea/uk.yaml
create mode 100644 sites/backend/src/templates/email/signup-aed.mjs
delete mode 100644 sites/backend/src/templates/email/signup-aed/de.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/de.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aed/en.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/en.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aed/es.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/es.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aed/fr.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/fr.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aed/index.mjs
delete mode 100644 sites/backend/src/templates/email/signup-aed/nl.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/nl.yaml
delete mode 100644 sites/backend/src/templates/email/signup-aed/uk.json
delete mode 100644 sites/backend/src/templates/email/signup-aed/uk.yaml
create mode 100644 sites/backend/src/templates/email/signup.mjs
delete mode 100644 sites/backend/src/templates/email/signup/de.json
delete mode 100644 sites/backend/src/templates/email/signup/de.yaml
delete mode 100644 sites/backend/src/templates/email/signup/en.json
delete mode 100644 sites/backend/src/templates/email/signup/en.yaml
delete mode 100644 sites/backend/src/templates/email/signup/es.json
delete mode 100644 sites/backend/src/templates/email/signup/es.yaml
delete mode 100644 sites/backend/src/templates/email/signup/fr.json
delete mode 100644 sites/backend/src/templates/email/signup/fr.yaml
delete mode 100644 sites/backend/src/templates/email/signup/index.mjs
delete mode 100644 sites/backend/src/templates/email/signup/nl.json
delete mode 100644 sites/backend/src/templates/email/signup/nl.yaml
delete mode 100644 sites/backend/src/templates/email/signup/uk.json
delete mode 100644 sites/backend/src/templates/email/signup/uk.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/de.json
delete mode 100644 sites/backend/src/templates/email/transinvite/de.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/en.json
delete mode 100644 sites/backend/src/templates/email/transinvite/en.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/es.json
delete mode 100644 sites/backend/src/templates/email/transinvite/es.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/fr.json
delete mode 100644 sites/backend/src/templates/email/transinvite/fr.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/index.mjs
delete mode 100644 sites/backend/src/templates/email/transinvite/nl.json
delete mode 100644 sites/backend/src/templates/email/transinvite/nl.yaml
delete mode 100644 sites/backend/src/templates/email/transinvite/uk.json
delete mode 100644 sites/backend/src/templates/email/transinvite/uk.yaml
delete mode 100644 sites/backend/src/templates/email/uk.json
delete mode 100644 sites/backend/src/templates/email/uk.yaml
create mode 100644 sites/backend/src/utils/oidc-provider.mjs
create mode 100644 sites/dev/docs/reference/api/point/dist/readme.mdx
create mode 100644 sites/org/authors.json
create mode 100644 sites/org/babel.config.mjs
rename sites/{orgdocs => org}/blog/2-20-for-dolls/index.mdx (100%)
rename sites/{orgdocs => org}/blog/2019-yearly-report/index.mdx (100%)
rename sites/{orgdocs => org}/blog/2021-wrapup/index.mdx (100%)
rename sites/{orgdocs => org}/blog/a-call-for-help/index.mdx (100%)
rename sites/{orgdocs => org}/blog/albert-apron/index.mdx (100%)
rename sites/{orgdocs => org}/blog/all-contributors/index.mdx (100%)
rename sites/{orgdocs => org}/blog/annnouncing-yuri/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-carlita/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-carlton-and-bent/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-charlie/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-freesewing-library/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-freesewing-social/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-freesewing-v30/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-freesewing/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-hortensia/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-penelope/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-sandy/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-shin/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-sven/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-teagan/index.mdx (100%)
rename sites/{orgdocs => org}/blog/announcing-ursula/index.mdx (100%)
create mode 100644 sites/org/blog/announcing-v2/index.mdx
rename sites/{orgdocs => org}/blog/bella-bodice-block/index.mdx (100%)
rename sites/{orgdocs => org}/blog/benjamin-bow-tie-beta/index.mdx (100%)
create mode 100644 sites/org/blog/breanna-measurements-sizes-in-2-2/index.mdx
rename sites/{orgdocs => org}/blog/bye-2020/index.mdx (100%)
rename sites/{orgdocs => org}/blog/calling-all-patrons/index.mdx (100%)
rename sites/{orgdocs => org}/blog/claim-your-showcase-posts-for-eternal-glory/index.mdx (100%)
rename sites/{orgdocs => org}/blog/core-1-8-jaeger-across-back/index.mdx (100%)
rename sites/{orgdocs => org}/blog/core-v1-3-0-is-out/index.mdx (100%)
rename sites/{orgdocs => org}/blog/cornelius-cycling-breeches/index.mdx (100%)
rename sites/{orgdocs => org}/blog/email-breakdown-post-mortem/index.mdx (100%)
rename sites/{orgdocs => org}/blog/email-spam-problems/index.mdx (100%)
rename sites/{orgdocs => org}/blog/facemask-frenzy/index.mdx (100%)
rename sites/{orgdocs => org}/blog/florence-face-mask/index.mdx (100%)
rename sites/{orgdocs => org}/blog/florent-flat-cap-beta/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-2-19/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-2-21/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-goes-jamstack/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-is-now-pay-what-you-want/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-v2-1/index.mdx (100%)
rename sites/{orgdocs => org}/blog/freesewing-v2-7/index.mdx (100%)
create mode 100644 sites/org/blog/freesewing-v3-1/index.mdx
rename sites/{orgdocs => org}/blog/gdpr-plan/index.mdx (100%)
rename sites/{orgdocs => org}/blog/gdpr-ready/index.mdx (100%)
rename sites/{orgdocs => org}/blog/halloween-cosplays-2021/index.mdx (100%)
rename sites/{orgdocs => org}/blog/halloween-ideas-2021/index.mdx (100%)
rename sites/{orgdocs => org}/blog/holmes-deerstalker-hat/index.mdx (100%)
rename sites/{orgdocs => org}/blog/huey-hoodie-beta/index.mdx (100%)
rename sites/{orgdocs => org}/blog/lets-meet-up-in-2019/index.mdx (100%)
rename sites/{orgdocs => org}/blog/meet-paco/index.mdx (100%)
rename sites/{orgdocs => org}/blog/open-backend-api/index.mdx (100%)
rename sites/{orgdocs => org}/blog/open-for-business/index.mdx (100%)
rename sites/{orgdocs => org}/blog/our-newest-design-is-the-tristan-top/index.mdx (100%)
rename sites/{orgdocs => org}/blog/privacy-choices/index.mdx (100%)
rename sites/{orgdocs => org}/blog/react-17/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2017-09/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2017-10/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2017-11/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2017-12/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-01/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-02/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-03/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-04/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-05/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-06/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-07/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-09/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-10/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2018-11/index.mdx (100%)
rename sites/{orgdocs => org}/blog/roundup-2019-01/index.mdx (100%)
rename sites/{orgdocs => org}/blog/the-refashioners-2017/index.mdx (100%)
rename sites/{orgdocs => org}/blog/v2-22-then-v3/index.mdx (100%)
rename sites/{orgdocs => org}/blog/v3-2-0/index.mdx (100%)
rename sites/{orgdocs => org}/blog/v3-umbrella-post/index.mdx (100%)
create mode 100644 sites/org/blog/welcome-to-freesewining-3/index.mdx
rename sites/{orgdocs => org}/broken (100%)
delete mode 100644 sites/org/components/crowdin/status.mjs
delete mode 100644 sites/org/components/crowdin/suggest-language.mjs
delete mode 100644 sites/org/components/crowdin/translator-invite.mjs
delete mode 100644 sites/org/components/crowdin/translators.mjs
delete mode 100644 sites/org/components/curate/de.yaml
delete mode 100644 sites/org/components/curate/en.yaml
delete mode 100644 sites/org/components/curate/es.yaml
delete mode 100644 sites/org/components/curate/fr.yaml
delete mode 100644 sites/org/components/curate/nl.yaml
delete mode 100644 sites/org/components/curate/uk.yaml
delete mode 100644 sites/org/components/design-examples.mjs
delete mode 100644 sites/org/components/design.mjs
delete mode 100644 sites/org/components/feeds.mjs
delete mode 100644 sites/org/components/footer/de.yaml
delete mode 100644 sites/org/components/footer/en.yaml
delete mode 100644 sites/org/components/footer/es.yaml
delete mode 100644 sites/org/components/footer/fr.yaml
delete mode 100644 sites/org/components/footer/nl.yaml
delete mode 100644 sites/org/components/footer/uk.yaml
delete mode 100644 sites/org/components/genimg/de.yaml
delete mode 100644 sites/org/components/genimg/en.yaml
delete mode 100644 sites/org/components/genimg/es.yaml
delete mode 100644 sites/org/components/genimg/fr.yaml
delete mode 100644 sites/org/components/genimg/index.mjs
delete mode 100644 sites/org/components/genimg/nl.yaml
delete mode 100644 sites/org/components/genimg/uk.yaml
delete mode 100644 sites/org/components/github/create-post.mjs
delete mode 100644 sites/org/components/github/design-picker.mjs
delete mode 100644 sites/org/components/github/inputs.mjs
delete mode 100644 sites/org/components/header/de.yaml
delete mode 100644 sites/org/components/header/en.yaml
delete mode 100644 sites/org/components/header/es.yaml
delete mode 100644 sites/org/components/header/fr.yaml
delete mode 100644 sites/org/components/header/index.mjs
delete mode 100644 sites/org/components/header/nl.yaml
delete mode 100644 sites/org/components/header/uk.yaml
delete mode 100644 sites/org/components/layouts/bare.mjs
delete mode 100644 sites/org/components/layouts/default.mjs
delete mode 100644 sites/org/components/layouts/docs.mjs
delete mode 100644 sites/org/components/layouts/editor.mjs
delete mode 100644 sites/org/components/layouts/post.mjs
delete mode 100644 sites/org/components/layouts/workbench.mjs
delete mode 100644 sites/org/components/mdx/index.mjs
delete mode 100644 sites/org/components/mdx/pattern-docs.mjs
delete mode 100644 sites/org/components/mdx/pattern-measurements.mjs
delete mode 100644 sites/org/components/mdx/pattern-options.mjs
delete mode 100644 sites/org/components/mdx/posts/author.mjs
delete mode 100644 sites/org/components/navigation/modal-menu.mjs
delete mode 100644 sites/org/components/navigation/sections-menu.mjs
delete mode 100644 sites/org/components/search.mjs
create mode 100644 sites/org/docs/account/about/avatar/index.mdx
create mode 100644 sites/org/docs/account/about/bio/index.mdx
create mode 100644 sites/org/docs/account/about/email/index.mdx
create mode 100644 sites/org/docs/account/about/index.mdx
create mode 100644 sites/org/docs/account/about/username/index.mdx
create mode 100644 sites/org/docs/account/actions/import/index.mdx
create mode 100644 sites/org/docs/account/actions/index.mdx
create mode 100644 sites/org/docs/account/actions/reload/index.mdx
create mode 100644 sites/org/docs/account/actions/remove/index.mdx
create mode 100644 sites/org/docs/account/actions/restrict/index.mdx
create mode 100644 sites/org/docs/account/data/bookmarks/index.mdx
create mode 100644 sites/org/docs/account/data/index.mdx
create mode 100644 sites/org/docs/account/data/patterns/index.mdx
create mode 100644 sites/org/docs/account/data/patterns/pattern.mdx
create mode 100644 sites/org/docs/account/data/sets/index.mdx
create mode 100644 sites/org/docs/account/data/sets/set.mdx
create mode 100644 sites/org/docs/account/index.mdx
create mode 100644 sites/org/docs/account/preferences/compare/index.mdx
create mode 100644 sites/org/docs/account/preferences/consent/index.mdx
create mode 100644 sites/org/docs/account/preferences/control/index.mdx
create mode 100644 sites/org/docs/account/preferences/index.mdx
create mode 100644 sites/org/docs/account/preferences/newsletter/index.mdx
create mode 100644 sites/org/docs/account/preferences/units/index.mdx
create mode 100644 sites/org/docs/account/security/apikeys/index.mdx
create mode 100644 sites/org/docs/account/security/index.mdx
create mode 100644 sites/org/docs/account/security/mfa/index.mdx
create mode 100644 sites/org/docs/account/security/password/index.mdx
create mode 100644 sites/org/docs/account/social/github/index.mdx
create mode 100644 sites/org/docs/account/social/index.mdx
create mode 100644 sites/org/docs/account/social/instagram/index.mdx
create mode 100644 sites/org/docs/account/social/mastodon/index.mdx
create mode 100644 sites/org/docs/account/social/reddit/index.mdx
create mode 100644 sites/org/docs/account/social/tiktok/index.mdx
create mode 100644 sites/org/docs/account/social/twitch/index.mdx
create mode 100644 sites/org/docs/account/social/website/index.mdx
create mode 100644 sites/org/docs/admin/index.mdx
create mode 100644 sites/org/docs/admin/subscribers.mdx
create mode 100644 sites/org/docs/designs/index.mdx
rename sites/{orgdocs => org/docs}/docs/_aboutbriansleevecap.mdx (99%)
rename sites/{orgdocs => org/docs}/docs/_controltip.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/community-standards/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/editor/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/faq/commercial-use/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/faq/email-trouble/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/faq/measurements-issues/highbust.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/about/faq/measurements-issues/highbust2.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/about/faq/measurements-issues/hps.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/about/faq/measurements-issues/hps2.jpg (100%)
create mode 100644 sites/org/docs/docs/about/faq/measurements-issues/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/faq/measurements-issues/waisttoarmpit.jpg (100%)
create mode 100644 sites/org/docs/docs/about/faq/newsletter/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/newsletter/why-subscribe-multiple-clicks/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/newsletter/why-unsubscribe-multiple-clicks/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/faq/notches/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/faq/printing-issues/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/seam-allowance/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/standard-measurements/readme.mdx
create mode 100644 sites/org/docs/docs/about/faq/tapering-seams/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/faq/womenswear-blocks/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/guide/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/notation/readme.mdx
create mode 100644 sites/org/docs/docs/about/pledge/motivation/readme.mdx
create mode 100644 sites/org/docs/docs/about/pledge/readme.mdx
create mode 100644 sites/org/docs/docs/about/privacy/readme.mdx
create mode 100644 sites/org/docs/docs/about/readme.mdx
create mode 100644 sites/org/docs/docs/about/rights/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/site/account/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/apikeys/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/bookmarks/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/csets/cset1.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/csets/cset2.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/csets/joost.png (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/csets/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/about/site/draft/editor.png (100%)
create mode 100644 sites/org/docs/docs/about/site/draft/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/site/patterns/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/site/readme.mdx
rename sites/{orgdocs => org/docs}/docs/about/site/sets/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/about/terms/readme.mdx
create mode 100644 sites/org/docs/docs/designs/aaron/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/finished.gif (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03f.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03g.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step03h.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step04a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step04b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/armholedrop/armholedrop.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/armholedrop/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/backlinebend/backlinebend.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/backlinebend/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/chestease/chestease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/chestease/readme.mdx
rename sites/{orgdocs/docs/designs/bent => org/docs/docs/designs/aaron}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/hipsease/hipsease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/hipsease/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/knitbindingwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/legacyarmholedepth/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/lengthbonus/lengthbonus.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/lengthbonus/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/necklinebend/necklinebend.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/necklinebend/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/necklinedrop/necklinedrop.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/necklinedrop/readme.mdx
create mode 100644 sites/org/docs/docs/designs/aaron/options/readme.mdx
create mode 100644 sites/org/docs/docs/designs/aaron/options/shoulderstrapplacement/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/shoulderstrapplacement/shoulderstrapplacement.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/shoulderstrapwidth/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/shoulderstrapwidth/shoulderstrapwidth.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/options/stretchfactor/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/aaron/options/stretchfactor/stretchfactor.svg (100%)
create mode 100644 sites/org/docs/docs/designs/aaron/readme.mdx
create mode 100644 sites/org/docs/docs/designs/albert/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/albert/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/backopening/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/biblength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/bibwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/chestdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/albert/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/albert/options/strapwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/albert/readme.mdx
create mode 100644 sites/org/docs/docs/designs/bee/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bee/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/backdartheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bandlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bandtielength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bandtiewidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bellaguide/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bottomcupdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/bustspanease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/crossbackties/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/duocolorties/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/frontarmholepitchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/frontcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/frontshoulderwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/fullchesteasereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/highbustwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/necktielength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/necktiewidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/pointedtieends/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bee/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/reversible/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/shouldertoshoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/sidecurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/sidedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/ties/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/topdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bee/options/waistease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bee/readme.mdx
create mode 100644 sites/org/docs/docs/designs/bella/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bella/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/armholedepth/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholecurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholecurvature/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholepitchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholepitchdepth/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholeslant/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backarmholeslant/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backdartheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backdartheight/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backhemslope/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backhemslope/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/backneckcutout/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartcurve/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartlength/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustdartminimumfabric/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustspanease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/bustspanease/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/chestease/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/frontarmholecurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/frontarmholepitchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/frontarmholepitchdepth/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/frontshoulderwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/frontshoulderwidth/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/fullchesteasereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/highbustwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/highbustwidth/sample.png (100%)
create mode 100644 sites/org/docs/docs/designs/bella/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/shouldertoshoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/waistdartcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/waistdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/waistdartlength/sample.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bella/options/waistease/sample.png (100%)
create mode 100644 sites/org/docs/docs/designs/bella/readme.mdx
create mode 100644 sites/org/docs/docs/designs/benjamin/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/finished.gif (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/layout1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/layout2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step12.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step13.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step14.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step15.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step22.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step23.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/instructions/step25.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/adjustmentribbon/adjustmentribbon.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/adjustmentribbon/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/bowlength/bowlength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/bowlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/bowstyle/bowstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/bowstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/collarbandheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/collarease/collarease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/endstyle/endstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/endstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/knotwidth/knotwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/knotwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/benjamin/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/tipwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/benjamin/options/tipwidth/tipwidth.svg (100%)
create mode 100644 sites/org/docs/docs/designs/benjamin/readme.mdx
create mode 100644 sites/org/docs/docs/designs/bent/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bent/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/backneckcutout/backneckcutout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/carlton => org/docs/docs/designs/bent}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bent/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/sleevebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/sleevecapheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bent/options/sleevelengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bent/readme.mdx
create mode 100644 sites/org/docs/docs/designs/bibi/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/dart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/gather.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/knitbinding_a.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/knitbinding_b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/knitbinding_c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/knitbinding_d.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/knitbinding_e.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/ribbing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/shoulders.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/sideseam.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/sleeve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/instructions/sleeve2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/armholecurveback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/armholecurvefront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/armholedropback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/backneckbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/bindingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/bustease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/curvatureadjustment/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/dart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/fitwaist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/flare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/lengthadjustment/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/necklinebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/necklinedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/necklinewidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bibi/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/ribbingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/ribbingstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/seatbackadjustment/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/shoulderease/shoulderease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleeveease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleevelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/sleeves/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/strapwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/usecuffribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/usewaistribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/waistadjustment/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bibi/options/waistease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bibi/readme.mdx
create mode 100644 sites/org/docs/docs/designs/bob/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bob/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bob/options/headsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bob/options/lengthratio/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bob/options/neckratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bob/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bob/options/widthratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bob/readme.mdx
create mode 100644 sites/org/docs/docs/designs/breanna/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/breanna/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/frontscyedart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/primarybustdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/primarybustdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/primarybustdartshaping/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/breanna/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/secondarybustdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/secondarybustdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/shoulderdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/shoulderdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/shoulderdartsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/de.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/en.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/es.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/fr.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/nl.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/sleevelengthbonus/uk.md (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/verticalease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/waistdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/waistdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/waistdartsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/breanna/options/waistease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/breanna/readme.mdx
create mode 100644 sites/org/docs/docs/designs/brian/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/finished.gif (100%)
create mode 100644 sites/org/docs/docs/designs/brian/instructions/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03f.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03g.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step03h.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step04a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step04b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/acrossbackfactor/acrossbackfactor.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/acrossbackfactor/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/armholedepth/armholedepthfactor.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/armholedepth/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/armholedepthfactor/armholedepthfactor.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/armholedepthfactor/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/backneckcutout/backneckcutout.svg (100%)
rename sites/{orgdocs/docs/designs/wahid => org/docs/docs/designs/brian}/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/bicepsease/bicepsease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/bicepsease/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/chestease/chestease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/chestease/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/collarease/collarease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/collarease/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/cuffease/cuffease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/cuffease/readme.mdx
rename sites/{orgdocs/docs/designs/diana => org/docs/docs/designs/brian}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/frontarmholedeeper/frontarmholedeeper.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/frontarmholedeeper/readme.mdx
create mode 100644 sites/org/docs/docs/designs/brian/options/legacyarmholedepth/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/lengthbonus/lengthbonus.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/lengthbonus/readme.mdx
create mode 100644 sites/org/docs/docs/designs/brian/options/readme.mdx
rename sites/{orgdocs/docs/designs/carlita => org/docs/docs/designs/brian}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/carlita => org/docs/docs/designs/brian}/options/s3collar/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/shoulderease/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/shoulderease/shoulderease.svg (100%)
rename sites/{orgdocs/docs/designs/wahid => org/docs/docs/designs/brian}/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/shoulderslopereduction/shoulderslopereduction.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapbackfactorx/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapbackfactory/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapease/readme.mdx
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapfrontfactorx/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapfrontfactory/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq1offset/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq1spread1/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq1spread2/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq2offset/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq2spread1/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq2spread2/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq3offset/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq3spread1/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq3spread2/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq4offset/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq4spread1/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecapq4spread2/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecaptopfactorx/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevecaptopfactory/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
create mode 100644 sites/org/docs/docs/designs/brian/options/sleevelengthbonus/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs/docs/designs/diana => org/docs/docs/designs/brian}/options/sleevewidthguarantee/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/brian/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/brian/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/brian/sleevecaptop.svg (100%)
create mode 100644 sites/org/docs/docs/designs/bruce/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step03-a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step03-b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step03-c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step03-d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step06.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step07.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step08.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step10.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step11.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step12.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step13.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step14.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/instructions/step15.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/backrise/backrise.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/backrise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/bulge/bulge.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/bulge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/legbonus/legbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/legbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/legstretch/legstretch.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/legstretch/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/bruce/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/rise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/rise/rise.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/stretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/bruce/options/stretch/stretch.svg (100%)
create mode 100644 sites/org/docs/docs/designs/bruce/readme.mdx
create mode 100644 sites/org/docs/docs/designs/carlita/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/apply-fusible-interfacing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/attach-canvas-to-front.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/close-the-back-darts.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/construct-the-belt.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/join-chest-canvas-piece-to-front-canvas.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/pad-stitch-lapels.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/prepare-the-inner-pocket-tab.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/beltwidth/beltwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/beltwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/buttonspacinghorizontal/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketangle/chestpocketangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketheight/chestpocketheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketplacement/chestpocketplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketwidth/chestpocketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/chestpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/collarflare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/collarheight/collarheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/collarheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/collarspread/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/contour/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/cufflength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/frontoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/innerpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/innerpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/innerpocketweltheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/innerpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/lapelreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/length/length.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketflapradius/pocketflapradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketflapradius/pocketradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketflapradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketplacementhorizontal/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketplacementvertical/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketradius/pocketradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/pocketwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/carlita/options/readme.mdx
rename sites/{orgdocs/docs/designs/carlton => org/docs/docs/designs/carlita}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/carlton => org/docs/docs/designs/carlita}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/seatease/seatease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/shoulderease/shoulderease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevebend/sleevebend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevecapease/sleevecapease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevecapheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlita/options/waistease/waistease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/carlita/readme.mdx
create mode 100644 sites/org/docs/docs/designs/carlton/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/apply-fusible-interfacing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/attach-canvas-to-front.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/close-the-back-darts.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/construct-the-belt.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/join-chest-canvas-piece-to-front-canvas.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/pad-stitch-lapels.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/prepare-the-inner-pocket-tab.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/beltwidth/beltwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/beltwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/buttonspacinghorizontal/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketangle/chestpocketangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketheight/chestpocketheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketplacement/chestpocketplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketwidth/chestpocketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/chestpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/collarflare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/collarheight/collarheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/collarheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/collarspread/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/cufflength/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/huey => org/docs/docs/designs/carlton}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/frontoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/innerpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/innerpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/innerpocketweltheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/innerpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/lapelreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/length/length.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketflapradius/pocketflapradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketflapradius/pocketradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketflapradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketplacementhorizontal/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketplacementvertical/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketradius/pocketradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/pocketwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/carlton/options/readme.mdx
rename sites/{orgdocs/docs/designs/huey => org/docs/docs/designs/carlton}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/huey => org/docs/docs/designs/carlton}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/seatease/seatease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/shoulderease/shoulderease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevebend/sleevebend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevecapease/sleevecapease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevecapheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/carlton/options/waistease/waistease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/carlton/readme.mdx
create mode 100644 sites/org/docs/docs/designs/cathrin/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step06.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step06b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step07.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/instructions/step07b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backdrop/backdrop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backopening/backopening.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backopening/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backrise/backrise.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/backrise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/frontdrop/frontdrop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/frontdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/frontrise/frontrise.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/frontrise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/hiprise/hiprise.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/hiprise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/panels/panels.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/panels/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/cathrin/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/waistreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cathrin/options/waistreduction/waistreduction.svg (100%)
create mode 100644 sites/org/docs/docs/designs/cathrin/readme.mdx
create mode 100644 sites/org/docs/docs/designs/charlie/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/AttachExtensionToRightLeg.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/AttachFacing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/AttachFacingToZipper.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/AttachZipperToExtension.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/BasteZipper.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/CloseCrossseam.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/CloseExtensionAndSerge.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/FinishFacing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/FinishLoopEdges.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/SewTheJSeam.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/StitchAndCutLoops.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step01.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step03.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step04a.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step04b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step04c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step04d.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step05a.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step05b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step06a.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step06b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step07.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/instructions/step08.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/backpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/backpocketfacing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/backpockethorizontalplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/backpocketverticalplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/backpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/beltloops/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crossseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crossseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crossseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crotchdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crotchseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crotchseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/crotchseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/flycurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/flylength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/flywidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketfacing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketslantbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketslantdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketslantround/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketslantwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/frontpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/grainlineposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/kneeease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/legbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/charlie/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/usewaistanglefor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistbandcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/charlie/options/waistheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/charlie/readme.mdx
create mode 100644 sites/org/docs/docs/designs/cornelius/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/bandbelowknee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/cuffstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/cuffwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/flywidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/fullness/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/kneetobelow/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/cornelius/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/ventlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/waistbandbelowwaist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/cornelius/options/waistreduction/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/cornelius/readme.mdx
create mode 100644 sites/org/docs/docs/designs/diana/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/diana/instructions/neckline.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/cuffease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/diana/options/draftforhighbust/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/drapeangle/drapeangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/drapeangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/diana/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/shoulderease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/shoulderease/shoulderease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/shoulderseamlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/shoulderseamlength/shoulderseamlength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevelengthbonus/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevelengthbonus/shoulderease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs/docs/designs/huey => org/docs/docs/designs/diana}/options/sleevewidthguarantee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/waistease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/diana/options/waistease/waistease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/diana/readme.mdx
create mode 100644 sites/org/docs/docs/designs/florence/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/florence/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/instructions/step1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/instructions/step3.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/instructions/step6.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/curve/curve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/curve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/height/height.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/height/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/length/length.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florence/options/length/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/florence/options/readme.mdx
create mode 100644 sites/org/docs/docs/designs/florence/readme.mdx
create mode 100644 sites/org/docs/docs/designs/florent/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/finished.gif (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step01.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step02.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step03.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step04.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step05.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step06.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step07.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step08.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step09.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step10.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step11.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step12.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step13.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step14.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step15.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/instructions/step16.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/florent/options/headease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/florent/options/readme.mdx
create mode 100644 sites/org/docs/docs/designs/florent/readme.mdx
create mode 100644 sites/org/docs/docs/designs/gozer/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/gozer/instructions/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/gozer/readme.mdx
create mode 100644 sites/org/docs/docs/designs/hi/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hi/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hi/options/aggressive/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hi/options/hungry/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hi/options/nosepointiness/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hi/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hi/options/size/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hi/readme.mdx
create mode 100644 sites/org/docs/docs/designs/holmes/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/holmes/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/buttonhole/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/earlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/earwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/gores/gores.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/gores/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/headease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/lengthratio/lengthratio.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/lengthratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/holmes/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/visorangle/brimangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/visorangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/visorlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/visorwidth/brimwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/holmes/options/visorwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/holmes/readme.mdx
create mode 100644 sites/org/docs/docs/designs/hortensia/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hortensia/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hortensia/options/handlewidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hortensia/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hortensia/options/size/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hortensia/options/straplength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hortensia/options/zippersize/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hortensia/readme.mdx
create mode 100644 sites/org/docs/docs/designs/huey/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/huey/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/hugo => org/docs/docs/designs/huey}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodangle/hoodangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodclosure/hoodclosure.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodclosure/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodcutback/hoodcutback.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodcutback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hooddepth/hooddepth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hooddepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodheight/hoodheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/hoodheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocket/pocket.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocketheight/pocketheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocketopening/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocketwidth/pocketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/pocketwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/huey/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbing/ribbing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbingheight/ribbingheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbingstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/ribbingstretch/ribbingstretch.svg (100%)
rename sites/{orgdocs/docs/designs/simon => org/docs/docs/designs/huey}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/simon => org/docs/docs/designs/huey}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/huey/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/simon => org/docs/docs/designs/huey}/options/sleevewidthguarantee/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/huey/readme.mdx
create mode 100644 sites/org/docs/docs/designs/hugo/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hugo/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/jaeger => org/docs/docs/designs/hugo}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/pocketwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hugo/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/ribbingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/ribbingstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/ribbingstretch/ribbingstretch.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/hugo/options/sleevelengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/hugo/readme.mdx
create mode 100644 sites/org/docs/docs/designs/jaeger/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/cuttingCaveat.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/attachChestPocketBag.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/attachChestPocketWelt.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/basteChestPocket.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/closeBack.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/closeFrontDarts.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/closeShoulders.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/closeSides.svg (100%)
create mode 100644 sites/org/docs/docs/designs/jaeger/instructions/collarCuts.svg
create mode 100644 sites/org/docs/docs/designs/jaeger/instructions/collarMarkings.svg
create mode 100644 sites/org/docs/docs/designs/jaeger/instructions/collarWithCanvas.svg
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/finishChestPocket.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/foldChestPocketWelt.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/front.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/padAndTape.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/prepareCanvas.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/pressChestPocket.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/backvent/backvent.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/backvent/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/backventlength/backventlength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/backventlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/buttonlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/buttons/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/centerbackdart/centerbackdart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/centerbackdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/centerfronthemdrop/centerfronthemdrop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/centerfronthemdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketangle/chestpocketangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketplacement/chestpocketplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketweltsize/chestpocketweltsize.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketweltsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketwidth/chestpocketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestshaping/chestshaping.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/chestshaping/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarheight/collarheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchangle/collarnotchangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchdepth/collarnotchdepth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchreturn/collarnotchreturn.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarnotchreturn/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarroll/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/collarspread/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/simon => org/docs/docs/designs/jaeger}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontcutawayangle/frontcutawayangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontcutawayangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontcutawayend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontcutawaystart/frontcutawaystart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontcutawaystart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontdartplacement/frontdartplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontdartplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketdepth/frontpocketdepth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketplacement/frontpocketplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketwidth/frontpocketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/frontpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/hemradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/innerpocketdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/innerpocketplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/innerpocketweltheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/innerpocketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/lapelreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/lapelstart/lapelstart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/lapelstart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/pocketfoldover/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/jaeger/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/rolllinecollarheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/rolllinecollarheight/rolllinecollarheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/shoulderslopereduction/shoulderslopereduction.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sidefrontplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sidefrontplacement/sidefrontplacement.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevebend/sleevebend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevecapease/sleevecapease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevecapheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleeveventlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/sleeveventwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jaeger/options/waistease/waistease.svg (100%)
create mode 100644 sites/org/docs/docs/designs/jaeger/readme.mdx
create mode 100644 sites/org/docs/docs/designs/jane/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/jane/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/bodyease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/gussetsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/neckdepthback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/neckdepthfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/neckwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/jane/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/shiftlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/jane/options/sleevelength/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/jane/readme.mdx
create mode 100644 sites/org/docs/docs/designs/lily/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lily/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crossseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crossseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crossseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crotchdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crotchseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crotchseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/crotchseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/fabricstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/fitguides/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/grainlineposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/kneeease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/lengthreduction/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lily/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/usewaistanglefor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/waistangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lily/options/waistheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lily/readme.mdx
create mode 100644 sites/org/docs/docs/designs/lucy/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lucy/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lucy/options/edge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lucy/options/length/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lucy/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lucy/options/width/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lucy/readme.mdx
create mode 100644 sites/org/docs/docs/designs/lumina/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lumina/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/ease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/fixedsidepanel/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/lowerwaistbandback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/pocket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/pocketdepth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lumina/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/sidepanel/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/smoothing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/waistband/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/waistbandsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/waistlowering/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumina/options/waistreduction/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lumina/readme.mdx
create mode 100644 sites/org/docs/docs/designs/lumira/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lumira/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/backgusset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/backgussetwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/buttlift/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/cyclingchamois/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/ease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/frontbulge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/frontbulgesize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/frontgussetlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/gussetwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/leglength/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lumira/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/waistband/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/waistbandsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/waistlowering/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lumira/options/waistreduction/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lumira/readme.mdx
create mode 100644 sites/org/docs/docs/designs/lunetius/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lunetius/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lunetius/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/lunetius/options/lengthratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lunetius/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/lunetius/options/widthratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/lunetius/readme.mdx
create mode 100644 sites/org/docs/docs/designs/noble/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/noble/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/armholedartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backarmholecurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backarmholepitchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backarmholeslant/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backdartheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backhemslope/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/bustspanease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/dartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/frontarmholecurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/frontarmholepitchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/frontshoulderwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/fullchesteasereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/highbustwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/noble/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/shoulderdartcurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/shoulderdartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/shouldertoshoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/upperdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/waistdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/waistdartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/noble/options/waistease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/noble/readme.mdx
create mode 100644 sites/org/docs/docs/designs/octoplushy/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/armlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/armtaper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/armwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/bottomarmreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/bottomarmreductionplushy/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/bottomtoparmratio/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/neckwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/octoplushy/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/size/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/octoplushy/options/type/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/octoplushy/readme.mdx
create mode 100644 sites/org/docs/docs/designs/onyx/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/onyx/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/armpitease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/backonfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/centerseamease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/crotchgussetwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/frontonfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hooddepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hoodfrontbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hoodfrontdip/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hoodfrontpiecesize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hoodheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/hoodhem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/leghem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/leghemease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/leglength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/legribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/legribbinglength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/legribbingwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/legtaperposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckbandlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckguardlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/neckstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/outseamease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/raglanscooplength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/raglanscoopmagnitude/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/onyx/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/skirt/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/skirthem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/skirtlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/skirtwaistband/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/skirtwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleeveease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleevehem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleevelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleeveribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleeveribbinglength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/sleeveribbingwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/upperlegease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/wristease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/zipperguardwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/zipperlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/onyx/options/zipperposition/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/onyx/readme.mdx
create mode 100644 sites/org/docs/docs/designs/opal/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/opal/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibbaseangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibbasecurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibhexagonheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibhexagonsideheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibhexagonverticalposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/backbibhexagonwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibplacketlayers/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibpocketonfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibwaistdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/bibwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crossseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crossseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crossseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchforkbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/crotchseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopcornerx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopcornery/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopfirstfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopoutseam/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopsecondfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hammerloopwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/hemallowance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/legbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/leghemallowance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/leghemease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/leglength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/outseamheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackcornerheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackcornerwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackpositionx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackpositiony/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbackwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbib/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibfeaturecurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibfeatureheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibfeaturewidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibonfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibverticalposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketbibwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenter/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenteranchorwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenteranchorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenteranchory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenterextra/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenterextraheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenterheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketcarpenteropeningheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslash/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashopeningcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashopeningheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashopeningwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashshieldoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/pocketslashwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/opal/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/seatbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/straplength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/strapposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/straptapercurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/straptaperposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/strapwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/thighshape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/waistbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/waistbandlayers/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/opal/options/waistposition/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/opal/readme.mdx
create mode 100644 sites/org/docs/docs/designs/otis/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/otis/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/otis/options/binding/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/otis/options/ease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/otis/options/hem/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/otis/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/otis/options/sleevetype/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/otis/options/snapplacket/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/otis/readme.mdx
create mode 100644 sites/org/docs/docs/designs/paco/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step02.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step02.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step02b.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03b.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03c.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step03c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step04.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step04b.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step05.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step05.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step05b.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step05c.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step06.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step06.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step06b.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step06c.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step07.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step07.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step08.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step09.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step10.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step11.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step11.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step12.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step12.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step13.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step13b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step13c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step13d.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step13e.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step14.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step14.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step15.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step15.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16d.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16e.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step16f.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step17.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/instructions/step18.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/ankleelastic/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/backpockets/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crossseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crossseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crossseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crotchdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crotchseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crotchseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/crotchseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/elasticatedcuff/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/frontpocketflapsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/frontpockets/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/grainlineposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/heelease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/legbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/paco/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/usewaistanglefor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/waistangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/waistbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/paco/options/waistheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/paco/readme.mdx
create mode 100644 sites/org/docs/docs/designs/penelope/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/penelope/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/backdartdepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/backvent/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/backventlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/curveddarts/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/darttosideseamfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/frontdartdepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/hem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/hembonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/nrofdarts/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/penelope/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/waistband/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/waistbandoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/penelope/options/zipperlocation/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/penelope/readme.mdx
create mode 100644 sites/org/docs/docs/designs/readme.mdx
create mode 100644 sites/org/docs/docs/designs/sandy/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/sandy/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/circleratio/circleratio.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/circleratio/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/gathering/gathering.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/gathering/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/hemwidth/hemwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/hemwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/panels/panels.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/panels/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/sandy/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/seamlessfullcircle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/seamlessfullcircle/seamlessfullcircle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandoverlap/waistbandoverlap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandposition/waistbandposition.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandshape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandshape/waistbandshape.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sandy/options/waistbandwidth/waistbandwidth.svg (100%)
create mode 100644 sites/org/docs/docs/designs/sandy/readme.mdx
create mode 100644 sites/org/docs/docs/designs/shelly/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/shelly/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/armpitease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/bodyhem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/bodylength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/hemwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/neckbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/neckbandlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/neckbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/neckease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/raglanscooplength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/raglanscoopmagnitude/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/shelly/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/sideshape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/sleeveease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/sleevehem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/sleevelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/straightsides/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shelly/options/wristease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/shelly/readme.mdx
create mode 100644 sites/org/docs/docs/designs/shin/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/shin/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/backrise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/bulge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/elasticwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/legreduction/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/shin/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/rise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/shin/options/stretch/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/shin/readme.mdx
create mode 100644 sites/org/docs/docs/designs/simon/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10f.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10g.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/10h.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/11a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/11b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/11c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/11d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/11e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/12.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13f.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/13g.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/14a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/14b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/14c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/15a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/15b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/15c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/16a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/16b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/18a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/18b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/18c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/19a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/19b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/19c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/19d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/19e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/1a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/1b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/20a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/20b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/20c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/2a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/2b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/2c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/2d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/3a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/3b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/3c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/3d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/4a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/4b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/4c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/5.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/6a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/6b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/7.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/8a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/8b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/8c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/9a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/9b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/9c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/9d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/9e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/finished.gif (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/backdarts/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/backdartshaping/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/barrelcuffnarrowbutton/barrelcuffnarrowbutton.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/barrelcuffnarrowbutton/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/boxpleat/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/boxpleatfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/boxpleatwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonfreelength/buttonfreelength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonfreelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketfoldwidth/buttonholeplacketfoldwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketfoldwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketstyle/buttonholeplacketstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketwidth/buttonholeplacketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonholeplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonplacketstyle/buttonplacketstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonplacketstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonplacketwidth/buttonplacketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttonplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttons/buttons.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/buttons/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarangle/collarangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarbend/collarbend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarease/collarease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarflare/collarflare.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarflare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collargap/collargap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collargap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarroll/collarroll.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarroll/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandbend/collarstandbend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandcurve/collarstandcurve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandwidth/collarstandwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarstandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/collarwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffbuttonrows/cuffbuttonrows.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffbuttonrows/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffdrape/cuffdrape.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffdrape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cufflength/cufflength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cufflength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffstyle/cuffstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/cuffstyle/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/sven => org/docs/docs/designs/simon}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/extratopbutton/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/ffsa/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hemcurve/hemcurve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hemcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hemstyle/hemstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hemstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/simon/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/roundback/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/simone => org/docs/docs/designs/simon}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/simone => org/docs/docs/designs/simon}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/separatebuttonholeplacket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/separatebuttonholeplacket/separatebuttonholeplacket.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/separatebuttonplacket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleeveplacketlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleeveplacketlength/sleeveplacketlength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleeveplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/sleeveplacketwidth/sleeveplacketwidth.svg (100%)
rename sites/{orgdocs/docs/designs/simone => org/docs/docs/designs/simon}/options/sleevewidthguarantee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/splityoke/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/splityoke/splityoke.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/waistease/waistease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simon/options/yokeheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/simon/readme.mdx
create mode 100644 sites/org/docs/docs/designs/simone/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/simone/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/armholedepthfactor/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/backdarts/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/backdartshaping/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/barrelcuffnarrowbutton/barrelcuffnarrowbutton.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/barrelcuffnarrowbutton/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/boxpleat/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/boxpleatfold/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/boxpleatwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/bustalignedbuttons/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/bustdartangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/bustdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonfreelength/buttonfreelength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonfreelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketfoldwidth/buttonholeplacketfoldwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketfoldwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketstyle/buttonholeplacketstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketwidth/buttonholeplacketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonholeplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonplacketstyle/buttonplacketstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonplacketstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonplacketwidth/buttonplacketwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttonplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttons/buttons.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/buttons/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarangle/collarangle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarbend/collarbend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarease/collarease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarflare/collarflare.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarflare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collargap/collargap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collargap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarroll/collarroll.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarroll/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandbend/collarstandbend.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandbend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandcurve/collarstandcurve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandwidth/collarstandwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarstandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/collarwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/contour/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffbuttonrows/cuffbuttonrows.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffbuttonrows/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffdrape/cuffdrape.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffdrape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cufflength/cufflength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cufflength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffstyle/cuffstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/cuffstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/extratopbutton/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/ffsa/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/frontdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/frontdarts/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hemcurve/hemcurve.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hemcurve/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hemstyle/hemstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hemstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/simone/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/roundback/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/sven => org/docs/docs/designs/simone}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/sven => org/docs/docs/designs/simone}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/separatebuttonholeplacket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/separatebuttonplacket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleeveplacketlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleeveplacketlength/sleeveplacketlength.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleeveplacketwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/sleeveplacketwidth/sleeveplacketwidth.svg (100%)
rename sites/{orgdocs/docs/designs/sven => org/docs/docs/designs/simone}/options/sleevewidthguarantee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/splityoke/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/splityoke/splityoke.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/waistease/waistease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/simone/options/yokeheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/simone/readme.mdx
create mode 100644 sites/org/docs/docs/designs/skully/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/skully/instructions/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/skully/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/skully/options/size/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/skully/readme.mdx
create mode 100644 sites/org/docs/docs/designs/sven/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/sven/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/cuffease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/tamiko => org/docs/docs/designs/sven}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/sven/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbing/ribbing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbingheight/ribbingheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbingstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/ribbingstretch/ribbingstretch.svg (100%)
rename sites/{orgdocs/docs/designs/yuri => org/docs/docs/designs/sven}/options/s3armhole/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/yuri => org/docs/docs/designs/sven}/options/s3collar/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/sven/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
rename sites/{orgdocs/docs/designs/yuri => org/docs/docs/designs/sven}/options/sleevewidthguarantee/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/sven/readme.mdx
create mode 100644 sites/org/docs/docs/designs/tamiko/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/instructions/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/instructions/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/chestease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/wahid => org/docs/docs/designs/tamiko}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/flare/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tamiko/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tamiko/options/shoulderseamlength/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tamiko/readme.mdx
create mode 100644 sites/org/docs/docs/designs/teagan/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step01.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step02.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03a.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03b.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03c.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03d.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03e.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03f.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03g.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03h.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step03i.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step04.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/instructions/step05.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/fitwaist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/necklinebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/necklinedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/necklinewidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/teagan/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleeveease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevelength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/sleevewidthguarantee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/teagan/options/waistease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/teagan/readme.mdx
create mode 100644 sites/org/docs/docs/designs/tiberius/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/armholedrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/clavi/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/clavuslocation/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/clavuswidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/forcewidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/headratio/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tiberius/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/width/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tiberius/options/widthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tiberius/readme.mdx
create mode 100644 sites/org/docs/docs/designs/titan/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/titan/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crossseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crossseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crossseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crotchdrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crotchseamcurveangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crotchseamcurvebend/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/crotchseamcurvestart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/fitknee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/grainlineposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/kneeease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/legbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/titan/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/seatease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/usewaistanglefor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/waistangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/waistbalance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/titan/options/waistheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/titan/readme.mdx
create mode 100644 sites/org/docs/docs/designs/trayvon/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step09.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step10.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step11.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step12.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step13.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step14.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step15.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step16.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/instructions/step17.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/options/knotwidth/knotwidth.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/options/knotwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/trayvon/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/options/tipwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/options/tipwidth/tipwidth.svg (100%)
create mode 100644 sites/org/docs/docs/designs/trayvon/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/trayvon/tie-grain.png (100%)
create mode 100644 sites/org/docs/docs/designs/tristan/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step05b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step06.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step07.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step08.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step09.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step10.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/instructions/step14.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/bustspanease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/cutdepthback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/cutdepthfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/cutroundnessback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/cutroundnessfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/frontshoulderwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/fullchesteasereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/hem/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/hemsize/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/highbustwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/lacing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/lacinglocation/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/lacingwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/peplum/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/peplumfullness/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/peplumsize/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tristan/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/shoulderdartcurvature/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/shoulderdartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/shouldertoshoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/strapwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/upperdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/waistdartlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/waistdartposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/tristan/options/zipperlocation/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/tristan/readme.mdx
create mode 100644 sites/org/docs/docs/designs/uma/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step06.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step07.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step08.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step08b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step09.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/instructions/step10.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/backdip/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/backexposure/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/bulge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/frontdip/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/frontexposure/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/gussetlength/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/gussetposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/gussetwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/legrise/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/uma/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/rise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/xstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/uma/options/ystretch/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/uma/readme.mdx
create mode 100644 sites/org/docs/docs/designs/umbra/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step01.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step02.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step03.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step04.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step05.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step06.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step08.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step09.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/instructions/step10.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/backdip/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/backdipshape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/backexposure/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/bulge/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/bulgefullness/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/elasticstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/flipback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/frontdip/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/frontdipshape/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/frontexposure/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/frontreduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/gussetposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/gussetwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/legrise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/minfabricwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/pocketgap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/pocketheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/pockets/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/umbra/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/rise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/splitposition/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/xstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/umbra/options/ystretch/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/umbra/readme.mdx
create mode 100644 sites/org/docs/docs/designs/wahid/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/01.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/01a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/01b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/02a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/03a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/04a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05e.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05f.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05g.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05h.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05i.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05j.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05k.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05l.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/05m.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/06a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/07a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/08a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/09a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/09b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/09c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/09d.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/10a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/10b.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/10c.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/11a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/12a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/13a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/14a.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/layout.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/backinset/backinset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/backinset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/backneckcutout/backneckcutout.svg (100%)
create mode 100644 sites/org/docs/docs/designs/wahid/options/backneckcutout/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/backscyedart/backscyedart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/backscyedart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/buttons/buttons.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/buttons/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/centerbackdart/centerbackdart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/centerbackdart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/chestease/readme.mdx (100%)
rename sites/{orgdocs/docs/designs/yuri => org/docs/docs/designs/wahid}/options/draftforhighbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontinset/frontinset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontinset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontscyedart/frontscyedart.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontscyedart/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontstyle/frontstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/frontstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hemradius/hemradius.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hemradius/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hemstyle/hemstyle.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hemstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hipsease/hipsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/neckinset/neckinset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/neckinset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/necklinedrop/necklinedrop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/necklinedrop/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/pocketangle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/pocketlocation/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/pocketwidth/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/wahid/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/shoulderinset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/shoulderinset/shoulderinset.svg (100%)
create mode 100644 sites/org/docs/docs/designs/wahid/options/shoulderslopereduction/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/shoulderslopereduction/shoulderslopereduction.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/waistease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/waistease/waistease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/wahid/options/weltheight/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/wahid/readme.mdx
create mode 100644 sites/org/docs/docs/designs/walburga/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/walburga/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/headratio/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/length/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/lengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/neckline/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/neckoratio/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/walburga/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/walburga/options/widthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/walburga/readme.mdx
create mode 100644 sites/org/docs/docs/designs/waralee/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/waralee/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/instructions/waralee-crotch-seam-no-pockets.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/instructions/waralee-hem-sides-and-bottom.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/instructions/waralee-waist-band-no-pockets.png (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/backpocket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/backraise/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchfactorbackhor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchfactorbackver/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchfactorfronthor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchfactorfrontver/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/crotchfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/fitwaist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/frontpocket/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/frontpocketstyle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/hemwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/knotinfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/knotplacement/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/legshortening/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/legsize/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/waralee/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/separatewaistband/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/showmini/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/waistbandwidth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/waistoverlap/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/waralee/options/waistraise/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/waralee/readme.mdx
create mode 100644 sites/org/docs/docs/designs/yuri/_notes.mdx
rename sites/{orgdocs => org/docs}/docs/designs/yuri/instructions/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/acrossbackfactor/acrossbackfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/acrossbackfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/armholedepth/armholedepthfactor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/armholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/armholedepthfactor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/backneckcutout/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/bicepsease/bicepsease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/bicepsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/chestease/chestease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/chestease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/collarease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/cuffease/cuffease.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/cuffease/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/yuri/options/draftforhighbust/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/frontarmholedeeper/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/hipsease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/legacyarmholedepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/lengthbonus/lengthbonus.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/lengthbonus/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/designs/yuri/options/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbing/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbing/ribbing.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbingheight/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbingheight/ribbingheight.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbingstretch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/ribbingstretch/ribbingstretch.svg (100%)
create mode 100644 sites/org/docs/docs/designs/yuri/options/s3armhole/readme.mdx
create mode 100644 sites/org/docs/docs/designs/yuri/options/s3collar/readme.mdx
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/shoulderease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/shoulderslopereduction/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecap.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapanchor.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapbackfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapbackfactorx/sleevecapbackfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapbackfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapbackfactory/sleevecapbackfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapfrontfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapfrontfactorx/sleevecapfrontfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapfrontfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapfrontfactory/sleevecapfrontfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapinflection.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1offset/sleevecapq1offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1spread1/sleevecapq1downwardspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq1spread2/sleevecapq1spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2offset/sleevecapq2offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2spread1/sleevecapq2spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq2spread2/sleevecapq2spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3offset/sleevecapq3offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3spread1/sleevecapq3spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq3spread2/sleevecapq3spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4offset/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4offset/sleevecapq4offset.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4spread1/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4spread1/sleevecapq4spread1.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4spread2/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapq4spread2/sleevecapq4spread2.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecapspread.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecaptop.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecaptopfactorx/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecaptopfactorx/sleevecaptopfactorx.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecaptopfactory/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevecaptopfactory/sleevecaptopfactory.svg (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevelengthbonus/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/designs/yuri/options/sleevelengthbonus/sleevelengthbonus.svg (100%)
create mode 100644 sites/org/docs/docs/designs/yuri/options/sleevewidthguarantee/readme.mdx
create mode 100644 sites/org/docs/docs/designs/yuri/readme.mdx
rename sites/{orgdocs => org/docs}/docs/measurements/ankle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/biceps/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/bustfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/bustpointtounderbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/bustspan/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/chest/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/crossseam/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/crossseamfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/crotchdepth/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/head/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/heel/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/highbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/highbustfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/hips/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/hpstobust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/hpstowaistback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/hpstowaistfront/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/inseam/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/knee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/neck/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/measurements/readme.mdx
rename sites/{orgdocs => org/docs}/docs/measurements/seat/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/seatback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/shoulderslope/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/shouldertoelbow/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/shouldertoshoulder/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/shouldertowrist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/underbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/upperleg/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waist/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waistback/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttoarmpit/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttofloor/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttohips/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttoknee/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttoseat/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttounderbust/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/waisttoupperleg/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/measurements/wrist/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/readme.mdx
rename sites/{orgdocs => org/docs}/docs/sewing/basic-sewing-supplies/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/basting/basting.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/basting/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/coverlock/coverlock-hem.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/coverlock/coverlock.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/coverlock/janome-coverpro.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/coverlock/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/cutting/cutting.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/cutting/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/darts/dart.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/darts/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step01.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step02.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step03.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step04.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step05.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step06.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step07a.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step07b.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step08.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step09.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step10.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step11a.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step11b.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step11c.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/double-welt-pockets/step12.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/ease/ease-min.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/ease/ease-plus.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/ease/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/edgestitching/edgestitching.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/edgestitching/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/fabric-grain/fabric-grain.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/fabric-grain/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/good-sides-together/cutting-good-sides-together.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/good-sides-together/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/good-sides-together/sewing-good-sides-together.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/hemming/coverlock-hem.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/hemming/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/hps/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/jersey/knit-fabric.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/jersey/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/knit_band.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/knit_binding.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/knitbinding1.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/knitbinding2.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/knitbinding3.png (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-binding/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-fabric/fabric.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/knit-fabric/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/on-the-fold/cutting-good-sides-together.jpg (100%)
create mode 100644 sites/org/docs/docs/sewing/on-the-fold/readme.mdx
rename sites/{orgdocs => org/docs}/docs/sewing/on-the-fold/sewing-good-sides-together.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/pinning/fabric-pinning.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/pinning/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/pinning/sewing-pins.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/rayon/rayon.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/rayon/readme.mdx (100%)
create mode 100644 sites/org/docs/docs/sewing/readme.mdx
rename sites/{orgdocs => org/docs}/docs/sewing/seam-allowance/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/seam-allowance/zig-zag.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/serger/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/serger/serged-seam.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/serger/serger.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/slipstitch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/slipstitch/slipstitch.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/topstitching/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/topstitching/topstitch-needles.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/topstitching/topstitching.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/trimming/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/trimming/trimming.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/twin-needle/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/twin-needle/twin-needle.gif (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/twin-needle/twin-needle.jpg (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/zig-zag-stitch/readme.mdx (100%)
rename sites/{orgdocs => org/docs}/docs/sewing/zig-zag-stitch/zig-zag.jpg (100%)
create mode 100644 sites/org/docs/donate.mdx
create mode 100644 sites/org/docs/id.mdx
create mode 100644 sites/org/docs/patrons/index.mdx
create mode 100644 sites/org/docs/patrons/join.mdx
create mode 100644 sites/org/docs/profile.mdx
create mode 100644 sites/org/docs/stats.mdx
create mode 100644 sites/org/docs/support.mdx
create mode 100644 sites/org/docs/users.mdx
create mode 100644 sites/org/docusaurus.config.mjs
delete mode 100644 sites/org/example.env
delete mode 100644 sites/org/hooks/use-bugsnag.mjs
delete mode 100644 sites/org/hooks/use-design.mjs
rename sites/{orgdocs => org}/newsletter/2021q2/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2021q3/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2021q4/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2022q1/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2022q2/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2022q3/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2022q4/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2023q1/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2023q2/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2023q3/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2023q4/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2024q1/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2024q2/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2024q3/index.mdx (100%)
rename sites/{orgdocs => org}/newsletter/2024q4/index.mdx (100%)
create mode 100644 sites/org/newsletter/2025q1/index.mdx
delete mode 100644 sites/org/next-i18next.config.js
delete mode 100644 sites/org/next.config.mjs
delete mode 100644 sites/org/page-templates/edit-pattern.mjs
delete mode 100644 sites/org/page-templates/new-pattern.mjs
delete mode 100644 sites/org/pages/-/index.mjs
delete mode 100644 sites/org/pages/404.mjs
delete mode 100644 sites/org/pages/_app.mjs
delete mode 100644 sites/org/pages/account/[platform].mjs
delete mode 100644 sites/org/pages/account/apikeys/index.mjs
delete mode 100644 sites/org/pages/account/bio.mjs
delete mode 100644 sites/org/pages/account/bookmark.mjs
delete mode 100644 sites/org/pages/account/bookmarks.mjs
delete mode 100644 sites/org/pages/account/compare.mjs
delete mode 100644 sites/org/pages/account/consent.mjs
delete mode 100644 sites/org/pages/account/control.mjs
delete mode 100644 sites/org/pages/account/email.mjs
delete mode 100644 sites/org/pages/account/export.mjs
delete mode 100644 sites/org/pages/account/github.mjs
delete mode 100644 sites/org/pages/account/img.mjs
delete mode 100644 sites/org/pages/account/import.mjs
delete mode 100644 sites/org/pages/account/index.mjs
delete mode 100644 sites/org/pages/account/language.mjs
delete mode 100644 sites/org/pages/account/mfa.mjs
delete mode 100644 sites/org/pages/account/newsletter.mjs
delete mode 100644 sites/org/pages/account/password.mjs
delete mode 100644 sites/org/pages/account/pattern.mjs
delete mode 100644 sites/org/pages/account/patterns/aaron/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/albert/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bee/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bella/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/benjamin/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bent/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bibi/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bob/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/breanna/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/brian/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/bruce/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/carlita/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/carlton/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/cathrin/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/charlie/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/cornelius/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/diana/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/florence/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/florent/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/gozer/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/hi/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/holmes/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/hortensia/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/huey/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/hugo/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/index.mjs
delete mode 100644 sites/org/pages/account/patterns/jaeger/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/jane/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/lily/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/lucy/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/lumina/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/lumira/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/lunetius/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/noble/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/octoplushy/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/onyx/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/opal/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/otis/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/paco/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/penelope/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/sandy/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/shelly/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/shin/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/simon/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/simone/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/skully/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/sven/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/tamiko/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/teagan/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/tiberius/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/titan/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/trayvon/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/tristan/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/uma/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/umbra/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/wahid/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/walburga/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/waralee/edit.mjs
delete mode 100644 sites/org/pages/account/patterns/yuri/edit.mjs
delete mode 100644 sites/org/pages/account/privacy.mjs
delete mode 100644 sites/org/pages/account/reload.mjs
delete mode 100644 sites/org/pages/account/remove.mjs
delete mode 100644 sites/org/pages/account/restrict.mjs
delete mode 100644 sites/org/pages/account/set.mjs
delete mode 100644 sites/org/pages/account/sets.mjs
delete mode 100644 sites/org/pages/account/units.mjs
delete mode 100644 sites/org/pages/account/username.mjs
delete mode 100644 sites/org/pages/admin/cset.mjs
delete mode 100644 sites/org/pages/admin/csets.mjs
delete mode 100644 sites/org/pages/admin/index.mjs
delete mode 100644 sites/org/pages/admin/subscribers.mjs
delete mode 100644 sites/org/pages/admin/user.mjs
delete mode 100644 sites/org/pages/apikeys.mjs
delete mode 100644 sites/org/pages/blog/[dir].mjs
delete mode 100644 sites/org/pages/blog/index.mjs
delete mode 100644 sites/org/pages/community/index.mjs
delete mode 100644 sites/org/pages/confirm/emailchange.mjs
delete mode 100644 sites/org/pages/confirm/signin.mjs
delete mode 100644 sites/org/pages/confirm/signup-aea.mjs
delete mode 100644 sites/org/pages/confirm/signup.mjs
delete mode 100644 sites/org/pages/curate/index.mjs
delete mode 100644 sites/org/pages/curate/set.mjs
delete mode 100644 sites/org/pages/curate/sets/[id].mjs
delete mode 100644 sites/org/pages/curate/sets/index.mjs
delete mode 100644 sites/org/pages/curate/sets/suggested/[id].mjs
delete mode 100644 sites/org/pages/curated-set.mjs
delete mode 100644 sites/org/pages/curated-sets/[id].mjs
delete mode 100644 sites/org/pages/curated-sets/index.mjs
delete mode 100644 sites/org/pages/designs/[design].mjs
delete mode 100644 sites/org/pages/designs/index.mjs
delete mode 100644 sites/org/pages/docs/[...slug].mjs
delete mode 100644 sites/org/pages/docs/index.mjs
delete mode 100644 sites/org/pages/donate/index.mjs
delete mode 100644 sites/org/pages/donate/thanks.mjs
delete mode 100644 sites/org/pages/id.mjs
delete mode 100644 sites/org/pages/index.mjs
delete mode 100644 sites/org/pages/migrate.mjs
delete mode 100644 sites/org/pages/new/aaron.mjs
delete mode 100644 sites/org/pages/new/albert.mjs
delete mode 100644 sites/org/pages/new/apikey.mjs
delete mode 100644 sites/org/pages/new/bee.mjs
delete mode 100644 sites/org/pages/new/bella.mjs
delete mode 100644 sites/org/pages/new/benjamin.mjs
delete mode 100644 sites/org/pages/new/bent.mjs
delete mode 100644 sites/org/pages/new/bibi.mjs
delete mode 100644 sites/org/pages/new/blog.mjs
delete mode 100644 sites/org/pages/new/bob.mjs
delete mode 100644 sites/org/pages/new/bookmark.mjs
delete mode 100644 sites/org/pages/new/breanna.mjs
delete mode 100644 sites/org/pages/new/brian.mjs
delete mode 100644 sites/org/pages/new/bruce.mjs
delete mode 100644 sites/org/pages/new/carlita.mjs
delete mode 100644 sites/org/pages/new/carlton.mjs
delete mode 100644 sites/org/pages/new/cathrin.mjs
delete mode 100644 sites/org/pages/new/charlie.mjs
delete mode 100644 sites/org/pages/new/cornelius.mjs
delete mode 100644 sites/org/pages/new/cset.mjs
delete mode 100644 sites/org/pages/new/diana.mjs
delete mode 100644 sites/org/pages/new/florence.mjs
delete mode 100644 sites/org/pages/new/florent.mjs
delete mode 100644 sites/org/pages/new/gozer.mjs
delete mode 100644 sites/org/pages/new/hi.mjs
delete mode 100644 sites/org/pages/new/holmes.mjs
delete mode 100644 sites/org/pages/new/hortensia.mjs
delete mode 100644 sites/org/pages/new/huey.mjs
delete mode 100644 sites/org/pages/new/hugo.mjs
delete mode 100644 sites/org/pages/new/img.mjs
delete mode 100644 sites/org/pages/new/index.mjs
delete mode 100644 sites/org/pages/new/jaeger.mjs
delete mode 100644 sites/org/pages/new/jane.mjs
delete mode 100644 sites/org/pages/new/lily.mjs
delete mode 100644 sites/org/pages/new/lucy.mjs
delete mode 100644 sites/org/pages/new/lumina.mjs
delete mode 100644 sites/org/pages/new/lumira.mjs
delete mode 100644 sites/org/pages/new/lunetius.mjs
delete mode 100644 sites/org/pages/new/noble.mjs
delete mode 100644 sites/org/pages/new/octoplushy.mjs
delete mode 100644 sites/org/pages/new/onyx.mjs
delete mode 100644 sites/org/pages/new/opack.mjs
delete mode 100644 sites/org/pages/new/opal.mjs
delete mode 100644 sites/org/pages/new/otis.mjs
delete mode 100644 sites/org/pages/new/paco.mjs
delete mode 100644 sites/org/pages/new/pattern.mjs
delete mode 100644 sites/org/pages/new/penelope.mjs
delete mode 100644 sites/org/pages/new/sandy.mjs
delete mode 100644 sites/org/pages/new/set.mjs
delete mode 100644 sites/org/pages/new/shelly.mjs
delete mode 100644 sites/org/pages/new/shin.mjs
delete mode 100644 sites/org/pages/new/showcase.mjs
delete mode 100644 sites/org/pages/new/simon.mjs
delete mode 100644 sites/org/pages/new/simone.mjs
delete mode 100644 sites/org/pages/new/skully.mjs
delete mode 100644 sites/org/pages/new/sven.mjs
delete mode 100644 sites/org/pages/new/tamiko.mjs
delete mode 100644 sites/org/pages/new/teagan.mjs
delete mode 100644 sites/org/pages/new/tiberius.mjs
delete mode 100644 sites/org/pages/new/titan.mjs
delete mode 100644 sites/org/pages/new/trayvon.mjs
delete mode 100644 sites/org/pages/new/tristan.mjs
delete mode 100644 sites/org/pages/new/uma.mjs
delete mode 100644 sites/org/pages/new/umbra.mjs
delete mode 100644 sites/org/pages/new/wahid.mjs
delete mode 100644 sites/org/pages/new/walburga.mjs
delete mode 100644 sites/org/pages/new/waralee.mjs
delete mode 100644 sites/org/pages/new/yuri.mjs
delete mode 100644 sites/org/pages/newsletter/[dir].mjs
delete mode 100644 sites/org/pages/newsletter/index.mjs
delete mode 100644 sites/org/pages/newsletter/subscribe.mjs
delete mode 100644 sites/org/pages/newsletter/unsubscribe.mjs
delete mode 100644 sites/org/pages/patrons/index.mjs
delete mode 100644 sites/org/pages/patrons/join.mjs
delete mode 100644 sites/org/pages/patrons/thanks.mjs
delete mode 100644 sites/org/pages/pattern.mjs
delete mode 100644 sites/org/pages/profile.mjs
delete mode 100644 sites/org/pages/search.mjs
delete mode 100644 sites/org/pages/set.mjs
delete mode 100644 sites/org/pages/sets/[id].mjs
delete mode 100644 sites/org/pages/showcase/[dir].mjs
delete mode 100644 sites/org/pages/showcase/index.mjs
delete mode 100644 sites/org/pages/signin/callback/[provider].mjs
delete mode 100644 sites/org/pages/signin/index.mjs
delete mode 100644 sites/org/pages/signup/index.mjs
delete mode 100644 sites/org/pages/sitemap.mjs
delete mode 100644 sites/org/pages/stats.mjs
delete mode 100644 sites/org/pages/support.mjs
delete mode 100644 sites/org/pages/translation/de.yaml
delete mode 100644 sites/org/pages/translation/en.yaml
delete mode 100644 sites/org/pages/translation/es.yaml
delete mode 100644 sites/org/pages/translation/fr.yaml
delete mode 100644 sites/org/pages/translation/index.mjs
delete mode 100644 sites/org/pages/translation/join.mjs
delete mode 100644 sites/org/pages/translation/nl.yaml
delete mode 100644 sites/org/pages/translation/suggest-language.mjs
delete mode 100644 sites/org/pages/translation/uk.yaml
delete mode 100644 sites/org/pages/typography.mjs
delete mode 100644 sites/org/pages/users/index.mjs
delete mode 100644 sites/org/pages/users/user.mjs
delete mode 100644 sites/org/pages/welcome/bio.mjs
delete mode 100644 sites/org/pages/welcome/compare.mjs
delete mode 100644 sites/org/pages/welcome/img.mjs
delete mode 100644 sites/org/pages/welcome/index.mjs
delete mode 100644 sites/org/pages/welcome/newsletter.mjs
delete mode 100644 sites/org/pages/welcome/units.mjs
delete mode 100644 sites/org/pages/welcome/username.mjs
delete mode 100644 sites/org/postcss.config.js
delete mode 100644 sites/org/prebuild.mjs
delete mode 100644 sites/org/prebuild/.gitkeep
delete mode 100644 sites/org/public/brands/algolia.svg
delete mode 100644 sites/org/public/brands/bugsnag.svg
delete mode 100644 sites/org/public/brands/crowdin.svg
delete mode 100644 sites/org/public/brands/netlify.svg
delete mode 100644 sites/org/public/brands/vercel.svg
delete mode 100644 sites/org/public/feeds/.gitkeep
delete mode 100644 sites/org/public/img/designs/aaron.png
delete mode 100644 sites/org/public/img/designs/albert.png
delete mode 100644 sites/org/public/img/designs/benjamin.png
delete mode 100644 sites/org/public/img/designs/bruce.png
delete mode 100644 sites/org/public/img/designs/cathrin.png
delete mode 100644 sites/org/public/img/designs/charlie.png
delete mode 100644 sites/org/public/img/designs/cornelius.png
delete mode 100644 sites/org/public/img/designs/diana.png
delete mode 100644 sites/org/public/img/designs/florence.png
delete mode 100644 sites/org/public/img/designs/florent.png
delete mode 100644 sites/org/public/img/designs/huey.png
delete mode 100644 sites/org/public/img/designs/hugo.png
delete mode 100644 sites/org/public/img/designs/jaeger.png
delete mode 100644 sites/org/public/img/designs/penelope.png
delete mode 100644 sites/org/public/img/designs/sandy.png
delete mode 100644 sites/org/public/img/designs/shin.png
delete mode 100644 sites/org/public/img/designs/simon.png
delete mode 100644 sites/org/public/img/designs/sven.png
delete mode 100644 sites/org/public/img/designs/tamiko.png
delete mode 100644 sites/org/public/img/designs/teagan.png
delete mode 100644 sites/org/public/img/designs/theo.png
delete mode 100644 sites/org/public/img/designs/titan.png
delete mode 100644 sites/org/public/img/designs/trayvon.png
delete mode 100644 sites/org/public/img/designs/ursula.png
delete mode 100644 sites/org/public/img/designs/wahid.png
delete mode 100644 sites/org/public/img/designs/waralee.png
delete mode 100644 sites/org/public/img/lineup-backdrop.svg
delete mode 100644 sites/org/public/img/og/.gitkeep
delete mode 100644 sites/org/public/support.jpg
rename sites/{orgdocs => org}/scripts/prebuild-step1.mjs (97%)
create mode 100644 sites/org/scripts/prebuild-step2.mjs
create mode 100644 sites/org/scripts/prebuild-step3.mjs
create mode 100644 sites/org/showcase-tags.mjs
rename sites/{orgdocs => org}/showcase/100percent-full-sandy-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/3d-skully/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-casual-test-of-noble/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-charming-small-lucy-by-moderndragon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-delightfully-drapey-teagan-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-dinosaur-themed-aaron-with-some-customizations/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-fantastic-outfit-featuring-teagan-simon-and-cornelius/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-flat-fronted-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-full-body-onyx-swimsuit-with-swim-skirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-handsome-simon-by-ogredandy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-jaeger-and-charlie-set/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-jersey-huey-hoodie/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-lined-tristan-top-with-front-lacing/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-lovely-lucy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-lovely-reversible-tristan-top-by-paula/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-mini-hi-with-embroidered-eyes/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-mock-up-of-titan-with-the-fit-to-knee-option-enabled/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-modified-holmes/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-noble-top-for-the-renaissance-festival/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-short-sleeved-simon-by-carcface/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-short-sleeved-simon-with-bonus-charlie-and-florent/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-shortened-penelope/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-simone-sandy-mashup-with-a-handkerchief-hem-by-rockerkitten/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-squid-friend-for-octopus/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-sturdy-albert-apron-by-ojensen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-tamiko-top/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-tiny-albert-apron/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-top-based-on-sven-with-the-hood-of-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-very-modified-yuri/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-warm-weather-pair-of-waralees/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/a-wearable-sandy-muslin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aaron-a-shirt-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aaron-a-shirt-by-pecatrix/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aaron-by-joost/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aaron-dress-by-ts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aaron-on-a-not-me-sized-dress-form-by-braveness23/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/airline-blanket-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/albert-apron-by-brady376/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/albert-apron-by-links147/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/albert-apron-by-saber007s-son/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/albert-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/an-aaron-undershirt-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/an-early-bee-bikini-top/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/an-early-uma/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/an-initial-sample-of-aaron-for-comixminxs-kid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/an-otter-ly-delightful-sven-sweatshirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/anneke-huey-black/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/anneke-huey-grey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/anneke-huey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/another-day-another-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/another-splendid-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aorion-diana/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/aorions-first-short-sleeve-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/audreyyy-teagan-titan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/baby-paco-pants/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/baby-sven-sweatshirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bee-by-ts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bee-teagan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bella-block/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bella-by-bumblebunch/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bella-by-deby/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bella-by-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bella-sandy-by-ts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/benjamin-by-anto/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/benjamin-by-rika/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/black-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/black-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bleach-dyed-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/blue-geometric-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/blue-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/blue-theo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/blue-wahid-by-bjeppson/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bob-bibs-by-duck/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bob3000-chore-coat/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bound-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brazenedminstrel-double-ws/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/breanna-dress-by-andrea-cretu/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brian-by-eric/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brian-by-stefan-1/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brian-by-stefan-2/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brian-by-stefan-3/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brian-by-stefan-4/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/brown-geometric-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-and-aaron-set-by-ogredandy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-boxer-briefs-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-by-bjeppson/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-by-clolimb/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-by-ferdi/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-by-victoria/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-by-william/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-on-doll/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-three-pack/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruce-with-a-flat-front-and-lengthened-legs/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bruces-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/bulbasaur-huey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/burgundy-florent/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-by-boris/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-by-charlotte/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-by-em/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-by-rudy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-by-sanulleh/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-coat-by-sewingdentist/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/carlton-coat/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/casual-pink-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-by-bob/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-by-joost-2/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-by-joost/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-by-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-florent-benjamin-by-elske/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-on-sorcha/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/charlie-shorts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/claire-does-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/colorful-hi-by-zag/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/comixminx-shins/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/corduroy-theo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/cornelius-by-atightshipwreck/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/cornelius-by-drew/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/cornelius-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/creos-bella-body-block-with-tweaks/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/danyuljohnson-wahid-benjamin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/diana-by-deby/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/doll-cathrin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/doll-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/doll-simone/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/doll-waralee-pants/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/drop-shoulder-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/duvet-trousers-ahoy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ellafay-simon-shirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/embroidered-opal-shortalls/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fantastic-four-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ferdis-first-simon-shirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fifi-simone/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fifis-paco-pjs/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fifis-second-simone/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fighter-hoodie/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/fintastic-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/first-version-dona-simone/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/flat-front-bruces/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/floral-aaron/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/floral-bruce-boxer-briefs-by-william/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/floral-camoflaged-charlie-chinos/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florence-jv/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florence/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-alberto/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-alexandre/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-elske/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-enno/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-michele/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-wim/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-cap-by-ferdi/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/florent-lined-with-lasermonkey12s-favorite-dr-seuss-book/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/flowery-hawaiian-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/formal-aaron/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/four-more-bruce-boxers-for-an-nb-kid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/four-versions-of-otis-and-a-bonus-bob/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/foxy-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/french-terry-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/gender-euphoric-bruces/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/green-cathrin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/green-charlie-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/green-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/grey-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/guin-gingham-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hand-sewn-test-of-florence/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hand-stitched-teagans-by-vili-with-explanation-of-the-stitches/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hellgys-hugo-hoodie/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hi-by-amelie/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hi-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hi-by-halbmoki/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hi-by-nisaea/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hi-the-shark-has-our-hearts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/high-vis-yuri/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hortensia-by-saber/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hortensia-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/houseoflief-lucy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/huey-by-hellgy-dinosaurs/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/huey-by-minty/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/huey-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-by-alan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-by-hellgy-shuttlecock/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-by-karin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-by-lainey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-saul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-teagan-mashup/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/hugo-with-cats/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/husband-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/jaeger-by-roberta/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/johnnygaijins-simon-shirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/joosts-most-recent-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/just-another-simon-shirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/just-peachy-shin-bee/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lasermonkeys-modded-bruces/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/latex-ursulas/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/liberty-trayvon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lightweight-waralees-for-summer/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/linnen-jaeger-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/linnen-theo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lower-rise-ursula/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lucy-by-xhex/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lumira-leggings-with-cycling-chamois/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lunetius-the-lacerna/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/lunetius-walburga-tiberius-ensemble/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/magicantace-breanna-sandy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/mark-wears-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/matching-florents/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/matching-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/meet-octoplushy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/meine-erste-badehose/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/mermaid-scale-print-waralees-by-magicantace/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/microhi/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/mini-shin-swim-trunks/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/modified-tamiko-nursing-cover/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/more-shin-swim-shorts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/more-wahid-by-adam/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/my-fisrt-sewing-project/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/nani-hugo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/no-waistband-cornelius-cycling-breeches/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/noble-based-evening-gown-with-sweetheart-neckline/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/nsfw-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/octopus-variant-octoplushy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/onyx-by-thrunic/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/onyx-full-body-unisuit/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/outfit-wahid-theo-florent-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/outfit-wahid-theo-simon-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/packer-pocket-bruce-by-nael-with-mini-tutorial/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/paco-by-joost/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/paco-by-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/paco-by-stefan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/paco-pj-shorts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/pirate-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/pregnant-lady-penelope/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/printed-charlies-by-william/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/purple-bruce/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/purple-huey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/pyjama-paco-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/quentin-carlita/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/quilted-jersey-huey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ramoth-cathrin-corset/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ramoth-short-sleeve-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ramoth-simon-flannel/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/red-button-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/red-theo/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/redblaquegolden-simon-sandy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/reversible-wahid-waistcoat-for-toddler/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ricos-huey/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ricos-sven/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/rockerkittens-simone-muslin-with-a-few-modifications/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/rostic-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/rowan-reversible-florence/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/rowans-leaf-print-florence/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sample-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sandy-by-adam/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sandy-by-anneke/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sandy-by-jv/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sandy-by-karin/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sandy-by-sunshine/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/scifaeries-simon-shirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sebastiansew-paco-2/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sebastiansew-paco/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/short-sleeve-shelly-rash-guard/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/short-sleeve-short-leg-onyx-swimsuit/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/shorts/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-as-overshirt/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-alan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-anna/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-deby/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-julian/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-lasermonkey12-feat-hand-sewn-buttonholes/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-mick/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-ramoth/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-sewandrew/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-by-stefan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-for-schorsch/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-on-snook/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-shirt-by-sewingdentist/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-shirt-by-solstice/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simon-white-stripe/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simone-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/simone-by-jackseye/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sleeveless-simon-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/small-calico-skully-and-a-bit-of-a-pattern-test-too/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/speckles-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sterling42-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/stripey-teagan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/suit/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/surprise-giant-hi-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sven-nr1/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sven-nr2/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/sven-nr3/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/tamiko-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/tartan-fu-mask/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/teagan-by-daryl/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/teagan-by-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/teagan-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/teagans-for-swimming/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/the-bella-block-by-rockerkitten/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/theo-by-theodore/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/theo-jeroen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/tiberius-the-tunica/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/tight-aaron/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/titan-by-deby/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/trampoline-punk-a-punk-suit-made-from-a-trampoline-using-the-jaeger-jacket-and-charlie-chinos-patterns/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/trans-hi-by-halbmoki/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/trayvon-tie-by-aneconradie/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/trayvon-tie-square/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/two-bruce-boxer-briefs/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/two-non-binary-hi/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/two-short-sleeved-simons-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/two-tone-teagan/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursula-and-bee/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursula-by-karen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursula-by-starf/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursula-test-pairs/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursula-undies-by-cakeymcdoodle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/ursulas-with-lace/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-by-adam/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-by-minty/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-by-ogredandy/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-by-pho/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-grey-windowpane/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-jeroen/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-kaena/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wahid-waistcoat-by-womp/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/walburga-the-wappenrock/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralee-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralee-shorts-by-space/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralee-with-pocket-by-nael/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralee-wrap-pants-by-wouter/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralees-by-gaelle/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/waralees-by-moderndragon-featuring-a-fancy-seam-finish/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/watermelon-charlie-chinos/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/who-can-resist-a-cuddly-shark-named-hi/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wonder-warrior-jacket/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wonder-woman-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/wonderful-waralees-by-tuesday/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/woolen-wahid/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/xl-octoplushy-by-lasermonkey12/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/yellow-button-simon/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/yoga-set-by-paul/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/yuri-by-its-designer/index.mdx (100%)
rename sites/{orgdocs => org}/showcase/zees-lunetius-lacerna/index.mdx (100%)
create mode 100644 sites/org/sidebars.js
delete mode 100644 sites/org/site.config.mjs
mode change 100755 => 100644 sites/org/skip_build.mjs
create mode 100644 sites/org/src/components/DesignExamples.mjs
create mode 100644 sites/org/src/components/bare-layout.mjs
create mode 100644 sites/org/src/css/code.css
create mode 100644 sites/org/src/css/custom.css
create mode 100644 sites/org/src/css/patterns.css
create mode 100644 sites/org/src/lib/designinfo.mjs
create mode 100644 sites/org/src/lib/designs.mjs
create mode 100644 sites/org/src/lib/i18n.mjs
rename sites/{orgdocs => org}/src/lib/plugins.mjs (100%)
create mode 100644 sites/org/src/lib/utils.mjs
create mode 100644 sites/org/src/pages/confirm/emailchange.js
create mode 100644 sites/org/src/pages/confirm/signin.js
create mode 100644 sites/org/src/pages/confirm/signup.js
create mode 100644 sites/org/src/pages/editor.js
create mode 100644 sites/org/src/pages/index.js
create mode 100644 sites/org/src/pages/oidc-flow/index.js
create mode 100644 sites/org/src/pages/signin/index.js
create mode 100644 sites/org/src/pages/signup/index.js
create mode 100644 sites/org/src/pages/typography.js
create mode 100644 sites/org/src/pages/welcome/bio.js
create mode 100644 sites/org/src/pages/welcome/compare.js
create mode 100644 sites/org/src/pages/welcome/img.js
create mode 100644 sites/org/src/pages/welcome/index.js
create mode 100644 sites/org/src/pages/welcome/newsletter.js
create mode 100644 sites/org/src/pages/welcome/units.js
create mode 100644 sites/org/src/pages/welcome/username.js
create mode 100644 sites/org/src/theme/BlogPostItem/index.js
create mode 100644 sites/org/src/theme/BlogPostItems/index.js
create mode 100644 sites/org/src/theme/MDXComponents/A.js
create mode 100644 sites/org/src/theme/MDXComponents/Code.js
create mode 100644 sites/org/src/theme/MDXComponents/Details.js
create mode 100644 sites/org/src/theme/MDXComponents/Heading.js
create mode 100644 sites/org/src/theme/MDXComponents/Img/index.js
create mode 100644 sites/org/src/theme/MDXComponents/Img/styles.module.css
create mode 100644 sites/org/src/theme/MDXComponents/Li.js
create mode 100644 sites/org/src/theme/MDXComponents/Pre.js
create mode 100644 sites/org/src/theme/MDXComponents/Ul/index.js
create mode 100644 sites/org/src/theme/MDXComponents/Ul/styles.module.css
rename sites/{orgdocs => org}/src/theme/MDXComponents/design-info.mjs (99%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/example.mjs (89%)
create mode 100644 sites/org/src/theme/MDXComponents/index.js
create mode 100644 sites/org/src/theme/MDXComponents/legend.mjs
rename sites/{orgdocs => org}/src/theme/MDXComponents/measurement-image.mjs (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/acrossback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/ankle.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/biceps.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/bustfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/bustpointtounderbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/bustspan.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/chest.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/crossseam.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/crossseamfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/crotchdepth.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/head.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/heel.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/highbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/highbustfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/hips.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/hipstoupperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/hpstobust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/hpstowaistback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/hpstowaistfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/index.mjs (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/inseam.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/knee.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/neck.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/seat.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/seatback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/shoulderslope.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/shouldertoelbow.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/shouldertoshoulder.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/shouldertowrist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/underbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/upperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waistback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttoarmpit.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttofloor.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttohips.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttoknee.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttoseat.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttounderbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/waisttoupperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/sarah/wrist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/acrossback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/ankle.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/biceps.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/bustfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/bustpointtounderbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/bustspan.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/chest.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/crossseam.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/crossseamfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/crotchdepth.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/head.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/heel.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/highbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/highbustfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/hips.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/hipstoupperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/hpstobust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/hpstowaistback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/hpstowaistfront.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/index.mjs (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/inseam.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/knee.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/neck.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/seat.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/seatback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/shoulderslope.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/shouldertoelbow.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/shouldertoshoulder.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/shouldertowrist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/underbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/upperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waistback.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttoarmpit.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttofloor.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttohips.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttoknee.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttoseat.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttounderbust.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/waisttoupperleg.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/tim/wrist.svg (100%)
rename sites/{orgdocs => org}/src/theme/MDXComponents/youtube.mjs (100%)
create mode 100644 sites/org/src/theme/NavbarItem/ComponentTypes.js
rename sites/{orgdocs => org}/static/.nojekyll (100%)
rename sites/{shared/favicon => org/static}/favicon.ico (100%)
create mode 100644 sites/org/static/img/favicon.ico
create mode 100644 sites/org/static/img/freesewing-social-card.png
create mode 100644 sites/org/static/img/lineup-backdrop.svg
create mode 100644 sites/org/static/img/logo-white.svg
create mode 100644 sites/org/static/img/logo.svg
rename sites/org/{public => static}/img/models/model-0.png (100%)
rename sites/org/{public => static}/img/models/model-1.png (100%)
rename sites/org/{public => static}/img/models/model-2.png (100%)
rename sites/org/{public => static}/img/models/model-3.png (100%)
rename sites/org/{public => static}/img/models/model-4.png (100%)
rename sites/org/{public => static}/img/models/model-5.png (100%)
rename sites/org/{public => static}/img/models/model-6.png (100%)
rename sites/org/{public => static}/img/models/model-7.png (100%)
rename sites/org/{public => static}/img/sarah-seated.jpg (100%)
rename sites/org/{public => static}/img/sarah-standing.jpg (100%)
rename sites/org/{public => static}/img/tim-seated.jpg (100%)
rename sites/org/{public => static}/img/tim-standing.jpg (100%)
rename sites/{orgdocs => org}/static/img/undraw_docusaurus_mountain.svg (100%)
rename sites/{orgdocs => org}/static/img/undraw_docusaurus_react.svg (100%)
rename sites/{orgdocs => org}/static/img/undraw_docusaurus_tree.svg (100%)
create mode 100644 sites/org/tailwind-force.html
create mode 100644 sites/org/themes/dark.mjs
create mode 100644 sites/org/themes/index.mjs
create mode 100644 sites/org/themes/light.mjs
delete mode 100644 sites/org/utils.mjs
delete mode 100644 sites/org/vercel.json
delete mode 100644 sites/orgdocs/babel.config.js
delete mode 100644 sites/orgdocs/blog/announcing-v2/index.mdx
delete mode 100644 sites/orgdocs/blog/breanna-measurements-sizes-in-2-2/index.mdx
delete mode 100644 sites/orgdocs/blog/freesewing-v3-1/index.mdx
delete mode 100644 sites/orgdocs/blog/welcome-to-freesewining-3/index.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/email-trouble/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/measurements-issues/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/newsletter/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/newsletter/why-subscribe-multiple-clicks/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/newsletter/why-unsubscribe-multiple-clicks/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/printing-issues/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/seam-allowance/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/standard-measurements/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/faq/tapering-seams/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/notation/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/pledge/motivation/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/pledge/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/privacy/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/rights/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/site/draft/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/site/readme.mdx
delete mode 100644 sites/orgdocs/docs/about/terms/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/armholedrop/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/backlinebend/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/chestease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/draftforhighbust/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/hipsease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/legacyarmholedepth/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/lengthbonus/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/necklinebend/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/necklinedrop/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/shoulderstrapplacement/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/shoulderstrapwidth/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/options/stretchfactor/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/aaron/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/albert/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bee/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bella/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/benjamin/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bent/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bibi/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bob/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/breanna/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/instructions/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/acrossbackfactor/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/armholedepth/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/armholedepthfactor/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/backneckcutout/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/bicepsease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/chestease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/collarease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/cuffease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/draftforhighbust/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/frontarmholedeeper/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/legacyarmholedepth/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/lengthbonus/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/s3armhole/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/s3collar/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/shoulderease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/shoulderslopereduction/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapbackfactorx/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapbackfactory/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapease/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapfrontfactorx/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapfrontfactory/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq1offset/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq1spread1/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq1spread2/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq2offset/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq2spread1/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq2spread2/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq3offset/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq3spread1/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq3spread2/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq4offset/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq4spread1/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecapq4spread2/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecaptopfactorx/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevecaptopfactory/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevelengthbonus/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/options/sleevewidthguarantee/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/brian/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/bruce/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/carlita/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/carlton/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/cathrin/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/charlie/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/cornelius/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/cornelius/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/diana/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/florence/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/florent/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/gozer/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/hi/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/hi/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/holmes/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/hortensia/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/hortensia/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/huey/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/hugo/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/jaeger/instructions/collarCuts.svg
delete mode 100644 sites/orgdocs/docs/designs/jaeger/instructions/collarMarkings.svg
delete mode 100644 sites/orgdocs/docs/designs/jaeger/instructions/collarWithCanvas.svg
delete mode 100644 sites/orgdocs/docs/designs/jaeger/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/jane/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lily/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lucy/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lumina/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lumina/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lumira/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lumira/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/lunetius/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/noble/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/noble/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/octoplushy/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/octoplushy/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/onyx/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/opal/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/otis/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/otis/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/paco/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/penelope/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/penelope/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/sandy/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/shelly/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/shin/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/simon/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/simone/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/skully/options/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/skully/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/sven/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/tamiko/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/teagan/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/tiberius/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/titan/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/trayvon/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/tristan/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/uma/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/umbra/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/wahid/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/walburga/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/waralee/readme.mdx
delete mode 100644 sites/orgdocs/docs/designs/yuri/readme.mdx
delete mode 100644 sites/orgdocs/docs/measurements/readme.mdx
delete mode 100644 sites/orgdocs/docs/sewing/on-the-fold/readme.mdx
delete mode 100644 sites/orgdocs/docs/sewing/readme.mdx
delete mode 100644 sites/orgdocs/docusaurus.config.mjs
delete mode 100644 sites/orgdocs/package.json
delete mode 100644 sites/orgdocs/scripts/prebuild-step2.mjs
delete mode 100644 sites/orgdocs/scripts/prebuild-step3.mjs
delete mode 100644 sites/orgdocs/sidebars.js
delete mode 100644 sites/orgdocs/skip_build.mjs
delete mode 100644 sites/orgdocs/src/components/doc-list.js
delete mode 100644 sites/orgdocs/src/components/todo.mjs
delete mode 100644 sites/orgdocs/src/css/custom.css
delete mode 100644 sites/orgdocs/src/css/patterns.css
delete mode 100644 sites/orgdocs/src/lib/utils.mjs
delete mode 100644 sites/orgdocs/src/pages/_new-design.md
delete mode 100644 sites/orgdocs/src/pages/_setup-monorepo.md
delete mode 100644 sites/orgdocs/src/pages/account/index.md
delete mode 100644 sites/orgdocs/src/pages/designs/aaron.md
delete mode 100644 sites/orgdocs/src/pages/designs/albert.md
delete mode 100644 sites/orgdocs/src/pages/designs/bee.md
delete mode 100644 sites/orgdocs/src/pages/designs/bella.md
delete mode 100644 sites/orgdocs/src/pages/designs/benjamin.md
delete mode 100644 sites/orgdocs/src/pages/designs/bent.md
delete mode 100644 sites/orgdocs/src/pages/designs/bibi.md
delete mode 100644 sites/orgdocs/src/pages/designs/bob.md
delete mode 100644 sites/orgdocs/src/pages/designs/breanna.md
delete mode 100644 sites/orgdocs/src/pages/designs/brian.md
delete mode 100644 sites/orgdocs/src/pages/designs/bruce.md
delete mode 100644 sites/orgdocs/src/pages/designs/carlita.md
delete mode 100644 sites/orgdocs/src/pages/designs/carlton.md
delete mode 100644 sites/orgdocs/src/pages/designs/cathrin.md
delete mode 100644 sites/orgdocs/src/pages/designs/charlie.md
delete mode 100644 sites/orgdocs/src/pages/designs/cornelius.md
delete mode 100644 sites/orgdocs/src/pages/designs/diana.md
delete mode 100644 sites/orgdocs/src/pages/designs/florence.md
delete mode 100644 sites/orgdocs/src/pages/designs/florent.md
delete mode 100644 sites/orgdocs/src/pages/designs/gozer.md
delete mode 100644 sites/orgdocs/src/pages/designs/hi.md
delete mode 100644 sites/orgdocs/src/pages/designs/holmes.md
delete mode 100644 sites/orgdocs/src/pages/designs/hortensia.md
delete mode 100644 sites/orgdocs/src/pages/designs/huey.md
delete mode 100644 sites/orgdocs/src/pages/designs/hugo.md
delete mode 100644 sites/orgdocs/src/pages/designs/index.md
delete mode 100644 sites/orgdocs/src/pages/designs/jaeger.md
delete mode 100644 sites/orgdocs/src/pages/designs/jane.md
delete mode 100644 sites/orgdocs/src/pages/designs/lily.md
delete mode 100644 sites/orgdocs/src/pages/designs/lucy.md
delete mode 100644 sites/orgdocs/src/pages/designs/lumina.md
delete mode 100644 sites/orgdocs/src/pages/designs/lumira.md
delete mode 100644 sites/orgdocs/src/pages/designs/lunetius.md
delete mode 100644 sites/orgdocs/src/pages/designs/noble.md
delete mode 100644 sites/orgdocs/src/pages/designs/octoplushy.md
delete mode 100644 sites/orgdocs/src/pages/designs/onyx.md
delete mode 100644 sites/orgdocs/src/pages/designs/opal.md
delete mode 100644 sites/orgdocs/src/pages/designs/otis.md
delete mode 100644 sites/orgdocs/src/pages/designs/paco.md
delete mode 100644 sites/orgdocs/src/pages/designs/penelope.md
delete mode 100644 sites/orgdocs/src/pages/designs/sandy.md
delete mode 100644 sites/orgdocs/src/pages/designs/shelly.md
delete mode 100644 sites/orgdocs/src/pages/designs/shin.md
delete mode 100644 sites/orgdocs/src/pages/designs/simon.md
delete mode 100644 sites/orgdocs/src/pages/designs/simone.md
delete mode 100644 sites/orgdocs/src/pages/designs/skully.md
delete mode 100644 sites/orgdocs/src/pages/designs/sven.md
delete mode 100644 sites/orgdocs/src/pages/designs/tamiko.md
delete mode 100644 sites/orgdocs/src/pages/designs/teagan.md
delete mode 100644 sites/orgdocs/src/pages/designs/tiberius.md
delete mode 100644 sites/orgdocs/src/pages/designs/titan.md
delete mode 100644 sites/orgdocs/src/pages/designs/trayvon.md
delete mode 100644 sites/orgdocs/src/pages/designs/tristan.md
delete mode 100644 sites/orgdocs/src/pages/designs/uma.md
delete mode 100644 sites/orgdocs/src/pages/designs/umbra.md
delete mode 100644 sites/orgdocs/src/pages/designs/wahid.md
delete mode 100644 sites/orgdocs/src/pages/designs/walburga.md
delete mode 100644 sites/orgdocs/src/pages/designs/waralee.md
delete mode 100644 sites/orgdocs/src/pages/designs/yuri.md
delete mode 100644 sites/orgdocs/src/pages/docs.js
delete mode 100644 sites/orgdocs/src/pages/editor/index.md
delete mode 100644 sites/orgdocs/src/pages/id.md
delete mode 100644 sites/orgdocs/src/pages/index.js
delete mode 100644 sites/orgdocs/src/pages/new/index.md
delete mode 100644 sites/orgdocs/src/pages/new/showcase.md
delete mode 100644 sites/orgdocs/src/pages/patrons/index.md
delete mode 100644 sites/orgdocs/src/pages/patrons/join.md
delete mode 100644 sites/orgdocs/src/pages/profile.md
delete mode 100644 sites/orgdocs/src/pages/share.md
delete mode 100644 sites/orgdocs/src/pages/support.md
delete mode 100644 sites/orgdocs/src/pages/users/user.md
delete mode 100644 sites/orgdocs/src/pages/welcome.md
delete mode 100644 sites/orgdocs/src/theme/BlogPostItem/index.js
delete mode 100644 sites/orgdocs/src/theme/BlogPostItems/index.js
delete mode 100644 sites/orgdocs/src/theme/MDXComponents/index.js
delete mode 100644 sites/orgdocs/src/theme/MDXComponents/legend.mjs
delete mode 100644 sites/orgdocs/src/theme/MDXComponents/readmore.js
delete mode 100644 sites/orgdocs/static/img/sarah-seated.jpg
delete mode 100644 sites/orgdocs/static/img/sarah-standing.jpg
delete mode 100644 sites/orgdocs/static/img/tim-seated.jpg
delete mode 100644 sites/orgdocs/static/img/tim-standing.jpg
delete mode 100644 sites/orgdocs/tailwind.config.mjs
delete mode 100644 sites/orgdocs/themes/dark.mjs
delete mode 100644 sites/orgdocs/themes/index.mjs
delete mode 100644 sites/orgdocs/themes/light.mjs
delete mode 100644 sites/sde/README.md
delete mode 100644 sites/sde/components/design-examples.mjs
delete mode 100644 sites/sde/components/dynamic-org-docs.mjs
delete mode 100644 sites/sde/components/feeds.mjs
delete mode 100644 sites/sde/components/header/design-picker.mjs
delete mode 100644 sites/sde/components/header/index.mjs
delete mode 100644 sites/sde/components/layouts/bare.mjs
delete mode 100644 sites/sde/components/layouts/default.mjs
delete mode 100644 sites/sde/components/layouts/workbench.mjs
delete mode 100644 sites/sde/components/navigation/modal-menu.mjs
delete mode 100644 sites/sde/components/search.mjs
delete mode 100644 sites/sde/components/wrappers/page.mjs
delete mode 100644 sites/sde/design/from-bella/en.json
delete mode 100644 sites/sde/design/from-bella/i18n/de.json
delete mode 100644 sites/sde/design/from-bella/i18n/en.json
delete mode 100644 sites/sde/design/from-bella/i18n/es.json
delete mode 100644 sites/sde/design/from-bella/i18n/fr.json
delete mode 100644 sites/sde/design/from-bella/i18n/index.mjs
delete mode 100644 sites/sde/design/from-bella/i18n/nl.json
delete mode 100644 sites/sde/design/from-bella/i18n/uk.json
delete mode 100644 sites/sde/design/from-bella/src/back.mjs
delete mode 100644 sites/sde/design/from-bella/src/front.mjs
delete mode 100644 sites/sde/design/from-bella/src/index.mjs
delete mode 100644 sites/sde/design/from-bent/i18n/de.json
delete mode 100644 sites/sde/design/from-bent/i18n/en.json
delete mode 100644 sites/sde/design/from-bent/i18n/es.json
delete mode 100644 sites/sde/design/from-bent/i18n/fr.json
delete mode 100644 sites/sde/design/from-bent/i18n/index.mjs
delete mode 100644 sites/sde/design/from-bent/i18n/nl.json
delete mode 100644 sites/sde/design/from-bent/i18n/uk.json
delete mode 100644 sites/sde/design/from-bent/src/back.mjs
delete mode 100644 sites/sde/design/from-bent/src/front.mjs
delete mode 100644 sites/sde/design/from-bent/src/index.mjs
delete mode 100644 sites/sde/design/from-bent/src/top-sleeve.mjs
delete mode 100644 sites/sde/design/from-bent/src/under-sleeve.mjs
delete mode 100644 sites/sde/design/from-breanna/i18n/de.json
delete mode 100644 sites/sde/design/from-breanna/i18n/en.json
delete mode 100644 sites/sde/design/from-breanna/i18n/es.json
delete mode 100644 sites/sde/design/from-breanna/i18n/fr.json
delete mode 100644 sites/sde/design/from-breanna/i18n/index.mjs
delete mode 100644 sites/sde/design/from-breanna/i18n/nl.json
delete mode 100644 sites/sde/design/from-breanna/i18n/uk.json
delete mode 100644 sites/sde/design/from-breanna/src/back.mjs
delete mode 100644 sites/sde/design/from-breanna/src/front.mjs
delete mode 100644 sites/sde/design/from-breanna/src/index.mjs
delete mode 100644 sites/sde/design/from-breanna/src/sleeve.mjs
delete mode 100644 sites/sde/design/from-brian/i18n/de.json
delete mode 100644 sites/sde/design/from-brian/i18n/en.json
delete mode 100644 sites/sde/design/from-brian/i18n/es.json
delete mode 100644 sites/sde/design/from-brian/i18n/fr.json
delete mode 100644 sites/sde/design/from-brian/i18n/index.mjs
delete mode 100644 sites/sde/design/from-brian/i18n/nl.json
delete mode 100644 sites/sde/design/from-brian/i18n/uk.json
delete mode 100644 sites/sde/design/from-brian/src/back.mjs
delete mode 100644 sites/sde/design/from-brian/src/front.mjs
delete mode 100644 sites/sde/design/from-brian/src/index.mjs
delete mode 100644 sites/sde/design/from-brian/src/sleeve.mjs
delete mode 100644 sites/sde/design/from-scratch/i18n/de.json
delete mode 100644 sites/sde/design/from-scratch/i18n/en.json
delete mode 100644 sites/sde/design/from-scratch/i18n/es.json
delete mode 100644 sites/sde/design/from-scratch/i18n/fr.json
delete mode 100644 sites/sde/design/from-scratch/i18n/index.mjs
delete mode 100644 sites/sde/design/from-scratch/i18n/nl.json
delete mode 100644 sites/sde/design/from-scratch/i18n/uk.json
delete mode 100644 sites/sde/design/from-scratch/src/bib.mjs
delete mode 100644 sites/sde/design/from-scratch/src/index.mjs
delete mode 100644 sites/sde/design/from-titan/i18n/de.json
delete mode 100644 sites/sde/design/from-titan/i18n/en.json
delete mode 100644 sites/sde/design/from-titan/i18n/es.json
delete mode 100644 sites/sde/design/from-titan/i18n/fr.json
delete mode 100644 sites/sde/design/from-titan/i18n/index.mjs
delete mode 100644 sites/sde/design/from-titan/i18n/nl.json
delete mode 100644 sites/sde/design/from-titan/i18n/uk.json
delete mode 100644 sites/sde/design/from-titan/src/back.mjs
delete mode 100644 sites/sde/design/from-titan/src/front.mjs
delete mode 100644 sites/sde/design/from-titan/src/index.mjs
delete mode 100644 sites/sde/design/tutorial/i18n/de.json
delete mode 100644 sites/sde/design/tutorial/i18n/en.json
delete mode 100644 sites/sde/design/tutorial/i18n/es.json
delete mode 100644 sites/sde/design/tutorial/i18n/fr.json
delete mode 100644 sites/sde/design/tutorial/i18n/index.mjs
delete mode 100644 sites/sde/design/tutorial/i18n/nl.json
delete mode 100644 sites/sde/design/tutorial/i18n/uk.json
delete mode 100644 sites/sde/design/tutorial/src/bib.mjs
delete mode 100644 sites/sde/design/tutorial/src/index.mjs
delete mode 100644 sites/sde/env.local
delete mode 100644 sites/sde/hooks/use-design.mjs
delete mode 100644 sites/sde/i18n.config.mjs
delete mode 100644 sites/sde/mock/designs.mjs
delete mode 100644 sites/sde/mock/docs-helpers.mjs
delete mode 100644 sites/sde/mock/highlight.mjs
delete mode 100644 sites/sde/mock/http.mjs
delete mode 100644 sites/sde/mock/info.mjs
delete mode 100644 sites/sde/mock/legend.mjs
delete mode 100644 sites/sde/mock/linedrawings.mjs
delete mode 100644 sites/sde/mock/read-more.mjs
delete mode 100644 sites/sde/mock/tabbed-example.mjs
delete mode 100644 sites/sde/mock/youtube.mjs
delete mode 100644 sites/sde/next-i18next.config.js
delete mode 100644 sites/sde/next.config.mjs
delete mode 100644 sites/sde/package.json
delete mode 100644 sites/sde/pages/_app.mjs
delete mode 100644 sites/sde/pages/account.mjs
delete mode 100644 sites/sde/pages/design.mjs
delete mode 100644 sites/sde/pages/design/[design].mjs
delete mode 100644 sites/sde/pages/index.mjs
delete mode 100644 sites/sde/pages/sde/de.yaml
delete mode 100644 sites/sde/pages/sde/en.yaml
delete mode 100644 sites/sde/pages/sde/es.yaml
delete mode 100644 sites/sde/pages/sde/fr.yaml
delete mode 100644 sites/sde/pages/sde/index.mjs
delete mode 100644 sites/sde/pages/sde/nl.yaml
delete mode 100644 sites/sde/pages/sde/uk.yaml
delete mode 100644 sites/sde/pages/signin/callback/[provider].mjs
delete mode 100644 sites/sde/pages/signin/index.mjs
delete mode 100644 sites/sde/pages/signup/index.mjs
delete mode 100644 sites/sde/pkgs/.gitkeep
delete mode 100644 sites/sde/postcss.config.js
delete mode 100644 sites/sde/prebuild.mjs
delete mode 100644 sites/sde/prebuild/.gitkeep
delete mode 100644 sites/sde/prebuild/sitenav.de.mjs
delete mode 100644 sites/sde/prebuild/sitenav.en.mjs
delete mode 100644 sites/sde/prebuild/sitenav.es.mjs
delete mode 100644 sites/sde/prebuild/sitenav.fr.mjs
delete mode 100644 sites/sde/prebuild/sitenav.mjs
delete mode 100644 sites/sde/prebuild/sitenav.nl.mjs
delete mode 100644 sites/sde/prebuild/sitenav.uk.mjs
delete mode 100644 sites/sde/prebuild/sluglut.mjs
delete mode 100644 sites/sde/public/brands/algolia.svg
delete mode 100644 sites/sde/public/brands/bugsnag.svg
delete mode 100644 sites/sde/public/brands/crowdin.svg
delete mode 100644 sites/sde/public/brands/netlify.svg
delete mode 100644 sites/sde/public/brands/vercel.svg
delete mode 100644 sites/sde/public/img/lineup-backdrop.svg
delete mode 100644 sites/sde/public/locales/de/account.json
delete mode 100644 sites/sde/public/locales/de/auth.json
delete mode 100644 sites/sde/public/locales/de/bella.json
delete mode 100644 sites/sde/public/locales/de/bent.json
delete mode 100644 sites/sde/public/locales/de/breanna.json
delete mode 100644 sites/sde/public/locales/de/brian.json
delete mode 100644 sites/sde/public/locales/de/common.json
delete mode 100644 sites/sde/public/locales/de/core-settings.json
delete mode 100644 sites/sde/public/locales/de/curate.json
delete mode 100644 sites/sde/public/locales/de/cut.json
delete mode 100644 sites/sde/public/locales/de/design-options.json
delete mode 100644 sites/sde/public/locales/de/designs.json
delete mode 100644 sites/sde/public/locales/de/docs.json
delete mode 100644 sites/sde/public/locales/de/errors.json
delete mode 100644 sites/sde/public/locales/de/flag.json
delete mode 100644 sites/sde/public/locales/de/footer.json
delete mode 100644 sites/sde/public/locales/de/frombella.json
delete mode 100644 sites/sde/public/locales/de/frombent.json
delete mode 100644 sites/sde/public/locales/de/frombreanna.json
delete mode 100644 sites/sde/public/locales/de/frombrian.json
delete mode 100644 sites/sde/public/locales/de/fromscratch.json
delete mode 100644 sites/sde/public/locales/de/fromtitan.json
delete mode 100644 sites/sde/public/locales/de/gdpr.json
delete mode 100644 sites/sde/public/locales/de/header.json
delete mode 100644 sites/sde/public/locales/de/hodl.json
delete mode 100644 sites/sde/public/locales/de/homepage.json
delete mode 100644 sites/sde/public/locales/de/lab.json
delete mode 100644 sites/sde/public/locales/de/locales.json
delete mode 100644 sites/sde/public/locales/de/logs.json
delete mode 100644 sites/sde/public/locales/de/measurements.json
delete mode 100644 sites/sde/public/locales/de/modal.json
delete mode 100644 sites/sde/public/locales/de/newsletter.json
delete mode 100644 sites/sde/public/locales/de/patrons.json
delete mode 100644 sites/sde/public/locales/de/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/de/plugins.json
delete mode 100644 sites/sde/public/locales/de/popout.json
delete mode 100644 sites/sde/public/locales/de/print.json
delete mode 100644 sites/sde/public/locales/de/roles.json
delete mode 100644 sites/sde/public/locales/de/sde.json
delete mode 100644 sites/sde/public/locales/de/sections.json
delete mode 100644 sites/sde/public/locales/de/sets.json
delete mode 100644 sites/sde/public/locales/de/sponsors.json
delete mode 100644 sites/sde/public/locales/de/stats.json
delete mode 100644 sites/sde/public/locales/de/status.json
delete mode 100644 sites/sde/public/locales/de/submissions.json
delete mode 100644 sites/sde/public/locales/de/support.json
delete mode 100644 sites/sde/public/locales/de/susi.json
delete mode 100644 sites/sde/public/locales/de/tags.json
delete mode 100644 sites/sde/public/locales/de/techniques.json
delete mode 100644 sites/sde/public/locales/de/themes.json
delete mode 100644 sites/sde/public/locales/de/timeago.json
delete mode 100644 sites/sde/public/locales/de/titan.json
delete mode 100644 sites/sde/public/locales/de/tutorial.json
delete mode 100644 sites/sde/public/locales/de/ui-settings.json
delete mode 100644 sites/sde/public/locales/de/workbench.json
delete mode 100644 sites/sde/public/locales/en/account.json
delete mode 100644 sites/sde/public/locales/en/auth.json
delete mode 100644 sites/sde/public/locales/en/bella.json
delete mode 100644 sites/sde/public/locales/en/bent.json
delete mode 100644 sites/sde/public/locales/en/breanna.json
delete mode 100644 sites/sde/public/locales/en/brian.json
delete mode 100644 sites/sde/public/locales/en/common.json
delete mode 100644 sites/sde/public/locales/en/core-settings.json
delete mode 100644 sites/sde/public/locales/en/curate.json
delete mode 100644 sites/sde/public/locales/en/cut.json
delete mode 100644 sites/sde/public/locales/en/design-options.json
delete mode 100644 sites/sde/public/locales/en/designs.json
delete mode 100644 sites/sde/public/locales/en/docs.json
delete mode 100644 sites/sde/public/locales/en/errors.json
delete mode 100644 sites/sde/public/locales/en/flag.json
delete mode 100644 sites/sde/public/locales/en/footer.json
delete mode 100644 sites/sde/public/locales/en/frombella.json
delete mode 100644 sites/sde/public/locales/en/frombent.json
delete mode 100644 sites/sde/public/locales/en/frombreanna.json
delete mode 100644 sites/sde/public/locales/en/frombrian.json
delete mode 100644 sites/sde/public/locales/en/fromscratch.json
delete mode 100644 sites/sde/public/locales/en/fromtitan.json
delete mode 100644 sites/sde/public/locales/en/gdpr.json
delete mode 100644 sites/sde/public/locales/en/header.json
delete mode 100644 sites/sde/public/locales/en/hodl.json
delete mode 100644 sites/sde/public/locales/en/homepage.json
delete mode 100644 sites/sde/public/locales/en/lab.json
delete mode 100644 sites/sde/public/locales/en/locales.json
delete mode 100644 sites/sde/public/locales/en/logs.json
delete mode 100644 sites/sde/public/locales/en/measurements.json
delete mode 100644 sites/sde/public/locales/en/modal.json
delete mode 100644 sites/sde/public/locales/en/newsletter.json
delete mode 100644 sites/sde/public/locales/en/patrons.json
delete mode 100644 sites/sde/public/locales/en/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/en/plugins.json
delete mode 100644 sites/sde/public/locales/en/popout.json
delete mode 100644 sites/sde/public/locales/en/print.json
delete mode 100644 sites/sde/public/locales/en/roles.json
delete mode 100644 sites/sde/public/locales/en/sde.json
delete mode 100644 sites/sde/public/locales/en/sections.json
delete mode 100644 sites/sde/public/locales/en/sets.json
delete mode 100644 sites/sde/public/locales/en/sponsors.json
delete mode 100644 sites/sde/public/locales/en/stats.json
delete mode 100644 sites/sde/public/locales/en/status.json
delete mode 100644 sites/sde/public/locales/en/submissions.json
delete mode 100644 sites/sde/public/locales/en/support.json
delete mode 100644 sites/sde/public/locales/en/susi.json
delete mode 100644 sites/sde/public/locales/en/tags.json
delete mode 100644 sites/sde/public/locales/en/techniques.json
delete mode 100644 sites/sde/public/locales/en/themes.json
delete mode 100644 sites/sde/public/locales/en/timeago.json
delete mode 100644 sites/sde/public/locales/en/titan.json
delete mode 100644 sites/sde/public/locales/en/tutorial.json
delete mode 100644 sites/sde/public/locales/en/ui-settings.json
delete mode 100644 sites/sde/public/locales/en/workbench.json
delete mode 100644 sites/sde/public/locales/es/account.json
delete mode 100644 sites/sde/public/locales/es/auth.json
delete mode 100644 sites/sde/public/locales/es/bella.json
delete mode 100644 sites/sde/public/locales/es/bent.json
delete mode 100644 sites/sde/public/locales/es/breanna.json
delete mode 100644 sites/sde/public/locales/es/brian.json
delete mode 100644 sites/sde/public/locales/es/common.json
delete mode 100644 sites/sde/public/locales/es/core-settings.json
delete mode 100644 sites/sde/public/locales/es/curate.json
delete mode 100644 sites/sde/public/locales/es/cut.json
delete mode 100644 sites/sde/public/locales/es/design-options.json
delete mode 100644 sites/sde/public/locales/es/designs.json
delete mode 100644 sites/sde/public/locales/es/docs.json
delete mode 100644 sites/sde/public/locales/es/errors.json
delete mode 100644 sites/sde/public/locales/es/flag.json
delete mode 100644 sites/sde/public/locales/es/footer.json
delete mode 100644 sites/sde/public/locales/es/frombella.json
delete mode 100644 sites/sde/public/locales/es/frombent.json
delete mode 100644 sites/sde/public/locales/es/frombreanna.json
delete mode 100644 sites/sde/public/locales/es/frombrian.json
delete mode 100644 sites/sde/public/locales/es/fromscratch.json
delete mode 100644 sites/sde/public/locales/es/fromtitan.json
delete mode 100644 sites/sde/public/locales/es/gdpr.json
delete mode 100644 sites/sde/public/locales/es/header.json
delete mode 100644 sites/sde/public/locales/es/hodl.json
delete mode 100644 sites/sde/public/locales/es/homepage.json
delete mode 100644 sites/sde/public/locales/es/lab.json
delete mode 100644 sites/sde/public/locales/es/locales.json
delete mode 100644 sites/sde/public/locales/es/logs.json
delete mode 100644 sites/sde/public/locales/es/measurements.json
delete mode 100644 sites/sde/public/locales/es/modal.json
delete mode 100644 sites/sde/public/locales/es/newsletter.json
delete mode 100644 sites/sde/public/locales/es/patrons.json
delete mode 100644 sites/sde/public/locales/es/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/es/plugins.json
delete mode 100644 sites/sde/public/locales/es/popout.json
delete mode 100644 sites/sde/public/locales/es/print.json
delete mode 100644 sites/sde/public/locales/es/roles.json
delete mode 100644 sites/sde/public/locales/es/sde.json
delete mode 100644 sites/sde/public/locales/es/sections.json
delete mode 100644 sites/sde/public/locales/es/sets.json
delete mode 100644 sites/sde/public/locales/es/sponsors.json
delete mode 100644 sites/sde/public/locales/es/stats.json
delete mode 100644 sites/sde/public/locales/es/status.json
delete mode 100644 sites/sde/public/locales/es/submissions.json
delete mode 100644 sites/sde/public/locales/es/support.json
delete mode 100644 sites/sde/public/locales/es/susi.json
delete mode 100644 sites/sde/public/locales/es/tags.json
delete mode 100644 sites/sde/public/locales/es/techniques.json
delete mode 100644 sites/sde/public/locales/es/themes.json
delete mode 100644 sites/sde/public/locales/es/timeago.json
delete mode 100644 sites/sde/public/locales/es/titan.json
delete mode 100644 sites/sde/public/locales/es/tutorial.json
delete mode 100644 sites/sde/public/locales/es/ui-settings.json
delete mode 100644 sites/sde/public/locales/es/workbench.json
delete mode 100644 sites/sde/public/locales/fr/account.json
delete mode 100644 sites/sde/public/locales/fr/auth.json
delete mode 100644 sites/sde/public/locales/fr/bella.json
delete mode 100644 sites/sde/public/locales/fr/bent.json
delete mode 100644 sites/sde/public/locales/fr/breanna.json
delete mode 100644 sites/sde/public/locales/fr/brian.json
delete mode 100644 sites/sde/public/locales/fr/common.json
delete mode 100644 sites/sde/public/locales/fr/core-settings.json
delete mode 100644 sites/sde/public/locales/fr/curate.json
delete mode 100644 sites/sde/public/locales/fr/cut.json
delete mode 100644 sites/sde/public/locales/fr/design-options.json
delete mode 100644 sites/sde/public/locales/fr/designs.json
delete mode 100644 sites/sde/public/locales/fr/docs.json
delete mode 100644 sites/sde/public/locales/fr/errors.json
delete mode 100644 sites/sde/public/locales/fr/flag.json
delete mode 100644 sites/sde/public/locales/fr/footer.json
delete mode 100644 sites/sde/public/locales/fr/frombella.json
delete mode 100644 sites/sde/public/locales/fr/frombent.json
delete mode 100644 sites/sde/public/locales/fr/frombreanna.json
delete mode 100644 sites/sde/public/locales/fr/frombrian.json
delete mode 100644 sites/sde/public/locales/fr/fromscratch.json
delete mode 100644 sites/sde/public/locales/fr/fromtitan.json
delete mode 100644 sites/sde/public/locales/fr/gdpr.json
delete mode 100644 sites/sde/public/locales/fr/header.json
delete mode 100644 sites/sde/public/locales/fr/hodl.json
delete mode 100644 sites/sde/public/locales/fr/homepage.json
delete mode 100644 sites/sde/public/locales/fr/lab.json
delete mode 100644 sites/sde/public/locales/fr/locales.json
delete mode 100644 sites/sde/public/locales/fr/logs.json
delete mode 100644 sites/sde/public/locales/fr/measurements.json
delete mode 100644 sites/sde/public/locales/fr/modal.json
delete mode 100644 sites/sde/public/locales/fr/newsletter.json
delete mode 100644 sites/sde/public/locales/fr/patrons.json
delete mode 100644 sites/sde/public/locales/fr/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/fr/plugins.json
delete mode 100644 sites/sde/public/locales/fr/popout.json
delete mode 100644 sites/sde/public/locales/fr/print.json
delete mode 100644 sites/sde/public/locales/fr/roles.json
delete mode 100644 sites/sde/public/locales/fr/sde.json
delete mode 100644 sites/sde/public/locales/fr/sections.json
delete mode 100644 sites/sde/public/locales/fr/sets.json
delete mode 100644 sites/sde/public/locales/fr/sponsors.json
delete mode 100644 sites/sde/public/locales/fr/stats.json
delete mode 100644 sites/sde/public/locales/fr/status.json
delete mode 100644 sites/sde/public/locales/fr/submissions.json
delete mode 100644 sites/sde/public/locales/fr/support.json
delete mode 100644 sites/sde/public/locales/fr/susi.json
delete mode 100644 sites/sde/public/locales/fr/tags.json
delete mode 100644 sites/sde/public/locales/fr/techniques.json
delete mode 100644 sites/sde/public/locales/fr/themes.json
delete mode 100644 sites/sde/public/locales/fr/timeago.json
delete mode 100644 sites/sde/public/locales/fr/titan.json
delete mode 100644 sites/sde/public/locales/fr/tutorial.json
delete mode 100644 sites/sde/public/locales/fr/ui-settings.json
delete mode 100644 sites/sde/public/locales/fr/workbench.json
delete mode 100644 sites/sde/public/locales/nl/account.json
delete mode 100644 sites/sde/public/locales/nl/auth.json
delete mode 100644 sites/sde/public/locales/nl/bella.json
delete mode 100644 sites/sde/public/locales/nl/bent.json
delete mode 100644 sites/sde/public/locales/nl/breanna.json
delete mode 100644 sites/sde/public/locales/nl/brian.json
delete mode 100644 sites/sde/public/locales/nl/common.json
delete mode 100644 sites/sde/public/locales/nl/core-settings.json
delete mode 100644 sites/sde/public/locales/nl/curate.json
delete mode 100644 sites/sde/public/locales/nl/cut.json
delete mode 100644 sites/sde/public/locales/nl/design-options.json
delete mode 100644 sites/sde/public/locales/nl/designs.json
delete mode 100644 sites/sde/public/locales/nl/docs.json
delete mode 100644 sites/sde/public/locales/nl/errors.json
delete mode 100644 sites/sde/public/locales/nl/flag.json
delete mode 100644 sites/sde/public/locales/nl/footer.json
delete mode 100644 sites/sde/public/locales/nl/frombella.json
delete mode 100644 sites/sde/public/locales/nl/frombent.json
delete mode 100644 sites/sde/public/locales/nl/frombreanna.json
delete mode 100644 sites/sde/public/locales/nl/frombrian.json
delete mode 100644 sites/sde/public/locales/nl/fromscratch.json
delete mode 100644 sites/sde/public/locales/nl/fromtitan.json
delete mode 100644 sites/sde/public/locales/nl/gdpr.json
delete mode 100644 sites/sde/public/locales/nl/header.json
delete mode 100644 sites/sde/public/locales/nl/hodl.json
delete mode 100644 sites/sde/public/locales/nl/homepage.json
delete mode 100644 sites/sde/public/locales/nl/lab.json
delete mode 100644 sites/sde/public/locales/nl/locales.json
delete mode 100644 sites/sde/public/locales/nl/logs.json
delete mode 100644 sites/sde/public/locales/nl/measurements.json
delete mode 100644 sites/sde/public/locales/nl/modal.json
delete mode 100644 sites/sde/public/locales/nl/newsletter.json
delete mode 100644 sites/sde/public/locales/nl/patrons.json
delete mode 100644 sites/sde/public/locales/nl/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/nl/plugins.json
delete mode 100644 sites/sde/public/locales/nl/popout.json
delete mode 100644 sites/sde/public/locales/nl/print.json
delete mode 100644 sites/sde/public/locales/nl/roles.json
delete mode 100644 sites/sde/public/locales/nl/sde.json
delete mode 100644 sites/sde/public/locales/nl/sections.json
delete mode 100644 sites/sde/public/locales/nl/sets.json
delete mode 100644 sites/sde/public/locales/nl/sponsors.json
delete mode 100644 sites/sde/public/locales/nl/stats.json
delete mode 100644 sites/sde/public/locales/nl/status.json
delete mode 100644 sites/sde/public/locales/nl/submissions.json
delete mode 100644 sites/sde/public/locales/nl/support.json
delete mode 100644 sites/sde/public/locales/nl/susi.json
delete mode 100644 sites/sde/public/locales/nl/tags.json
delete mode 100644 sites/sde/public/locales/nl/techniques.json
delete mode 100644 sites/sde/public/locales/nl/themes.json
delete mode 100644 sites/sde/public/locales/nl/timeago.json
delete mode 100644 sites/sde/public/locales/nl/titan.json
delete mode 100644 sites/sde/public/locales/nl/tutorial.json
delete mode 100644 sites/sde/public/locales/nl/ui-settings.json
delete mode 100644 sites/sde/public/locales/nl/workbench.json
delete mode 100644 sites/sde/public/locales/uk/account.json
delete mode 100644 sites/sde/public/locales/uk/auth.json
delete mode 100644 sites/sde/public/locales/uk/bella.json
delete mode 100644 sites/sde/public/locales/uk/bent.json
delete mode 100644 sites/sde/public/locales/uk/breanna.json
delete mode 100644 sites/sde/public/locales/uk/brian.json
delete mode 100644 sites/sde/public/locales/uk/common.json
delete mode 100644 sites/sde/public/locales/uk/core-settings.json
delete mode 100644 sites/sde/public/locales/uk/curate.json
delete mode 100644 sites/sde/public/locales/uk/cut.json
delete mode 100644 sites/sde/public/locales/uk/design-options.json
delete mode 100644 sites/sde/public/locales/uk/designs.json
delete mode 100644 sites/sde/public/locales/uk/docs.json
delete mode 100644 sites/sde/public/locales/uk/errors.json
delete mode 100644 sites/sde/public/locales/uk/flag.json
delete mode 100644 sites/sde/public/locales/uk/footer.json
delete mode 100644 sites/sde/public/locales/uk/frombella.json
delete mode 100644 sites/sde/public/locales/uk/frombent.json
delete mode 100644 sites/sde/public/locales/uk/frombreanna.json
delete mode 100644 sites/sde/public/locales/uk/frombrian.json
delete mode 100644 sites/sde/public/locales/uk/fromscratch.json
delete mode 100644 sites/sde/public/locales/uk/fromtitan.json
delete mode 100644 sites/sde/public/locales/uk/gdpr.json
delete mode 100644 sites/sde/public/locales/uk/header.json
delete mode 100644 sites/sde/public/locales/uk/hodl.json
delete mode 100644 sites/sde/public/locales/uk/homepage.json
delete mode 100644 sites/sde/public/locales/uk/lab.json
delete mode 100644 sites/sde/public/locales/uk/locales.json
delete mode 100644 sites/sde/public/locales/uk/logs.json
delete mode 100644 sites/sde/public/locales/uk/measurements.json
delete mode 100644 sites/sde/public/locales/uk/modal.json
delete mode 100644 sites/sde/public/locales/uk/newsletter.json
delete mode 100644 sites/sde/public/locales/uk/patrons.json
delete mode 100644 sites/sde/public/locales/uk/plugin-annotations.json
delete mode 100644 sites/sde/public/locales/uk/plugins.json
delete mode 100644 sites/sde/public/locales/uk/popout.json
delete mode 100644 sites/sde/public/locales/uk/print.json
delete mode 100644 sites/sde/public/locales/uk/roles.json
delete mode 100644 sites/sde/public/locales/uk/sde.json
delete mode 100644 sites/sde/public/locales/uk/sections.json
delete mode 100644 sites/sde/public/locales/uk/sets.json
delete mode 100644 sites/sde/public/locales/uk/sponsors.json
delete mode 100644 sites/sde/public/locales/uk/stats.json
delete mode 100644 sites/sde/public/locales/uk/status.json
delete mode 100644 sites/sde/public/locales/uk/submissions.json
delete mode 100644 sites/sde/public/locales/uk/support.json
delete mode 100644 sites/sde/public/locales/uk/susi.json
delete mode 100644 sites/sde/public/locales/uk/tags.json
delete mode 100644 sites/sde/public/locales/uk/techniques.json
delete mode 100644 sites/sde/public/locales/uk/themes.json
delete mode 100644 sites/sde/public/locales/uk/timeago.json
delete mode 100644 sites/sde/public/locales/uk/titan.json
delete mode 100644 sites/sde/public/locales/uk/tutorial.json
delete mode 100644 sites/sde/public/locales/uk/ui-settings.json
delete mode 100644 sites/sde/public/locales/uk/workbench.json
delete mode 100644 sites/sde/site.config.mjs
delete mode 100644 sites/sde/tailwind.config.mjs
delete mode 100644 sites/shared/components/accordion.mjs
delete mode 100644 sites/shared/components/account/apikeys.mjs
delete mode 100644 sites/shared/components/account/bio.mjs
delete mode 100644 sites/shared/components/account/bookmarks.mjs
delete mode 100644 sites/shared/components/account/compare.mjs
delete mode 100644 sites/shared/components/account/consent.mjs
delete mode 100644 sites/shared/components/account/control.mjs
delete mode 100644 sites/shared/components/account/de.yaml
delete mode 100644 sites/shared/components/account/email.mjs
delete mode 100644 sites/shared/components/account/en.yaml
delete mode 100644 sites/shared/components/account/es.yaml
delete mode 100644 sites/shared/components/account/export.mjs
delete mode 100644 sites/shared/components/account/force-account-check.mjs
delete mode 100644 sites/shared/components/account/fr.yaml
delete mode 100644 sites/shared/components/account/github.mjs
delete mode 100644 sites/shared/components/account/img.mjs
delete mode 100644 sites/shared/components/account/imperial.mjs
delete mode 100644 sites/shared/components/account/import.mjs
delete mode 100644 sites/shared/components/account/language.mjs
delete mode 100644 sites/shared/components/account/links.mjs
delete mode 100644 sites/shared/components/account/mfa.mjs
delete mode 100644 sites/shared/components/account/newsletter.mjs
delete mode 100644 sites/shared/components/account/nl.yaml
delete mode 100644 sites/shared/components/account/overview.mjs
delete mode 100644 sites/shared/components/account/password.mjs
delete mode 100644 sites/shared/components/account/patterns.mjs
delete mode 100644 sites/shared/components/account/platform.mjs
delete mode 100644 sites/shared/components/account/profile.mjs
delete mode 100644 sites/shared/components/account/reload.mjs
delete mode 100644 sites/shared/components/account/remove.mjs
delete mode 100644 sites/shared/components/account/restrict.mjs
delete mode 100644 sites/shared/components/account/role.mjs
delete mode 100644 sites/shared/components/account/sets.mjs
delete mode 100644 sites/shared/components/account/shared.mjs
delete mode 100644 sites/shared/components/account/status.mjs
delete mode 100644 sites/shared/components/account/uk.yaml
delete mode 100644 sites/shared/components/account/username.mjs
delete mode 100644 sites/shared/components/admin.mjs
delete mode 100644 sites/shared/components/animations/freesewing.mjs
delete mode 100644 sites/shared/components/animations/how-does-it-work.mjs
delete mode 100644 sites/shared/components/animations/loading-bar.mjs
delete mode 100644 sites/shared/components/base-layout.mjs
delete mode 100644 sites/shared/components/bookmarks.mjs
delete mode 100644 sites/shared/components/breadcrumbs.mjs
delete mode 100644 sites/shared/components/bullet.mjs
delete mode 100644 sites/shared/components/buttons/continue-button.mjs
delete mode 100644 sites/shared/components/buttons/flex-button-text.mjs
delete mode 100644 sites/shared/components/buttons/save-settings-button.mjs
delete mode 100644 sites/shared/components/card-link.mjs
delete mode 100644 sites/shared/components/choice-button.mjs
delete mode 100644 sites/shared/components/choice-link.mjs
delete mode 100644 sites/shared/components/code-box.mjs
delete mode 100644 sites/shared/components/code.mjs
delete mode 100644 sites/shared/components/collapse.mjs
delete mode 100644 sites/shared/components/control/score.mjs
delete mode 100644 sites/shared/components/control/tip.mjs
delete mode 100644 sites/shared/components/copy-to-clipboard.mjs
delete mode 100644 sites/shared/components/curated-sets.mjs
delete mode 100644 sites/shared/components/designs/design-picker.mjs
delete mode 100644 sites/shared/components/designs/design.mjs
delete mode 100644 sites/shared/components/designs/difficulty.mjs
delete mode 100644 sites/shared/components/designs/info.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/aaron.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/albert.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bee.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bella.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/benjamin.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bent.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bibi.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bob.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/breanna.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/brian.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/bruce.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/carlita.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/carlton.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/cathrin.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/charlie.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/cornelius.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/diana.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/florence.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/florent.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/gozer.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/hi.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/holmes.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/hortensia.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/huey.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/hugo.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/index.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/lucy.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/lumina.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/lumira.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/lunetius.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/noble.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/shared.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/simon.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/teagan.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/tristan.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/uma.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/umbra.mjs
delete mode 100644 sites/shared/components/designs/linedrawings/wahid.mjs
delete mode 100644 sites/shared/components/error/error-boundary.mjs
delete mode 100644 sites/shared/components/error/reset-buttons.mjs
delete mode 100644 sites/shared/components/error/view.mjs
delete mode 100644 sites/shared/components/errors/404.mjs
delete mode 100644 sites/shared/components/errors/de.yaml
delete mode 100644 sites/shared/components/errors/en.yaml
delete mode 100644 sites/shared/components/errors/es.yaml
delete mode 100644 sites/shared/components/errors/fr.yaml
delete mode 100644 sites/shared/components/errors/nl.yaml
delete mode 100644 sites/shared/components/errors/uk.yaml
delete mode 100644 sites/shared/components/errors/vague.mjs
delete mode 100644 sites/shared/components/fingerprint.mjs
delete mode 100644 sites/shared/components/footer/de.yaml
delete mode 100644 sites/shared/components/footer/en.yaml
delete mode 100644 sites/shared/components/footer/es.yaml
delete mode 100644 sites/shared/components/footer/fr.yaml
delete mode 100644 sites/shared/components/footer/index.mjs
delete mode 100644 sites/shared/components/footer/nl.yaml
delete mode 100644 sites/shared/components/footer/uk.yaml
delete mode 100644 sites/shared/components/gdpr/de.yaml
delete mode 100644 sites/shared/components/gdpr/details.mjs
delete mode 100644 sites/shared/components/gdpr/en.yaml
delete mode 100644 sites/shared/components/gdpr/es.yaml
delete mode 100644 sites/shared/components/gdpr/form.mjs
delete mode 100644 sites/shared/components/gdpr/fr.yaml
delete mode 100644 sites/shared/components/gdpr/nl.yaml
delete mode 100644 sites/shared/components/gdpr/uk.yaml
delete mode 100644 sites/shared/components/header.mjs
delete mode 100644 sites/shared/components/hodl/de.yaml
delete mode 100644 sites/shared/components/hodl/en.yaml
delete mode 100644 sites/shared/components/hodl/es.yaml
delete mode 100644 sites/shared/components/hodl/fr.yaml
delete mode 100644 sites/shared/components/hodl/index.mjs
delete mode 100644 sites/shared/components/hodl/nl.yaml
delete mode 100644 sites/shared/components/hodl/uk.yaml
delete mode 100644 sites/shared/components/icons.mjs
delete mode 100644 sites/shared/components/icons/flip.js
delete mode 100644 sites/shared/components/icons/rotate.js
delete mode 100644 sites/shared/components/inputs.mjs
delete mode 100644 sites/shared/components/jargon.mjs
delete mode 100644 sites/shared/components/joost.mjs
delete mode 100644 sites/shared/components/json.mjs
delete mode 100644 sites/shared/components/lightbox.mjs
delete mode 100644 sites/shared/components/link.mjs
delete mode 100644 sites/shared/components/loader.mjs
delete mode 100644 sites/shared/components/logos/cc-by.mjs
delete mode 100644 sites/shared/components/logos/cc.mjs
delete mode 100644 sites/shared/components/logos/freesewing.mjs
delete mode 100644 sites/shared/components/logos/osi.mjs
delete mode 100644 sites/shared/components/mdx/design-measurements.mjs
delete mode 100644 sites/shared/components/mdx/design-options.mjs
delete mode 100644 sites/shared/components/mdx/docs-helpers.mjs
delete mode 100644 sites/shared/components/mdx/dynamic.mjs
delete mode 100644 sites/shared/components/mdx/figure.mjs
delete mode 100644 sites/shared/components/mdx/highlight.mjs
delete mode 100644 sites/shared/components/mdx/http.mjs
delete mode 100644 sites/shared/components/mdx/index.mjs
delete mode 100644 sites/shared/components/mdx/legend.mjs
delete mode 100644 sites/shared/components/mdx/mermaid.mjs
delete mode 100644 sites/shared/components/mdx/meta.mjs
delete mode 100644 sites/shared/components/mdx/read-more.mjs
delete mode 100644 sites/shared/components/mdx/tabbed-example.mjs
delete mode 100644 sites/shared/components/mdx/toc.mjs
delete mode 100644 sites/shared/components/mdx/youtube.mjs
delete mode 100644 sites/shared/components/measurements/image.mjs
delete mode 100644 sites/shared/components/measurements/sarah/acrossback.svg
delete mode 100644 sites/shared/components/measurements/sarah/ankle.svg
delete mode 100644 sites/shared/components/measurements/sarah/biceps.svg
delete mode 100644 sites/shared/components/measurements/sarah/bustfront.svg
delete mode 100644 sites/shared/components/measurements/sarah/bustpointtounderbust.svg
delete mode 100644 sites/shared/components/measurements/sarah/bustspan.svg
delete mode 100644 sites/shared/components/measurements/sarah/chest.svg
delete mode 100644 sites/shared/components/measurements/sarah/crossseam.svg
delete mode 100644 sites/shared/components/measurements/sarah/crossseamfront.svg
delete mode 100644 sites/shared/components/measurements/sarah/crotchdepth.svg
delete mode 100644 sites/shared/components/measurements/sarah/head.svg
delete mode 100644 sites/shared/components/measurements/sarah/heel.svg
delete mode 100644 sites/shared/components/measurements/sarah/highbust.svg
delete mode 100644 sites/shared/components/measurements/sarah/highbustfront.svg
delete mode 100644 sites/shared/components/measurements/sarah/hips.svg
delete mode 100644 sites/shared/components/measurements/sarah/hipstoupperleg.svg
delete mode 100644 sites/shared/components/measurements/sarah/hpstobust.svg
delete mode 100644 sites/shared/components/measurements/sarah/hpstowaistback.svg
delete mode 100644 sites/shared/components/measurements/sarah/hpstowaistfront.svg
delete mode 100644 sites/shared/components/measurements/sarah/index.mjs
delete mode 100644 sites/shared/components/measurements/sarah/inseam.svg
delete mode 100644 sites/shared/components/measurements/sarah/knee.svg
delete mode 100644 sites/shared/components/measurements/sarah/neck.svg
delete mode 100644 sites/shared/components/measurements/sarah/seat.svg
delete mode 100644 sites/shared/components/measurements/sarah/seatback.svg
delete mode 100644 sites/shared/components/measurements/sarah/shoulderslope.svg
delete mode 100644 sites/shared/components/measurements/sarah/shouldertoelbow.svg
delete mode 100644 sites/shared/components/measurements/sarah/shouldertoshoulder.svg
delete mode 100644 sites/shared/components/measurements/sarah/shouldertowrist.svg
delete mode 100644 sites/shared/components/measurements/sarah/underbust.svg
delete mode 100644 sites/shared/components/measurements/sarah/upperleg.svg
delete mode 100644 sites/shared/components/measurements/sarah/waist.svg
delete mode 100644 sites/shared/components/measurements/sarah/waistback.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttoarmpit.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttofloor.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttohips.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttoknee.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttoseat.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttounderbust.svg
delete mode 100644 sites/shared/components/measurements/sarah/waisttoupperleg.svg
delete mode 100644 sites/shared/components/measurements/sarah/wrist.svg
delete mode 100644 sites/shared/components/measurements/tim/acrossback.svg
delete mode 100644 sites/shared/components/measurements/tim/ankle.svg
delete mode 100644 sites/shared/components/measurements/tim/biceps.svg
delete mode 100644 sites/shared/components/measurements/tim/bustfront.svg
delete mode 100644 sites/shared/components/measurements/tim/bustpointtounderbust.svg
delete mode 100644 sites/shared/components/measurements/tim/bustspan.svg
delete mode 100644 sites/shared/components/measurements/tim/chest.svg
delete mode 100644 sites/shared/components/measurements/tim/crossseam.svg
delete mode 100644 sites/shared/components/measurements/tim/crossseamfront.svg
delete mode 100644 sites/shared/components/measurements/tim/crotchdepth.svg
delete mode 100644 sites/shared/components/measurements/tim/head.svg
delete mode 100644 sites/shared/components/measurements/tim/heel.svg
delete mode 100644 sites/shared/components/measurements/tim/highbust.svg
delete mode 100644 sites/shared/components/measurements/tim/highbustfront.svg
delete mode 100644 sites/shared/components/measurements/tim/hips.svg
delete mode 100644 sites/shared/components/measurements/tim/hipstoupperleg.svg
delete mode 100644 sites/shared/components/measurements/tim/hpstobust.svg
delete mode 100644 sites/shared/components/measurements/tim/hpstowaistback.svg
delete mode 100644 sites/shared/components/measurements/tim/hpstowaistfront.svg
delete mode 100644 sites/shared/components/measurements/tim/index.mjs
delete mode 100644 sites/shared/components/measurements/tim/inseam.svg
delete mode 100644 sites/shared/components/measurements/tim/knee.svg
delete mode 100644 sites/shared/components/measurements/tim/neck.svg
delete mode 100644 sites/shared/components/measurements/tim/seat.svg
delete mode 100644 sites/shared/components/measurements/tim/seatback.svg
delete mode 100644 sites/shared/components/measurements/tim/shoulderslope.svg
delete mode 100644 sites/shared/components/measurements/tim/shouldertoelbow.svg
delete mode 100644 sites/shared/components/measurements/tim/shouldertoshoulder.svg
delete mode 100644 sites/shared/components/measurements/tim/shouldertowrist.svg
delete mode 100644 sites/shared/components/measurements/tim/underbust.svg
delete mode 100644 sites/shared/components/measurements/tim/upperleg.svg
delete mode 100644 sites/shared/components/measurements/tim/waist.svg
delete mode 100644 sites/shared/components/measurements/tim/waistback.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttoarmpit.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttofloor.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttohips.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttoknee.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttoseat.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttounderbust.svg
delete mode 100644 sites/shared/components/measurements/tim/waisttoupperleg.svg
delete mode 100644 sites/shared/components/measurements/tim/wrist.svg
delete mode 100644 sites/shared/components/modal/de.yaml
delete mode 100644 sites/shared/components/modal/en.yaml
delete mode 100644 sites/shared/components/modal/es.yaml
delete mode 100644 sites/shared/components/modal/fr.yaml
delete mode 100644 sites/shared/components/modal/locale-picker.mjs
delete mode 100644 sites/shared/components/modal/modal.mjs
delete mode 100644 sites/shared/components/modal/nl.yaml
delete mode 100644 sites/shared/components/modal/problem-report.mjs
delete mode 100644 sites/shared/components/modal/spinner.mjs
delete mode 100644 sites/shared/components/modal/theme-picker.mjs
delete mode 100644 sites/shared/components/modal/uk.yaml
delete mode 100644 sites/shared/components/navigation/aside.mjs
delete mode 100644 sites/shared/components/navigation/pagination.mjs
delete mode 100644 sites/shared/components/navigation/primary.mjs
delete mode 100644 sites/shared/components/navigation/sections-menu.mjs
delete mode 100644 sites/shared/components/navigation/sitenav.mjs
delete mode 100644 sites/shared/components/newsletter/de.yaml
delete mode 100644 sites/shared/components/newsletter/en.yaml
delete mode 100644 sites/shared/components/newsletter/es.yaml
delete mode 100644 sites/shared/components/newsletter/fr.yaml
delete mode 100644 sites/shared/components/newsletter/index.mjs
delete mode 100644 sites/shared/components/newsletter/nl.yaml
delete mode 100644 sites/shared/components/newsletter/uk.yaml
delete mode 100644 sites/shared/components/null.mjs
delete mode 100644 sites/shared/components/patrons/de.yaml
delete mode 100644 sites/shared/components/patrons/en.yaml
delete mode 100644 sites/shared/components/patrons/es.yaml
delete mode 100644 sites/shared/components/patrons/fr.yaml
delete mode 100644 sites/shared/components/patrons/nl.yaml
delete mode 100644 sites/shared/components/patrons/plea.mjs
delete mode 100644 sites/shared/components/patrons/please-subscribe.mjs
delete mode 100644 sites/shared/components/patrons/subscribe.mjs
delete mode 100644 sites/shared/components/patrons/uk.yaml
delete mode 100644 sites/shared/components/pattern/manage.mjs
delete mode 100644 sites/shared/components/pattern/preview.mjs
delete mode 100644 sites/shared/components/popout/de.yaml
delete mode 100644 sites/shared/components/popout/en.yaml
delete mode 100644 sites/shared/components/popout/es.yaml
delete mode 100644 sites/shared/components/popout/fr.yaml
delete mode 100644 sites/shared/components/popout/index.mjs
delete mode 100644 sites/shared/components/popout/nl.yaml
delete mode 100644 sites/shared/components/popout/uk.yaml
delete mode 100644 sites/shared/components/prev-next.mjs
delete mode 100644 sites/shared/components/raw-span.mjs
delete mode 100644 sites/shared/components/robot/index.mjs
delete mode 100644 sites/shared/components/robot/poses.mjs
delete mode 100644 sites/shared/components/role.mjs
delete mode 100644 sites/shared/components/row.mjs
delete mode 100644 sites/shared/components/social/icons.mjs
delete mode 100644 sites/shared/components/social/mastodon-verification.mjs
delete mode 100644 sites/shared/components/spinner.mjs
delete mode 100644 sites/shared/components/sponsors/algolia.mjs
delete mode 100644 sites/shared/components/sponsors/bugsnag.mjs
delete mode 100644 sites/shared/components/sponsors/crowdin.mjs
delete mode 100644 sites/shared/components/sponsors/de.yaml
delete mode 100644 sites/shared/components/sponsors/en.yaml
delete mode 100644 sites/shared/components/sponsors/es.yaml
delete mode 100644 sites/shared/components/sponsors/fr.yaml
delete mode 100644 sites/shared/components/sponsors/index.mjs
delete mode 100644 sites/shared/components/sponsors/nl.yaml
delete mode 100644 sites/shared/components/sponsors/uk.yaml
delete mode 100644 sites/shared/components/sponsors/vercel.mjs
delete mode 100644 sites/shared/components/submissions/de.yaml
delete mode 100644 sites/shared/components/submissions/en.yaml
delete mode 100644 sites/shared/components/submissions/es.yaml
delete mode 100644 sites/shared/components/submissions/fr.yaml
delete mode 100644 sites/shared/components/submissions/index.mjs
delete mode 100644 sites/shared/components/submissions/nl.yaml
delete mode 100644 sites/shared/components/submissions/uk.yaml
delete mode 100644 sites/shared/components/support/status.mjs
delete mode 100644 sites/shared/components/support/support.mjs
delete mode 100644 sites/shared/components/susi/de.yaml
delete mode 100644 sites/shared/components/susi/en.yaml
delete mode 100644 sites/shared/components/susi/es.yaml
delete mode 100644 sites/shared/components/susi/fr.yaml
delete mode 100644 sites/shared/components/susi/migrate.mjs
delete mode 100644 sites/shared/components/susi/nl.yaml
delete mode 100644 sites/shared/components/susi/sign-in.mjs
delete mode 100644 sites/shared/components/susi/sign-up.mjs
delete mode 100644 sites/shared/components/susi/uk.yaml
delete mode 100644 sites/shared/components/tabs.mjs
delete mode 100644 sites/shared/components/tag.mjs
delete mode 100644 sites/shared/components/text-on-bg.mjs
delete mode 100644 sites/shared/components/timeago/de.yaml
delete mode 100644 sites/shared/components/timeago/en.yaml
delete mode 100644 sites/shared/components/timeago/es.yaml
delete mode 100644 sites/shared/components/timeago/fr.yaml
delete mode 100644 sites/shared/components/timeago/index.mjs
delete mode 100644 sites/shared/components/timeago/nl.yaml
delete mode 100644 sites/shared/components/timeago/uk.yaml
delete mode 100644 sites/shared/components/user-profile.mjs
delete mode 100644 sites/shared/components/v3-wip.mjs
delete mode 100644 sites/shared/components/wordmark.mjs
delete mode 100644 sites/shared/components/workbench/de.yaml
delete mode 100644 sites/shared/components/workbench/en.yaml
delete mode 100644 sites/shared/components/workbench/es.yaml
delete mode 100644 sites/shared/components/workbench/exporting/export-handler.mjs
delete mode 100644 sites/shared/components/workbench/exporting/pdf.mjs
delete mode 100644 sites/shared/components/workbench/fr.yaml
delete mode 100644 sites/shared/components/workbench/gist.mjs
delete mode 100644 sites/shared/components/workbench/header.mjs
delete mode 100644 sites/shared/components/workbench/layout/default.mjs
delete mode 100644 sites/shared/components/workbench/logs.mjs
delete mode 100644 sites/shared/components/workbench/menus/core-settings/config.mjs
delete mode 100644 sites/shared/components/workbench/menus/core-settings/core-setting-sa-mm.mjs
delete mode 100644 sites/shared/components/workbench/menus/core-settings/de.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/en.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/es.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/fr.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/index.mjs
delete mode 100644 sites/shared/components/workbench/menus/core-settings/inputs.mjs
delete mode 100644 sites/shared/components/workbench/menus/core-settings/nl.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/uk.yaml
delete mode 100644 sites/shared/components/workbench/menus/core-settings/values.mjs
delete mode 100644 sites/shared/components/workbench/menus/design-options/de.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/en.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/es.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/fr.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/index.mjs
delete mode 100644 sites/shared/components/workbench/menus/design-options/inputs.mjs
delete mode 100644 sites/shared/components/workbench/menus/design-options/nl.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/uk.yaml
delete mode 100644 sites/shared/components/workbench/menus/design-options/values.mjs
delete mode 100644 sites/shared/components/workbench/menus/mobile-menubar.mjs
delete mode 100644 sites/shared/components/workbench/menus/shared/index.mjs
delete mode 100644 sites/shared/components/workbench/menus/shared/inputs.mjs
delete mode 100644 sites/shared/components/workbench/menus/shared/menu-item.mjs
delete mode 100644 sites/shared/components/workbench/menus/shared/menu-wrapper.mjs
delete mode 100644 sites/shared/components/workbench/menus/shared/values.mjs
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/config.mjs
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/de.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/en.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/es.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/fr.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/index.mjs
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/inputs.mjs
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/list.mjs
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/nl.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/uk.yaml
delete mode 100644 sites/shared/components/workbench/menus/ui-settings/values.mjs
delete mode 100644 sites/shared/components/workbench/new.mjs
delete mode 100644 sites/shared/components/workbench/nl.yaml
delete mode 100644 sites/shared/components/workbench/pan-zoom-pattern.mjs
delete mode 100644 sites/shared/components/workbench/pattern/movable/index.mjs
delete mode 100644 sites/shared/components/workbench/pattern/movable/stack.mjs
delete mode 100644 sites/shared/components/workbench/pattern/movable/transform-buttons.mjs
delete mode 100644 sites/shared/components/workbench/pattern/pan-zoom-context.mjs
delete mode 100644 sites/shared/components/workbench/pattern/snippet.mjs
delete mode 100644 sites/shared/components/workbench/pattern/stack.mjs
delete mode 100644 sites/shared/components/workbench/pattern/text.mjs
delete mode 100644 sites/shared/components/workbench/pattern/utils.mjs
delete mode 100644 sites/shared/components/workbench/preloaders.mjs
delete mode 100644 sites/shared/components/workbench/uk.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/de.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/en.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/es.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/fr.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/hooks.mjs
delete mode 100644 sites/shared/components/workbench/views/cut/index.mjs
delete mode 100644 sites/shared/components/workbench/views/cut/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/cut/nl.yaml
delete mode 100644 sites/shared/components/workbench/views/cut/settings.mjs
delete mode 100644 sites/shared/components/workbench/views/cut/uk.yaml
delete mode 100644 sites/shared/components/workbench/views/docs/index.mjs
delete mode 100644 sites/shared/components/workbench/views/draft/header.mjs
delete mode 100644 sites/shared/components/workbench/views/draft/index.mjs
delete mode 100644 sites/shared/components/workbench/views/draft/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/edit/index.mjs
delete mode 100644 sites/shared/components/workbench/views/edit/settings-validator.mjs
delete mode 100644 sites/shared/components/workbench/views/exporting/index.mjs
delete mode 100644 sites/shared/components/workbench/views/flags.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/index.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/path.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/pattern.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/point.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/shared.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/inspector/stack.mjs
delete mode 100644 sites/shared/components/workbench/views/inspect/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/logs/de.yaml
delete mode 100644 sites/shared/components/workbench/views/logs/en.yaml
delete mode 100644 sites/shared/components/workbench/views/logs/errors.mjs
delete mode 100644 sites/shared/components/workbench/views/logs/es.yaml
delete mode 100644 sites/shared/components/workbench/views/logs/fr.yaml
delete mode 100644 sites/shared/components/workbench/views/logs/index.mjs
delete mode 100644 sites/shared/components/workbench/views/logs/nl.yaml
delete mode 100644 sites/shared/components/workbench/views/logs/uk.yaml
delete mode 100644 sites/shared/components/workbench/views/measies/editor.mjs
delete mode 100644 sites/shared/components/workbench/views/measies/index.mjs
delete mode 100644 sites/shared/components/workbench/views/pattern-with-menu.mjs
delete mode 100644 sites/shared/components/workbench/views/print/actions.mjs
delete mode 100644 sites/shared/components/workbench/views/print/config.mjs
delete mode 100644 sites/shared/components/workbench/views/print/de.yaml
delete mode 100644 sites/shared/components/workbench/views/print/en.yaml
delete mode 100644 sites/shared/components/workbench/views/print/es.yaml
delete mode 100644 sites/shared/components/workbench/views/print/fr.yaml
delete mode 100644 sites/shared/components/workbench/views/print/index.mjs
delete mode 100644 sites/shared/components/workbench/views/print/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/print/nl.yaml
delete mode 100644 sites/shared/components/workbench/views/print/settings.mjs
delete mode 100644 sites/shared/components/workbench/views/print/uk.yaml
delete mode 100644 sites/shared/components/workbench/views/save/index.mjs
delete mode 100644 sites/shared/components/workbench/views/test/index.mjs
delete mode 100644 sites/shared/components/workbench/views/test/measurements.mjs
delete mode 100644 sites/shared/components/workbench/views/test/menu.mjs
delete mode 100644 sites/shared/components/workbench/views/test/options.mjs
delete mode 100644 sites/shared/components/workbench/views/time/index.mjs
delete mode 100644 sites/shared/components/worm.mjs
delete mode 100644 sites/shared/components/wrappers/auth/de.yaml
delete mode 100644 sites/shared/components/wrappers/auth/en.yaml
delete mode 100644 sites/shared/components/wrappers/auth/es.yaml
delete mode 100644 sites/shared/components/wrappers/auth/fr.yaml
delete mode 100644 sites/shared/components/wrappers/auth/index.mjs
delete mode 100644 sites/shared/components/wrappers/auth/nl.yaml
delete mode 100644 sites/shared/components/wrappers/auth/uk.yaml
delete mode 100644 sites/shared/components/wrappers/chart.mjs
delete mode 100644 sites/shared/components/wrappers/context.mjs
delete mode 100644 sites/shared/components/wrappers/header.mjs
delete mode 100644 sites/shared/components/wrappers/img.mjs
delete mode 100644 sites/shared/components/wrappers/layout.mjs
delete mode 100644 sites/shared/components/wrappers/mdx.mjs
delete mode 100644 sites/shared/components/wrappers/modal.mjs
delete mode 100644 sites/shared/components/wrappers/page.mjs
delete mode 100644 sites/shared/components/wrappers/popout.mjs
delete mode 100644 sites/shared/components/wrappers/production.mjs
delete mode 100644 sites/shared/components/wrappers/susi.mjs
delete mode 100644 sites/shared/components/wrappers/swipes.mjs
delete mode 100644 sites/shared/components/wrappers/table.mjs
delete mode 100644 sites/shared/components/wrappers/welcome.mjs
delete mode 100644 sites/shared/components/wrappers/workbench.mjs
delete mode 100644 sites/shared/components/yaml.mjs
delete mode 100644 sites/shared/config/cloudflare.mjs
delete mode 100644 sites/shared/config/designs.mjs
delete mode 100644 sites/shared/config/freesewing.config.mjs
delete mode 100644 sites/shared/config/i18n.config.mjs
delete mode 100644 sites/shared/config/measurements.js
delete mode 100644 sites/shared/config/next.mjs
delete mode 100644 sites/shared/config/paypal.mjs
delete mode 100644 sites/shared/config/postcss.config.js
delete mode 100644 sites/shared/config/social.mjs
delete mode 100644 sites/shared/config/tailwind-force.html
delete mode 100644 sites/shared/config/tailwind.config.mjs
delete mode 100644 sites/shared/context/loading-status-context.mjs
delete mode 100644 sites/shared/context/mobile-menubar-context.mjs
delete mode 100644 sites/shared/context/modal-context.mjs
delete mode 100644 sites/shared/context/navigation-context.mjs
delete mode 100644 sites/shared/designs/index.js
delete mode 100644 sites/shared/favicon/android-chrome-192x192.png
delete mode 100644 sites/shared/favicon/android-chrome-384x384.png
delete mode 100644 sites/shared/favicon/apple-touch-icon.png
delete mode 100644 sites/shared/favicon/browserconfig.xml
delete mode 100644 sites/shared/favicon/favicon-16x16.png
delete mode 100644 sites/shared/favicon/favicon-32x32.png
delete mode 100644 sites/shared/favicon/mstile-150x150.png
delete mode 100644 sites/shared/favicon/safari-pinned-tab.svg
delete mode 100644 sites/shared/favicon/site.webmanifest
delete mode 100644 sites/shared/hooks/use-account.mjs
delete mode 100644 sites/shared/hooks/use-backend.mjs
delete mode 100644 sites/shared/hooks/use-bugsnag.mjs
delete mode 100644 sites/shared/hooks/use-dynamic-mdx.mjs
delete mode 100644 sites/shared/hooks/use-evaled-mdx.mjs
delete mode 100644 sites/shared/hooks/use-id.mjs
delete mode 100644 sites/shared/hooks/use-language.mjs
delete mode 100644 sites/shared/hooks/use-navigation-helpers.mjs
delete mode 100644 sites/shared/hooks/use-pattern-settings.mjs
delete mode 100644 sites/shared/hooks/use-theme.mjs
delete mode 100644 sites/shared/hooks/use-view.mjs
delete mode 100644 sites/shared/i18n/common/de.yaml
delete mode 100644 sites/shared/i18n/common/en.yaml
delete mode 100644 sites/shared/i18n/common/es.yaml
delete mode 100644 sites/shared/i18n/common/fr.yaml
delete mode 100644 sites/shared/i18n/common/nl.yaml
delete mode 100644 sites/shared/i18n/common/uk.yaml
delete mode 100644 sites/shared/i18n/curate/de.yaml
delete mode 100644 sites/shared/i18n/curate/en.yaml
delete mode 100644 sites/shared/i18n/curate/es.yaml
delete mode 100644 sites/shared/i18n/curate/fr.yaml
delete mode 100644 sites/shared/i18n/curate/nl.yaml
delete mode 100644 sites/shared/i18n/curate/uk.yaml
delete mode 100644 sites/shared/i18n/designs.mjs
delete mode 100644 sites/shared/i18n/docs/de.yaml
delete mode 100644 sites/shared/i18n/docs/en.yaml
delete mode 100644 sites/shared/i18n/docs/es.yaml
delete mode 100644 sites/shared/i18n/docs/fr.yaml
delete mode 100644 sites/shared/i18n/docs/nl.yaml
delete mode 100644 sites/shared/i18n/docs/uk.yaml
delete mode 100644 sites/shared/i18n/flag/de.yaml
delete mode 100644 sites/shared/i18n/flag/en.yaml
delete mode 100644 sites/shared/i18n/flag/es.yaml
delete mode 100644 sites/shared/i18n/flag/fr.yaml
delete mode 100644 sites/shared/i18n/flag/nl.yaml
delete mode 100644 sites/shared/i18n/flag/uk.yaml
delete mode 100644 sites/shared/i18n/homepage/de.yaml
delete mode 100644 sites/shared/i18n/homepage/en.yaml
delete mode 100644 sites/shared/i18n/homepage/es.yaml
delete mode 100644 sites/shared/i18n/homepage/fr.yaml
delete mode 100644 sites/shared/i18n/homepage/nl.yaml
delete mode 100644 sites/shared/i18n/homepage/uk.yaml
delete mode 100644 sites/shared/i18n/lab/de.yaml
delete mode 100644 sites/shared/i18n/lab/en.yaml
delete mode 100644 sites/shared/i18n/lab/es.yaml
delete mode 100644 sites/shared/i18n/lab/fr.yaml
delete mode 100644 sites/shared/i18n/lab/nl.yaml
delete mode 100644 sites/shared/i18n/lab/uk.yaml
delete mode 100644 sites/shared/i18n/locales/de.yaml
delete mode 100644 sites/shared/i18n/locales/en.yaml
delete mode 100644 sites/shared/i18n/locales/es.yaml
delete mode 100644 sites/shared/i18n/locales/fr.yaml
delete mode 100644 sites/shared/i18n/locales/nl.yaml
delete mode 100644 sites/shared/i18n/locales/uk.yaml
delete mode 100644 sites/shared/i18n/measurements/de.yaml
delete mode 100644 sites/shared/i18n/measurements/en.yaml
delete mode 100644 sites/shared/i18n/measurements/es.yaml
delete mode 100644 sites/shared/i18n/measurements/fr.yaml
delete mode 100644 sites/shared/i18n/measurements/nl.yaml
delete mode 100644 sites/shared/i18n/measurements/uk.yaml
delete mode 100644 sites/shared/i18n/plugins.mjs
delete mode 100644 sites/shared/i18n/roles/de.yaml
delete mode 100644 sites/shared/i18n/roles/en.yaml
delete mode 100644 sites/shared/i18n/roles/es.yaml
delete mode 100644 sites/shared/i18n/roles/fr.yaml
delete mode 100644 sites/shared/i18n/roles/nl.yaml
delete mode 100644 sites/shared/i18n/roles/uk.yaml
delete mode 100644 sites/shared/i18n/sde-designs.mjs
delete mode 100644 sites/shared/i18n/sections/de.yaml
delete mode 100644 sites/shared/i18n/sections/en.yaml
delete mode 100644 sites/shared/i18n/sections/es.yaml
delete mode 100644 sites/shared/i18n/sections/fr.yaml
delete mode 100644 sites/shared/i18n/sections/nl.yaml
delete mode 100644 sites/shared/i18n/sections/uk.yaml
delete mode 100644 sites/shared/i18n/sets/de.yaml
delete mode 100644 sites/shared/i18n/sets/en.yaml
delete mode 100644 sites/shared/i18n/sets/es.yaml
delete mode 100644 sites/shared/i18n/sets/fr.yaml
delete mode 100644 sites/shared/i18n/sets/nl.yaml
delete mode 100644 sites/shared/i18n/sets/uk.yaml
delete mode 100644 sites/shared/i18n/stats/de.yaml
delete mode 100644 sites/shared/i18n/stats/en.yaml
delete mode 100644 sites/shared/i18n/stats/es.yaml
delete mode 100644 sites/shared/i18n/stats/fr.yaml
delete mode 100644 sites/shared/i18n/stats/nl.yaml
delete mode 100644 sites/shared/i18n/stats/uk.yaml
delete mode 100644 sites/shared/i18n/status/de.yaml
delete mode 100644 sites/shared/i18n/status/en.yaml
delete mode 100644 sites/shared/i18n/status/es.yaml
delete mode 100644 sites/shared/i18n/status/fr.yaml
delete mode 100644 sites/shared/i18n/status/nl.yaml
delete mode 100644 sites/shared/i18n/status/uk.yaml
delete mode 100644 sites/shared/i18n/support/de.yaml
delete mode 100644 sites/shared/i18n/support/en.yaml
delete mode 100644 sites/shared/i18n/support/es.yaml
delete mode 100644 sites/shared/i18n/support/fr.yaml
delete mode 100644 sites/shared/i18n/support/nl.yaml
delete mode 100644 sites/shared/i18n/support/uk.yaml
delete mode 100644 sites/shared/i18n/tags/de.yaml
delete mode 100644 sites/shared/i18n/tags/en.yaml
delete mode 100644 sites/shared/i18n/tags/es.yaml
delete mode 100644 sites/shared/i18n/tags/fr.yaml
delete mode 100644 sites/shared/i18n/tags/nl.yaml
delete mode 100644 sites/shared/i18n/tags/uk.yaml
delete mode 100644 sites/shared/i18n/techniques/de.yaml
delete mode 100644 sites/shared/i18n/techniques/en.yaml
delete mode 100644 sites/shared/i18n/techniques/es.yaml
delete mode 100644 sites/shared/i18n/techniques/fr.yaml
delete mode 100644 sites/shared/i18n/techniques/nl.yaml
delete mode 100644 sites/shared/i18n/techniques/uk.yaml
delete mode 100644 sites/shared/i18n/themes/de.yaml
delete mode 100644 sites/shared/i18n/themes/en.yaml
delete mode 100644 sites/shared/i18n/themes/es.yaml
delete mode 100644 sites/shared/i18n/themes/fr.yaml
delete mode 100644 sites/shared/i18n/themes/nl.yaml
delete mode 100644 sites/shared/i18n/themes/uk.yaml
delete mode 100644 sites/shared/mdx/browser-compile.mjs
delete mode 100644 sites/shared/mdx/compile.mjs
delete mode 100644 sites/shared/mdx/load.mjs
delete mode 100644 sites/shared/mdx/rehype-jargon-transform.mjs
delete mode 100644 sites/shared/mdx/remark-github-images.mjs
delete mode 100644 sites/shared/mdx/remark-intro-as-frontmatter.mjs
delete mode 100644 sites/shared/mdx/remark-toc-as-frontmatter.mjs
delete mode 100644 sites/shared/package.json
delete mode 100644 sites/shared/page-templates/docs.dev.mjs.mustache
delete mode 100644 sites/shared/page-templates/docs.org.mjs.mustache
delete mode 100644 sites/shared/plugins/plugin-cut-layout.mjs
delete mode 100644 sites/shared/plugins/plugin-layout-part.mjs
delete mode 100644 sites/shared/prebuild/algolia.mjs
delete mode 100644 sites/shared/prebuild/contributors.mjs
delete mode 100644 sites/shared/prebuild/crowdin.mjs
delete mode 100644 sites/shared/prebuild/data/.gitkeep
delete mode 100644 sites/shared/prebuild/data/design-measurements.mjs
delete mode 100644 sites/shared/prebuild/data/design-options.mjs
delete mode 100644 sites/shared/prebuild/data/designs.mjs
delete mode 100644 sites/shared/prebuild/designs.mjs
delete mode 100644 sites/shared/prebuild/favicon.mjs
delete mode 100644 sites/shared/prebuild/feed.mjs
delete mode 100644 sites/shared/prebuild/git.mjs
delete mode 100644 sites/shared/prebuild/i18n-only.mjs
delete mode 100644 sites/shared/prebuild/i18n.mjs
delete mode 100644 sites/shared/prebuild/jargon.mjs
delete mode 100644 sites/shared/prebuild/lab.mjs
delete mode 100644 sites/shared/prebuild/markdown.mjs
delete mode 100644 sites/shared/prebuild/md-intro.mjs
delete mode 100644 sites/shared/prebuild/navigation.mjs
delete mode 100644 sites/shared/prebuild/og.mjs
delete mode 100644 sites/shared/prebuild/org.mjs
delete mode 100644 sites/shared/prebuild/patrons.mjs
delete mode 100644 sites/shared/prebuild/runner.mjs
delete mode 100644 sites/shared/prebuild/search.mjs
delete mode 100644 sites/shared/prebuild/shared.mjs
delete mode 100644 sites/shared/prebuild/sitenav-dev.mjs
delete mode 100644 sites/shared/prebuild/sitenav-lab.mjs
delete mode 100644 sites/shared/prebuild/sitenav-org.mjs
delete mode 100644 sites/shared/prebuild/users.mjs
delete mode 100644 sites/shared/styles/globals.css
delete mode 100644 sites/shared/styles/svg-freesewing-draft.css
delete mode 100644 sites/shared/themes/aqua.mjs
delete mode 100644 sites/shared/themes/dark.mjs
delete mode 100644 sites/shared/themes/hax0r.mjs
delete mode 100644 sites/shared/themes/index.mjs
delete mode 100644 sites/shared/themes/lgbtq.mjs
delete mode 100644 sites/shared/themes/light.mjs
delete mode 100644 sites/shared/themes/monochrome.mjs
delete mode 100644 sites/shared/themes/pastel.mjs
delete mode 100644 sites/shared/utils.mjs
delete mode 100644 yarn.lock
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index babcee61a92..1ff019dc2d6 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -9,7 +9,7 @@ const nodeFiles = [
`**/prebuild.${jsSuffixes}`,
`**/prebuild/**/*.${jsSuffixes}`,
`**/scripts/**/*.${jsSuffixes}`,
- `packages/new-design/lib/**/*.${jsSuffixes}`,
+ `packages/studio/lib/*.${jsSuffixes}`,
`sites/backend/**/*.${jsSuffixes}`,
`sites/*/mdx/**/*.${jsSuffixes}`,
`sites/*/themes/**/*.${jsSuffixes}`,
@@ -60,16 +60,6 @@ module.exports = {
'no-console': 'off',
},
},
- {
- files: frontendFiles,
- excludedFiles: nodeFiles,
- extends: ['next'],
- settings: {
- next: {
- rootDir: 'sites/dev/',
- },
- },
- },
{
files: [`**/*.${jsSuffixes}{,.mustache}`],
excludedFiles: [].concat(mongoFiles, nodeFiles, frontendFiles),
diff --git a/.github/workflows/dependabot-sync.yml b/.github/workflows/dependabot-sync.yml
deleted file mode 100644
index fb5c444ab17..00000000000
--- a/.github/workflows/dependabot-sync.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: Sync Dependabot Bump
-on:
- pull_request:
- types: [opened, synchronize]
-
-permissions:
- contents: write
-
-jobs:
- sync:
- if: ${{ github.actor == 'dependabot[bot]' }}
- name: Sync dependency files
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout Repository
- uses: actions/checkout@v3
- with:
- ref: ${{ github.head_ref }}
- - name: Setup Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- - name: Install dependencies
- run: |
- cd packages/core
- npm i --workspaces=false --no-save
- cd ../../scripts
- npm i --workspaces=false --no-save
- cd ../
- env:
- CI: true
- - name: Run Sync Script
- run: node ./scripts/sync-dependencies.mjs ${{ github.head_ref }}
- - name: Reconfigure
- run: node --experimental-json-modules --no-warnings ./scripts/reconfigure.mjs
- - name: Bootstrap
- run: yarn install
- - name: Commit Changes
- run: |
- git add .
- git status
- git config user.name github-actions
- git config user.email github-actions@github.com
- git commit -m "[dependabot skip] chore(deps): bumped ${{ github.head_ref }} changes in config/dependencies.yaml"
- git push
diff --git a/.gitignore b/.gitignore
index 985b39ac1a0..424bde05ef3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,12 @@
# See https://help.github.com/ignore-files/ for more about ignoring files.
dump
production.sqlite
+.husky
# .env
.env
*.key
+*.env
# Plugins
plugins/plugin-theme/src/bundle.css.js
@@ -14,16 +16,17 @@ plugins/plugin-theme/css
packages/core/coverage
packages/*/report
-# Any NPM or Yarn lock files
+# Any Yarn lock files
designs/*/package-lock.json
designs/*/yarn.lock
packages/*/package-lock.json
packages/*/yarn.lock
plugins/*/package-lock.json
plugins/*/yarn.lock
+yarn.lock
-# NPM lock files for sites (we use yarn)
-sites/*/package-lock.json
+# Yarn lock files for sites (we use npm)
+sites/*/yarn.lock
# Nx cache
.nx/cache
@@ -42,26 +45,16 @@ packages/new-design/shared/.gitignore
packages/new-design/lib/banner.mjs
sites/*/public/img/og/*
-# Orgdocs prebuild artifacts
-sites/orgdocs/src/lib/designs.mjs
-sites/orgdocs/src/lib/designinfo.mjs
-sites/orgdocs/src/lib/i18n.mjs
-sites/orgdocs/docs/designs/*/options/readme.mdx
-sites/orgdocs/authors.json
-sites/orgdocs/showcase-tags.mjs
-
-# Lab auto-generated content
-sites/lab/lib
-sites/lab/public/android-chrome-192x192.png
-sites/lab/public/android-chrome-384x384.png
-sites/lab/public/apple-touch-icon.png
-sites/lab/public/browserconfig.xml
-sites/lab/public/favicon-16x16.png
-sites/lab/public/favicon-32x32.png
-sites/lab/public/favicon.ico
-sites/lab/public/mstile-150x150.png
-sites/lab/public/safari-pinned-tab.svg
-sites/lab/public/site.webmanifest
+# Org prebuild artifacts
+sites/org/src/lib/designs.mjs
+sites/org/src/lib/designinfo.mjs
+sites/org/src/lib/i18n.mjs
+sites/org/docs/designs/*/options/readme.mdx
+sites/org/authors.json
+sites/org/showcase-tags.mjs
+sites/org/design-examples.mjs
+sites/org/docs/designs/*.mdx
+sites/org/recent-blog-posts.mjs
# sde auto-generated content
sites/sde/public/android-chrome-192x192.png
@@ -87,25 +80,15 @@ sites/dev/public/mstile-150x150.png
sites/dev/public/safari-pinned-tab.svg
sites/dev/public/site.webmanifest
-# org auto-generated content
-sites/org/public/android-chrome-192x192.png
-sites/org/public/android-chrome-384x384.png
-sites/org/public/apple-touch-icon.png
-sites/org/public/browserconfig.xml
-sites/org/public/favicon-16x16.png
-sites/org/public/favicon-32x32.png
-sites/org/public/favicon.ico
-sites/org/public/mstile-150x150.png
-sites/org/public/safari-pinned-tab.svg
-sites/org/public/site.webmanifest
-
# Node dependencies
node_modules
# Build folders
dist
build
-export
+
+# But don't ignore point/dist reference
+!/sites/dev/docs/reference/api/point/dist/
# Prebuild files
prebuild/*.json
@@ -147,3 +130,6 @@ scripts/verdaccio.sh
# e2e test results
sites/*/playwright-report
+
+# Local Netlify folder
+.netlify
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 37236231717..2312dc587f6 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1 +1 @@
-yarn lint-staged
+npx lint-staged
diff --git a/.prettierignore b/.prettierignore
index d289ffa1006..10c6479679b 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -27,4 +27,5 @@ yarn.lock
.all-contributorsrc
.nvmrc
ansible.cfg
-sites/shared/prebuild/data/*.mjs
+sites/org/docs/docs/designs/*/options/readme.mdx
+/.nx/workspace-data
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 88c99f5f595..f1020ad4953 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,9 @@
## Unreleased
+
+## 4.0.0 (2024-04-01)
+
### bibi
#### Changed
@@ -133,8 +136,25 @@
- The `withCondition` named export is deprecated and will always return true.
+### collection
+
+#### Added
+
+ - Added a new `@freesewing/collection` package that bundles all our designs
+
+### config
+
+#### Added
+
+ - Added a new `@freesewing/config` package for shared configuration
+
### core
+#### Breaking
+
+ - FreeSewing new requires NodeJS 20 (or more recent)
+ - We removed all but English translations. We still support i18n in our core library and designs, but no longer provide translations
+
#### Added
- The `Path.rotate()` method was added to the core API.
@@ -144,6 +164,30 @@
- Fix an issue when splitting path on start or end point. Fixes
+### i18n
+
+#### Added
+
+ - The `@freesewing/i18n` package holds translations in English for where they are needed
+
+### studio
+
+#### Added
+
+ - Added `@freesewing/studio`, our new development environment
+
+### react
+
+#### Added
+
+ - The `@freesewing/react` package holds shared components, hooks, and context for our React-based frontends
+
+### utils
+
+#### Added
+
+ - Added a new `@freesewing/utils` package for shared utils
+
## 3.2.0 (2024-02-11)
@@ -225,12 +269,6 @@
- Calling `Path.join` with a second parameter to indicate that the resulting paths most be closed is now deprecated and will be removed in FreeSewing v4.
-### react-components
-
-#### Added
-
- - This Pattern component now supports translation of nested arrays of strings, giving you more flexibility to concatenate translated parts of strings
-
## 3.1.0 (2023-12-26)
@@ -424,12 +462,6 @@
- Make Path.split() more robust when handling edge-case. Fixes
- Prevent utils.circlesIntersect() from running sqrt on a negative number. Fixes
-### new-design
-
-#### Fixed
-
- - Removed unwanted debug output
-
## 3.0.0 (2023-09-30)
@@ -675,16 +707,6 @@
- Make generatePartTransform a named export
-### new-design
-
-#### Changed
-
- - We're now loading content from the main branch by default
-
-#### Fixed
-
- - Add bin entry to package.json
-
## 2.21.2 (2022-06-30)
@@ -1092,8 +1114,24 @@
- Migrated from Rollup to Esbuild for all builds
- The `pctBasedOn()` helper method for pattern config was moved to config-helpers We did not make this a breaking change since it's only used internally.
+### i18n
+
+#### Changed
+
+ - Migrated from Rollup to Esbuild for all builds
+
+#### Fixed
+
+ - Added missing lab namespace for English
+
### models
+#### Changed
+
+ - Migrated from Rollup to Esbuild for all builds
+
+### utils
+
#### Changed
- Migrated from Rollup to Esbuild for all builds
@@ -1202,12 +1240,6 @@
- Fix bug in Svg.escapeText() that only escaped the first quote
-### backend
-
-#### Fixed
-
- - Mitigate risk of denial-of-service attacks in catch-all route
-
## 2.20.4 (2022-01-28)
@@ -1231,6 +1263,12 @@
## 2.20.2 (2022-01-27)
+### i18n
+
+#### Fixed
+
+ - Patterns options were always in English due to symlinks being used
+
## 2.20.1 (2022-01-27)
@@ -1559,6 +1597,12 @@
- Added support for `settings.scale`
+### i18n
+
+#### Fixed
+
+ - Fixed issue that was causing plugin translations to always be in English
+
## 2.19.9 (2022-01-09)
@@ -1991,6 +2035,13 @@
- Pattern.on() is now chainable as it returns the Pattern object
+### i18n
+
+#### Fixed
+
+ - Fixed bug in resolving of shared pattern options
+ - Removed optional chaining which broke node v12 support
+
### snapseries
#### Added
@@ -2037,6 +2088,16 @@
- Handle path.offset() of very short curves with control points on the start or end point Closes [#1257](https://github.com/freesewing/freesewing/issues/1257)
+### i18n
+
+#### Added
+
+ - Added translations for Yuri
+
+#### Fixed
+
+ - Added optional chaining so missing options always lead to clear error message
+
## 2.17.4 (2021-08-20)
@@ -2049,6 +2110,18 @@
## 2.17.3 (2021-08-16)
+### i18n
+
+#### Added
+
+ - New translations
+
+### utils
+
+#### Fixed
+
+ - Added missing `bustPointToUnderbust` measurement to `neckstimate`
+
## 2.17.2 (2021-08-15)
@@ -2064,6 +2137,12 @@
- Added new ffsa option to let the user control the extra SA for flat-felled seams Closes [#1251](https://github.com/freesewing/freesewing/issues/1251)
+### i18n
+
+#### Added
+
+ - Added new ffsa option for simon & simone
+
### models
#### Added
@@ -2185,9 +2264,21 @@
- Fix a bug in `path.shiftAlong` where no point is returned if the distance to shift is a fraction of one step (1/25mm) into a new path segment See [#1140](https://github.com/freesewing/freesewing/issues/1140)
+### i18n
+
+#### Changed
+
+ - Changed antman references to antperson
+
## 2.16.2 (2021-05-05)
+### i18n
+
+#### Changed
+
+ - String updates
+
## 2.16.1 (2021-05-30)
@@ -2395,6 +2486,19 @@
- Changed `department` setting in config in line with new grouping
+### i18n
+
+#### Added
+
+ - New translations for pattern filter
+
+### utils
+
+#### Changed
+
+ - neckstimate now takes an extra `noRound` parameter to return the unrounded value
+ - measurementDiffers takes an extra `absolute` value that can be set to false to get the non-absolute and non-rounded value
+
## 2.16.0 (2021-05-24)
@@ -2423,6 +2527,12 @@
- Fixed third button not showing up See [#973](https://github.com/freesewing/freesewing/issues/973)
+### i18n
+
+#### Changed
+
+ - Changes to cfp strings
+
## 2.15.4 (2021-05-08)
@@ -2554,6 +2664,13 @@
- Don't round coordinates internally to avoid path.split misses
+### i18n
+
+#### Added
+
+ - Added translation for new Titan options
+ - Added translations for Charlie
+
## 2.14.0 (2021-03-07)
@@ -2569,6 +2686,12 @@
- Replaced grainline indicator on pocket with cut-on-fold indicator
+### i18n
+
+#### Added
+
+ - Added translations for Cornelius
+
## 2.13.2 (2021-02-21)
@@ -2617,6 +2740,12 @@
- Added missing sleeve notch on yoke
+### utils
+
+#### Added
+
+ - Pass pattern handle to tiler
+
## 2.13.0 (2021-02-13)
@@ -2670,6 +2799,12 @@
- Make sure roudEnd and roundStart points are always available
+### i18n
+
+#### Added
+
+ - Translation for Hortensia
+
## 2.12.1 (2021-01-27)
@@ -2794,6 +2929,16 @@
- Removed unused lengthBonus option
+### i18n
+
+#### Changed
+
+ - New strings for new features
+
+#### Fixed
+
+ - Type in Simon title
+
## 2.10.7 (2020-11-18)
@@ -2809,6 +2954,12 @@
## 2.10.5 (2020-11-14)
+### i18n
+
+#### Fixed
+
+ - Added missing `cty.` translations to non-English language files
+
## 2.10.4 (2020-11-13)
@@ -2871,6 +3022,18 @@
- Added the `info` type to raised events
- Added support for conditional loading of plugins
+### i18n
+
+#### Added
+
+ - Added translations for plugin-title
+ - Added translations for teagan
+ - Added some translations for the UI
+
+#### Fixed
+
+ - Replaced a few identical files with symlinks
+
## 2.8.1 (2020-08-16)
@@ -2981,6 +3144,12 @@
- Added a new `debug` setting
- Shorthand now proxies objects to allow debug and raise
+### utils
+
+#### Added
+
+ - Added backend calls for creating gists/issues on Github
+
## 2.7.0 (2020-07-12)
@@ -3258,6 +3427,13 @@
- [Properly escape quotes in imperial units](https://github.com/freesewing/freesewing/issues/437)
+### i18n
+
+#### Changed
+
+ - Added translations for Titan
+ - Removed `Circumference` suffix from measurement names
+
### models
#### Changed
@@ -3266,6 +3442,21 @@
- Ported models to the crotchDepth measurement. See [#425](https://github.com/freesewing/freesewing/issues/425)
- Removed `Circumference` suffix from measurement names
+### utils
+
+#### Added
+
+ - Added new `isDegMeasurement` method. See [#358](https://github.com/freesewing/freesewing/issues/358)
+ - `neckStimate` now supports all new measurements. See [#416](https://github.com/freesewing/freesewing/issues/416)
+
+#### Changed
+
+ - Changed `neckstimate` to handle new `shoulderSlope` degree measurement. See [#358](https://github.com/freesewing/freesewing/issues/358)
+ - Changed `neckstimate` to support all new measurements. See [#416](https://github.com/freesewing/freesewing/issues/416)
+ - Ported `neckstimate` to the crotchDepth measurement. See [#425](https://github.com/freesewing/freesewing/issues/425)
+ - Removed `Circumference` suffix from measurement names
+ - Added the `isDegMeasurement` method
+
## 2.6.0 (2020-05-01)
@@ -3310,6 +3501,12 @@
- utils now includes `Bezier` which holds the bezier-js library so you don't need to re-import it
- We no longer set the plugin configuration/data object to fall in `pattern.use()`
+### i18n
+
+#### Changed
+
+ - Changes to support the renaming of @freesewing/fu to @freesewing/florence
+
## 2.5.0 (2020-04-05)
@@ -3319,9 +3516,21 @@
- Diana is a top with a draped neck
+### i18n
+
+#### Added
+
+ - title, description, and options for Dianna
+
## 2.4.6 (2020-03-23)
+### i18n
+
+#### Fixed
+
+ - Fixed an bug in the i18n package
+
## 2.4.5 (2020-03-19)
@@ -3337,6 +3546,12 @@
- Check whether frontScyeDart option is zero prior to implementing it
+### utils
+
+#### Changed
+
+ - neckstimate() now returns values rounded to nearest mm
+
## 2.4.4 (2020-03-15)
@@ -3373,12 +3588,30 @@
## 2.4.3 (2020-03-12)
+### i18n
+
+#### Added
+
+ - Added more translations
+
## 2.4.2 (2020-03-08)
+### i18n
+
+#### Added
+
+ - Added more strings
+
## 2.4.1 (2020-03-04)
+### utils
+
+#### Fixed
+
+ - [#542](https://github.com/freesewing/freesewing.org/issues/542): Prevent neckstimate from throwing when getting an unexpected measurement
+
## 2.4.0 (2020-02-29)
@@ -3542,12 +3775,34 @@
- Added the `Path.noop()` method
- Added the `Path.insop()` methods
+### i18n
+
+#### Added
+
+ - Added translations for Breanna
+
+#### Changed
+
+ - Added/Updated strings for the 2.2 frontend changes
+ - Changed `Joost De Cock` to `Joost` because spam filters don't like cock
+
+#### Removed
+
+ - Removed the files for homepage translation, and moved that content to markdown
+ - Removed the files for editor translation, as it is no longer used
+
### models
#### Changed
- Extended the menswear size range to have 10 different sizes, just like womenswear
+### utils
+
+#### Changed
+
+ - Neckstimate now uses proportions only
+
## 2.1.9 (2020-01-18)
@@ -3585,6 +3840,12 @@
## 2.1.6 (2019-11-24)
+### utils
+
+#### Fixed
+
+ - [#317](https://github.com/freesewing/freesewing.org/issues/317): Fixed bug where format was not passed to formatImperial
+
## 2.1.5 (2019-11-19)
@@ -3594,12 +3855,40 @@
## 2.1.3 (2019-10-18)
+### i18n
+
+#### Added
+
+ - More translated strings
+
+### utils
+
+#### Changed
+
+ - Adjusted slope of the shoulderToShoulder measurement in neckstimate data
+
+#### Fixed
+
+ - [#250](https://github.com/freesewing/freesewing.org/issues/250): Model page stays empty with pre 2.0 model data: Error: 'neckstimate() requires a valid measurement name as second parameter. (received underBust)'
+
## 2.1.2 (2019-10-14)
+### i18n
+
+#### Fixed
+
+ - Fixed issue where symlinks were causing all languages to export English strings
+
## 2.1.1 (2019-10-13)
+### utils
+
+#### Fixed
+
+ - Fixed an issue with the formatMm method not adding units
+
## 2.1.0 (2019-10-06)
@@ -3645,6 +3934,23 @@
- The pattern super constructor now sets a `config` property that holds the pattern configuration. This means that unlike before, there is no need to instantiate a pattern to access its config. You can just import the pattern, and it's config property will contain the pattern config.
+### i18n
+
+#### Added
+
+ - Added translations for Penelope, Waralee, and Simone
+
+### utils
+
+#### Added
+
+ - Added backend methods for administration
+ - Added the resendActivationEmail method to backend
+
+#### Fixed
+
+ - Fixed an issue where optionDefault was not handling list options correctly
+
## 2.0.4 (2019-09-27)
@@ -3663,6 +3969,12 @@
- [#106](https://github.com/freesewing/freesewing/issues/106): Fix incorrect hem allowance
+### utils
+
+#### Fixed
+
+ - Fix measurementDiffers to pass breasts parameter to neckstimate
+
## 2.0.2 (2019-09-06)
@@ -3686,6 +3998,18 @@
- [#102](https://github.com/freesewing/freesewing.org/issues/102): Fixed 'Snippets not defined' error when drafting a seperate button placket
- [#103](https://github.com/freesewing/freesewing.org/issues/103): Fixed 'hemSa not defined' when drafting paperless Simon without seam allowance
+### i18n
+
+#### Added
+
+ - [#90](https://github.com/freesewing/freesewing/issues/90): Added missing option translations for Benjamin, Florent, Sandy, Shin, and Theo
+
+### utils
+
+#### Fixed
+
+ - Removed lingering debug statement in formatImperial
+
## 2.0.1 (2019-09-01)
@@ -3704,6 +4028,12 @@
- [#86](https://github.com/freesewing/freesewing/issues/86): The `seatCircumference` measurement was missing, thus making it unavailable on the website
+### utils
+
+#### Added
+
+ - The `measurementDiffers` method is new.
+
## 2.0.0 (2019-08-25)
@@ -3877,6 +4207,12 @@
### core
+#### Added
+
+ - Initial release
+
+### i18n
+
#### Added
- Initial release
@@ -3893,4 +4229,10 @@
- Initial release
+### utils
+
+#### Added
+
+ - Initial release
+
diff --git a/README.md b/README.md
index 9a66568ba1f..ebc625818f6 100644
--- a/README.md
+++ b/README.md
@@ -24,11 +24,6 @@
>
-
-
# FreeSewing
@@ -54,7 +44,7 @@
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -64,7 +54,7 @@ This repository is the FreeSewing *monorepo* holding all FreeSewing's websites,
Where the world of makers and developers collide, that's where you'll find FreeSewing.
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
sewing patterns adapted to your measurements.
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
@@ -76,7 +66,7 @@ functionality of the platform.
If you have NodeJS installed, you can try it right now by running:
```bash
-npx @freesewing/new-design
+npx @freesewing/studio
```
Getting started guides are available for:
@@ -92,48 +82,46 @@ show you how to create your first parametric design.
To get started with FreeSewing, you can spin up our development environment with:
```bash
-npx @freesewing/new-design
+npx @freesewing/studio
```
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) and [lerna](https://lerna.js.org/) on your system.
+Once you have those, clone (or fork) this repo and run `npm run kickstart`:
```bash
-git clone git@github.com:freesewing/freesewing.git
+git clone git@codeberg.org:freesewing/freesewing.git
cd freesewing
-yarn kickstart
+npm run kickstart
```
## Links 👩💻
**Official channels**
- - 🪡 Makers website: [FreeSewing.org](https://freesewing.org)
+ - 🪡 Makers website: [FreeSewing.eu](https://freesewing.eu)
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
**Social media**
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
- - 🐘 Mastodon: [freesewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
**Places the FreeSewing community hangs out**
+ - 💬 [Forum](https://forum.freesewing.eu/)
- 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
## Where to get help 🤯
-Check our [support page](https://freesewing.org/support), or use
-the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
## License: MIT 🤓
© [Joost De Cock](https://github.com/joostdecock).
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
+
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
diff --git a/artwork/stickers/sticker-2025.svg b/artwork/stickers/sticker-2025.svg
new file mode 100644
index 00000000000..37baf7601f5
--- /dev/null
+++ b/artwork/stickers/sticker-2025.svg
@@ -0,0 +1,754 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org
+ FreeSewin
+
+
+
+ org
+ r
+ g
+ FreeSewin
+
+ r
+ e
+ e
+ S
+ e
+ w
+ i
+ n
+
+ o
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/authors.mjs b/config/authors.mjs
deleted file mode 100644
index c9dc6fef527..00000000000
--- a/config/authors.mjs
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * A list of (documentation) authors.
- * The ID is the (future v3) FreeSewing user ID (zero for now)
- * The name is what we'll use as display name
- */
-export const authors = {
- /*
- * For these we know their FreeSewing ID and they are ordered by that ID
- * Which means new users/contributors will typically go at the bottom
- */
-
- // The dinosaurs
- joostdecock: { id: 1, name: 'Joost De Cock' },
- mocked: { id: 8, name: 'Unknown (mocked in dev)' },
- 'Prof. dr. Sorcha Ní Dhubhghaill': { id: 9, name: 'Prof. dr. Sorcha Ní Dhubhghaill' },
- woutervdub: { id: 132, name: 'Wouter van Wageningen' },
- tangerineshark: { id: 13050, name: 'tangerineshark' },
- Zee: { id: 13460, name: 'Zee' },
- Natalia: { id: 19867, name: 'Natalia Sayang' },
-
- // The old guard
- 'Sanne Kalkman': { id: 20343, name: 'Sanne Kalkman' },
- bobgeorgethe3rd: { id: 20650, name: 'bobgeorgethe3rd' },
- Tríona: { id: 22104, name: 'Tríona' },
- starfetch: { id: 22708, name: 'starfetch' },
- 'Morgan Frost': { id: 23957, name: 'Morgan Frost' },
- jackseye: { id: 25383, name: 'jackseye' },
- 'Nick Dower': { id: 26126, name: 'Nick Dower' },
- jgfichte: { id: 26295, name: 'jgfichte' },
- 'anna-puk': { id: 26981, name: 'Anna Puk' },
- 'Enoch Riese': { id: 28119, name: 'Enoch Riese' },
- benjamesben: { id: 28838, name: 'Benjamin' },
- 'Joe Schofield': { id: 28809, name: 'Joe Schofield' },
- 'Vili Sinervä': { id: 31336, name: 'Vili Sinervä' },
- Thrunic: { id: 33070, name: 'Thrunic' },
-
- // The new faces
- 'Paula Vidas': { id: 64919, name: 'Paula Vidas' },
- 'Jonathan Haas': { id: 71843, name: 'Jonathan Haas' },
-
- /*
- * For the folowwing authors, we don't have their FreeSewing ID
- * so if they surface, we should try to get it.
- * Then again, these are based on git contributions, so it's
- * entirely possible that they don't have an account.
- * They are all linked to the anonymous user (id 8)
- */
- 'Annie Kao': { id: 8, name: 'Annie Kao' },
- Bart: { id: 8, name: 'Bart' },
- 'James Bradbury': { id: 8, name: 'James Bradbury' },
- 'Glenn Matthews': { id: 8, name: 'Glenn Matthews' },
- 'Raphael Sizemore': { id: 8, name: 'Raphael Sizemore' },
- mergerg: { id: 9, name: 'mergerg' },
- 'Darigov Research': { id: 8, name: 'Darigov Research' },
- 'Jeroen Hoek': { id: 8, name: 'Jeroen Hoek' },
- chri5b: { id: 8, name: 'chri5b' },
- 'Ivo Bek': { id: 8, name: 'Ivo Bek' },
- bijay_d: { id: 8, name: 'bijay_d' },
-}
-
-/*
- * Maps git commiter name to author for those cases where the
- * name in the authors table is different
- */
-export const gitToAuthor = {
- 'Joost De Cock': 'joostdecock',
- 'Benjamin F': 'benjamesben',
- 'Benjamin Fan': 'benjamesben',
- SeaZeeZee: 'Zee',
- 'Wouter van Wageningen': 'woutervdub',
- 'bobgeorgethe3rd@googlemail.com': 'bobgeorgethe3rd',
- '70777269+tangerineshark@users.noreply.github.com': 'tangerineshark',
- 'thijs.assies@gmail.com': 'MA-TATAS',
- 'Natalia Sayang': 'Natalia',
- '109869956+BenJamesBen@users.noreply.github.com': 'benjamesben',
- 'vili.m.sinerva@gmail.com': 'Vili Sinervä',
- 'bekivo@gmail.com': 'Ivo Bek',
- 'paulavidas@gmail.com': 'Paula Vidas',
- '104308146+KaerMorhan@users.noreply.github.com': 'Morgan Frost',
-}
diff --git a/config/badges.yaml b/config/badges.yaml
index 3bc899d22bb..c908eee223f 100644
--- a/config/badges.yaml
+++ b/config/badges.yaml
@@ -7,22 +7,14 @@ _all:
link: 'https://opensource.org/licenses/MIT'
img: 'https://img.shields.io/npm/l/{{{fullname}}}.svg?label=License'
alt: 'License: MIT'
- deepscan:
- link: 'https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256'
- img: 'https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg'
- alt: 'Code quality on DeepScan'
- issues:
- link: 'https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3A{{name}}'
- img: 'https://img.shields.io/github/issues/freesewing/freesewing/pkg:{{name}}.svg?label=Issues'
- alt: 'Open issues tagged pkg:{{name}}'
contributors:
link: '#contributors-'
img: 'https://img.shields.io/badge/all_contributors-{{ name }}-pink.svg'
alt: 'All Contributors'
_social:
- twitter:
- link: 'https://twitter.com/freesewing_org'
- img: 'https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15'
+ forum:
+ link: 'https://forum.freesewing.org'
+ img: 'https://img.shields.io/badge/%F3%A0%80%A0-Forum-E4405F.svg?logo=discourse&logoColor=white&logoWidth=15'
alt: 'Follow @freesewing_org on Twitter'
discord:
link: 'https://chat.freesewing.org'
@@ -32,7 +24,3 @@ _social:
link: 'https://freesewing.org/patrons/join'
img: 'https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15'
alt: 'Become a FreeSewing Patron'
- instagram:
- link: 'https://instagram.com/freesewing_org'
- img: 'https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15'
- alt: 'Follow @freesewing_org on Twitter'
diff --git a/config/changelog.yaml b/config/changelog.yaml
index ad2170cd8d2..c831ee199cf 100644
--- a/config/changelog.yaml
+++ b/config/changelog.yaml
@@ -1,8 +1,32 @@
Unreleased:
+ Changed:
+
+4.0.0:
+ date: 2024-04-01
+
+ Breaking:
+ core:
+ - FreeSewing new requires NodeJS 20 (or more recent)
+ - We removed all but English translations. We still support i18n in our core library and designs, but no longer provide translations
+ new-design:
+ - The `@freesewing/new-design` package is removed, use `@freesewing/studio` instead
+
Added:
+ collection:
+ - Added a new `@freesewing/collection` package that bundles all our designs
+ config:
+ - Added a new `@freesewing/config` package for shared configuration
core:
- The `Path.rotate()` method was added to the core API.
- The `Path.circleSegment()` method was added to the core API.
+ i18n:
+ - The `@freesewing/i18n` package holds translations in English for where they are needed
+ react:
+ - The `@freesewing/react` package holds shared components, hooks, and context for our React-based frontends
+ studio:
+ - Added `@freesewing/studio`, our new development environment
+ utils:
+ - Added a new `@freesewing/utils` package for shared utils
Changed:
brian:
diff --git a/config/dependencies.yaml b/config/dependencies.yaml
index bcb070f62b2..e5521150fd8 100644
--- a/config/dependencies.yaml
+++ b/config/dependencies.yaml
@@ -13,6 +13,9 @@ _types:
dev:
'mocha': *mocha
'chai': *chai
+#
+# Designs
+#
aaron:
peer:
'@freesewing/brian': *freesewing
@@ -45,21 +48,6 @@ charlie:
peer:
'@freesewing/titan': *freesewing
'@freesewing/snapseries': *freesewing
-core:
- _:
- '@freesewing/core-plugins': *freesewing
- 'bezier-js': '6.1.4'
- 'hooks': '0.3.2'
- 'lodash.get': &_get '4.4.2'
- 'lodash.set': &_set '4.3.2'
- 'lodash.unset': &_unset '4.5.2'
- 'lodash.clonedeep': '^4.5.0'
- dev:
- 'eslint': &eslint '8.57.0'
- 'nyc': '17.1.0'
- 'mocha': *mocha
- 'chai': *chai
- 'sinon': &sinon '^18.0.0'
diana:
peer:
'@freesewing/brian': *freesewing
@@ -89,15 +77,6 @@ lily:
peer:
'@freesewing/titan': *freesewing
'@freesewing/paco': *freesewing
-new-design:
- _:
- 'axios': &axios '1.7.2'
- 'chalk': '5.3.0'
- 'execa': '9.2.0'
- 'mustache': &mustache '4.2.0'
- 'ora': &ora '8.0.1'
- 'prompts': '2.4.2'
- 'recursive-readdir': '2.2.3'
noble:
peer:
'@freesewing/bella': *freesewing
@@ -105,12 +84,6 @@ paco:
peer:
'@freesewing/titan': *freesewing
'@freesewing/snapseries': *freesewing
-core-plugins:
- dev:
- '@freesewing/plugin-annotations': *freesewing
- '@freesewing/plugin-mirror': *freesewing
- '@freesewing/plugin-round': *freesewing
- '@freesewing/plugin-sprinkle': *freesewing
plugintest:
peer:
'@freesewing/plugin-annotations': *freesewing
@@ -124,24 +97,9 @@ plugintest:
'@freesewing/plugin-sprinkle': *freesewing
'@freesewing/plugin-svgattr': *freesewing
'@freesewing/plugin-theme': *freesewing
-react-components:
- _:
- axios: *axios
- html-react-parser: "^5.0.7"
- nuqs: "^1.17.6"
- react-markdown: "^9.0.1"
- use-local-storage-state: "19.1.0"
- use-session-storage-state: "^19.0.0"
- peer:
- react: "^18.2.0"
-rehype-jargon:
- _:
- 'unist-util-visit': &unist-util-visit '5.0.0'
- 'hast-util-from-html': '2.0.1'
-rehype-highlight-lines:
- _:
- 'unist-util-remove': '4.0.0'
sandy:
+ _:
+ '@freesewing/plugin-ringsector': *freesewing
peer:
'@freesewing/snapseries': *freesewing
shin:
@@ -184,266 +142,139 @@ yuri:
'@freesewing/brian': *freesewing
'@freesewing/plugin-bust': *freesewing
-# Sites go here
-
-backend:
+#
+# Plugins
+#
+core-plugins:
_:
- '@aws-sdk/client-sesv2': '3.592.0'
- '@prisma/client': &prisma '5.15.0'
- 'bcryptjs': '2.4.3'
- 'cors': '2.8.5'
- 'dotenv': '16.4.5'
- 'express': '4.19.2'
- 'js-yaml': &jsyaml '4.1.0'
- 'lodash.get': *_get
- 'mustache': *mustache
- 'otplib': '12.0.1'
- 'passport': '0.7.0'
- 'passport-http': '0.3.0'
- 'passport-jwt': '4.0.1'
- 'pino': '9.2.0'
- 'qrcode': '1.5.3'
- 'swagger-ui-dist': '5.17.10'
- 'swagger-ui-express': '5.0.0'
+ '@freesewing/plugin-annotations': *freesewing
+ '@freesewing/plugin-measurements': *freesewing
+ '@freesewing/plugin-mirror': *freesewing
+ '@freesewing/plugin-round': *freesewing
+ '@freesewing/plugin-sprinkle': *freesewing
+ '@freesewing/plugin-bin-pack': *freesewing
+
+#
+# Packages
+#
+core:
+ _:
+ '@freesewing/core-plugins': *freesewing
+ 'bezier-js': '6.1.4'
+ 'hooks': '0.3.2'
+ 'lodash.get': &_get '4.4.2'
+ 'lodash.set': &_set '4.3.2'
+ 'lodash.unset': &_unset '4.5.2'
+ 'lodash.clonedeep': '^4.5.0'
dev:
- 'chai': *chai
- 'chai-http': '5.1.1'
- 'esbuild': '0.21.3'
+ 'eslint': &eslint '8.57.0'
+ 'nyc': '17.1.0'
'mocha': *mocha
- 'mocha-steps': '1.3.0'
- 'nodemon': '3.1.0'
- 'prisma': *prisma
-
-dev:
+ 'chai': *chai
+ 'sinon': &sinon '^18.0.0'
+collection:
_:
- '@mdx-js/mdx': &mdx '^3.0.0'
- '@mdx-js/react': *mdx
- '@mdx-js/runtime': &mdxRuntime '2.0.0-next.9'
- '@next/bundle-analyzer': &next '14.2.3'
- '@tailwindcss/typography': &tailwindTypography '0.5.13'
- 'algoliasearch': &algoliasearch '4.23.3'
- 'daisyui': &daisyui '4.11.1'
- 'lodash.get': *_get
- 'lodash.orderby': &_orderby '4.6.0'
- 'lodash.set': *_set
- 'next': *next
- 'react': &react '18.3.1'
- 'react-copy-to-clipboard': &reactCopyToClipboard '5.1.0'
- 'react-dom': *react
- 'react-hotkeys-hook': &reactHotkeysHook '4.5.0'
- 'react-instantsearch-dom': &reactInstantsearchDom '6.40.4'
- 'react-instantsearch-hooks-web': &reactInstantsearchHooksWeb '6.47.3'
- 'react-swipeable': &reactSwipeable '7.0.1'
- 'react-timeago': &reactTimeago '7.2.0'
- 'rehype-autolink-headings': &rehypeAutolinkHeadings '7.1.0'
- 'rehype-highlight': &rehypeHighlight '7.0.0'
- 'rehype-sanitize': &rehypeSanitize '6.0.0'
- 'rehype-slug': &rehypeSlug '6.0.0'
- 'rehype-stringify': &rehypeStringify '10.0.1'
- 'remark': &remark 15.0.1
- # see: https://github.com/npm/cli/issues/2610#issuecomment-1295371753
- 'remark-copy-linked-files': &remarkCopyLinkedFiles 'git+https://git@github.com/joostdecock/remark-copy-linked-files'
- 'remark-gfm': &remarkGfm '4.0.0'
- 'strip-markdown': &stripMarkdown 6.0.0
- dev: &nextSiteDevDependencies
- 'autoprefixer': &autoprefixer '10.4.19'
- 'js-yaml': &jsYaml '4.1.0'
- 'postcss': &postcss '8.4.38'
- 'remark-extract-frontmatter': '3.2.0'
- 'remark-mdx-frontmatter': &mdxfrontmatter '5.0.0'
- 'tailwindcss': &tailwindcss '3.4.3'
- 'yaml-loader': '0.8.1'
-
-lab:
+ # Designs
+ '@freesewing/aaron': *freesewing
+ '@freesewing/albert': *freesewing
+ '@freesewing/bee': *freesewing
+ '@freesewing/bella': *freesewing
+ '@freesewing/benjamin': *freesewing
+ '@freesewing/bent': *freesewing
+ '@freesewing/bibi': *freesewing
+ '@freesewing/bob': *freesewing
+ '@freesewing/bonny': *freesewing
+ '@freesewing/breanna': *freesewing
+ '@freesewing/brian': *freesewing
+ '@freesewing/bruce': *freesewing
+ '@freesewing/carlita': *freesewing
+ '@freesewing/carlton': *freesewing
+ '@freesewing/cathrin': *freesewing
+ '@freesewing/charlie': *freesewing
+ '@freesewing/cornelius': *freesewing
+ '@freesewing/diana': *freesewing
+ '@freesewing/florence': *freesewing
+ '@freesewing/florent': *freesewing
+ '@freesewing/gozer': *freesewing
+ '@freesewing/hi': *freesewing
+ '@freesewing/holmes': *freesewing
+ '@freesewing/hortensia': *freesewing
+ '@freesewing/huey': *freesewing
+ '@freesewing/hugo': *freesewing
+ '@freesewing/jaeger': *freesewing
+ '@freesewing/jane': *freesewing
+ '@freesewing/lily': *freesewing
+ '@freesewing/lucy': *freesewing
+ '@freesewing/lumina': *freesewing
+ '@freesewing/lumira': *freesewing
+ '@freesewing/lunetius': *freesewing
+ '@freesewing/noble': *freesewing
+ '@freesewing/octoplushy': *freesewing
+ '@freesewing/onyx': *freesewing
+ '@freesewing/opal': *freesewing
+ '@freesewing/otis': *freesewing
+ '@freesewing/paco': *freesewing
+ '@freesewing/penelope': *freesewing
+ '@freesewing/sandy': *freesewing
+ '@freesewing/shelly': *freesewing
+ '@freesewing/shin': *freesewing
+ '@freesewing/simon': *freesewing
+ '@freesewing/simone': *freesewing
+ '@freesewing/skully': *freesewing
+ '@freesewing/sven': *freesewing
+ '@freesewing/tamiko': *freesewing
+ '@freesewing/teagan': *freesewing
+ '@freesewing/tiberius': *freesewing
+ '@freesewing/titan': *freesewing
+ '@freesewing/trayvon': *freesewing
+ '@freesewing/tristan': *freesewing
+ '@freesewing/uma': *freesewing
+ '@freesewing/umbra': *freesewing
+ '@freesewing/wahid': *freesewing
+ '@freesewing/walburga': *freesewing
+ '@freesewing/waralee': *freesewing
+ '@freesewing/yuri': *freesewing
+ # Plugins
+ '@freesewing/plugin-bust': *freesewing
+ '@freesewing/plugin-flip': *freesewing
+ '@freesewing/core-plugins': *freesewing
+ # Other
+ '@freesewing/core': *freesewing
+ '@freesewing/snapseries': *freesewing
+studio:
_:
- '@mdx-js/mdx': *mdx
- '@mdx-js/react': *mdx
- '@mdx-js/runtime': *mdxRuntime
- '@tailwindcss/typography': *tailwindTypography
- 'algoliasearch': *algoliasearch
- 'd3-dispatch': &d3dispatch '3.0.1'
- 'd3-drag': &d3drag '3.0.0'
- 'd3-selection': &d3selection '3.0.0'
- 'daisyui': *daisyui
- 'i18next': &i18next '23.11.5'
- 'lodash.get': *_get
- 'lodash.orderby': *_orderby
- 'lodash.set': *_set
- 'next': *next
- 'next-i18next': &nextI18next '15.3.0'
- 'ora': *ora
- 'react': *react
- 'react-copy-to-clipboard': *reactCopyToClipboard
- 'react-hotkeys-hook': *reactHotkeysHook
- 'react-i18next': &reactI18next '14.1.2'
- 'react-instantsearch-dom': *reactInstantsearchDom
- 'react-swipeable': *reactSwipeable
- 'react-timeago': *reactTimeago
- 'rehype-autolink-headings': *rehypeAutolinkHeadings
- 'rehype-highlight': *rehypeHighlight
- 'rehype-sanitize': *rehypeSanitize
- 'rehype-slug': *rehypeSlug
- 'rehype-stringify': *rehypeStringify
- 'remark-copy-linked-files': *remarkCopyLinkedFiles
- 'remark-gfm': *remarkGfm
- 'remark-mdx-frontmatter': *mdxfrontmatter
- dev:
- *nextSiteDevDependencies
-
-org:
+ chalk: "^5.2.0"
+ execa: "^9.5.2"
+ glob: "^11.0.1"
+ ora: "^8.2.0"
+ prompts: "^2.4.2"
+react:
_:
- '@bugsnag/js': &bugsnag 7.23.0
- '@bugsnag/plugin-react': 8.1.1
- '@mdx-js/mdx': *mdx
- '@mdx-js/react': *mdx
- '@mdx-js/runtime': *mdxRuntime
- "@tailwindcss/nesting": &twnesting "^0.0.0-insiders.565cd3e"
- '@tailwindcss/typography': *tailwindTypography
- 'algoliasearch': *algoliasearch
- 'react-copy-to-clipboard': *reactCopyToClipboard
- 'daisyui': *daisyui
- 'echarts': &echarts 5.5.0
- 'echarts-for-react': &echartsReact 3.0.2
- 'jotai': &jotai '2.8.3'
- 'jotai-location': &jotai-location '0.5.5'
- 'lodash.get': *_get
- 'lodash.orderby': *_orderby
- 'lodash.set': *_set
- 'luxon': '3.5.0'
- 'next': *next
- 'next-i18next': *nextI18next
- 'ora': *ora
- 'react': *react
- 'react-dom': *react
- 'react-dropzone': &dropzone '14.2.3'
- 'react-hotkeys-hook': *reactHotkeysHook
- "react-i18next": *reactI18next
- 'react-instantsearch-dom': *reactInstantsearchDom
- 'react-instantsearch-hooks-web': *reactInstantsearchHooksWeb
- 'react-swipeable': *reactSwipeable
- 'react-timeago': *reactTimeago
- 'react-zoom-pan-pinch': &zoompanpinch '3.4.4'
- 'rehype-autolink-headings': *rehypeAutolinkHeadings
- 'rehype-highlight': *rehypeHighlight
- 'rehype-sanitize': *rehypeSanitize
- 'rehype-slug': *rehypeSlug
- 'rehype-stringify': *rehypeStringify
- 'remark': *remark
- 'remark-copy-linked-files': *remarkCopyLinkedFiles
- 'remark-gfm': *remarkGfm
- 'remark-mdx-frontmatter': *mdxfrontmatter
- 'strip-markdown': *stripMarkdown
- 'use-local-storage-state': &use-local-storage-state 19.2.0
- 'yaml-loader': 0.8.1
- dev: *nextSiteDevDependencies
-
-shared:
+ "@codemirror/lang-yaml": "^6.1.2"
+ "@uiw/react-codemirror": "^4.23.8"
+ d3-drag: "3.0.0"
+ d3-selection: "3.0.0"
+ diff: "^7.0.0"
+ echarts: "^5.6.0"
+ echarts-for-react: "^3.0.2"
+ file-saver: "^2.0.5"
+ "highlight.js": "^11.11.1"
+ html-react-parser: "^5.2.2"
+ jotai: "^2.12.1"
+ jotai-location: "^0.5.5"
+ luxon: "^3.5.0"
+ mustache: "^4.2.0"
+ pdfkit: "^0.16.0"
+ react-diff-viewer-continued: "^4.0.5"
+ react-dropzone: "^14.3.5"
+ react-zoom-pan-pinch: "^3.7.0"
+ svg-to-pdfkit: "^0.1.8"
+ use-local-storage-state: "^19.5.0"
+ web-worker: "^1.5.0"
+ yaml: "^2.7.0"
+ peer:
+ react: &react "^19.0.0"
+utils:
_:
- '@next/mdx': *next
- '@resvg/resvg-js': '2.6.2'
- '@tailwindcss/typography': *tailwindTypography
- 'Buffer': '0.0.0'
- 'd3-dispatch': '3.0.1'
- 'd3-drag': '3.0.0'
- 'd3-selection': '3.0.0'
- 'daisyui': *daisyui
- 'feed': '4.2.2'
- 'file-saver': &filesaver '2.0.5'
- 'front-matter': '4.0.2'
- 'highlight.js': '11.9.0'
- 'github-slugger': '2.0.0'
- 'jotai': *jotai
- 'jotai-location': *jotai-location
- 'lodash.clonedeep': '4.5.0'
- 'lodash.debounce': &_debounce '^4.0.8'
- 'lodash.orderby': *_orderby
- 'lodash.unset': *_unset
- 'lodash.get': *_get
- 'mdast-util-toc': '7.0.1'
- 'mermaid': '11.3.0'
- 'ora': *ora
- 'pdfkit': &pdfkit '0.15.0'
- 'postcss-for': &postcssfor '2.1.1'
- 'react': *react
- 'react-dom': *react
- 'react-timeago': *reactTimeago
- 'react-zoom-pan-pinch': *zoompanpinch
- 'rehype-autolink-headings': *rehypeAutolinkHeadings
- 'rehype-highlight': *rehypeHighlight
- 'remark-frontmatter': &remarkfrontmatter '5.0.0'
- 'remark-mdx-frontmatter': *mdxfrontmatter
- "remark-smartypants": &smartypants "3.0.2"
- "slugify": &slugify "^1.6.6"
- # see: https://github.com/npm/cli/issues/2610#issuecomment-1295371753
- 'svg-to-pdfkit': &svgtopdfkit 'https://git@github.com/eriese/SVG-to-PDFKit'
- 'tlds': &rlds '1.252.0'
- 'to-vfile': '8.0.0'
- 'unist-util-visit': *unist-util-visit
- 'use-local-storage-state': *use-local-storage-state
- 'web-worker': &webworker '1.3.0'
- dev:
- 'recursive-readdir': '^2.2.3'
- 'html-to-text': '^9.0.5'
-
-sde:
- _:
- "@freesewing/core": *freesewing
- "@freesewing/core-plugins": *freesewing
- "@freesewing/brian": *freesewing
- "@freesewing/bent": *freesewing
- "@freesewing/titan": *freesewing
- "@freesewing/bella": *freesewing
- "@freesewing/breanna": *freesewing
- "@freesewing/plugin-bust": *freesewing
- "@freesewing/plugin-timing": *freesewing
- "@freesewing/plugin-theme": *freesewing
- "@freesewing/plugin-i18n": *freesewing
- "@freesewing/snapseries": *freesewing
- "@freesewing/react-components": *freesewing
- '@mdx-js/mdx': *mdx
- '@mdx-js/react': *mdx
- '@mdx-js/runtime': *mdxRuntime
- "@tailwindcss/nesting": *twnesting
- '@tailwindcss/typography': *tailwindTypography
- 'autoprefixer': *autoprefixer
- 'axios': *axios
- 'd3-dispatch': *d3dispatch
- 'd3-drag': *d3drag
- 'd3-selection': *d3selection
- 'daisyui': *daisyui
- 'echarts': *echarts
- 'echarts-for-react': *echartsReact
- 'file-saver': *filesaver
- 'i18next': *i18next
- 'jotai': *jotai
- 'jotai-location': *jotai-location
- 'js-yaml': *jsyaml
- 'lodash.debounce': *_debounce
- 'lodash.get': *_get
- 'lodash.orderby': *_orderby
- 'lodash.set': *_set
- 'mustache': *mustache
- "next": *next
- 'next-i18next': *nextI18next
- 'pdfkit': *pdfkit
- 'postcss-for': *postcssfor
- "react": *react
- "react-dom": *react
- 'react-copy-to-clipboard': *reactCopyToClipboard
- 'react-hotkeys-hook': *reactHotkeysHook
- "react-i18next": *reactI18next
- 'react-dropzone': *dropzone
- 'react-swipeable': *reactSwipeable
- 'react-timeago': *reactTimeago
- 'react-zoom-pan-pinch': *zoompanpinch
- 'remark-gfm': *remarkGfm
- 'remark-frontmatter': *remarkfrontmatter
- 'remark-mdx-frontmatter': *mdxfrontmatter
- 'remark-smartypants': *smartypants
- "slugify": *slugify
- 'svg-to-pdfkit': *svgtopdfkit
- 'tailwindcss': *tailwindcss
- 'tlds': *rlds
- 'use-local-storage-state': *use-local-storage-state
- 'web-worker': *webworker
-
+ lodash: "^4.17.21"
+ tlds: "^1.255.0"
diff --git a/config/exceptions.yaml b/config/exceptions.yaml
index 778c7d0f2cc..52db272d56f 100644
--- a/config/exceptions.yaml
+++ b/config/exceptions.yaml
@@ -1,19 +1,11 @@
noNamespace:
- rehype-jargon
- rehype-highlight-lines
-customBuild:
- - i18n
- - new-design
- - prettier-config
- - core-plugins
- - react-components
- - rehype-jargon
- - rehype-highlight-lines
skipTests:
- theo
packageJson:
backend:
- name: backend.freesewing.org
+ name: backend.freesewing.eu
bee:
author: bobgeorgethe3rd (https://github.com/bobgeorgethe3rd)
benjamin:
@@ -30,8 +22,6 @@ packageJson:
author: woutervdub (https://github.com/woutervdub)
holmes:
author: AlfaLyr (https://github.com/alfalyr)
- i18n:
- private: true
jane:
author: SeaZeeZee (https://github.com/SeaZeeZee)
lab:
@@ -44,19 +34,16 @@ packageJson:
author: Starfetch (https://github.com/starfetch)
magde:
author: clegganator259 (https://github.com/clegganator259)
- new-design:
+ studio:
exports: '!'
bin:
- new-design: './index.mjs'
+ studio: './index.mjs'
files:
- - README.md
- - package.json
- - lib/**/*
- - shared/**/*
- - templates/**/*
- - index.mjs
- - package.json
- - data.mjs
+ - "lib/"
+ - "utils/"
+ - "index.mjs"
+ - "template/"
+ - "template/designs/.base/"
module: '!'
noble:
author: woutervdub (https://github.com/woutervdub)
@@ -67,26 +54,99 @@ packageJson:
prettier-config:
type: 'module'
exports: { .: './index.json' }
- scripts: { build: 'echo "prettier-config: No build required" && exit 0' }
keywords:
- prettier
files:
- index.json
- package.json
- react-components:
+ react:
exports:
".":
"internal": "./src/index.mjs"
"default": "./dist/index.mjs"
+ # Legacy
"./linedrawings": "./src/linedrawings/index.mjs"
"./pattern": "./src/pattern/index.mjs"
"./xray": "./src/pattern-xray/index.mjs"
+ # Components
+ "./components/Account": "./components/Account/index.mjs"
+ "./components/Admin": "./components/Admin/index.mjs"
+ "./components/Breadcrumbs": "./components/Breadcrumbs/index.mjs"
+ "./components/Button": "./components/Button/index.mjs"
+ "./components/Collection": "./components/Collection/index.mjs"
+ "./components/Control": "./components/Control/index.mjs"
+ "./components/CopyToClipboardButton": "./components/CopyToClipboardButton/index.mjs"
+ "./components/Design": "./components/Design/index.mjs"
+ "./components/DiffViewer": "./components/DiffViewer/index.mjs"
+ "./components/Docusaurus": "./components/Docusaurus/index.mjs"
+ "./components/Echart": "./components/Echart/index.mjs"
+ "./components/Editor": "./components/Editor/index.mjs"
+ "./components/Heading": "./components/Heading/index.mjs"
+ "./components/Highlight": "./components/Highlight/index.mjs"
+ "./components/Icon": "./components/Icon/index.mjs"
+ "./components/Input": "./components/Input/index.mjs"
+ "./components/Json": "./components/Json/index.mjs"
+ "./components/KeyVal": "./components/KeyVal/index.mjs"
+ "./components/Layout": "./components/Layout/index.mjs"
+ "./components/LineDrawing": "./components/LineDrawing/index.mjs"
+ "./components/Link": "./components/Link/index.mjs"
+ "./components/Logo": "./components/Logo/index.mjs"
+ "./components/Markdown": "./components/Markdown/index.mjs"
+ "./components/Mini": "./components/Mini/index.mjs"
+ "./components/Modal": "./components/Modal/index.mjs"
+ "./components/New": "./components/New/index.mjs"
+ "./components/Newsletter": "./components/Newsletter/index.mjs"
+ "./components/Null": "./components/Null/index.mjs"
+ "./components/Number": "./components/Number/index.mjs"
+ "./components/Pattern": "./components/Pattern/index.mjs"
+ "./components/Patrons": "./components/Patrons/index.mjs"
+ "./components/Popout": "./components/Popout/index.mjs"
+ "./components/Profile": "./components/Profile/index.mjs"
+ "./components/Role": "./components/Role/index.mjs"
+ "./components/SignIn": "./components/SignIn/index.mjs"
+ "./components/SignUp": "./components/SignUp/index.mjs"
+ "./components/Spinner": "./components/Spinner/index.mjs"
+ "./components/Stats": "./components/Stats/index.mjs"
+ "./components/Tab": "./components/Tab/index.mjs"
+ "./components/Table": "./components/Table/index.mjs"
+ "./components/Time": "./components/Time/index.mjs"
+ "./components/Uuid": "./components/Uuid/index.mjs"
+ "./components/Ux": "./components/Ux/index.mjs"
+ "./components/Yaml": "./components/Yaml/index.mjs"
+ "./components/Xray": "./components/Xray/index.mjs"
+ # Context
+ "./context/LoadingStatus": "./context/LoadingStatus/index.mjs"
+ "./context/Modal": "./context/Modal/index.mjs"
+ # Hooks
+ "./hooks/useAccount": "./hooks/useAccount/index.mjs"
+ "./hooks/useBackend": "./hooks/useBackend/index.mjs"
+ "./hooks/useControl": "./hooks/useControl/index.mjs"
+ "./hooks/useDesign": "./hooks/useDesign/index.mjs"
+ "./hooks/useDesignTranslation": "./hooks/useDesignTranslation/index.mjs"
+ "./hooks/useSelection": "./hooks/useSelection/index.mjs"
+ "./hooks/useStateObject": "./hooks/useStateObject/index.mjs"
+ # Lib
+ "./lib/RestClient": "./lib/RestClient/index.mjs"
+ "./lib/logoPath": "./components/Logo/path.mjs"
+ files:
+ - "components/"
+ - "context/"
+ - "hooks/"
+ - "lib/"
+ - "README.md"
+ scripts:
+ lint: "eslint 'components/**/*.mjs' 'hooks/**/*.mjs' 'lib/**/*.mjs' 'context/**/*.mjs' 'config/**/*.mjs'"
+ prettier: "npx prettier --write 'components/**/*.mjs' 'hooks/**/*.mjs' 'lib/**/*.mjs' 'context/**/*.mjs' 'config/**/*.mjs'"
+
rehype-hightlight-lines:
private: true
sandy:
author: AlfaLyr (https://github.com/alfalyr)
shelly:
author: Thrunic (https://github.com/Thrunic)
+ utils:
+ exports: '!'
+ module: "./src/index.mjs"
onyx:
author: Thrunic (https://github.com/Thrunic)
opal:
diff --git a/config/languages.json b/config/languages.json
index d98bcf47368..c68c1808a39 100644
--- a/config/languages.json
+++ b/config/languages.json
@@ -1 +1 @@
-["en", "fr", "es", "de", "nl", "uk"]
+["en"]
diff --git a/config/pattern-options.js b/config/pattern-options.js
deleted file mode 100644
index b91e171be89..00000000000
--- a/config/pattern-options.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- models: {},
- only: {},
-}
diff --git a/config/scripts.yaml b/config/scripts.yaml
index 20e1df6b560..8eda0a200b5 100644
--- a/config/scripts.yaml
+++ b/config/scripts.yaml
@@ -1,12 +1,6 @@
_:
- build: &build 'node build.mjs'
- 'build:all': 'yarn build'
- clean: 'rimraf dist'
- mbuild: &mbuild 'NO_MINIFY=1 node build.mjs'
symlink: 'mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -'
test: 'echo "{{name}}: No tests configured. Perhaps you could write some?" && exit 0'
- vbuild: &vbuild 'VERBOSE=1 node build.mjs'
- lab: 'cd ../../sites/lab && yarn start'
tips: 'node ../../scripts/help.mjs'
lint: "npx eslint 'src/**' 'tests/*.mjs'"
_types:
@@ -27,89 +21,38 @@ core:
jsdoc: 'jsdoc -c jsdoc.json -r src'
models:
test: 'npx mocha tests/*.test.mjs'
-new-design:
- i18n-only: 'SITE="new-design/shared" node --conditions=internal ../../sites/shared/prebuild/i18n-only.mjs'
- wbuild: '!'
+studio:
lint: "npx eslint 'lib/*.mjs'"
- mbuild: '!'
- prebuild: 'node --conditions=internal ./prebuild.mjs'
test: '!'
testci: '!'
- vbuild: '!'
rehype-highlight-lines:
- build: '!'
- mbuild: '!'
- vbuild: '!'
- 'build:all': '!'
lint: "npx eslint 'src/*.mjs'"
rehype-jargon:
lint: "npx eslint 'src/*.mjs'"
snapseries:
lint: "npx eslint 'src/*.mjs'"
-react-components:
+react:
lint: "eslint 'src/**/*.mjs'"
# Sites go here
backend:
- build: 'node build.mjs'
- clean: 'rimraf dist'
dev: 'nodemon src/index.mjs'
initdb: 'npx prisma db push'
- mbuild: *mbuild
newdb: 'node ./scripts/newdb.mjs'
prettier: "npx prettier --write 'src/*.mjs' 'tests/*.mjs'"
rmdb: 'node ./scripts/rmdb.mjs'
test: 'npx mocha --require mocha-steps tests/index.mjs'
- vbuild: *vbuild
-dev:
- build: &nextBuild 'next build'
- cibuild: 'yarn build && node scripts/algolia.mjs'
- clean: &nextClean 'rimraf prebuild/* && rimraf public/locales/*/* && rimraf public/feeds/* && rimraf ../shared/prebuild/data/*'
- dev: &nextDev 'next dev -p 8000'
- develop: *nextDev
- i18n: "SITE=dev node --conditions=internal ../shared/prebuild/i18n-only.mjs"
- lint: &nextLint 'next lint'
- prebuild: &sitePrebuild 'node --conditions=internal --experimental-json-modules ./prebuild.mjs'
- serve: "pm2 start npm --name 'dev' -- run start"
- start: &nextStart 'yarn prebuild && yarn dev'
+dev: &docusaurus
+ build: 'docusaurus build'
+ dev: 'docusaurus start'
+ lint: 'docusuaurus lint'
+ prebuild: 'node --conditions=internal --experimental-json-modules ./prebuild.mjs'
+ start: 'docusaurus start'
email:
build: 'maizzle build production'
dev: 'maizzle serve'
-lab:
- build: *nextBuild
- cibuild: 'yarn build'
- dev: *nextDev
- develop: *nextDev
- i18n: 'SITE=lab node --conditions=internal ../shared/prebuild/i18n-only.mjs'
- lint: *nextLint
- prebuild: *sitePrebuild
- start: 'cd ../org && yarn prebuild && cd - && yarn prebuild && yarn dev'
+org: *docusaurus
-sde:
- build: *nextBuild
- cibuild: 'yarn build'
- dev: *nextDev
- develop: *nextDev
- i18n: 'SITE=sde node --conditions=internal ../shared/prebuild/i18n-only.mjs'
- lint: *nextLint
- prebuild: *sitePrebuild
- start: *nextStart
-
-org:
- build: *nextBuild
- cibuild: 'yarn build'
- clean: *nextClean
- dev: *nextDev
- develop: *nextDev
- i18n: 'SITE=org node --conditions=internal ../shared/prebuild/i18n-only.mjs'
- lint: *nextLint
- prebuild: *sitePrebuild
- start: *nextStart
-
-sanity:
- dev: 'sanity dev'
- start: 'sanity start'
- build: 'sanity build -y'
diff --git a/config/social.mjs b/config/social.mjs
deleted file mode 100644
index 0b2ad9dcb4e..00000000000
--- a/config/social.mjs
+++ /dev/null
@@ -1,10 +0,0 @@
-export const social = {
- YouTube: 'https://www.youtube.com/@freesewing',
- Discord: 'https://discord.freesewing.org/',
- Instagram: 'https://instagram.com/freesewing_org',
- Facebook: 'https://www.facebook.com/groups/627769821272714/',
- GitHub: 'https://github.com/freesewing',
- Reddit: 'https://www.reddit.com/r/freesewing/',
- Mastodon: 'https://freesewing.social/@freesewing',
- Bluesky: 'https://bsky.app/profile/freesewing.org',
-}
diff --git a/config/software/designs.json b/config/software/designs.json
index 147150bb620..93ce52c9bad 100644
--- a/config/software/designs.json
+++ b/config/software/designs.json
@@ -4,8 +4,6 @@
"description": "A FreeSewing pattern for a A-shirt or tank top",
"design": "Joost De Cock",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"tops",
"underwear"
@@ -13,8 +11,8 @@
"techniques": [
"hem",
"stretch",
- "knitBinding",
- "curvedSeam"
+ "knit-binding",
+ "curved-seam"
]
},
"albert": {
@@ -22,15 +20,13 @@
"description": "A FreeSewing pattern for an apron",
"design": "Wouter Van Wageningen",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"accessories"
],
"techniques": [
"hem",
- "knitBinding",
- "curvedSeam",
+ "knit-binding",
+ "curved-seam",
"pocket"
]
},
@@ -39,8 +35,6 @@
"description": "A FreeSewing pattern for a bikini top",
"design": "PrudenceRabbit",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops",
"swimwear"
@@ -48,7 +42,7 @@
"techniques": [
"hem",
"stretch",
- "curvedSeam",
+ "curved-seam",
"precision"
]
},
@@ -60,8 +54,6 @@
"Joost De Cock"
],
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
@@ -76,8 +68,6 @@
"description": "A FreeSewing pattern for a bow tie",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"accessories"
],
@@ -91,16 +81,14 @@
"description": "A FreeSewing pattern for a menswear body block with a two-part sleeve",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
],
"techniques": [
"hem",
- "curvedSeam",
- "setSleeve"
+ "curved-seam",
+ "set-sleeve"
]
},
"bibi": {
@@ -108,16 +96,14 @@
"description": "A FreeSewing pattern for a knit top body block",
"design": "Jonathan Haas",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"hem",
- "flatSleeve"
+ "flat-sleeve"
]
},
"bob": {
@@ -125,25 +111,29 @@
"description": "A FreeSewing pattern for a bib",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"infants"
],
"techniques": [
- "biasTape",
- "curvedSeam",
+ "bias-tape",
+ "curved-seam",
"snap"
]
},
+ "bonny": {
+ "code": "Jonathan Haas",
+ "description": "A FreeSewing pattern that turns measurements into a body outline",
+ "design": "Jonathan Haas",
+ "difficulty": 1,
+ "tags": [],
+ "techniques": []
+ },
"breanna": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a basic body block for womenswear",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
@@ -158,15 +148,13 @@
"description": "A FreeSewing pattern for a basic body block for menswear",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
],
"techniques": [
"block",
- "flatSleeve"
+ "flat-sleeve"
]
},
"bruce": {
@@ -174,8 +162,6 @@
"description": "A FreeSewing pattern for boxer briefs",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"underwear"
@@ -183,7 +169,7 @@
"techniques": [
"stretch",
"hem",
- "curvedSeam",
+ "curved-seam",
"elastic"
]
},
@@ -195,8 +181,6 @@
"Joost De Cock"
],
"difficulty": 5,
- "lab": true,
- "org": true,
"tags": [
"tops",
"coats"
@@ -204,12 +188,12 @@
"techniques": [
"hem",
"pocket",
- "curvedSeam",
+ "curved-seam",
"precision",
- "setSleeve",
- "weltPocket",
+ "set-sleeve",
+ "welt-pocket",
"lining",
- "princessSeam",
+ "princess-seam",
"interfacing",
"button"
]
@@ -222,8 +206,6 @@
"Joost De Cock"
],
"difficulty": 5,
- "lab": true,
- "org": true,
"tags": [
"tops",
"coats"
@@ -231,10 +213,10 @@
"techniques": [
"hem",
"pocket",
- "curvedSeam",
+ "curved-seam",
"precision",
- "setSleeve",
- "weltPocket",
+ "set-sleeve",
+ "welt-pocket",
"lining",
"interfacing",
"button"
@@ -248,8 +230,6 @@
"Joost De Cock"
],
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"tops",
"underwear"
@@ -257,7 +237,7 @@
"techniques": [
"boning",
"precision",
- "curvedSeam",
+ "curved-seam",
"interfacing"
]
},
@@ -266,22 +246,20 @@
"description": "A FreeSewing pattern for chino trousers",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
- "weltPocket",
- "curvedSeam",
+ "welt-pocket",
+ "curved-seam",
"interfacing",
"fly",
"zipper",
"button",
"dart",
"hem",
- "seamPocket"
+ "seam-pocket"
]
},
"cornelius": {
@@ -289,14 +267,12 @@
"description": "A FreeSewing pattern for cycling breeches, based on the Keystone drafting system",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"fly",
"zipper",
"button",
@@ -308,35 +284,29 @@
"description": "A FreeSewing pattern for a top with a draped neck",
"design": "Erica Alcusa Sáez",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
- "flatSleeve",
+ "curved-seam",
+ "flat-sleeve",
"hem"
]
},
"examples": {
"code": "Joost De Cock",
- "description": "A FreeSewing pattern holding examples for our documentation",
- "lab": false,
- "org": false
+ "description": "A FreeSewing pattern holding examples for our documentation"
},
"florence": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a face mask",
"design": "Joost De Cock",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"accessories"
],
"techniques": [
- "curvedSeam"
+ "curved-seam"
]
},
"florent": {
@@ -347,14 +317,12 @@
"description": "A FreeSewing pattern for a flat cap",
"design": "Quentin Felix",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"hats"
],
"techniques": [
- "curvedSeam"
+ "curved-seam"
]
},
"gozer": {
@@ -362,8 +330,6 @@
"description": "A FreeSewing pattern for a ghost costume",
"design": "Wouter Van Wageningen",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"costumes"
],
@@ -376,14 +342,12 @@
"description": "A FreeSewing pattern for a shark plush toy",
"design": "Wouter Van Wageningen",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"toys"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"dart"
]
},
@@ -395,14 +359,12 @@
"description": "A FreeSewing pattern for a Sherlock Holmes hat",
"design": "Erica Alcusa Sáez",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"hats"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"lining"
]
},
@@ -414,14 +376,12 @@
"Wouter Van Wageningen"
],
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"bags"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"precision",
"lining",
"zipper"
@@ -432,17 +392,15 @@
"description": "A FreeSewing pattern for a zip-up hoodie",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"pocket",
"zipper",
"ribbing",
- "flatSleeve"
+ "flat-sleeve"
]
},
"hugo": {
@@ -450,16 +408,14 @@
"description": "A FreeSewing pattern for a hooded jumper with raglan sleeves",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"pocket",
"ribbing",
- "raglanSleeve"
+ "raglan-sleeve"
]
},
"jaeger": {
@@ -467,8 +423,6 @@
"description": "A FreeSewing pattern for a sport coat style jacket",
"design": "Joost De Cock",
"difficulty": 5,
- "lab": true,
- "org": true,
"tags": [
"tops",
"coats"
@@ -476,10 +430,10 @@
"techniques": [
"hem",
"pocket",
- "curvedSeam",
+ "curved-seam",
"precision",
- "setSleeve",
- "weltPocket",
+ "set-sleeve",
+ "welt-pocket",
"lining",
"interfacing",
"button"
@@ -490,8 +444,6 @@
"description": "A FreeSewing pattern for a 1790s shift",
"design": "SeaZeeZee",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"tops",
"historical",
@@ -503,24 +455,20 @@
},
"legend": {
"code": "Joost De Cock",
- "description": "A FreeSewing pattern to document pattern notation",
- "lab": false,
- "org": false
+ "description": "A FreeSewing pattern to document pattern notation"
},
"lucy": {
"code": "SeaZeeZee",
"description": "A FreeSewing pattern for a historical tie-on pocket",
"design": "SeaZeeZee",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"historical",
"bags"
],
"techniques": [
- "curvedSeam"
+ "curved-seam"
]
},
"lumina": {
@@ -528,15 +476,13 @@
"description": "A FreeSewing pattern for leggings",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
"stretch",
- "curvedSeam",
+ "curved-seam",
"elastic"
]
},
@@ -545,15 +491,13 @@
"description": "A FreeSewing pattern for leggings",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
"stretch",
- "curvedSeam",
+ "curved-seam",
"elastic"
]
},
@@ -562,8 +506,6 @@
"description": "A FreeSewing pattern for a lacerna, a historical Roman cloak",
"design": "Rika Tamaike",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"tops",
"coats",
@@ -578,8 +520,6 @@
"description": "A FreeSewing pattern for a bike messenger bag",
"design": "clegganator259",
"difficulty": 3,
- "lab": true,
- "org": false,
"tags": [
"accessories",
"bags"
@@ -591,17 +531,15 @@
"description": "A FreeSewing pattern for a princess seam bodice block",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"tops"
],
"techniques": [
"block",
- "curvedSeam",
+ "curved-seam",
"precision",
- "princessSeam"
+ "princess-seam"
]
},
"octoplushy": {
@@ -609,14 +547,12 @@
"description": "A FreeSewing pattern for an octopus plushy toy",
"design": "Wouter Van Wageningen",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"toys"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"precision"
]
},
@@ -625,8 +561,6 @@
"description": "A FreeSewing pattern for one-piece garments",
"design": "Thrunic",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"swimwear",
"pajamas",
@@ -634,7 +568,7 @@
],
"techniques": [
"hem",
- "curvedSeam",
+ "curved-seam",
"stretch",
"lining",
"zipper",
@@ -646,16 +580,14 @@
"description": "A FreeSewing pattern for overalls",
"design": "Thrunic",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"overalls",
"onePiece"
],
"techniques": [
- "flatFelledSeam",
+ "flat-felled-seam",
"hem",
- "curvedSeam",
+ "curved-seam",
"button",
"pocket"
]
@@ -665,8 +597,6 @@
"description": "A FreeSewing pattern for a baby romper",
"design": "Wouter Van Wageningen",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [],
"techniques": []
},
@@ -675,17 +605,15 @@
"description": "A FreeSewing pattern for summer pants",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
"elastic",
- "curvedSeam",
+ "curved-seam",
"pocket",
- "weltPocket",
+ "welt-pocket",
"hem"
]
},
@@ -694,30 +622,24 @@
"description": "A FreeSewing pattern for a pencil skirt",
"design": "Wouter Van Wageningen",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"skirts"
],
"techniques": [
"hem",
- "curvedSeam",
+ "curved-seam",
"precision",
"zipper"
]
},
"plugintest": {
"code": "Joost De Cock",
- "description": "A FreeSewing pattern to test (y)our plugins",
- "lab": true,
- "org": false
+ "description": "A FreeSewing pattern to test (y)our plugins"
},
"rendertest": {
"code": "Joost De Cock",
- "description": "A FreeSewing pattern to test (y)our render engine our CSS",
- "lab": true,
- "org": false
+ "description": "A FreeSewing pattern to test (y)our render engine our CSS"
},
"sandy": {
"code": [
@@ -727,14 +649,12 @@
"description": "A FreeSewing pattern for a circle skirt",
"design": "Erica Alcusa Sáez",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"skirts"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"button",
"hem"
]
@@ -744,8 +664,6 @@
"description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts",
"design": "Thrunic",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"tops",
"swimwear"
@@ -753,8 +671,8 @@
"techniques": [
"hem",
"stretch",
- "curvedSeam",
- "raglanSleeve"
+ "curved-seam",
+ "raglan-sleeve"
]
},
"shin": {
@@ -762,8 +680,6 @@
"description": "A FreeSewing pattern for swim trunks",
"design": "Joost De Cock",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"swimwear"
@@ -771,7 +687,7 @@
"techniques": [
"hem",
"stretch",
- "curvedSeam",
+ "curved-seam",
"elastic"
]
},
@@ -780,8 +696,6 @@
"description": "A FreeSewing pattern for a button down shirt",
"design": "Joost De Cock",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
@@ -789,9 +703,9 @@
"hem",
"button",
"interfacing",
- "curvedSeam",
- "flatFelledSeam",
- "flatSleeve"
+ "curved-seam",
+ "flat-felled-seam",
+ "flat-sleeve"
]
},
"simone": {
@@ -799,8 +713,6 @@
"description": "A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)",
"design": "Joost De Cock",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
@@ -808,9 +720,9 @@
"hem",
"button",
"interfacing",
- "curvedSeam",
- "flatFelledSeam",
- "flatSleeve"
+ "curved-seam",
+ "flat-felled-seam",
+ "flat-sleeve"
]
},
"skully": {
@@ -818,14 +730,12 @@
"description": "A FreeSewing pattern for skully, our logo, a plushy toy",
"design": "Wouter Van Wageningen",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"accessories",
"toys"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"precision"
]
},
@@ -834,14 +744,12 @@
"description": "A FreeSewing pattern for a straightforward sweater",
"design": "Joost De Cock",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
- "flatSleeve",
+ "curved-seam",
+ "flat-sleeve",
"ribbing"
]
},
@@ -850,13 +758,11 @@
"description": "A FreeSewing pattern for a zero-waste top",
"design": "Joost De Cock",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam"
+ "curved-seam"
]
},
"teagan": {
@@ -864,16 +770,14 @@
"description": "A FreeSewing pattern for a T-shirt",
"design": "Joost De Cock",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"hem",
- "flatSleeve",
- "knitBand"
+ "flat-sleeve",
+ "knit-band"
]
},
"tiberius": {
@@ -881,8 +785,6 @@
"description": "A FreeSewing pattern for a tunica, a historical Roman tunic",
"design": "Rika Tamaike",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"tops",
"historical"
@@ -897,8 +799,6 @@
"Joost De Cock"
],
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"blocks",
"bottoms"
@@ -910,8 +810,6 @@
"description": "A FreeSewing pattern for a tie",
"design": "Joost De Cock",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"accessories"
],
@@ -925,13 +823,11 @@
"description": "A FreeSewing pattern for a fitted top with prince(ss) seams",
"design": "Natalia Sayang",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"precision"
]
},
@@ -940,31 +836,27 @@
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
"design": "Joost De Cock",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"underwear"
],
"techniques": [
"elastic",
- "curvedSeam"
+ "curved-seam"
]
},
"umbra": {
- "code": "Joost De Cock, Jonathan Haas",
+ "code": ["Joost De Cock", "Jonathan Haas"],
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
- "design": "Joost De Cock, Jonathan Haas",
+ "design": ["Joost De Cock", "Jonathan Haas"],
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"underwear"
],
"techniques": [
"elastic",
- "curvedSeam"
+ "curved-seam"
]
},
"wahid": {
@@ -972,17 +864,15 @@
"description": "A FreeSewing pattern for a classic fitted waistcoat",
"design": "Joost De Cock",
"difficulty": 4,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"hem",
"interfacing",
"lining",
- "weltPocket",
+ "welt-pocket",
"button"
]
},
@@ -991,8 +881,6 @@
"description": "A FreeSewing pattern for a wappenrock (tabard/surcoat), a historical European/medieval (ish) garment",
"design": "Rika Tamaike",
"difficulty": 1,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"historical"
@@ -1006,16 +894,14 @@
"description": "A FreeSewing pattern for wrap pants",
"design": "Wouter Van Wageningen",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"bottoms",
"trousers"
],
"techniques": [
- "curvedSeam",
+ "curved-seam",
"hem",
- "weltPocket"
+ "welt-pocket"
]
},
"yuri": {
@@ -1023,31 +909,27 @@
"description": "A FreeSewing pattern for a fancy zipless sweater based on the Huey hoodie",
"design": "Biou",
"difficulty": 3,
- "lab": true,
- "org": true,
"tags": [
"tops"
],
"techniques": [
- "curvedSeam",
- "flatSleeve",
+ "curved-seam",
+ "flat-sleeve",
"hem",
"button"
]
},
"lily": {
- "code": "Anna Puk, Joost De Cock",
+ "code": ["Anna Puk", "Joost De Cock"],
"description": "A FreeSewing pattern for basic leggings",
"design": "Anna Puk",
"difficulty": 2,
- "lab": true,
- "org": true,
"tags": [
"bottoms"
],
"techniques": [
"elastic",
- "curvedSeam",
+ "curved-seam",
"hem"
]
}
diff --git a/config/software/packages.json b/config/software/packages.json
index 06c041d81fe..70c52b78bb2 100644
--- a/config/software/packages.json
+++ b/config/software/packages.json
@@ -1,10 +1,12 @@
{
+ "collection": "All FreeSewing designs bundles into one pacakge, our collection",
+ "config": "Various configurations for FreeSewing",
"core": "A library for creating made-to-measure sewing patterns",
+ "i18n": "Translation for the FreeSewing project",
"models": "Body measurements data for a range of default sizes",
- "new-design": "Initializer package for a new FreeSewing design: npx @freesewing/new-design",
+ "studio": "Initializer package for a the FreeSewing design studio: npx @freesewing/studio",
"prettier-config": "FreeSewing's shared configuration for prettier",
- "react-components": "React components by/for FreeSewing",
+ "react": "React components, hooks and context by/for FreeSewing",
"snapseries": "A series of common sizes for elastics and other series to be used with snapped percentage options",
- "rehype-jargon": "A Rehype plugin for jargon terms",
- "rehype-highlight-lines": "A Rehype plugin to add highlighted lines to code blocks"
+ "utils": "A number of utilities, typically used by FreeSewing frontend code"
}
diff --git a/config/templates/build.dflt.mjs b/config/templates/build.dflt.mjs
deleted file mode 100644
index 99ace216bc8..00000000000
--- a/config/templates/build.dflt.mjs
+++ /dev/null
@@ -1,35 +0,0 @@
-/* This script will build the package with esbuild */
-import esbuild from 'esbuild'
-import pkg from './package.json' assert { type: 'json' }
-
-// Create banner based on package info
-const banner = `/**
- * ${pkg.name} | v${pkg.version}
- * ${pkg.description}
- * (c) ${new Date().getFullYear()} ${pkg.author}
- * @license ${pkg.license}
- */`
-
-// Shared esbuild options
-const options = {
- banner: { js: banner },
- bundle: true,
- entryPoints: ['src/index.mjs'],
- format: 'esm',
- outfile: 'dist/index.mjs',
- external: ['@freesewing'],
- metafile: process.env.VERBOSE ? true : false,
- minify: process.env.NO_MINIFY ? false : true,
- sourcemap: true,
-}
-
-// Let esbuild generate the build
-const build = async () => {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/config/templates/design.test.mjs.mustache b/config/templates/design.test.mjs.mustache
index 7eb4a2e7f16..4639fbcee77 100644
--- a/config/templates/design.test.mjs.mustache
+++ b/config/templates/design.test.mjs.mustache
@@ -4,7 +4,7 @@
// Dollar signs are allowed in EcmaScript identifier names,
// which is helpful when running unrendered Mustache templates through eslint.
//}}{{=$$ $$=}}
-import { $$Name$$, i18n } from '../src/index.mjs'
+import { $$Name$$, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -13,7 +13,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig($$Name$$)
+testPatternConfig($$Name$$, about)
// Test translation
testPatternI18n($$Name$$, i18n)
diff --git a/config/templates/design/i18n/index.mjs b/config/templates/design/i18n/index.mjs
index 36aac928b67..11028ae01ae 100644
--- a/config/templates/design/i18n/index.mjs
+++ b/config/templates/design/i18n/index.mjs
@@ -1,8 +1,3 @@
-import en from './en.json' assert { type: 'json' }
-import de from './de.json' assert { type: 'json' }
-import es from './es.json' assert { type: 'json' }
-import fr from './fr.json' assert { type: 'json' }
-import nl from './nl.json' assert { type: 'json' }
-import uk from './uk.json' assert { type: 'json' }
+import en from './en.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/config/templates/design/package.json.mustache b/config/templates/design/package.json.mustache
index 22e3a375618..f33a42dc0af 100644
--- a/config/templates/design/package.json.mustache
+++ b/config/templates/design/package.json.mustache
@@ -2,11 +2,11 @@
"name": "{{name}}",
"version": "0.0.1",
"description": "{{description}}",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
+ "author": "Joost De Cock (https://codeberg.org/joostdecock)",
+ "homepage": "https://freesewing.eu/",
+ "repository": "https://codeberg.org/freesewing/freesewing",
"license": "MIT",
- "main": "dist/index.mjs",
+ "main": "src/index.mjs",
"module": "dist/index.mjs",
"scripts": {}
}
diff --git a/config/templates/design/tests/shared.test.mjs b/config/templates/design/tests/shared.test.mjs
index 91b6a8c9884..1765da6d5b3 100644
--- a/config/templates/design/tests/shared.test.mjs
+++ b/config/templates/design/tests/shared.test.mjs
@@ -3,7 +3,7 @@
import chai from 'chai'
import models from '@freesewing/models'
import patterns from '@freesewing/pattern-info'
-import Pattern from './dist/index.mjs'
+import Pattern from './src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/patterns/config.mjs'
diff --git a/config/templates/package.dflt.json b/config/templates/package.dflt.json
index 709b8412da3..99d9fbdca3a 100644
--- a/config/templates/package.dflt.json
+++ b/config/templates/package.dflt.json
@@ -12,28 +12,23 @@
},
"keywords": ["freesewing"],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "cibuild_step1": "node build.mjs",
- "build": "node build.mjs",
"testonly": "BABEL_ENV=production ../../node_modules/.bin/_mocha tests/*.test.js --require @babel/register",
- "publish": "npm run build && npm publish --access public"
+ "publish": "npm publish --access public"
},
"peerDependencies": {},
"dependencies": {},
"devDependencies": {},
- "files": ["dist/*", "README.md"],
+ "files": ["src/", "i18n/", "about.json", "README.md"],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/config/templates/plugin/package.json.mustache b/config/templates/plugin/package.json.mustache
index 0d3e911a502..cc379d0deec 100644
--- a/config/templates/plugin/package.json.mustache
+++ b/config/templates/plugin/package.json.mustache
@@ -2,9 +2,9 @@
"name": "{{pluginName}}",
"version": "0.0.1",
"description": "{{description}}",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
+ "author": "Joost De Cock (https://codeberg.org/joostdecock)",
+ "homepage": "https://freesewing.eu/",
+ "repository": "https://codeberg.org/freesewing/freesewing",
"license": "MIT",
"main": "dist/index.mjs",
"module": "dist/index.mjs",
diff --git a/config/templates/readme.dflt.md b/config/templates/readme.dflt.md
index 74e75059891..ed57556067b 100644
--- a/config/templates/readme.dflt.md
+++ b/config/templates/readme.dflt.md
@@ -14,7 +14,7 @@
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -31,7 +31,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/#
-
-
# FreeSewing
@@ -54,7 +44,7 @@
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -64,7 +54,7 @@ This repository is the FreeSewing *monorepo* holding all FreeSewing's websites,
Where the world of makers and developers collide, that's where you'll find FreeSewing.
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
sewing patterns adapted to your measurements.
If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
@@ -76,7 +66,7 @@ functionality of the platform.
If you have NodeJS installed, you can try it right now by running:
```bash
-npx @freesewing/new-design
+npx @freesewing/studio
```
Getting started guides are available for:
@@ -92,44 +82,42 @@ show you how to create your first parametric design.
To get started with FreeSewing, you can spin up our development environment with:
```bash
-npx @freesewing/new-design
+npx @freesewing/studio
```
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) and [lerna](https://lerna.js.org/) on your system.
+Once you have those, clone (or fork) this repo and run `npm run kickstart`:
```bash
-git clone git@github.com:freesewing/freesewing.git
+git clone git@codeberg.org:freesewing/freesewing.git
cd freesewing
-yarn kickstart
+npm run kickstart
```
## Links 👩💻
**Official channels**
- - 🪡 Makers website: [FreeSewing.org](https://freesewing.org)
+ - 🪡 Makers website: [FreeSewing.eu](https://freesewing.eu)
- 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
**Social media**
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
- - 🐘 Mastodon: [freesewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
**Places the FreeSewing community hangs out**
+ - 💬 [Forum](https://forum.freesewing.eu/)
- 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- 💬 [Reddit](https://www.reddit.com/r/freesewing/)
## Where to get help 🤯
-Check our [support page](https://freesewing.org/support), or use
-the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
## License: MIT 🤓
© [Joost De Cock](https://github.com/joostdecock).
See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
+
diff --git a/config/templates/use-design.mjs.mustache b/config/templates/use-design.mjs.mustache
deleted file mode 100644
index aa27f3bc54c..00000000000
--- a/config/templates/use-design.mjs.mustache
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * This file is auto-generated.
- * Any manual changes will be overwritten.
- */
-{{#designs}}
-import { {{ Name }} as {{ name }} } from '@freesewing/{{ name }}'
-{{/designs}}
-
-export const designs = {
-{{#designs}}
- {{ name }},
-{{/designs}}
-}
-
-export const useDesign = (design) => (designs[design] ? designs[design] : false)
-
-export const collection = Object.keys(designs)
diff --git a/config/trustees.mjs b/config/trustees.mjs
deleted file mode 100644
index 652f6bdf21e..00000000000
--- a/config/trustees.mjs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * This defines the FreeSewing web of trust
- * See: https://FreeSewing.dev/reference/trust
- */
-export const trustees = {
- 1: {
- x: 1306,
- y: 319,
- title: 'joost',
- in: 'Antwerp',
- },
- 132: {
- x: 457,
- y: 345,
- title: 'woutervdub',
- in: 'Seattle',
- },
- 13050: {
- x: 668,
- y: 399,
- title: 'karen',
- in: 'Chicago',
- },
-}
-
-/*
- * These are the connections between the trustees
- * See: https://FreeSewing.dev/reference/trust
- */
-export const connections = [
- [1, 132],
- [1, 13050],
-]
-
-export const lastUpdate = '20240402'
diff --git a/crowdin.yml b/crowdin.yml
deleted file mode 100644
index 72aa2f76a69..00000000000
--- a/crowdin.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-content_segmentation: 0
-commit_message: skip-build
-pull_request_assignees:
- - joostdecock
-pull_request_title: 'New Crowdin Translations [skip build]'
-pull_request_labels:
- - crowdin
- - i18n
-files:
- - source: /markdown/org/**/en.md
- translation: /markdown/org/**/%two_letters_code%.md
- - source: /sites/**/en.yaml
- translation: /sites/**/%two_letters_code%.yaml
- - source: /sites/shared/jargon/en.json
- translation: /sites/shared/jargon/%two_letters_code%.json
- - source: /designs/*/i18n/en.json
- translation: /designs/*/i18n/%two_letters_code%.json
- - source: /packages/new-design/i18n/en.json
- translation: /packages/new-design/i18n/%two_letters_code%.json
diff --git a/designs/aaron/README.md b/designs/aaron/README.md
index 93db8b61044..0bf77c5f19e 100644
--- a/designs/aaron/README.md
+++ b/designs/aaron/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/aaron
@@ -59,7 +44,7 @@ A FreeSewing pattern for a A-shirt or tank top
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/aaron/src/front.mjs b/designs/aaron/src/front.mjs
index 35e5b3f9a7c..2d0b6233241 100644
--- a/designs/aaron/src/front.mjs
+++ b/designs/aaron/src/front.mjs
@@ -18,7 +18,7 @@ export const front = {
shoulderSlopeReduction: 0,
chestEase: { pct: 8, min: 0, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
draftForHighBust: { bool: false, menu: 'fit' },
- hipsEase: { pct: 8, min: 0, max: 20, menu: 'fit' },
+ hipsEase: { pct: 8, min: 0, max: 20, ...pctBasedOn('hips'), menu: 'fit' },
stretchFactor: { pct: 5, min: 0, max: 15, menu: 'fit' },
armholeDrop: { pct: 10, min: 0, max: 75, menu: 'style' },
lengthBonus: { pct: 10, min: -20, max: 60, menu: 'style' },
diff --git a/designs/aaron/src/index.mjs b/designs/aaron/src/index.mjs
index e2f9e8f3451..f5431ee315c 100644
--- a/designs/aaron/src/index.mjs
+++ b/designs/aaron/src/index.mjs
@@ -1,7 +1,7 @@
import { Design, mergeI18n } from '@freesewing/core'
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as aaronI18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { back } from './back.mjs'
import { front } from './front.mjs'
import { armBinding } from './arm-binding.mjs'
@@ -9,7 +9,7 @@ import { neckBinding } from './neck-binding.mjs'
// Setup our new design
const Aaron = new Design({
- data,
+ data: about,
parts: [back, front, armBinding, neckBinding],
})
@@ -27,10 +27,12 @@ const i18n = mergeI18n([brianI18n, aaronI18n], {
'legacyArmholeDepthNo',
'legacyArmholeDepthYes',
'armholeDepth',
+ 'draftForHighBustNo',
+ 'draftForHighBustYes',
],
},
s: { drop: [] },
})
// Named exports
-export { back, front, Aaron, i18n }
+export { back, front, Aaron, i18n, about }
diff --git a/designs/aaron/tests/shared.test.mjs b/designs/aaron/tests/shared.test.mjs
index c01c7865cf0..be5e249cc20 100644
--- a/designs/aaron/tests/shared.test.mjs
+++ b/designs/aaron/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Aaron, i18n } from '../src/index.mjs'
+import { Aaron, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Aaron)
+testPatternConfig(Aaron, about)
// Test translation
testPatternI18n(Aaron, i18n)
diff --git a/designs/albert/README.md b/designs/albert/README.md
index d6f4ece5062..038e910d5b4 100644
--- a/designs/albert/README.md
+++ b/designs/albert/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/albert
@@ -59,7 +44,7 @@ A FreeSewing pattern for an apron
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/albert/data.mjs b/designs/albert/data.mjs
deleted file mode 100644
index c6a5f83a944..00000000000
--- a/designs/albert/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/albert'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/albert/i18n/de.json b/designs/albert/i18n/de.json
deleted file mode 100644
index a2bc1234728..00000000000
--- a/designs/albert/i18n/de.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Albert, die Schürze",
- "d": "Albert ist eine Schürze.",
- "p": {
- "front": "Vorderseite",
- "pocket": "Tasche",
- "strap": "Strap"
- },
- "s": {},
- "o": {
- "backOpening": {
- "t": "Hintere Öffnung",
- "d": "Steuert die Öffnung an der Rückseite der Schürze"
- },
- "chestDepth": {
- "t": "Länge des Riemens",
- "d": "Steuert die Länge der Riemen"
- },
- "lengthBonus": {
- "t": "Längenzugabe",
- "d": "Steuert die Länge der Schürze"
- },
- "bibLength": {
- "t": "Latzlänge",
- "d": "Steuert die Länge des Latzes"
- },
- "bibWidth": {
- "t": "Latzbreite",
- "d": "Steuert die Breite des Latzes"
- },
- "strapWidth": {
- "t": "Riemenbreite",
- "d": "Steuert die Breite des Riemens"
- }
- }
-}
diff --git a/designs/albert/i18n/es.json b/designs/albert/i18n/es.json
deleted file mode 100644
index f4da8c32ec6..00000000000
--- a/designs/albert/i18n/es.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Albert, delantal",
- "d": "Albert es un delantal.",
- "p": {
- "front": "Frente",
- "pocket": "Bolsillo",
- "strap": "Strap"
- },
- "s": {},
- "o": {
- "backOpening": {
- "t": "Abertura de la espalda",
- "d": "Controla la apertura en la parte trasera del Profeta"
- },
- "chestDepth": {
- "t": "Longitud del Strp",
- "d": "Controla la longitud de las correas"
- },
- "lengthBonus": {
- "t": "Bonus de longitud",
- "d": "Controla la longitud del buque"
- },
- "bibLength": {
- "t": "Longitud de bib",
- "d": "Controla la longitud de la bib"
- },
- "bibWidth": {
- "t": "Ancho bib",
- "d": "Controla el ancho de la bib"
- },
- "strapWidth": {
- "t": "Strap width",
- "d": "Controla el ancho de la correa"
- }
- }
-}
diff --git a/designs/albert/i18n/fr.json b/designs/albert/i18n/fr.json
deleted file mode 100644
index f19bf1b0e5b..00000000000
--- a/designs/albert/i18n/fr.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Tablier Albert",
- "d": "Albert est un tablier.",
- "p": {
- "front": "Avant",
- "pocket": "Poche",
- "strap": "Strap"
- },
- "s": {},
- "o": {
- "backOpening": {
- "t": "Ouverture arrière",
- "d": "Contrôle l'ouverture à l'arrière du tablier"
- },
- "chestDepth": {
- "t": "Longueur de l'anse",
- "d": "Contrôle la longueur des liens"
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "Contrôle la longueur du tablier"
- },
- "bibLength": {
- "t": "Longueur du plastron",
- "d": "Contrôle la longueur du plastron"
- },
- "bibWidth": {
- "t": "Largeur du plastron",
- "d": "Contrôle la largeur du plastron"
- },
- "strapWidth": {
- "t": "Largeur du lien",
- "d": "Contrôle la largeur des liens"
- }
- }
-}
diff --git a/designs/albert/i18n/index.mjs b/designs/albert/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/albert/i18n/index.mjs
+++ b/designs/albert/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/albert/i18n/nl.json b/designs/albert/i18n/nl.json
deleted file mode 100644
index 7b71d88af02..00000000000
--- a/designs/albert/i18n/nl.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Albert schort",
- "d": "Albert is een vork.",
- "p": {
- "back": "Achterzijde",
- "backBase": "Basis rug",
- "backPocketWelt": "Back pocket welt",
- "base": "Basis",
- "bentBack": "Achterzijde Bent",
- "bentBase": "Basis Bent",
- "bentFront": "Voorzijde Bent",
- "bentSleeve": "Mouw Bent",
- "bentTopSleeve": "Bovenmouw Bent",
- "bentUnderSleeve": "Ondermouw Bent",
- "buttonholePlacket": "Knoopsgatenpat",
- "buttonPlacket": "Knopenpat",
- "collar": "Kraag",
- "collarStand": "Kraagstaander",
- "cuff": "Manchet",
- "fabricTail": "Stof staart",
- "fabricTip": "Stof tip",
- "frontBase": "Basis voorzijde",
- "frontFacing": "Beleg vooraan",
- "front": "Voorzijde",
- "frontLeft": "Voorzijde links",
- "frontLining": "Voering vooraan",
- "frontRight": "Voorzijde rechts",
- "gusset": "Gusset",
- "hoodCenter": "Midden kap",
- "hood": "Capuchon",
- "hoodSide": "Zijkant kap",
- "inset": "Inzet",
- "interfacingTail": "Interfacing staart",
- "interfacingTip": "Interfacing tip",
- "liningTail": "Voering staart",
- "liningTip": "Voering tip",
- "loop": "Lus",
- "panel1": "Deel 1",
- "panel2": "Deel 2",
- "panel3": "Deel 3",
- "panel4": "Deel 4",
- "panel5": "Deel 5",
- "panel6": "Deel 6",
- "panels": "Panelen",
- "pocketBag": "Binnenzak",
- "pocketFacing": "Zak beleg",
- "pocketInterfacing": "Tussenvoering zak",
- "pocket": "Zak",
- "pocketWelt": "Paspel zak",
- "side": "Zijkant",
- "sleeveBase": "Basis mouw",
- "sleevecap": "Mouwkop",
- "sleevePlacketOverlap": "Mouwsplit boven",
- "sleevePlacketUnderlap": "Mouwsplit onder",
- "sleeve": "Mouw",
- "topSleeve": "Bovenmouw",
- "top": "Top",
- "underCollar": "Onderkraag",
- "underSleeve": "Ondermouw",
- "waistband": "Tailleband",
- "yoke": "Schouderpas"
- },
- "s": {},
- "o": {
- "backOpening": {
- "t": "Rugopening",
- "d": "Bepaalt de opening aan de achterkant van de schort"
- },
- "chestDepth": {
- "t": "Lengte van de badjes",
- "d": "Bepaalt de lengte van de bandjes"
- },
- "lengthBonus": {
- "t": "Lengtebonus",
- "d": "Bepaalt de lengte van de schort"
- },
- "bibLength": {
- "t": "Lengte slabbetje",
- "d": "Bepaalt de lengte van het slabbetje"
- },
- "bibWidth": {
- "t": "Breedte slabbetje",
- "d": "Bepaalt de breedte van het slabbetje"
- },
- "strapWidth": {
- "t": "Breedte bandjes",
- "d": "Bepaalt de breedte van de bandjes"
- }
- }
-}
diff --git a/designs/albert/i18n/uk.json b/designs/albert/i18n/uk.json
deleted file mode 100644
index 8696750e98c..00000000000
--- a/designs/albert/i18n/uk.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Albert apron",
- "d": "Albert is an apron.",
- "p": {
- "front": "Front",
- "pocket": "Pocket",
- "strap": "Strap"
- },
- "s": {},
- "o": {
- "backOpening": {
- "t": "Back opening",
- "d": "Controls the opening at the back of the apron"
- },
- "chestDepth": {
- "t": "Strap length",
- "d": "Controls the length of the straps"
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Controls the length of the apron"
- },
- "bibLength": {
- "t": "Bib length",
- "d": "Controls the length of the bib"
- },
- "bibWidth": {
- "t": "Bib width",
- "d": "Controls the width of the bib"
- },
- "strapWidth": {
- "t": "Strap width",
- "d": "Controls the width of the strap"
- }
- }
-}
diff --git a/designs/albert/package.json b/designs/albert/package.json
index 1fe84d37014..3e3f590356d 100644
--- a/designs/albert/package.json
+++ b/designs/albert/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/albert",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for an apron",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/albert/src/front.mjs b/designs/albert/src/front.mjs
index 8d87c18badb..d96e9bf9aaa 100644
--- a/designs/albert/src/front.mjs
+++ b/designs/albert/src/front.mjs
@@ -106,16 +106,23 @@ export const front = {
if (sa) {
const saBase = new Path()
- .move(points.bottomLeft.shift(-90, sa))
- .line(points.bottomRight.shift(-90, sa))
- .line(points.topRightBack)
+ .move(points.bottomLeft.shift(-90, strapWidth - sa))
+ .line(points.bottomRight.shift(-90, strapWidth - sa).shift(0, strapWidth - sa))
+ .line(points.topRightBack.shift(0, strapWidth - sa))
.curve(points.topRightBackCPfront, points.topRightCPdown, points.topRightHem)
- .line(points.topRight.shift(90, sa))
- .line(points.topLeft.shift(90, sa))
+ .line(points.topRight.shift(90, strapWidth - sa))
+ .line(points.topLeft.shift(90, strapWidth - sa))
paths.sa = saBase
.clone()
.offset(sa * 2)
.addClass('fabric sa')
+ paths.sa = new Path()
+ .move(points.bottomLeft)
+ .line(paths.sa.start())
+ .join(paths.sa)
+ .line(points.topLeft)
+ .attr('class', 'fabric sa')
+
if (complete) {
paths.hemHint = saBase.clone().offset(sa).addClass('note help')
macro('banner', {
@@ -127,6 +134,24 @@ export const front = {
classes: 'fill-note center',
})
}
+ macro('hd', {
+ from: points.bottomRight,
+ to: points.bottomRight.shift(0, strapWidth),
+ y: points.bottomLeft.y + sa + (sa ? strapWidth : 0) + 15,
+ id: 'wBottomHem',
+ })
+ macro('vd', {
+ from: points.topLeft,
+ to: points.topLeft.shift(90, strapWidth),
+ x: points.topLeftHem.x - 15,
+ id: 'foldoverTop',
+ })
+ macro('vd', {
+ from: points.bottomLeft.shift(270, strapWidth),
+ to: points.bottomLeft,
+ x: points.topLeftHem.x - 15,
+ id: 'hLeftToFoldover',
+ })
}
/*
@@ -178,52 +203,33 @@ export const front = {
macro('hd', {
from: points.bottomLeft,
to: points.bottomRight,
- y: points.bottomLeft.y + sa + 15,
+ y: points.bottomLeft.y + sa + (sa ? strapWidth : 0) + 15,
id: 'wBottom',
})
macro('hd', {
from: points.topLeft,
to: points.topRight,
- y: points.topLeft.y - sa - 15,
+ y: points.topLeft.y - sa - (sa ? strapWidth : 0) - 15,
id: 'wTop',
})
macro('vd', {
from: points.bottomLeft,
to: points.topLeft,
- x: points.topLeft.x - 30,
+ x: points.topLeft.x - 15,
id: 'hLeft',
})
macro('vd', {
from: points.bottomRight,
to: points.topRightBack,
- x: points.topRightBack.x + sa + 15,
+ x: points.topRightBack.x + sa + (sa ? strapWidth : 0) + 15,
id: 'hRightBottom',
})
macro('vd', {
from: points.topRightBack,
to: points.topRight,
- x: points.topRightBack.x + sa + 15,
+ x: points.topRightBack.x + sa + (sa ? strapWidth : 0) + 15,
id: 'hRightTop',
})
- macro('vd', {
- from: points.topLeftHem,
- to: points.topLeft,
- x: points.topLeftHem.x - 15,
- id: 'foldoverTop',
- })
- macro('vd', {
- from: points.bottomLeftHem,
- to: points.topLeftHem,
- x: points.topLeftHem.x - 15,
- id: 'hLeftToFoldover',
- })
- macro('vd', {
- from: points.bottomLeft,
- to: points.bottomLeftHem,
- x: points.bottomLeftHem.x + sa + 15,
- id: 'hBottomHem',
- })
-
return part
},
}
diff --git a/designs/albert/src/index.mjs b/designs/albert/src/index.mjs
index 9897b7fd4b5..51369b09b32 100644
--- a/designs/albert/src/index.mjs
+++ b/designs/albert/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { front } from './front.mjs'
import { pocket } from './pocket.mjs'
import { strap } from './strap.mjs'
@@ -7,9 +7,9 @@ import { i18n } from '../i18n/index.mjs'
// Setup our new design
const Albert = new Design({
- data,
+ data: about,
parts: [front, pocket, strap],
})
// Named exports
-export { front, pocket, strap, Albert, i18n }
+export { front, pocket, strap, Albert, i18n, about }
diff --git a/designs/albert/src/pocket.mjs b/designs/albert/src/pocket.mjs
index 62719a04d71..99c2a5ce605 100644
--- a/designs/albert/src/pocket.mjs
+++ b/designs/albert/src/pocket.mjs
@@ -16,6 +16,7 @@ export const pocket = {
units,
store,
part,
+ complete,
}) => {
const pocketSize = store.get('pocketSize')
@@ -53,11 +54,11 @@ export const pocket = {
.line(points.bottomRight)
.line(points.topRight)
.line(points.topLeft)
- .move(points.bottomLeft)
+ .line(points.bottomLeft)
.close()
.attr('class', 'fabric')
- if (sa)
+ if (sa) {
paths.sa = new Path()
.move(points.bottomLeft)
.line(points.bottomRight)
@@ -65,7 +66,46 @@ export const pocket = {
.line(points.topLeft.shift(90, store.get('strapWidth')))
.offset(sa)
.attr('class', 'fabric sa')
+ paths.sa = new Path()
+ .move(points.bottomLeft)
+ .line(paths.sa.start())
+ .join(paths.sa)
+ .line(points.topLeft)
+ .attr('class', 'fabric sa')
+ if (complete) {
+ paths.SAhemHint = new Path()
+ .move(points.topRight.shift(90, store.get('strapWidth')).shift(0, sa))
+ .line(points.topLeft.shift(90, store.get('strapWidth')))
+ .addClass('note help')
+ macro('banner', {
+ id: 'SAfoldHere',
+ path: paths.SAhemHint.reverse(),
+ text: 'albert:foldHere',
+ repeat: 60,
+ spaces: 30,
+ classes: 'fill-note center',
+ })
+ paths.hemHint = new Path()
+ .move(points.topRight.shift(0, sa))
+ .line(points.topLeft)
+ .setHidden(true)
+ macro('banner', {
+ id: 'foldHere',
+ path: paths.hemHint.reverse(),
+ text: 'albert:foldHere',
+ repeat: 60,
+ spaces: 30,
+ classes: 'fill-note center',
+ })
+ macro('vd', {
+ from: points.topLeft,
+ to: points.topLeft.shift(90, store.get('strapWidth')),
+ x: points.topLeft.x - 15,
+ id: 'heightHem',
+ })
+ }
+ }
/*
* Annotations
*/
diff --git a/designs/albert/tests/shared.test.mjs b/designs/albert/tests/shared.test.mjs
index 13f70c52092..0ae8eb0f13a 100644
--- a/designs/albert/tests/shared.test.mjs
+++ b/designs/albert/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Albert, i18n } from '../src/index.mjs'
+import { Albert, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Albert)
+testPatternConfig(Albert, about)
// Test translation
testPatternI18n(Albert, i18n)
diff --git a/designs/bee/README.md b/designs/bee/README.md
index 675021acacc..00fc6207e51 100644
--- a/designs/bee/README.md
+++ b/designs/bee/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bee
@@ -59,7 +44,7 @@ A FreeSewing pattern for a bikini top
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bee/data.mjs b/designs/bee/data.mjs
deleted file mode 100644
index f8dece83edc..00000000000
--- a/designs/bee/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bee'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bee/i18n/de.json b/designs/bee/i18n/de.json
deleted file mode 100644
index f3c3331923e..00000000000
--- a/designs/bee/i18n/de.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
- "t": "Bee, das Bikini-Oberteil",
- "d": "Bee ist ein Bikini-Oberteil",
- "p": {
- "bandTie": "Band Tie",
- "cup": "Cup",
- "neckTie": "Neck Tie"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Brustzugabe",
- "d": "Kontrolliert die Brustzugabe des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "waistEase": {
- "t": "Taillenzugabe",
- "d": "Kontrolliert die Taillenzugabe des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "bustSpanEase": {
- "t": "Zugabe im Abstand der Brustpunkte",
- "d": "Kontrolliert die Zugabe des Abstandes der Brustpunkte des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "topDepth": {
- "t": "Obere Tiefe",
- "d": "Kontrolliert, wie weit sich der Bikini-Cup nach oben erstreckt"
- },
- "bottomCupDepth": {
- "t": "Untere Tiefe",
- "d": "Kontrolliert, wie weit sich der Bikini-Cup nach unten erstreckt"
- },
- "sideDepth": {
- "t": "Seitliche Tiefe",
- "d": "Kontrolliert, wie weit sich der Bikini-Cup zur Seite erstreckt"
- },
- "sideCurve": {
- "t": "Seitliche Kurve",
- "d": "Kontrolliert die Krümmung der Seite des Bikini-Cups"
- },
- "frontCurve": {
- "t": "Vordere Kurve",
- "d": "Kontrolliert die Krümmung der Vorderseite des Bikini-Cups"
- },
- "bellaGuide": {
- "t": "Bella anzeigen",
- "d": "Zeigt die Umrisse des Bella-Grundschnittes an, auf dem Bee basiert"
- },
- "ties": {
- "t": "Bänder",
- "d": "Sollen Bänder hinzugefügt werden, ja oder nein"
- },
- "bandTieWidth": {
- "t": "Breite des Brustbandes",
- "d": "Kontrolliert die Breite des Bandes um deinen Brustkorb"
- },
- "bandTieLength": {
- "t": "Länge des Brustbandes",
- "d": "Kontrolliert die Länge des Bandes um deinen Brustkorb"
- },
- "bandTieEnds": {
- "t": "Enden des Brustbandes",
- "d": "Möchtest du gerade oder spitze Enden des Brustbandes?"
- },
- "bandTieColours": {
- "t": "Farben des Brustbandes",
- "d": "Möchtest du ein- oder mehrfarbige Brustbänder?"
- },
- "neckTieWidth": {
- "t": "Breite des Nackenträgers",
- "d": "Steuert die Breite des Nackenträgers"
- },
- "neckTieLength": {
- "t": "Länge des Nackenträgers",
- "d": "Steuert die Länge des Nackenträgers"
- },
- "neckTieEnds": {
- "t": "Enden des Nackenträgers",
- "d": "Möchtest du gerade oder spitze Enden des Nackenträgers?"
- },
- "neckTieColours": {
- "t": "Farben des Nackenträgers",
- "d": "Möchtest du ein- oder mehrfarbige Nackenträger?"
- },
- "crossBackTies": {
- "t": "Gekreuzte Rückenträger",
- "d": "Möchtest du die Version von Bee mit gekreuzten Rückenträgern?"
- },
- "bandLength": {
- "t": "Länge der gekreuzten Rückenträger",
- "d": "Kontrolliert die Länge Brustbandes für die Variante von Bee mit gekreuzten Rückenträgern"
- },
- "backDartHeight": {
- "t": "Höhe der Rückenabnäher (Bella)",
- "d": "Kontrolliert die Höhe der Rückenabnäher des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "armholeDepth": {
- "t": "Tiefen des Armloches (Bella)",
- "d": "Kontrolliert die Tiefe des Armloches des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "frontArmholePitchDepth": {
- "t": "Tiefe des vorderen Armlochdrehpunktes (Bella)",
- "d": "Kontrolliert die Tiefe des vorderen Armlochdrehpunktes des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "frontShoulderWidth": {
- "t": "Vordere Schulterbreite (Bella)",
- "d": "Kontrolliert die vordere Schulterbreite des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "fullChestEaseReduction": {
- "t": "Full chest reduction (Bella)",
- "d": "Controls the full chest reduction in the underlying Bella block Bee is based on"
- },
- "highBustWidth": {
- "t": "Hohe Brustweite (Bella)",
- "d": "Kontrolliert die hohe Brustbreite des zugrunde liegenden Grundschnittes \"Bella\" auf welchem Bee basiert"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease (Bella)",
- "d": "Controls the shoulder to shoulder ease in the underlying Bella block Bee is based on"
- }
- }
-}
diff --git a/designs/bee/i18n/es.json b/designs/bee/i18n/es.json
deleted file mode 100644
index 8965d3401aa..00000000000
--- a/designs/bee/i18n/es.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
- "t": "Bee, sujetador de bikini",
- "d": "Bee el sujetador de un bikini",
- "p": {
- "bandTie": "Band Tie",
- "cup": "Cup",
- "neckTie": "Neck Tie"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Holgura de pecho",
- "d": "Controla la holgura del pecho en el patrón base (Bella) en el que se basa Bee"
- },
- "waistEase": {
- "t": "Holgura de cintura",
- "d": "Controla la holgura de cintura en el patrón base (Bella) en el que se basa Bee"
- },
- "bustSpanEase": {
- "t": "Holgura alrededor del busto",
- "d": "Controla la holgura de busto en el patrón base (Bella) en el que se basa Bee"
- },
- "topDepth": {
- "t": "Límite superior",
- "d": "Controla hasta qué punto la copa de bikini se extiende hacia arriba"
- },
- "bottomCupDepth": {
- "t": "Límite inferior",
- "d": "Controla hasta qué punto la copa de bikini se extiende hacia abajo"
- },
- "sideDepth": {
- "t": "Límite lateral",
- "d": "Controla hasta qué punto se extiende la copa del bikini hacia el lado"
- },
- "sideCurve": {
- "t": "Curva lateral exterior",
- "d": "Controla la curvatura del lado exterior de la copa del bikini"
- },
- "frontCurve": {
- "t": "Curva lateral interior",
- "d": "Controla la curvatura de la parte lateral interior de la copa del bikini"
- },
- "bellaGuide": {
- "t": "Mostrar Bella",
- "d": "Muestra el contorno del patrón base Bella en el que se basa Bee"
- },
- "ties": {
- "t": "Cintas",
- "d": "Sobre si incluir cintas o no"
- },
- "bandTieWidth": {
- "t": "Ancho de la cinta del pecho",
- "d": "Controla el ancho de las cintas alrededor del pecho"
- },
- "bandTieLength": {
- "t": "Longitud de la cinta del pecho",
- "d": "Controla la longitud de las cintas alrededor del pecho"
- },
- "bandTieEnds": {
- "t": "Puntas de la cinta del pecho",
- "d": "Si prefieres que las puntas de la cinta alrededor del pecho sean planas o acaben en punta"
- },
- "bandTieColours": {
- "t": "Colores de la longitud de la cinta del pecho",
- "d": "Sobre si quieres cintas de un solo color alrededor del pecho o de dos colores."
- },
- "neckTieWidth": {
- "t": "Ancho de la cinta del cuello",
- "d": "Controla el ancho de las cintas alrededor del pecho"
- },
- "neckTieLength": {
- "t": "Longitud de la cinta del cuello",
- "d": "Controla la longitud de las cintas alrededor del pecho"
- },
- "neckTieEnds": {
- "t": "Puntas de la cinta del cuello",
- "d": "Si prefieres que las puntas de la cinta alrededor del pecho sean planas o acaben en punta"
- },
- "neckTieColours": {
- "t": "Colores de la cinta del cuello",
- "d": "Sobre si quieres cintas de un solo color alrededor del pecho o de dos colores."
- },
- "crossBackTies": {
- "t": "Cintas cruzadas",
- "d": "Whether you'd like to use the cross back tie variation of Bee"
- },
- "bandLength": {
- "t": "Band Length (Cross back ties)",
- "d": "Controla la longitud de la cinta alrededor de tu pecho para la versión de tirantes cruzados de Bee"
- },
- "backDartHeight": {
- "t": "Back dart height (Bella)",
- "d": "Controla la altura de la pinza trasera en el patrón base Bella, en el que se basa Bee"
- },
- "armholeDepth": {
- "t": "Armhole depth (Bella)",
- "d": "Controla la profundidad de la sisa en el patron de base Bella en el que se basa Bee"
- },
- "frontArmholePitchDepth": {
- "t": "Front armhole pitch depth (Bella)",
- "d": "Controls the front armhole pitch depth in the underlying Bella block Bee is based on"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width (Bella)",
- "d": "Controla el ancho de hombros en el patrón de base Bella en el que se basa Bee"
- },
- "fullChestEaseReduction": {
- "t": "Full chest reduction (Bella)",
- "d": "Controls the full chest reduction in the underlying Bella block Bee is based on"
- },
- "highBustWidth": {
- "t": "High bust width (Bella)",
- "d": "Controls the high bust width in the underlying Bella block Bee is based on"
- },
- "shoulderToShoulderEase": {
- "t": "Ancho de hombros (Bella)",
- "d": "Controla el ancho de hombros en el patrón de base Bella en el que se basa Bee"
- }
- }
-}
diff --git a/designs/bee/i18n/fr.json b/designs/bee/i18n/fr.json
deleted file mode 100644
index 7b29cdbf757..00000000000
--- a/designs/bee/i18n/fr.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
- "t": "Haut de bikini Bee",
- "d": "Bee est un haut de bikini",
- "p": {
- "bandTie": "Band Tie",
- "cup": "Cup",
- "neckTie": "Neck Tie"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Aisance de poitrine",
- "d": "Contrôle l'aisance de la poitrine dans le bloc de Bella sur lequel est basé Bee"
- },
- "waistEase": {
- "t": "Aisance à la taille",
- "d": "Contrôle l'aisance de la taille dans le bloc de Bella sur lequel est basé Bee"
- },
- "bustSpanEase": {
- "t": "Aisance de l'écart poitrine",
- "d": "Contrôle l'aisance de l'écart de poitrine dans le bloc de Bella sur lequel est basé Bee"
- },
- "topDepth": {
- "t": "Profondeur supérieure",
- "d": "Contrôle jusqu'à quel point le bonnet de bikini s'étend vers le haut"
- },
- "bottomCupDepth": {
- "t": "Profondeur inférieure",
- "d": "Contrôle jusqu'à quel point le bonnet de bikini s'étend vers le bas"
- },
- "sideDepth": {
- "t": "Profondeur latérale",
- "d": "Contrôle jusqu'à quel point le bonnet du bikini se prolonge vers le côté"
- },
- "sideCurve": {
- "t": "Courbe latérale",
- "d": "Contrôle la courbure du côté du bonnet du bikini"
- },
- "frontCurve": {
- "t": "Courbe frontale",
- "d": "Contrôle la courbure du devant du bonnet du bikini"
- },
- "bellaGuide": {
- "t": "Afficher Bella",
- "d": "Affiche le contour du bloc Bella sur lequel est basé Bee"
- },
- "ties": {
- "t": "Liens",
- "d": "S'il faut inclure les liens, oui ou non"
- },
- "bandTieWidth": {
- "t": "Largeur de la bande (sous poitrine)",
- "d": "Contrôle la largeur des bandes autour de votre poitrine"
- },
- "bandTieLength": {
- "t": "Longueur de la bande (sous poitrine)",
- "d": "Contrôle la longueur des bandes autour de votre poitrine"
- },
- "bandTieEnds": {
- "t": "Finition des bouts de bandes (sous poitrine)",
- "d": "Choisir si vous voulez que la pointe de la bande autour de votre poitrine se termine droite ou en pointe"
- },
- "bandTieColours": {
- "t": "Couleurs de la bande (sous poitrine)",
- "d": "Que vous vouliez une seule couleur autour de votre poitrine, ou des couleurs doubles"
- },
- "neckTieWidth": {
- "t": "Largeur de la bande de cou",
- "d": "Contrôle la largeur des bandes autour de votre cou"
- },
- "neckTieLength": {
- "t": "Longueur de la bande",
- "d": "Contrôle la longueur des bandes autour de votre cou"
- },
- "neckTieEnds": {
- "t": "Fin de la bande de cou",
- "d": "Choisir si vous voulez que la pointe de la bande autour de votre cou se termine droite ou en pointe"
- },
- "neckTieColours": {
- "t": "Couleurs de bande de cou",
- "d": "Que vous vouliez une seule couleur autour de votre cou, ou des couleurs doubles"
- },
- "crossBackTies": {
- "t": "Bandes croisées dans le dos",
- "d": "Si vous souhaitez utiliser la variation de dos croisé de Bee"
- },
- "bandLength": {
- "t": "Longueur de la bande (bandes croisées dans le dos)",
- "d": "Contrôle la longueur de la bande autour de votre buste pour la variation du dos croisé de Bee"
- },
- "backDartHeight": {
- "t": "Hauteur de la pince dos (Bella)",
- "d": "Contrôle la hauteur de pince dos dans le bloc de Bella sur lequel est basé Bee"
- },
- "armholeDepth": {
- "t": "Profondeur d'emmanchure (Bella)",
- "d": "Contrôle la profondeur de l'emmanchure dans le bloc de Bella sur lequel est basé Bee"
- },
- "frontArmholePitchDepth": {
- "t": "Profondeur du point pivot de l'emmanchure devant (Bella)",
- "d": "Contrôle la profondeur du point pivot de l'emmanchure avant dans le bloc Bella sur lequel est basé le patron Bee"
- },
- "frontShoulderWidth": {
- "t": "Largeur de l'épaule devant (Bella)",
- "d": "Contrôle la largeur de l'épaule avant dans le bloc de Bella sur lequel est basé le patron Bee"
- },
- "fullChestEaseReduction": {
- "t": "Réduction de la poitrine (Bella)",
- "d": "Contrôle la réduction du thorax dans le bloc Bella sur lequel est basé Bee"
- },
- "highBustWidth": {
- "t": "Largeur du tour de buste supérieur (Bella)",
- "d": "Contrôle la largeur du buste supérieur dans le bloc de Bella sur lequel est basé Bee"
- },
- "shoulderToShoulderEase": {
- "t": "Aisance d'épaules à épaules (Bella)",
- "d": "Contrôle l'aisance d'épaule à épaule dans le bloc Bella sur lequel est basé le patron Bee"
- }
- }
-}
diff --git a/designs/bee/i18n/index.mjs b/designs/bee/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bee/i18n/index.mjs
+++ b/designs/bee/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bee/i18n/nl.json b/designs/bee/i18n/nl.json
deleted file mode 100644
index 79118499c42..00000000000
--- a/designs/bee/i18n/nl.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
- "t": "Bee bikini top",
- "d": "Bee is a bikini top",
- "p": {
- "bandTie": "Band Tie",
- "cup": "Cup",
- "neckTie": "Neck Tie"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Overwijdte borst",
- "d": "Controls the chest ease in the underlying Bella block Bee is based on"
- },
- "waistEase": {
- "t": "Overwijdte taille",
- "d": "Controls the waist ease in the underlying Bella block Bee is based on"
- },
- "bustSpanEase": {
- "t": "Overwijdte bustenwijdte",
- "d": "Controls the bust span ease in the underlying Bella block Bee is based on"
- },
- "topDepth": {
- "t": "Top Depth",
- "d": "Controls how far the bikini cup extends upwards"
- },
- "bottomCupDepth": {
- "t": "Bottom depth",
- "d": "Controls how far the bikini cup extends downwards"
- },
- "sideDepth": {
- "t": "Side depth",
- "d": "Controls how far the bikini cup extends towards the side"
- },
- "sideCurve": {
- "t": "Side curve",
- "d": "Controls the curvature of the side of the bikini cup"
- },
- "frontCurve": {
- "t": "Front curve",
- "d": "Controls the curvature of the front of the bikini cup"
- },
- "bellaGuide": {
- "t": "Show Bella",
- "d": "Shows the outline of the Bella block Bee is based on"
- },
- "ties": {
- "t": "Ties",
- "d": "Whether to includes ties, yes or no"
- },
- "bandTieWidth": {
- "t": "Band (chest) tie width",
- "d": "Controls the width of the ties around your chest"
- },
- "bandTieLength": {
- "t": "Band (chest) tie length",
- "d": "Controls the length of the ties around your chest"
- },
- "bandTieEnds": {
- "t": "Band (chest) tie ends",
- "d": "Whether you like straight or pointy ends on the ties around your chest"
- },
- "bandTieColours": {
- "t": "Band (chest) tie length colours",
- "d": "Whether you want single color ties around your chest, or dual-coloured ones"
- },
- "neckTieWidth": {
- "t": "Neck tie width",
- "d": "Controls the width of the ties around your chest"
- },
- "neckTieLength": {
- "t": "Neck tie length",
- "d": "Controls the length of the ties around your chest"
- },
- "neckTieEnds": {
- "t": "Neck tie ends",
- "d": "Whether you like straight or pointy ends on the ties around your chest"
- },
- "neckTieColours": {
- "t": "Neck tie colours",
- "d": "Whether you want single color ties around your chest, or dual-coloured ones"
- },
- "crossBackTies": {
- "t": "Cross back ties",
- "d": "Whether you'd like to use the cross back tie variation of Bee"
- },
- "bandLength": {
- "t": "Band Length (Cross back ties)",
- "d": "Controls the length of the band around your chest for the cross back ties variation of Bee"
- },
- "backDartHeight": {
- "t": "Back dart height (Bella)",
- "d": "Controls the back dart height in the underlying Bella block Bee is based on"
- },
- "armholeDepth": {
- "t": "Armhole depth (Bella)",
- "d": "Controls the armhole depth in the underlying Bella block Bee is based on"
- },
- "frontArmholePitchDepth": {
- "t": "Front armhole pitch depth (Bella)",
- "d": "Controls the front armhole pitch depth in the underlying Bella block Bee is based on"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width (Bella)",
- "d": "Controls the front shoulder width in the underlying Bella block Bee is based on"
- },
- "fullChestEaseReduction": {
- "t": "Full chest reduction (Bella)",
- "d": "Controls the full chest reduction in the underlying Bella block Bee is based on"
- },
- "highBustWidth": {
- "t": "High bust width (Bella)",
- "d": "Controls the high bust width in the underlying Bella block Bee is based on"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease (Bella)",
- "d": "Controls the shoulder to shoulder ease in the underlying Bella block Bee is based on"
- }
- }
-}
diff --git a/designs/bee/i18n/uk.json b/designs/bee/i18n/uk.json
deleted file mode 100644
index 77d96166ba3..00000000000
--- a/designs/bee/i18n/uk.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
- "t": "Bee bikini top",
- "d": "Bee is a bikini top",
- "p": {
- "bandTie": "Band Tie",
- "cup": "Cup",
- "neckTie": "Neck Tie"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the chest ease in the underlying Bella block Bee is based on"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the waist ease in the underlying Bella block Bee is based on"
- },
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the bust span ease in the underlying Bella block Bee is based on"
- },
- "topDepth": {
- "t": "Top Depth",
- "d": "Controls how far the bikini cup extends upwards"
- },
- "bottomCupDepth": {
- "t": "Bottom depth",
- "d": "Controls how far the bikini cup extends downwards"
- },
- "sideDepth": {
- "t": "Side depth",
- "d": "Controls how far the bikini cup extends towards the side"
- },
- "sideCurve": {
- "t": "Side curve",
- "d": "Controls the curvature of the side of the bikini cup"
- },
- "frontCurve": {
- "t": "Front curve",
- "d": "Controls the curvature of the front of the bikini cup"
- },
- "bellaGuide": {
- "t": "Show Bella",
- "d": "Shows the outline of the Bella block Bee is based on"
- },
- "ties": {
- "t": "Ties",
- "d": "Whether to includes ties, yes or no"
- },
- "bandTieWidth": {
- "t": "Band (chest) tie width",
- "d": "Controls the width of the ties around your chest"
- },
- "bandTieLength": {
- "t": "Band (chest) tie length",
- "d": "Controls the length of the ties around your chest"
- },
- "bandTieEnds": {
- "t": "Band (chest) tie ends",
- "d": "Whether you like straight or pointy ends on the ties around your chest"
- },
- "bandTieColours": {
- "t": "Band (chest) tie length colours",
- "d": "Whether you want single color ties around your chest, or dual-coloured ones"
- },
- "neckTieWidth": {
- "t": "Neck tie width",
- "d": "Controls the width of the ties around your chest"
- },
- "neckTieLength": {
- "t": "Neck tie length",
- "d": "Controls the length of the ties around your chest"
- },
- "neckTieEnds": {
- "t": "Neck tie ends",
- "d": "Whether you like straight or pointy ends on the ties around your chest"
- },
- "neckTieColours": {
- "t": "Neck tie colours",
- "d": "Whether you want single color ties around your chest, or dual-coloured ones"
- },
- "crossBackTies": {
- "t": "Cross back ties",
- "d": "Whether you'd like to use the cross back tie variation of Bee"
- },
- "bandLength": {
- "t": "Band Length (Cross back ties)",
- "d": "Controls the length of the band around your chest for the cross back ties variation of Bee"
- },
- "backDartHeight": {
- "t": "Back dart height (Bella)",
- "d": "Controls the back dart height in the underlying Bella block Bee is based on"
- },
- "armholeDepth": {
- "t": "Armhole depth (Bella)",
- "d": "Controls the armhole depth in the underlying Bella block Bee is based on"
- },
- "frontArmholePitchDepth": {
- "t": "Front armhole pitch depth (Bella)",
- "d": "Controls the front armhole pitch depth in the underlying Bella block Bee is based on"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width (Bella)",
- "d": "Controls the front shoulder width in the underlying Bella block Bee is based on"
- },
- "fullChestEaseReduction": {
- "t": "Full chest reduction (Bella)",
- "d": "Controls the full chest reduction in the underlying Bella block Bee is based on"
- },
- "highBustWidth": {
- "t": "High bust width (Bella)",
- "d": "Controls the high bust width in the underlying Bella block Bee is based on"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease (Bella)",
- "d": "Controls the shoulder to shoulder ease in the underlying Bella block Bee is based on"
- }
- }
-}
diff --git a/designs/bee/package.json b/designs/bee/package.json
index 9dfb577de81..dfa3525bc4b 100644
--- a/designs/bee/package.json
+++ b/designs/bee/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bee",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a bikini top",
"author": "bobgeorgethe3rd (https://github.com/bobgeorgethe3rd)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/bella": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/bella": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bee/src/index.mjs b/designs/bee/src/index.mjs
index 58f8430fef2..42786fd9bae 100644
--- a/designs/bee/src/index.mjs
+++ b/designs/bee/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { cup } from './cup.mjs'
import { neckTie } from './neck-tie.mjs'
import { bandTie } from './band-tie.mjs'
@@ -7,7 +7,7 @@ import { i18n as beeI18n } from '../i18n/index.mjs'
import { i18n as bellaI18n } from '@freesewing/bella'
const Bee = new Design({
- data,
+ data: about,
parts: [cup, neckTie, bandTie],
})
@@ -50,4 +50,4 @@ const i18n = mergeI18n([bellaI18n, beeI18n], {
o: { keep: i18nKeepOptions },
})
-export { cup, neckTie, bandTie, Bee, i18n }
+export { cup, neckTie, bandTie, Bee, i18n, about }
diff --git a/designs/bee/tests/shared.test.mjs b/designs/bee/tests/shared.test.mjs
index a6377910d90..1ea26b5f8b5 100644
--- a/designs/bee/tests/shared.test.mjs
+++ b/designs/bee/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bee, i18n } from '../src/index.mjs'
+import { Bee, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bee)
+testPatternConfig(Bee, about)
// Test translation
testPatternI18n(Bee, i18n)
diff --git a/designs/bella/README.md b/designs/bella/README.md
index 706218203d2..e7c2f44512e 100644
--- a/designs/bella/README.md
+++ b/designs/bella/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bella
@@ -59,7 +44,7 @@ A FreeSewing pattern for a womenswear bodice block
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bella/data.mjs b/designs/bella/data.mjs
deleted file mode 100644
index 0ec9614446c..00000000000
--- a/designs/bella/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bella'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bella/i18n/de.json b/designs/bella/i18n/de.json
deleted file mode 100644
index bac54ac2b22..00000000000
--- a/designs/bella/i18n/de.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "t": "Bella, ein Grundschnitt",
- "d": "Bella ist ein Grundschnitt für Personen mit Brüsten.",
- "p": {
- "back": "Rückseite",
- "frontSideDart": "Vorderseite"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Brustumfangszugabe",
- "d": "Steuert die Größe der Zugabe zum Brustumfang"
- },
- "waistEase": {
- "t": "Taillenzugabe",
- "d": "Steuert die Menge an Leichtigkeit in deiner Taille"
- },
- "bustSpanEase": {
- "t": "Zugabe seitlicher Brustbereich",
- "d": "Steuert die Größe der (horizontalen) Zugabe, zu deinem seitlichen Brustbereich, \nwenn Brustpunkt berechnet wird."
- },
- "shoulderToShoulderEase": {
- "t": "Zugabe des Schulterabstandes",
- "d": "Kontrolliert die Menge an Zugabe zwischen deinen Schultern. Liegt inital bei -0,5%, da Bella ein Grundschnitt erfüllt, welcher in der Branche verwendet wird."
- },
- "fullChestEaseReduction": {
- "t": "Verringerung der Brustumfangszugabe",
- "d": "Ermöglicht es dir den Spielraum an der Brust zu verringern, um dort einen engeren Sitz zu ermöglichen"
- },
- "backDartHeight": {
- "t": "Höhe Rückenabnäher",
- "d": "Steuert die Höhe des Rückenabnähers"
- },
- "bustDartLength": {
- "t": "Länge des Brustabnähers",
- "d": "Steuert die Länge des Brustabnähers"
- },
- "waistDartLength": {
- "t": "Länge des Taillenabnähers",
- "d": "Steuert die Länge des Taillenabnähers"
- },
- "bustDartCurve": {
- "t": "Rundung Brustabnäher",
- "d": "Steuert die Krümmung des Büstendarts"
- },
- "armholeDepth": {
- "t": "Armlochtiefe",
- "d": "Steuert die Tiefe des Armloches"
- },
- "backArmholeSlant": {
- "t": "Hintere Armlochschiebung",
- "d": "Dreht das Armloch leicht in seinem Drehpunkt"
- },
- "frontArmholeCurvature": {
- "t": "Vordere Armlochkrümmung",
- "d": "Steuert wie tief das Armloch nach vorne unten ausgeschnitten ist"
- },
- "backArmholeCurvature": {
- "t": "Hintere Armlochkrümmung",
- "d": "Steuert wie tief das Armloch nach hinten unten ausgeschnitten ist"
- },
- "frontArmholePitchDepth": {
- "t": "Vordere Armlochtiefe",
- "d": "Stellt die horizontale Position des Vorderarmlochpunktes fest"
- },
- "backArmholePitchDepth": {
- "t": "Rückenarmloch-Tiefe",
- "d": "Stellt die horizontale Position des Rückenlochpunktes fest"
- },
- "backNeckCutout": {
- "t": "Ausschnitt im Nacken",
- "d": "Steuert, wie tief der Nackenausschnit am Rücken ausfällt"
- },
- "backHemSlope": {
- "t": "Neigung des hinteren Saumes",
- "d": "Steuert den Hang des Saum auf der Rückseite"
- },
- "frontShoulderWidth": {
- "t": "Vordere Schulterbreite",
- "d": "Steuert die Schmalheit der vorderen Schultern relativ zum Rücken"
- },
- "highBustWidth": {
- "t": "Oberbrustweite",
- "d": "Erlaubt es dir die Oberbrustweite vorne zu optimieren"
- }
- }
-}
diff --git a/designs/bella/i18n/es.json b/designs/bella/i18n/es.json
deleted file mode 100644
index ceb4a1fc7a2..00000000000
--- a/designs/bella/i18n/es.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "t": "Bella, patrón base de torso con pechos",
- "d": "Bella es un patrón báse para personas con pechos.",
- "p": {
- "back": "Atrás",
- "frontSideDart": "Frente"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Holgura de pecho",
- "d": "Controla la cantidad de facilidad en la parte más completa de tu cofre"
- },
- "waistEase": {
- "t": "Holgura de cintura",
- "d": "Controla la cantidad de facilidad en tu cintura"
- },
- "bustSpanEase": {
- "t": "Facilidad de la expansión del polvo",
- "d": "Controla la cantidad de facilidad (horizontal) que se agrega a tu superficie de busto al ubicar el punto de busto."
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease",
- "d": "Controls the amount of ease between your shoulders. Initially set to -.5% because Bella implements a block that is used in the industry."
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "backDartHeight": {
- "t": "Altura del dart trasero",
- "d": "Controla la altura del dart posterior"
- },
- "bustDartLength": {
- "t": "Longitud del dart del polvo",
- "d": "Controla la longitud del polvo"
- },
- "waistDartLength": {
- "t": "Longitud del dart de Waist",
- "d": "Controla la longitud del dardo de la cintura"
- },
- "bustDartCurve": {
- "t": "Curva darda de busto",
- "d": "Controla la curvatura del polvo"
- },
- "armholeDepth": {
- "t": "Profundidad del orificio",
- "d": "Controla la profundidad del orificio"
- },
- "backArmholeSlant": {
- "t": "Slant del orificio trasero",
- "d": "Rota ligeramente el orificio alrededor de su punto de zanja"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "backArmholeCurvature": {
- "t": "Curvatura del orificio trasero",
- "d": "Controla la profundidad del agujero de armadura en la parte trasera"
- },
- "frontArmholePitchDepth": {
- "t": "Profundidad del tono del orificio delantero",
- "d": "Modifica la posición horizontal del punto de giro del blindaje frontal"
- },
- "backArmholePitchDepth": {
- "t": "Profundidad del tono del orificio trasero",
- "d": "Modifica la posición horizontal del punto de giro del orificio trasero"
- },
- "backNeckCutout": {
- "t": "Corte trasero del cuello",
- "d": "Controla la profundidad de la apertura del cuello en la espalda"
- },
- "backHemSlope": {
- "t": "Pendiente trasera",
- "d": "Controla la pendiente del hem en la espalda"
- },
- "frontShoulderWidth": {
- "t": "Ancho del hombro frontal",
- "d": "Controla la estrechez de los hombros delanteros relativos a la parte trasera"
- },
- "highBustWidth": {
- "t": "Ancho de bust alto",
- "d": "Le permite ajustar el ancho del polvo alto en la parte frontal"
- }
- }
-}
diff --git a/designs/bella/i18n/fr.json b/designs/bella/i18n/fr.json
deleted file mode 100644
index 60931762d93..00000000000
--- a/designs/bella/i18n/fr.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "t": "Buste de base Bella",
- "d": "Bella est un bloc corporel de base pour les personnes qui ont le sein.",
- "p": {
- "back": "Retour",
- "frontSideDart": "Avant"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Aisance de poitrine",
- "d": "Contrôle la quantité d'aisance au niveau le plus large de votre buste"
- },
- "waistEase": {
- "t": "Aisance à la taille",
- "d": "Contrôle la quantité d'aisance au niveau de la taille"
- },
- "bustSpanEase": {
- "t": "Aisance de l'écart poitrine",
- "d": "Contrôle la quantité d'aisance (horizontale) ajoutée à votre poitrine entre les 2 pointes de la poitrine."
- },
- "shoulderToShoulderEase": {
- "t": "Aisance d'épaule à épaule",
- "d": "Contrôle la quantité d'aisance entre vos épaules. Initialement réglé sur -.5% parce que Bella implémente un bloc qui est utilisé dans l'industrie."
- },
- "fullChestEaseReduction": {
- "t": "Réduction de l'aisance de la poitrine",
- "d": "Vous permet de réduire l'aisance de la poitrine indépendamment pour rendre plus seyant cette zone"
- },
- "backDartHeight": {
- "t": "Hauteur de pince dos",
- "d": "Contrôle la hauteur de pince dans le dos"
- },
- "bustDartLength": {
- "t": "Longueur des pinces poitrine",
- "d": "Contrôle la longueur de la pince dos"
- },
- "waistDartLength": {
- "t": "Longueur de la pince de taille",
- "d": "Contrôle la longueur de la pince de taille"
- },
- "bustDartCurve": {
- "t": "Courbe de la pince poitrine",
- "d": "Contrôle la courbure de la pince poitrine"
- },
- "armholeDepth": {
- "t": "Profondeur d'emmanchure",
- "d": "Contrôle la profondeur de l'emmanchure"
- },
- "backArmholeSlant": {
- "t": "Inclinaison d'emmanchure dos",
- "d": "Modifie légèrement l'inclinaison de courbe de l'emmanchure autour de son point de pivot"
- },
- "frontArmholeCurvature": {
- "t": "Coube de l'emmanchure avant",
- "d": "Contrôle la profondeur du bas de la courbure d'emmanchure sur le devant"
- },
- "backArmholeCurvature": {
- "t": "Courbure de l'emmanchure arrière",
- "d": "Contrôle la profondeur du bas de la courbure d'emmanchure dans le dos"
- },
- "frontArmholePitchDepth": {
- "t": "Profondeur du point de pivot de l'emmanchure avant",
- "d": "Modifie la position horizontale du point de pivot de l'emmanchure avant"
- },
- "backArmholePitchDepth": {
- "t": "Profondeur du point de pivot de l'emmanchure dos",
- "d": "Modifie la position horizontale du point de pivot de l'emmanchure dos"
- },
- "backNeckCutout": {
- "t": "Arrondi de l'encolure au dos",
- "d": "Contrôle la profondeur de l'encolure à l'arrière du cou"
- },
- "backHemSlope": {
- "t": "Pente de l'ourlet dos",
- "d": "Contrôle la pente de l'ourlet à l'arrière"
- },
- "frontShoulderWidth": {
- "t": "Largeur d'épaule devant",
- "d": "Contrôle l'étroitesse des longueurs d'épaules de devant par rapport au dos"
- },
- "highBustWidth": {
- "t": "Largeur de buste supérieur",
- "d": "Permet de modifier la largeur de buste supérieur à l'avant"
- }
- }
-}
diff --git a/designs/bella/i18n/index.mjs b/designs/bella/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bella/i18n/index.mjs
+++ b/designs/bella/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bella/i18n/nl.json b/designs/bella/i18n/nl.json
deleted file mode 100644
index 58479b27745..00000000000
--- a/designs/bella/i18n/nl.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "t": "Bella lichaam blok",
- "d": "Bella is een basisorgaan voor mensen met borsten.",
- "p": {
- "back": "Achterzijde",
- "frontSideDart": "Voorzijde"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Overwijdte borst",
- "d": "Bepaalt de hoeveelheid overwijdte aan het grootste deel van je borst"
- },
- "waistEase": {
- "t": "Overwijdte taille",
- "d": "Bepaalt de hoeveelheid overwijdte aan je taille"
- },
- "bustSpanEase": {
- "t": "Overwijdte bustenwijdte",
- "d": "Bepaalt de hoeveelheid (horizontaal) overwijdte die wordt toegevoegd aan uw bustewijdte bij het lokaliseren van het bustepunt."
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease",
- "d": "Controls the amount of ease between your shoulders. Initially set to -.5% because Bella implements a block that is used in the industry."
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "backDartHeight": {
- "t": "Hoogte neep rug",
- "d": "Bepaalt de hoogte van de achterste neep"
- },
- "bustDartLength": {
- "t": "Lengte busteneep",
- "d": "Bepaalt de lengte van de buste-neep"
- },
- "waistDartLength": {
- "t": "Lengte neep taille",
- "d": "Bepaalt de lengte van de neep van de taille"
- },
- "bustDartCurve": {
- "t": "Curve busteneep",
- "d": "Bepaalt de kromming van de busteneep"
- },
- "armholeDepth": {
- "t": "Diepte armsgat",
- "d": "Bepaalt de diepte van het armsgat"
- },
- "backArmholeSlant": {
- "t": "Schuin armsgat achter",
- "d": "Het armsgat rond zijn toonhoogte roteert enigszins"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "backArmholeCurvature": {
- "t": "Kromming armsgat achter",
- "d": "Bepaalt hoe diep het armsgat aan de achterste onderkant wordt uitgekoopt"
- },
- "frontArmholePitchDepth": {
- "t": "Diepte armsgat vooraan",
- "d": "Aanpassen van de horizontale plaatsing van het pitch voorste armsgat"
- },
- "backArmholePitchDepth": {
- "t": "Diepte armsgat achteraan",
- "d": "Aanpassen van de horizontale plaatsing van het armsgat achterin"
- },
- "backNeckCutout": {
- "t": "Hals uitsnijding achteraan",
- "d": "Bepaalt hoe diep de halsopening aan de achterkant wordt uitgekoopt"
- },
- "backHemSlope": {
- "t": "Lope zoom achter",
- "d": "Bepaalt de richtingscoëfficiënt van de zoom achteraan"
- },
- "frontShoulderWidth": {
- "t": "Schouderbreedte vooraan",
- "d": "Bepaalt de smalheid van de schouders vooraan ten opzichte van de achterkant"
- },
- "highBustWidth": {
- "t": "Hoge buste-breedte",
- "d": "Stelt je in staat om de breedte van de nachtbust vooraan te wijzigen"
- }
- }
-}
diff --git a/designs/bella/i18n/uk.json b/designs/bella/i18n/uk.json
deleted file mode 100644
index 0765e252747..00000000000
--- a/designs/bella/i18n/uk.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "t": "Bella body block",
- "d": "Bella is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "frontSideDart": "Front"
- },
- "s": {},
- "o": {
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the fullest part of your chest"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of (horizontal) ease added to your bust span when locating the bust point."
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to Shoulder ease",
- "d": "Controls the amount of ease between your shoulders. Initially set to -.5% because Bella implements a block that is used in the industry."
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "backDartHeight": {
- "t": "Back dart height",
- "d": "Controls the height of the back dart"
- },
- "bustDartLength": {
- "t": "Bust dart length",
- "d": "Controls the length of the bust dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "bustDartCurve": {
- "t": "Bust dart curve",
- "d": "Controls the curvature of the bust dart"
- },
- "armholeDepth": {
- "t": "Armhole depth",
- "d": "Controls the depth of the armhole"
- },
- "backArmholeSlant": {
- "t": "Back armhole slant",
- "d": "Slightly rotates the armhole around its pitch point"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "backArmholeCurvature": {
- "t": "Back armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the back bottom"
- },
- "frontArmholePitchDepth": {
- "t": "Front armhole pitch depth",
- "d": "Tweaks the horizontal placement of the front armhole pitch point"
- },
- "backArmholePitchDepth": {
- "t": "Back armhole pitch depth",
- "d": "Tweaks the horizontal placement of the back armhole pitch point"
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "Controls how deep the neck opening is scooped out at at the back"
- },
- "backHemSlope": {
- "t": "Back hem slope",
- "d": "Controls the slope of the hem at the back"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls the narrowness of the front shoulders relative to the back"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Allows you to tweak the hight bust width at the front"
- }
- }
-}
diff --git a/designs/bella/package.json b/designs/bella/package.json
index 9ea0acaf5d7..e1385404340 100644
--- a/designs/bella/package.json
+++ b/designs/bella/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bella",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a womenswear bodice block",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bella/src/back.mjs b/designs/bella/src/back.mjs
index 05577b33564..1397e0c52f9 100644
--- a/designs/bella/src/back.mjs
+++ b/designs/bella/src/back.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
export const back = {
name: 'bella.back',
measurements: [
@@ -24,11 +26,17 @@ export const back = {
backCenterWaistReduction: 0.35,
collarFactor: 0.19,
// Fit
- bustSpanEase: { pct: 10, min: 0, max: 20, menu: 'fit' },
- chestEase: { pct: 11, min: 5, max: 20, menu: 'fit' },
+ bustSpanEase: { pct: 10, min: 0, max: 20, ...pctBasedOn('bustSpan'), menu: 'fit' },
+ chestEase: { pct: 11, min: 5, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
fullChestEaseReduction: { pct: 4, min: 0, max: 8, menu: 'fit' },
- shoulderToShoulderEase: { pct: -0.5, min: -1, max: 5, menu: 'fit' },
- waistEase: { pct: 5, min: 1, max: 20, menu: 'fit' },
+ shoulderToShoulderEase: {
+ pct: -0.5,
+ min: -1,
+ max: 5,
+ ...pctBasedOn('shoulderToShoulder'),
+ menu: 'fit',
+ },
+ waistEase: { pct: 5, min: 1, max: 20, ...pctBasedOn('waist'), menu: 'fit' },
// Darts
backDartHeight: { pct: 46, min: 38, max: 54, menu: 'darts' },
bustDartCurve: { pct: 100, min: -100, max: 100, menu: 'darts' },
diff --git a/designs/bella/src/index.mjs b/designs/bella/src/index.mjs
index 46a0565b8d6..c04d343b45a 100644
--- a/designs/bella/src/index.mjs
+++ b/designs/bella/src/index.mjs
@@ -1,12 +1,12 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { back } from './back.mjs'
import { frontSideDart } from './front-side-dart.mjs'
import { i18n } from '../i18n/index.mjs'
const Bella = new Design({
- data,
+ data: about,
parts: [back, frontSideDart],
})
-export { back, frontSideDart, Bella, i18n }
+export { back, frontSideDart, Bella, i18n, about }
diff --git a/designs/bella/tests/shared.test.mjs b/designs/bella/tests/shared.test.mjs
index c681ef87c62..69d7a6124f5 100644
--- a/designs/bella/tests/shared.test.mjs
+++ b/designs/bella/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bella, i18n } from '../src/index.mjs'
+import { Bella, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bella)
+testPatternConfig(Bella, about)
// Test translation
testPatternI18n(Bella, i18n)
diff --git a/designs/benjamin/README.md b/designs/benjamin/README.md
index 4fb021e3971..8be9c1d3373 100644
--- a/designs/benjamin/README.md
+++ b/designs/benjamin/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/benjamin
@@ -59,7 +44,7 @@ A FreeSewing pattern for a bow tie
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/benjamin/data.mjs b/designs/benjamin/data.mjs
deleted file mode 100644
index 2b16721ef72..00000000000
--- a/designs/benjamin/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/benjamin'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/benjamin/i18n/de.json b/designs/benjamin/i18n/de.json
deleted file mode 100644
index a75e226d275..00000000000
--- a/designs/benjamin/i18n/de.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Benjamin, die Fliege",
- "d": "Benjamin ist eine Schleife - oder Fliege - mit vier unterschiedlichen Formvariationen.",
- "p": {
- "base": "Base",
- "bow1": "Fliege",
- "bow2": "Fliege",
- "bow3": "Fliege",
- "ribbon": "Einstellband"
- },
- "s": {},
- "o": {
- "adjustmentRibbon": {
- "t": "Einstellband",
- "d": "Einstellband verwenden oder nicht"
- },
- "bandLength": {
- "t": "Bandlänge",
- "d": "Lände des Bandes"
- },
- "tipWidth": {
- "t": "Spitzenbreite",
- "d": "Breite der Spitzen"
- },
- "knotWidth": {
- "t": "Knotenbreite",
- "d": "Breite des Knotens"
- },
- "bowLength": {
- "t": "Fliegenlänge",
- "d": "Länge der Fliege (wenn geknotet)"
- },
- "bowStyle": {
- "t": "Fliegen-Stil",
- "d": "Stil der Fliege"
- },
- "endStyle": {
- "t": "Enden-Stil",
- "d": "Stil für die Enden der Fliege"
- },
- "collarEase": {
- "t": "Kragen Zugabe",
- "d": "Die Menge an Zugabe an deinem Hals"
- },
- "ribbonWidth": {
- "t": "Bänderbreite",
- "d": "Breite des Bandes"
- }
- }
-}
diff --git a/designs/benjamin/i18n/es.json b/designs/benjamin/i18n/es.json
deleted file mode 100644
index 26a3ed895c9..00000000000
--- a/designs/benjamin/i18n/es.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Benjamin, pajarita",
- "d": "Benjamin es un patrón de pajarita con cuatro formas a elegir.",
- "p": {
- "base": "Base",
- "bow1": "Pajarita",
- "bow2": "Pajarita",
- "bow3": "Pajarita",
- "ribbon": "Banda"
- },
- "s": {},
- "o": {
- "adjustmentRibbon": {
- "t": "Cinta de ajuste",
- "d": "Incluir o no una cinta de ajuste"
- },
- "bandLength": {
- "t": "Longitud de la banda",
- "d": "Longitud de la banda"
- },
- "tipWidth": {
- "t": "Ancho de la punta",
- "d": "Ancho de las puntas"
- },
- "knotWidth": {
- "t": "Ancho de nudo",
- "d": "Ancho del nudo"
- },
- "bowLength": {
- "t": "Longitud del lazo",
- "d": "Longitud del lazo (cuando está anudado)"
- },
- "bowStyle": {
- "t": "Estilo del lazo",
- "d": "Estilo del lazo"
- },
- "endStyle": {
- "t": "Estilo de las puntas",
- "d": "Estilo de las puntas del lazo"
- },
- "collarEase": {
- "t": "Facilidad de cuello",
- "d": "The amount of ease at your neck"
- },
- "ribbonWidth": {
- "t": "Ribbon width",
- "d": "Width of the ribbon"
- }
- }
-}
diff --git a/designs/benjamin/i18n/fr.json b/designs/benjamin/i18n/fr.json
deleted file mode 100644
index 58fa86c5d5a..00000000000
--- a/designs/benjamin/i18n/fr.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Nœud papillon Benjamin",
- "d": "Benjamin est un nœud papillon avec 4 possibilités de styles différents.",
- "p": {
- "base": "Base",
- "bow1": "Nœud",
- "bow2": "Nœud",
- "bow3": "Nœud",
- "ribbon": "Bande"
- },
- "s": {},
- "o": {
- "adjustmentRibbon": {
- "t": "Ruban d'ajustement",
- "d": "Si vous souhaitez inclure ou non un ruban d'ajustement"
- },
- "bandLength": {
- "t": "Longueur de bande",
- "d": "Longueur de la bande"
- },
- "tipWidth": {
- "t": "Largeur de pointe",
- "d": "Largeur des pointes"
- },
- "knotWidth": {
- "t": "Largeur du noeud",
- "d": "Largeur du nœud"
- },
- "bowLength": {
- "t": "Longueur de nœud",
- "d": "Longueur du nœud (lorsqu'il est noué)"
- },
- "bowStyle": {
- "t": "Style de nœud",
- "d": "Style du nœud"
- },
- "endStyle": {
- "t": "Style de l'extrémité",
- "d": "Style des extrémités du noeud"
- },
- "collarEase": {
- "t": "Aisance du col",
- "d": "La quantité d'aisance à votre cou"
- },
- "ribbonWidth": {
- "t": "Largeur du ruban d'ajustement",
- "d": "Largeur du ruban"
- }
- }
-}
diff --git a/designs/benjamin/i18n/index.mjs b/designs/benjamin/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/benjamin/i18n/index.mjs
+++ b/designs/benjamin/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/benjamin/i18n/nl.json b/designs/benjamin/i18n/nl.json
deleted file mode 100644
index 5e0665410a4..00000000000
--- a/designs/benjamin/i18n/nl.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Benjamin vlinderdas",
- "d": "Benjamin is een vlinderdas met vier verschillende mogelijke vormen.",
- "p": {
- "base": "Base",
- "bow1": "Vlinderdas",
- "bow2": "Vlinderdas",
- "bow3": "Vlinderdas",
- "ribbon": "Band"
- },
- "s": {},
- "o": {
- "adjustmentRibbon": {
- "t": "Aanpaslintje",
- "d": "Of je wel of geen aanpaslintje wil"
- },
- "bandLength": {
- "t": "Lengte band",
- "d": "Lengte van de band"
- },
- "tipWidth": {
- "t": "Tip breedte",
- "d": "Breedte van de punten"
- },
- "knotWidth": {
- "t": "Knoop breedte",
- "d": "Breedte van de knoop"
- },
- "bowLength": {
- "t": "Lengte strik",
- "d": "De lengte van gestrikt (gestrikt)"
- },
- "bowStyle": {
- "t": "Stijl strik",
- "d": "Stijl van de strik"
- },
- "endStyle": {
- "t": "Puntvorm",
- "d": "Stijl van de puntjes van de strik"
- },
- "collarEase": {
- "t": "Overwijdte kraag",
- "d": "The amount of ease at your neck"
- },
- "ribbonWidth": {
- "t": "Ribbon width",
- "d": "Width of the ribbon"
- }
- }
-}
diff --git a/designs/benjamin/i18n/uk.json b/designs/benjamin/i18n/uk.json
deleted file mode 100644
index b5fb78c15f3..00000000000
--- a/designs/benjamin/i18n/uk.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Benjamin bow tie",
- "d": "Benjamin is a bow tie pattern with four different shape options.",
- "p": {
- "base": "Base",
- "bow1": "Bow",
- "bow2": "Bow",
- "bow3": "Bow",
- "ribbon": "Ribbon"
- },
- "s": {},
- "o": {
- "adjustmentRibbon": {
- "t": "Adjustment ribbon",
- "d": "Whether or not to include an adjustment ribbon"
- },
- "bandLength": {
- "t": "Band length",
- "d": "Length of the band"
- },
- "tipWidth": {
- "t": "Tip width",
- "d": "Width of the tips"
- },
- "knotWidth": {
- "t": "Knot width",
- "d": "Width of the knot"
- },
- "bowLength": {
- "t": "Bow length",
- "d": "Length of the bow (when knotted)"
- },
- "bowStyle": {
- "t": "Bow style",
- "d": "Style of the bow"
- },
- "endStyle": {
- "t": "End style",
- "d": "Style of the bow ends"
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease at your neck"
- },
- "ribbonWidth": {
- "t": "Ribbon width",
- "d": "Width of the ribbon"
- }
- }
-}
diff --git a/designs/benjamin/package.json b/designs/benjamin/package.json
index 952766a1282..27a80a25cfa 100644
--- a/designs/benjamin/package.json
+++ b/designs/benjamin/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/benjamin",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a bow tie",
"author": "woutervdub (https://github.com/woutervdub)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/benjamin/src/base.mjs b/designs/benjamin/src/base.mjs
index 2a1550188f1..53a9e087d98 100644
--- a/designs/benjamin/src/base.mjs
+++ b/designs/benjamin/src/base.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
function draftBenjaminBase({
store,
sa,
@@ -236,7 +238,7 @@ export const base = {
bandLength: 0.17,
adjustmentRibbonWidth: 20,
// Fit options
- collarEase: { pct: 3, min: 0, max: 6, menu: 'fit' },
+ collarEase: { pct: 3, min: 0, max: 6, ...pctBasedOn('neck'), menu: 'fit' },
adjustmentRibbon: { bool: false, menu: 'fit' },
// Style options
tipWidth: { pct: 15, min: 0, max: 20, menu: 'style' },
diff --git a/designs/benjamin/src/index.mjs b/designs/benjamin/src/index.mjs
index af0d0b3c3fb..b128637ca0a 100644
--- a/designs/benjamin/src/index.mjs
+++ b/designs/benjamin/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { bow1 } from './bow1.mjs'
import { bow2 } from './bow2.mjs'
import { bow3 } from './bow3.mjs'
@@ -8,9 +8,9 @@ import { i18n } from '../i18n/index.mjs'
// Setup our new design
const Benjamin = new Design({
- data,
+ data: about,
parts: [bow1, bow2, bow3, collarBand],
})
// Named exports
-export { bow1, bow2, bow3, collarBand, Benjamin, i18n }
+export { bow1, bow2, bow3, collarBand, Benjamin, i18n, about }
diff --git a/designs/benjamin/tests/shared.test.mjs b/designs/benjamin/tests/shared.test.mjs
index 722b2328af1..929c89e8d5f 100644
--- a/designs/benjamin/tests/shared.test.mjs
+++ b/designs/benjamin/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Benjamin, i18n } from '../src/index.mjs'
+import { Benjamin, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Benjamin)
+testPatternConfig(Benjamin, about)
// Test translation
testPatternI18n(Benjamin, i18n)
diff --git a/designs/bent/README.md b/designs/bent/README.md
index 7b4e4503da8..d11e1bbb90d 100644
--- a/designs/bent/README.md
+++ b/designs/bent/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bent
@@ -59,7 +44,7 @@ A FreeSewing pattern for a menswear body block with a two-part sleeve
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bent/data.mjs b/designs/bent/data.mjs
deleted file mode 100644
index b27b4fb228f..00000000000
--- a/designs/bent/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bent'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bent/i18n/de.json b/designs/bent/i18n/de.json
deleted file mode 100644
index 073189e3c53..00000000000
--- a/designs/bent/i18n/de.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "t": "Bent, ein Grundschnitt",
- "d": "Dieser zweiteilige Ärmel-Grundschnitt ist die Grundlage für unsere Mäntel- und Jackenschnitte.",
- "p": {
- "sleeve": "Sleeve",
- "topSleeve": "Oberärmel",
- "underSleeve": "Unterärmel"
- },
- "s": {},
- "o": {
- "sleeveBend": {
- "t": "Ärmelkrümmung",
- "d": "Steuert die Krümmung des Ärmels am Ellbogen."
- },
- "sleevecapHeight": {
- "t": "Armkugel Höhe",
- "d": "Steuert die Höhe der Armkugel."
- }
- }
-}
diff --git a/designs/bent/i18n/es.json b/designs/bent/i18n/es.json
deleted file mode 100644
index c1ca8464714..00000000000
--- a/designs/bent/i18n/es.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "t": "Bent, patrón base de chaqueta",
- "d": "Este patrón base con mangas de dos partes es la base de nuestros patrones de chaqueta y abrigo.",
- "p": {
- "sleeve": "Sleeve",
- "topSleeve": "Manga superior",
- "underSleeve": "Manga debajo"
- },
- "s": {},
- "o": {
- "sleeveBend": {
- "t": "Manga doblada",
- "d": "Curva de la manga en el codo."
- },
- "sleevecapHeight": {
- "t": "Altura de la manga",
- "d": "Controla la altura de la manga."
- }
- }
-}
diff --git a/designs/bent/i18n/fr.json b/designs/bent/i18n/fr.json
deleted file mode 100644
index 8c9ec83a85b..00000000000
--- a/designs/bent/i18n/fr.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "t": "Patron de base Bent",
- "d": "Ce bloc d'emmanchure en deux parties est la base de nos modèles de manteau et de veste.",
- "p": {
- "sleeve": "Manche",
- "topSleeve": "Haut de manche",
- "underSleeve": "Sous-manche"
- },
- "s": {},
- "o": {
- "sleeveBend": {
- "t": "Courbe de manche",
- "d": "Contrôle la courbure de la manche au niveau du coude."
- },
- "sleevecapHeight": {
- "t": "Hauteur du tête de manche",
- "d": "Contrôle la hauteur du tête de manche"
- }
- }
-}
diff --git a/designs/bent/i18n/index.mjs b/designs/bent/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bent/i18n/index.mjs
+++ b/designs/bent/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bent/i18n/nl.json b/designs/bent/i18n/nl.json
deleted file mode 100644
index cdf687bb0f2..00000000000
--- a/designs/bent/i18n/nl.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "t": "Bent Basisvorm",
- "d": "Dit patroon met tweedelige mouw is de basis voor onze jassen- en jasjespatronen.",
- "p": {
- "sleeve": "Sleeve",
- "topSleeve": "Bovenmouw",
- "underSleeve": "Ondermouw"
- },
- "s": {},
- "o": {
- "sleeveBend": {
- "t": "Mouw kromming",
- "d": "Buiging van de mouw aan de elleboog"
- },
- "sleevecapHeight": {
- "t": "Hoogte mouwkop",
- "d": "Bepaalt de hoogte van de mouwkop"
- }
- }
-}
diff --git a/designs/bent/i18n/uk.json b/designs/bent/i18n/uk.json
deleted file mode 100644
index 49544bbf595..00000000000
--- a/designs/bent/i18n/uk.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "t": "Bent body Block",
- "d": "This two-part sleeve block is the basis of our coat and jacket patterns.",
- "p": {
- "sleeve": "Sleeve",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "Controls the bend of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- }
- }
-}
diff --git a/designs/bent/package.json b/designs/bent/package.json
index 648467cc41c..1a65df446fc 100644
--- a/designs/bent/package.json
+++ b/designs/bent/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bent",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a menswear body block with a two-part sleeve",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bent/src/index.mjs b/designs/bent/src/index.mjs
index fb5097d1378..12029e74371 100644
--- a/designs/bent/src/index.mjs
+++ b/designs/bent/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { front, back, i18n as brianI18n } from '@freesewing/brian'
import { sleeve } from './sleeve.mjs'
import { topSleeve } from './topsleeve.mjs'
@@ -8,7 +8,7 @@ import { i18n as bentI18n } from '../i18n/index.mjs'
// Create new design
const Bent = new Design({
- data,
+ data: about,
parts: [front, back, sleeve, topSleeve, underSleeve],
})
@@ -28,4 +28,4 @@ const i18n = mergeI18n([brianI18n, bentI18n], {
})
// Named exports
-export { front, back, sleeve, topSleeve, underSleeve, Bent, i18n }
+export { front, back, sleeve, topSleeve, underSleeve, Bent, i18n, about }
diff --git a/designs/bent/src/sleeve.mjs b/designs/bent/src/sleeve.mjs
index 4f26e9090b6..9667a541b4e 100644
--- a/designs/bent/src/sleeve.mjs
+++ b/designs/bent/src/sleeve.mjs
@@ -1,4 +1,5 @@
import { front } from '@freesewing/brian'
+import { pctBasedOn } from '@freesewing/core'
function draftBentSleeve({ Path, paths, points, store, options, part }) {
function draftSleeve(part, tweak) {
@@ -183,11 +184,11 @@ export const sleeve = {
brianFitCollar: true,
collarFactor: 4.8,
// Fit
- chestEase: { pct: 8, min: -4, max: 20, menu: 'fit' },
- collarEase: { pct: 3.5, min: 0, max: 10, menu: 'fit' },
- bicepsEase: { pct: 20, min: 10, max: 40, menu: 'fit' },
- cuffEase: { pct: 40, min: 2, max: 100, menu: 'fit' },
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
+ chestEase: { pct: 8, min: -4, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
+ collarEase: { pct: 3.5, min: 0, max: 10, ...pctBasedOn('neck'), menu: 'fit' },
+ bicepsEase: { pct: 20, min: 10, max: 40, ...pctBasedOn('biceps'), menu: 'fit' },
+ cuffEase: { pct: 40, min: 2, max: 100, ...pctBasedOn('wrist'), menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
lengthBonus: { pct: 0, min: -4, max: 60, menu: 'fit' },
sleeveLengthBonus: { pct: 0, min: -20, max: 15, menu: 'fit' },
sleeveBend: { deg: 10, min: 0, max: 20, menu: 'fit' },
diff --git a/designs/bent/tests/shared.test.mjs b/designs/bent/tests/shared.test.mjs
index 90bfc253fa3..f542eef0682 100644
--- a/designs/bent/tests/shared.test.mjs
+++ b/designs/bent/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bent, i18n } from '../src/index.mjs'
+import { Bent, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bent)
+testPatternConfig(Bent, about)
// Test translation
testPatternI18n(Bent, i18n)
diff --git a/designs/bibi/CHANGELOG.md b/designs/bibi/CHANGELOG.md
index fd38619ed40..066a84bf20d 100644
--- a/designs/bibi/CHANGELOG.md
+++ b/designs/bibi/CHANGELOG.md
@@ -1,6 +1,14 @@
# Change log for: @freesewing/bibi
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Changed the algorithm to draft the side seam, so the measurements are followed more precisely
+ - Reduced default influence of the seat back measurement and added an option to adjust it.
+ - Added various options for ribbing and knit binding on waistband, armscyes/cuffs and neck hole and included more documentation
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/bibi/README.md b/designs/bibi/README.md
index c615ce3ba1e..ef50d0e10ec 100644
--- a/designs/bibi/README.md
+++ b/designs/bibi/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bibi
@@ -59,7 +44,7 @@ A FreeSewing pattern for a knit top body block
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bibi/data.mjs b/designs/bibi/data.mjs
deleted file mode 100644
index f4ae7812c7c..00000000000
--- a/designs/bibi/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bibi'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bibi/i18n/de.json b/designs/bibi/i18n/de.json
deleted file mode 100644
index 6aa01adedfc..00000000000
--- a/designs/bibi/i18n/de.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan, das T-Shirt",
- "d": "Teagan ist ein Schnittmuster für ein passgenaues T-Shirt.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "sleeve": "Ärmel"
- },
- "s": {
- "fullLengthFromHps": "Volle Länge (vom höchsten Schulterpunkt)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Entwurf für hohe Büste",
- "d": "Zeichnen Sie das Muster für die hohe Büstenmessung (falls vorhanden) statt der (vollen) Truhe. Dies wird zu einem besser angepassten Kleidungsstück für Brustkleidung führen."
- },
- "sleeveEase": {
- "t": "Bequemlichkeitszugabe Ärmel",
- "d": "Größe der Bequemlichkeitszugabe an den Ärmeln"
- },
- "sleeveLength": {
- "t": "Ärmellänge",
- "d": "Steuert die Länge deiner Ärmel"
- },
- "necklineBend": {
- "t": "Krümmung Halsausschnitt",
- "d": "Steuert die Krümmung des Halsausschnitts."
- },
- "necklineDepth": {
- "t": "Ausschnitttiefe",
- "d": "Steuert, wie tief der Halsausschnitt fällt."
- },
- "necklineWidth": {
- "t": "Ausschnittbreite",
- "d": "Steuert die Breite des Halsausschnitts."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/bibi/i18n/es.json b/designs/bibi/i18n/es.json
deleted file mode 100644
index 381ab9391b8..00000000000
--- a/designs/bibi/i18n/es.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan, camiseta",
- "d": "Teagan es un patrón de camiseta entallada.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "sleeve": "Manga"
- },
- "s": {
- "fullLengthFromHps": "Longitud completa (de HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Borrador para alta caída",
- "d": "Borra el patrón para la medición alta del polvo (si está disponible) en lugar del cofre (completo). Esto dará lugar a una prenda más ajustada para las personas con senos."
- },
- "sleeveEase": {
- "t": "Manga fácil",
- "d": "Cantidad de facilidad de sus mangas"
- },
- "sleeveLength": {
- "t": "Longitud de la manga",
- "d": "Controla la longitud de las mangas"
- },
- "necklineBend": {
- "t": "Curvatura neckline",
- "d": "Controla la curvatura del cuello."
- },
- "necklineDepth": {
- "t": "Profundidad del cuello",
- "d": "Controla la profundidad de la abertura del cuello."
- },
- "necklineWidth": {
- "t": "Neckline width",
- "d": "Controla el ancho de la abertura del cuello."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/bibi/i18n/fr.json b/designs/bibi/i18n/fr.json
deleted file mode 100644
index 15507133df6..00000000000
--- a/designs/bibi/i18n/fr.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "T-shirt Teagan",
- "d": "Teagan est un T-shirt ajusté.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "sleeve": "Manche"
- },
- "s": {
- "fullLengthFromHps": "Longueur complète (à partir du haut de l'épaule)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Tracé pour le buste supérieur",
- "d": "Tracer le patron pour la mesure de tour de poitrine supérieure (si disponible) plutôt que la poitrine (pleine). Il en résultera un vêtement plus ajusté pour les personnes qui ont des seins."
- },
- "sleeveEase": {
- "t": "Aisance des manches",
- "d": "Quantité d'aisance de vos manches"
- },
- "sleeveLength": {
- "t": "Longueur des manches",
- "d": "Contrôle la longueur de vos manches"
- },
- "necklineBend": {
- "t": "Courbure de l'encolure",
- "d": "Contrôle la courbure de l'encolure."
- },
- "necklineDepth": {
- "t": "Profondeur de l'encolure",
- "d": "Contrôle la profondeur de l'encolure."
- },
- "necklineWidth": {
- "t": "Largeur d'encolure",
- "d": "Contrôle la largeur de l'encolure."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/bibi/i18n/index.mjs b/designs/bibi/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bibi/i18n/index.mjs
+++ b/designs/bibi/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bibi/i18n/nl.json b/designs/bibi/i18n/nl.json
deleted file mode 100644
index 6ae4ae5ba5e..00000000000
--- a/designs/bibi/i18n/nl.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan T-shirt",
- "d": "Teagan is een patroon voor een aansluitend t-shirt.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "sleeve": "Mouw"
- },
- "s": {
- "fullLengthFromHps": "Afgewerkte lengte (vanaf HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Teken voor hoge buste",
- "d": "Teken het patroon voor de hoge bustemaat (indien beschikbaar) in plaats van de volle borstomtrek. Dit heeft een aansluitender kledingstuk als resultaat voor mensen met borsten."
- },
- "sleeveEase": {
- "t": "Overwijdte mouw",
- "d": "De hoeveelheid extra ruimte in je mouwen"
- },
- "sleeveLength": {
- "t": "Mouwlengte",
- "d": "Bepaalt de lengte van je mouwen"
- },
- "necklineBend": {
- "t": "Curve halslijn",
- "d": "Bepaalt de curve van de halsuitsnijding."
- },
- "necklineDepth": {
- "t": "Diepte halsuitsnijding",
- "d": "Bepaalt hoe diep de halsopening is."
- },
- "necklineWidth": {
- "t": "Breedte halsuitsnijding",
- "d": "Bepaalt hoe breed de halsopening is."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/bibi/i18n/uk.json b/designs/bibi/i18n/uk.json
deleted file mode 100644
index 689205eff60..00000000000
--- a/designs/bibi/i18n/uk.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan T-shirt",
- "d": "Teagan is a fitted T-shirt pattern.",
- "p": {
- "back": "Back",
- "front": "Front",
- "sleeve": "Sleeve"
- },
- "s": {
- "fullLengthFromHps": "Full length (from HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Amount of ease of your sleeves"
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls the length of your sleeves"
- },
- "necklineBend": {
- "t": "Neckline curvature",
- "d": "Controls the curvature of the neckline."
- },
- "necklineDepth": {
- "t": "Neckline depth",
- "d": "Controls how deep the neck opening plunges down."
- },
- "necklineWidth": {
- "t": "Neckline width",
- "d": "Controls the width of the neck opening."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/bibi/package.json b/designs/bibi/package.json
index ef15b4559d5..1b851930b89 100644
--- a/designs/bibi/package.json
+++ b/designs/bibi/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bibi",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a knit top body block",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bibi/src/cuff.mjs b/designs/bibi/src/cuff.mjs
index ec94b4a209c..60a1b30c971 100644
--- a/designs/bibi/src/cuff.mjs
+++ b/designs/bibi/src/cuff.mjs
@@ -1,5 +1,5 @@
import { sleevecap as brianSleeveCap } from '@freesewing/brian'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
import { draftRibbing } from './shared.mjs'
export const cuff = {
@@ -13,7 +13,7 @@ export const cuff = {
s3Armhole: 0,
brianFitSleeve: true,
brianFitCollar: false,
- bicepsEase: { pct: 5, min: 0, max: 50, menu: 'fit' },
+ bicepsEase: { pct: 5, min: 0, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
collarEase: 0,
shoulderSlopeReduction: 0,
sleeveWidthGuarantee: 0.85,
@@ -21,12 +21,13 @@ export const cuff = {
legacyArmholeDepth: false,
// Unused as legacyArmholeDepth is disabled, hide option in documentation
armholeDepthFactor: 0.5,
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
// Note: we reuse Brian's cuff ease as "armhole fullness"
cuffEase: {
pct: 20,
min: 0,
max: 200,
+ ...pctBasedOn('wrist'),
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
diff --git a/designs/bibi/src/front.mjs b/designs/bibi/src/front.mjs
index 718dd8a091d..371f11fde08 100644
--- a/designs/bibi/src/front.mjs
+++ b/designs/bibi/src/front.mjs
@@ -10,6 +10,7 @@ import {
plotSideLineMeasurements,
verticalSplit,
} from './shared.mjs'
+import { pctBasedOn } from '@freesewing/core'
export const front = {
name: 'bibi.front',
diff --git a/designs/bibi/src/index.mjs b/designs/bibi/src/index.mjs
index 9b7d68b56a2..946c1b13121 100644
--- a/designs/bibi/src/index.mjs
+++ b/designs/bibi/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as bibiI18n } from '../i18n/index.mjs'
import { front } from './front.mjs'
@@ -26,7 +26,7 @@ import {
// Setup our new design
const Bibi = new Design({
- data,
+ data: about,
parts: [waistband, cuff, armholeBinding, neckBinding, sleeve, back, front],
})
@@ -58,4 +58,5 @@ export {
draftKnitBinding,
Bibi,
i18n,
+ about,
}
diff --git a/designs/bibi/src/waistband.mjs b/designs/bibi/src/waistband.mjs
index a84d537b503..4af4d237e30 100644
--- a/designs/bibi/src/waistband.mjs
+++ b/designs/bibi/src/waistband.mjs
@@ -8,6 +8,7 @@ import {
correctArmHole,
draftRibbing,
} from './shared.mjs'
+import { pctBasedOn } from '@freesewing/core'
export const waistband = {
name: 'bibi.waistband',
@@ -21,12 +22,13 @@ export const waistband = {
pct: 5,
min: -10,
max: 20,
+ ...pctBasedOn('waist'),
menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false),
order: 'EBB',
},
- hipsEase: { pct: 5, min: -5, max: 50, menu: 'fit', order: 'ECA' },
- seatEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'EDA' },
- chestEase: { pct: 2, min: -5, max: 25, menu: 'fit', order: 'EAB' },
+ hipsEase: { pct: 5, min: -5, max: 50, ...pctBasedOn('hips'), menu: 'fit', order: 'ECA' },
+ seatEase: { pct: 2, min: -5, max: 50, ...pctBasedOn('seat'), menu: 'fit', order: 'EDA' },
+ chestEase: { pct: 2, min: -5, max: 25, ...pctBasedOn('chest'), menu: 'fit', order: 'EAB' },
length: {
dflt: 'seat',
list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'],
diff --git a/designs/bibi/tests/shared.test.mjs b/designs/bibi/tests/shared.test.mjs
index 5a6830c127e..ade305cf2b8 100644
--- a/designs/bibi/tests/shared.test.mjs
+++ b/designs/bibi/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bibi, i18n } from '../src/index.mjs'
+import { Bibi, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bibi)
+testPatternConfig(Bibi, about)
// Test translation
testPatternI18n(Bibi, i18n)
diff --git a/designs/bob/README.md b/designs/bob/README.md
index d4f50c03eae..ffab30c7747 100644
--- a/designs/bob/README.md
+++ b/designs/bob/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bob
@@ -59,7 +44,7 @@ A FreeSewing pattern for a bib
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bob/data.mjs b/designs/bob/data.mjs
deleted file mode 100644
index 2395b064274..00000000000
--- a/designs/bob/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bob'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bob/i18n/de.json b/designs/bob/i18n/de.json
deleted file mode 100644
index a78aa5d33af..00000000000
--- a/designs/bob/i18n/de.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "t": "Bob, das Lätzchen",
- "d": "Dies ist das Lätzchen, welches du erstellst, wenn du unserem Design-Tutorial folgst",
- "p": {
- "bib": "Lätzchen"
- },
- "s": {},
- "o": {
- "neckRatio": {
- "t": "Halsöffnung",
- "d": "Steuert die Größe der Halsöffnung in Relation zu der Größe des Lätzchens"
- },
- "widthRatio": {
- "t": "Breite",
- "d": "Steuert die Breite des Latzes"
- },
- "lengthRatio": {
- "t": "Länge",
- "d": "Steuert die Länge des Latzes"
- },
- "headSize": {
- "t": "Kopfgröße",
- "d": "Der Kopfumfang, für den das Lätzchen passen soll"
- }
- }
-}
diff --git a/designs/bob/i18n/es.json b/designs/bob/i18n/es.json
deleted file mode 100644
index c90a17d8348..00000000000
--- a/designs/bob/i18n/es.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "t": "Bob the bib",
- "d": "This is the bib that you can create by following our design tutorial",
- "p": {
- "bib": "Bib"
- },
- "s": {},
- "o": {
- "neckRatio": {
- "t": "Neck opening",
- "d": "Controls the size of the neck opening relative to the bib size"
- },
- "widthRatio": {
- "t": "Anchura",
- "d": "Controla el ancho de la bib"
- },
- "lengthRatio": {
- "t": "Longitud",
- "d": "Controla la longitud de la bib"
- },
- "headSize": {
- "t": "Head size",
- "d": "The head circumference you want the bib to accomodate"
- }
- }
-}
diff --git a/designs/bob/i18n/fr.json b/designs/bob/i18n/fr.json
deleted file mode 100644
index 0115ae6407e..00000000000
--- a/designs/bob/i18n/fr.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "t": "Bob le bavoir",
- "d": "Voici le bavoir que vous pouvez créer en suivant notre tutoriel de design",
- "p": {
- "bib": "bavoir"
- },
- "s": {},
- "o": {
- "neckRatio": {
- "t": "Ouverture du cou",
- "d": "Contrôle la taille de l'ouverture du cou par rapport à la taille du bavoir"
- },
- "widthRatio": {
- "t": "Largeur",
- "d": "Contrôle la largeur du bavoir"
- },
- "lengthRatio": {
- "t": "Longeur",
- "d": "Contrôle la longueur du bavoir"
- },
- "headSize": {
- "t": "Taille de la tête",
- "d": "Le tour de tête que vous voulez que le bavoir prenne en compte"
- }
- }
-}
diff --git a/designs/bob/i18n/index.mjs b/designs/bob/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bob/i18n/index.mjs
+++ b/designs/bob/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bob/i18n/nl.json b/designs/bob/i18n/nl.json
deleted file mode 100644
index 9f33a86575a..00000000000
--- a/designs/bob/i18n/nl.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "t": "Bob the bib",
- "d": "This is the bib that you can create by following our design tutorial",
- "p": {
- "bib": "Slabber"
- },
- "s": {},
- "o": {
- "neckRatio": {
- "t": "Neck opening",
- "d": "Controls the size of the neck opening relative to the bib size"
- },
- "widthRatio": {
- "t": "Breedte",
- "d": "Bepaalt de breedte van het slabbetje"
- },
- "lengthRatio": {
- "t": "Lengte",
- "d": "Bepaalt de lengte van het slabbetje"
- },
- "headSize": {
- "t": "Head size",
- "d": "The head circumference you want the bib to accomodate"
- }
- }
-}
diff --git a/designs/bob/i18n/uk.json b/designs/bob/i18n/uk.json
deleted file mode 100644
index efbe0091dc8..00000000000
--- a/designs/bob/i18n/uk.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "t": "Bob the bib",
- "d": "This is the bib that you can create by following our design tutorial",
- "p": {
- "bib": "Bib"
- },
- "s": {},
- "o": {
- "neckRatio": {
- "t": "Neck opening",
- "d": "Controls the size of the neck opening relative to the bib size"
- },
- "widthRatio": {
- "t": "Width",
- "d": "Controls the width of the bib"
- },
- "lengthRatio": {
- "t": "Length",
- "d": "Controls the length of the bib"
- },
- "headSize": {
- "t": "Head size",
- "d": "The head circumference you want the bib to accomodate"
- }
- }
-}
diff --git a/designs/bob/package.json b/designs/bob/package.json
index 0605e282c23..1270a080792 100644
--- a/designs/bob/package.json
+++ b/designs/bob/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bob",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a bib",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bob/src/index.mjs b/designs/bob/src/index.mjs
index 7f29e4b36e5..cb574842365 100644
--- a/designs/bob/src/index.mjs
+++ b/designs/bob/src/index.mjs
@@ -1,13 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { bib } from './bib.mjs'
import { i18n } from '../i18n/index.mjs'
// Setup our new design
const Bob = new Design({
- data,
+ data: about,
parts: [bib],
})
//Named exports
-export { bib, Bob, i18n }
+export { bib, Bob, i18n, about }
diff --git a/designs/bob/tests/shared.test.mjs b/designs/bob/tests/shared.test.mjs
index e96fbb1a67d..e72e3b86271 100644
--- a/designs/bob/tests/shared.test.mjs
+++ b/designs/bob/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bob, i18n } from '../src/index.mjs'
+import { Bob, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bob)
+testPatternConfig(Bob, about)
// Test translation
testPatternI18n(Bob, i18n)
diff --git a/designs/bonny/CHANGELOG.md b/designs/bonny/CHANGELOG.md
new file mode 100644
index 00000000000..3d372db588f
--- /dev/null
+++ b/designs/bonny/CHANGELOG.md
@@ -0,0 +1,17 @@
+# Change log for: @freesewing/bonny
+
+
+## 3.0.0 (2023-09-30)
+
+### Changed
+
+ - All FreeSewing packages are now ESM only.
+ - All FreeSewing packages now use named exports.
+ - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
+
+
+This is the **initial release**, and the start of this change log.
+
+> Prior to version 2, FreeSewing was not a JavaScript project.
+> As such, that history is out of scope for this change log.
+
diff --git a/designs/bonny/README.md b/designs/bonny/README.md
new file mode 100644
index 00000000000..e87c9fde78e
--- /dev/null
+++ b/designs/bonny/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+# @freesewing/bonny
+
+A FreeSewing pattern that turns measurements into a body outline
+
+
+
+# FreeSewing
+
+> [!TIP]
+>#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
+>
+> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
+>
+> If you feel FreeSewing is worthwhile, and you can spend a few coins without
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
+
+## What am I looking at? 🤔
+
+This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
+
+This folder holds: @freesewing/bonny
+
+If you're not entirely sure what to do or how to start, type this command:
+
+```
+npm run tips
+```
+
+> [!NOTE]
+> If you don't want to set up a dev environment, you can run it in your browser:
+>
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx @freesewing/studio
+```
+
+Getting started guides are available for:
+- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
+- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
+- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
+
+The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
+show you how to create your first parametric design.
+
+## Getting started ⚡
+
+To get started with FreeSewing, you can spin up our development environment with:
+
+```bash
+npx @freesewing/studio
+```
+
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) on your system.
+Once you have that, clone (or fork) this repo and run `npm run kickstart`:
+
+```bash
+git clone git@codeberg.org:freesewing/freesewing.git
+cd freesewing
+npm run kickstart
+```
+
+## Links 👩💻
+
+**Official channels**
+
+ - 💻 Makers website: [FreeSewing.eu](https://freesewing.eu/)
+ - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev/)
+ - ✅ [Support](https://forum.freesewing.eu/),
+ [Issues](https://codeberg.org/freesewing/freesewing/issues) &
+ [Codeberg](https://codeberg.org/freesewing/freesewing)
+
+**Social media**
+
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
+
+**Places the FreeSewing community hangs out**
+
+ - 💬 [Forum](https://forum.freesewing.eu/)
+ - 💬 [Discord](https://discord.freesewing.org/)
+ - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
+
+## License: MIT 🤓
+
+© [Joost De Cock](https://codeberg.org/joostdecock).
+See [the license file](https://codeberg.org/freesewing/freesewing/blob/develop/LICENSE) for details.
+
+## Where to get help 🤯
+
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
+
diff --git a/designs/bonny/about.json b/designs/bonny/about.json
new file mode 100644
index 00000000000..832ad54fa64
--- /dev/null
+++ b/designs/bonny/about.json
@@ -0,0 +1,12 @@
+{
+ "id": "bonny",
+ "code": "Jonathan Haas",
+ "name": "Bonny",
+ "description": "A FreeSewing pattern that turns measurements into a body outline",
+ "design": "Jonathan Haas",
+ "difficulty": 1,
+ "tags": [],
+ "techniques": [],
+ "version": "4.0.0",
+ "pkg": "@freesewing/bonny"
+}
\ No newline at end of file
diff --git a/designs/aaron/build.mjs b/designs/bonny/build.mjs
similarity index 100%
rename from designs/aaron/build.mjs
rename to designs/bonny/build.mjs
diff --git a/designs/bonny/data.mjs b/designs/bonny/data.mjs
new file mode 100644
index 00000000000..bbfb24bef6d
--- /dev/null
+++ b/designs/bonny/data.mjs
@@ -0,0 +1,4 @@
+// This file is auto-generated | All changes you make will be overwritten.
+export const name = '@freesewing/bonny'
+export const version = '3.3.0-rc.1'
+export const data = { name, version }
diff --git a/designs/bonny/i18n/en.json b/designs/bonny/i18n/en.json
new file mode 100644
index 00000000000..ac51e11f789
--- /dev/null
+++ b/designs/bonny/i18n/en.json
@@ -0,0 +1,61 @@
+{
+ "t": "Bonny",
+ "d": "A FreeSewing pattern that draws a body silhouette",
+ "p": { },
+ "s": {
+ "validationOk.t": "Validation OK",
+ "validationOk.d": "Your measurements don't seem to contain any obvious contradictions or problems.",
+ "shouldBeLarger-hpsToWaistFront-hpsToBust.t": "Bust below waist",
+ "shouldBeLarger-hpsToWaistFront-hpsToBust.d": "The HPS to bust measurement should be smaller than HPS to waist front, since FreeSewing patterns assume that the bust line is higher than the waist line.",
+ "shouldBeLarger-hpsToWaistFront-waistToUnderbust.t": "Underbust above HPS",
+ "shouldBeLarger-hpsToWaistFront-waistToUnderbust.d": "Waist to underbust must be smaller than HPS to waist front, otherwise the HPS would not be above the underbust line.",
+ "shouldBeLarger-hpsToWaistFront-waistToArmpit.t": "Armpit above HPS",
+ "shouldBeLarger-hpsToWaistFront-waistToArmpit.d": "Waist to armpit must be smaller than HPS to waist front, otherwise the HPS would not be above the armpit.",
+ "shouldBeLarger-hpsToWaistBack-waistToArmpit.t": "Armpit above HPS",
+ "shouldBeLarger-hpsToWaistBack-waistToArmpit.d": "Waist to armpit must be smaller than HPS to waist back, otherwise the HPS would not be above the armpit.",
+ "shouldBeLarger-shoulderToWrist-shoulderToElbow.t": "Wrist above elbow",
+ "shouldBeLarger-shoulderToWrist-shoulderToElbow.d": "Shoulder to wrist should be larger than shoulder to elbow, otherwise the elbow would be farther from the shoulder than the wrist.",
+ "shouldBeLarger-waistToFloor-waistToKnee.t": "Knee below floor",
+ "shouldBeLarger-waistToFloor-waistToKnee.d": "Waist to knee should be smaller than waist to floor, otherwise the knee would be farther away from the waist than the floor.",
+ "shouldBeLarger-waistToKnee-waistToUpperLeg.t": "Upper leg below knee",
+ "shouldBeLarger-waistToKnee-waistToUpperLeg.d": "Waist to upper leg should be smaller than waist to knee, otherwise the upper leg would be farther away from the waist than the knee.",
+ "shouldBeLarger-waistToUpperLeg-waistToSeat.t": "Seat below upper leg",
+ "shouldBeLarger-waistToUpperLeg-waistToSeat.d": "Waist to upper leg should be larger than waist to seat. The seat should be measured around the fullest part of your bum, while the upper leg measurement should be taken around your upper leg, a bit below your crotch. Place your seat measurement around the bum, even if your body is wider around your upper legs.",
+ "shouldBeLarger-waistToSeat-waistToHips.t": "Hips below seat",
+ "shouldBeLarger-waistToSeat-waistToHips.d": "Waist to seat should be larger than waist to hips as your hips measurement should be taken around the top of your hip bone. FreeSewing designs may not work correctly if your seat measurement is at or above your hips measurement.",
+ "shouldBeLarger-waistToFloor-inseam.t": "Crotch above waist",
+ "shouldBeLarger-waistToFloor-inseam.d": "The inseam measurement must be smaller than the waist to floor measurement, since the inseam measurement is the distance from the crotch to the floor and the crotch can't be at or above the waist.",
+ "shouldBeLarger-crossSeam-crossSeamFront.t": "Cross seam front",
+ "shouldBeLarger-crossSeam-crossSeamFront.d": "The cross seam front measurement should be the front part of the cross seam measurement and thus must be smaller than the total cross seam measurement.",
+ "shouldBeLarger-seat-seatBack.t": "Seat",
+ "shouldBeLarger-seat-seatBack.d": "The seat back measurement should be the back part of the seat measurement and thus must be smaller than the total seat measurement.",
+ "shouldBeLarger-highBust-highBustFront.t": "High Bust",
+ "shouldBeLarger-highBust-highBustFront.d": "The high bust front measurement should be the front part of the high bust measurement and thus must be smaller than the total high bust measurement.",
+ "shouldBeLarger-chest-bustFront.t": "Chest",
+ "shouldBeLarger-chest-bustFront.d": "The bust front measurement should be the front part of the chest measurement and thus must be smaller than the total chest measurement.",
+ "shouldBeLarger-bustFront-bustSpan.t": "Bust span",
+ "shouldBeLarger-bustFront-bustSpan.d": "The bust span measurement can't be larger than the bust front measurement.",
+ "shouldBeLarger-waist-waistBack.t": "Waist circumference",
+ "shouldBeLarger-waist-waistBack.d": "The waist back measurement should be the back part of the waist circumference measurement and thus must be smaller than the total waist circumference.",
+
+ "constraint-backChest.t": "Back chest",
+ "constraint-backChest.d": "The difference between the chest circumference and bust front, as well as the difference between high bust and high bust front measure both the back half of the ribcage and thus should be (at least approximately) equal.",
+ "constraint-waistFront.t": "Front bust measurements",
+ "constraint-waistFront.d": "Measuring from the HPS point directly to the waist across your front can't be larger than the sum of the individual vertical bust measurements (hps to bust, bustpoint to underbust, waist to underbust). However note that waist to underbust is measured at the side of the body instead of at the front, but usually this doesn't make a large difference.",
+ "constraint-waistToUpperLeg.t": "Upper leg above crotch",
+ "constraint-waistToUpperLeg.d": "The waist-to-upper-leg measurement goes from the waist along the body to a bit below the crotch and the inseam measurement goes vertically from the crotch to the floor. Thus, waist to upper leg should be a bit larger than the difference between waist to floor and the inseam measurement.",
+ "constraint-waistBack.t": "Back waist",
+ "constraint-waistBack.d": "The waist back measurement is usually not much bigger than half the waist measurement.",
+ "constraint-bustFront.t": "Bust front",
+ "constraint-bustFront.d": "The bust front measurement is usually a bit larger than half the chest measurement.",
+ "constraint-highBustFront.t": "High bust front",
+ "constraint-highBustFront.d": "The high bust front measurement is usually roughly half the high bust measurement.",
+
+ "crossseam.t": "Cross seam",
+ "crossseam.d": "We could not draw a cross seam curve using your measurements. Double check the inseam measurement and check that waist to seat, waist to upper leg, and the cross seam measurements use the same waist line.",
+
+ "crossseamfront.t": "Cross seam front",
+ "crossseamfront.d": "We could not determine the fork position on the crotch line. Double check your cross seam measurements and seat measurements."
+},
+ "o": { }
+}
diff --git a/designs/bonny/i18n/index.mjs b/designs/bonny/i18n/index.mjs
new file mode 100644
index 00000000000..11028ae01ae
--- /dev/null
+++ b/designs/bonny/i18n/index.mjs
@@ -0,0 +1,3 @@
+import en from './en.json' with { type: 'json' }
+
+export const i18n = { en }
diff --git a/designs/bonny/package.json b/designs/bonny/package.json
new file mode 100644
index 00000000000..36f92fc5b8a
--- /dev/null
+++ b/designs/bonny/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "@freesewing/bonny",
+ "version": "4.0.0",
+ "description": "A FreeSewing pattern that turns measurements into a body outline",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "design",
+ "diy",
+ "fashion",
+ "made to measure",
+ "parametric design",
+ "pattern",
+ "sewing",
+ "sewing pattern"
+ ],
+ "type": "module",
+ "module": "src/index.mjs",
+ "exports": {
+ ".": "./src/index.mjs"
+ },
+ "scripts": {
+ "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
+ "test": "npx mocha tests/*.test.mjs",
+ "tips": "node ../../scripts/help.mjs",
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'",
+ "prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "mocha": "10.4.0",
+ "chai": "5.1.1",
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
+ },
+ "files": [
+ "src/",
+ "i18n/",
+ "about.json",
+ "README.md"
+ ],
+ "publishConfig": {
+ "access": "public",
+ "tag": "latest"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+}
diff --git a/designs/bonny/src/front.mjs b/designs/bonny/src/front.mjs
new file mode 100644
index 00000000000..f615ced509d
--- /dev/null
+++ b/designs/bonny/src/front.mjs
@@ -0,0 +1,654 @@
+import { side } from './side.mjs'
+
+const descendingCheck = [
+ ['hpsToWaistFront', 'hpsToBust'],
+ ['hpsToWaistFront', 'waistToUnderbust'],
+ ['hpsToWaistFront', 'waistToArmpit'],
+ ['hpsToWaistBack', 'waistToArmpit'],
+ ['shoulderToWrist', 'shoulderToElbow'],
+ ['waistToFloor', 'waistToKnee', 'waistToUpperLeg', 'waistToSeat', 'waistToHips'],
+ ['waistToFloor', 'inseam'],
+ ['crossSeam', 'crossSeamFront'],
+ ['seat', 'seatBack'],
+ ['highBust', 'highBustFront'],
+ ['chest', 'bustFront', 'bustSpan'],
+ ['waist', 'waistBack'],
+]
+
+const constraintCheck = [
+ {
+ lhs: [
+ { m: 'highBust', coefficient: 1 },
+ { m: 'highBustFront', coefficient: -1 },
+ ],
+ rhs: [
+ { m: 'chest', coefficient: 1 },
+ { m: 'bustFront', coefficient: -1 },
+ ],
+ tolerance: 0.05,
+ key: 'backChest',
+ },
+ {
+ lhs: [{ m: 'hpsToWaistFront', coefficient: 1 }],
+ rhs: [
+ { m: 'hpsToBust', coefficient: 1 },
+ { m: 'bustPointToUnderbust', coefficient: 1 },
+ { m: 'waistToUnderbust', coefficient: 1 },
+ ],
+ lhsMustBeSmaller: true,
+ tolerance: 0.1,
+ key: 'waistFront',
+ },
+ {
+ lhs: [{ m: 'waistToFloor', coefficient: 1 }],
+ rhs: [
+ { m: 'waistToUpperLeg', coefficient: 1 },
+ { m: 'inseam', coefficient: 1 },
+ ],
+ tolerance: 0,
+ lhsMustBeSmaller: true,
+ key: 'waistToUpperLeg',
+ },
+ {
+ lhs: [{ m: 'waistBack', coefficient: 2 }],
+ rhs: [{ m: 'waist', coefficient: 1 }],
+ lhsMustBeSmaller: true,
+ tolerance: 0.1,
+ key: 'waistBack',
+ },
+ {
+ lhs: [{ m: 'chest', coefficient: 1 }],
+ rhs: [{ m: 'bustFront', coefficient: 2 }],
+ tolerance: 0.2,
+ lhsMustBeSmaller: true,
+ key: 'bustFront',
+ },
+ {
+ lhs: [{ m: 'highBust', coefficient: 1 }],
+ rhs: [{ m: 'highBustFront', coefficient: 2 }],
+ tolerance: 0.2,
+ key: 'highBustFront',
+ },
+]
+
+function checkDescendingSet(set, warnings, measies) {
+ let biggerValue = null
+ let biggerMeasurement = null
+ for (const measurement of set) {
+ let value = measies[measurement]
+ if (value !== null) {
+ if (biggerValue !== null && value >= biggerValue) {
+ warnings.push(`shouldBeLarger-${biggerMeasurement}-${measurement}`)
+ } else {
+ biggerValue = value
+ biggerMeasurement = measurement
+ }
+ }
+ }
+}
+
+function checkConstraint(constraint, warnings, measies) {
+ let lhsSum = sumMeasurements(constraint.lhs, measies)
+ let rhsSum = sumMeasurements(constraint.rhs, measies)
+ if (lhsSum === false || rhsSum === false) {
+ // Some measurements are missing
+ return
+ }
+ const difference = Math.abs(((lhsSum - rhsSum) / (lhsSum + rhsSum)) * 2)
+ if (difference <= constraint.tolerance) {
+ // minor difference
+ return
+ }
+ if (constraint.lhsMustBeSmaller) {
+ if (lhsSum > rhsSum) {
+ warnings.push(`constraint-${constraint.key}`)
+ }
+ } else {
+ warnings.push(`constraint-${constraint.key}`)
+ }
+}
+
+function sumMeasurements(params, measies) {
+ let result = 0
+ for (const e of params) {
+ if (!measies[e.m]) {
+ return false
+ }
+ result += e.coefficient * measies[e.m]
+ }
+ return result
+}
+
+function checkDescendingSets(warnings, measies) {
+ for (const e of descendingCheck) {
+ checkDescendingSet(e, warnings, measies)
+ }
+}
+function checkConstraints(warnings, measies) {
+ for (const e of constraintCheck) {
+ checkConstraint(e, warnings, measies)
+ }
+}
+function draftFront({ measurements, Point, Path, points, paths, macro, utils, store, part }) {
+ points.floor = new Point(0, 0)
+
+ points.ankle = new Point(0, -measurements.heel * 0.35)
+
+ points.waist = new Point(0, -measurements.waistToFloor)
+
+ points.hips = points.waist.shift(-90, measurements.waistToHips)
+
+ points.seat = points.waist.shift(-90, measurements.waistToSeat)
+
+ points.knee = points.waist.shift(-90, measurements.waistToKnee)
+
+ points.crotch = points.waist.shift(-90, measurements.waistToUpperLeg)
+
+ points.underbust = points.waist.shift(90, measurements.waistToUnderbust)
+
+ const y = measurements.bustPointToUnderbust
+ const x = Math.min(y, 0.3 * (measurements.chest - measurements.underbust))
+ const bustPointToUnderbust = Math.sqrt(y * y - x * x)
+ points.bust1 = points.underbust.shift(90, bustPointToUnderbust)
+
+ points.armpit = points.waist.shift(90, measurements.waistToArmpit)
+
+ points.neck = points.waist.shift(90, measurements.hpsToWaistBack * 0.88)
+
+ points.bust2 = points.neck.shift(-90, measurements.hpsToBust * 0.82)
+
+ points.bust = points.bust1.shiftFractionTowards(points.bust2, 0.5)
+
+ points.shoulder = points.neck.shift(
+ -90,
+ (Math.sin((measurements.shoulderSlope / 180) * Math.PI) * measurements.shoulderToShoulder) / 2
+ )
+ points.head = points.neck.shift(90, measurements.head * 0.43)
+
+ points.armpitCrease = points.armpit.shiftFractionTowards(points.shoulder, 0.1)
+
+ points.elbow = points.shoulder.shift(-90, measurements.shoulderToElbow * 0.95)
+ points.wrist = points.shoulder.shift(-90, measurements.shoulderToWrist * 0.95)
+
+ points.outerShoulder = points.shoulder.shift(180, measurements.shoulderToShoulder * 0.44)
+ points.outerShoulderLower = points.shoulder
+ .shiftFractionTowards(points.armpit, 0.2)
+ .shift(180, measurements.shoulderToShoulder * 0.51)
+
+ points.crotchMain = points.floor.shift(90, measurements.inseam)
+
+ points.crotchMainCp2 = points.crotchMain.shift(180, measurements.seat * 0.005)
+
+ points.crotchCurve = points.crotchMain.shift(147, measurements.seat * 0.023)
+ points.crotchCurveCp1 = points.crotchMain.shift(180, measurements.seat * 0.01)
+
+ points.innerCrotch = points.crotch.shift(
+ 180,
+ Math.max(measurements.seat * 0.03, measurements.seat - measurements.upperLeg * 1.4) * 0.06
+ )
+
+ points.crotchCp1 = points.innerCrotch.shift(86, measurements.seat * 0.01)
+ points.crotchCp2 = points.innerCrotch.shift(-94, points.crotch.dy(points.knee) * 0.6)
+
+ points.outerUpperLeg = new Point(
+ (measurements.seat + measurements.upperLeg * 1.7) * -0.094,
+ points.innerCrotch.y
+ )
+
+ points.footMain = points.floor.shift(180, measurements.hips * 0.11)
+ points.ankleMain = points.ankle.shift(180, measurements.hips * 0.11)
+ points.kneeMain = points.knee.shift(180, measurements.hips * 0.12)
+ points.upperLegMain = points.crotch.shift(180, measurements.upperLeg * 0.17)
+ points.shoulderMain = points.shoulder.shift(180, measurements.shoulderToShoulder * 0.4)
+ points.elbowMain = utils.beamIntersectsY(
+ points.shoulderMain,
+ points.shoulderMain.shift(258.5, 10),
+ points.elbow.y
+ )
+ points.wristMain = utils.beamIntersectsY(
+ points.shoulderMain,
+ points.shoulderMain.shift(256.4, 10),
+ points.wrist.y
+ )
+
+ points.innerKnee = points.kneeMain.shift(0, measurements.knee * 0.17)
+ points.outerKnee = points.kneeMain.shift(180, measurements.knee * 0.15)
+
+ points.calf = points.kneeMain
+ .shiftFractionTowards(points.ankleMain, 0.2)
+ .shift(180, points.knee.dy(points.ankle) * 0.01)
+ points.outerCalf = points.calf.shift(180, measurements.knee * 0.17)
+ points.innerCalf = points.calf.shift(0, measurements.knee * 0.15)
+
+ points.innerAnkle = points.ankleMain.shift(0, measurements.ankle * 0.13)
+ points.outerAnkle = points.ankleMain.shift(180, measurements.ankle * 0.13)
+
+ points.innerFoot = points.footMain.shift(0, measurements.heel * 0.13)
+ points.outerFoot = points.footMain.shift(180, measurements.heel * 0.08)
+
+ points.innerSideFoot = points.footMain.shift(18, measurements.heel * 0.175)
+ points.outerSideFoot = points.footMain.shift(163, measurements.heel * 0.138)
+
+ points.innerSideFootCp1 = points.innerSideFoot.shift(90, measurements.heel * 0.05)
+ points.innerSideFootCp2 = points.innerSideFoot.shift(-90, measurements.heel * 0.03)
+
+ points.outerSideFootCp1 = points.outerSideFoot.shift(-90, measurements.heel * 0.03)
+ points.outerSideFootCp2 = points.outerSideFoot.shift(90, measurements.heel * 0.05)
+
+ points.innerFootCp1 = points.innerFoot.shift(0, measurements.heel * 0.02)
+ points.outerFootCp2 = points.outerFoot.shift(180, measurements.heel * 0.02)
+
+ points.outerSeat = points.seat.shift(180, measurements.seat * 0.18)
+
+ points.outerHips = points.hips.shift(180, measurements.hips * 0.18)
+
+ points.outerWaist = points.waist.shift(180, measurements.waist * 0.18)
+
+ points.outerUnderbust = points.underbust.shift(180, measurements.underbust * 0.175)
+
+ points.outerBust = points.bust.shift(
+ 180,
+ (measurements.highBust - measurements.highBustFront) * 0.36
+ )
+
+ points.outerArmpit = points.armpitCrease.shift(180, measurements.shoulderToShoulder * 0.36)
+
+ points.innerElbow = points.elbowMain.shift(-20, measurements.biceps * 0.12)
+ points.outerElbow = points.elbowMain.shift(160, measurements.biceps * 0.15)
+
+ points.innerWrist = points.wristMain.shift(-20, measurements.wrist * 0.1)
+ points.outerWrist = points.wristMain.shift(160, measurements.wrist * 0.15)
+
+ points.outerArm = points.outerShoulderLower.shift(-104, measurements.biceps * 0.29)
+
+ points.outerNeck = points.neck.shift(180, measurements.neck * 0.15)
+ points.outerUpperNeck = points.neck.shift(138, measurements.head * 0.13)
+ points.chin = points.neck.shift(140, measurements.head * 0.105)
+
+ points.outerUpperLegCp1 = points.outerUpperLeg.shift(
+ -90,
+ (measurements.waistToKnee - measurements.waistToUpperLeg) * 0.5
+ )
+ points.outerUpperLegCp2 = points.outerUpperLeg.shift(
+ 90,
+ (measurements.waistToUpperLeg - measurements.waistToSeat) * 0.3
+ )
+
+ let kneeToFloor = measurements.waistToFloor - measurements.waistToKnee
+ let ankleToFloor = -points.ankleMain.y
+
+ points.innerKneeCp1 = points.innerKnee.shift(82, kneeToFloor * 0.06)
+ points.innerKneeCp2 = points.innerKnee.shift(-98, kneeToFloor * 0.06)
+
+ points.innerCalfCp1 = points.innerCalf.shift(95, kneeToFloor * 0.05)
+ points.innerCalfCp2 = points.innerCalf.shift(-85, kneeToFloor * 0.3)
+
+ points.innerAnkleCp1 = points.innerAnkle.shift(95, ankleToFloor * 0.9)
+ points.innerAnkleCp2 = points.innerAnkle.shift(-85, ankleToFloor * 0.7)
+
+ points.outerKneeCp1 = points.outerKnee.shift(-90, kneeToFloor * 0.06)
+ points.outerKneeCp2 = points.outerKnee.shift(90, kneeToFloor * 0.2)
+
+ points.outerAnkleCp1 = points.outerAnkle.shift(-83, ankleToFloor * 0.7)
+ points.outerAnkleCp2 = points.outerAnkle.shift(97, ankleToFloor * 0.7)
+
+ points.outerCalfCp1 = points.outerCalf.shift(-95, kneeToFloor * 0.22)
+ points.outerCalfCp2 = points.outerCalf.shift(85, kneeToFloor * 0.07)
+
+ points.outerSeatCp1 = points.outerSeat.shift(
+ points.outerHips.angle(points.outerUpperLeg),
+ measurements.seat * 0.03
+ )
+ points.outerSeatCp2 = points.outerSeat.shift(
+ points.outerHips.angle(points.outerUpperLeg),
+ measurements.seat * -0.06
+ )
+
+ points.outerHipsCp1 = points.outerHips.shift(
+ points.outerWaist.angle(points.outerSeat),
+ measurements.hips * 0.05
+ )
+ points.outerHipsCp2 = points.outerHips.shift(
+ points.outerWaist.angle(points.outerSeat),
+ measurements.hips * -0.05
+ )
+
+ points.outerWaistCp1 = points.outerWaist.shift(
+ points.outerUnderbust.angle(points.outerHips),
+ measurements.waist * 0.05
+ )
+ points.outerWaistCp2 = points.outerWaist.shift(
+ points.outerUnderbust.angle(points.outerHips),
+ measurements.waist * -0.05
+ )
+
+ points.outerUnderbustCp1 = points.outerUnderbust.shift(
+ points.outerBust.angle(points.outerWaist),
+ measurements.underbust * 0.07
+ )
+ points.outerUnderbustCp2 = points.outerUnderbust.shift(
+ points.outerBust.angle(points.outerWaist),
+ measurements.underbust * -0.02
+ )
+
+ points.outerBustCp1 = points.outerBust.shift(
+ points.outerBust.angle(points.outerWaist),
+ measurements.highBust * 0.02
+ )
+ points.outerBustCp2 = points.outerBust.shift(
+ points.outerBust.angle(points.outerWaist),
+ measurements.highBust * -0.02
+ )
+
+ points.outerBustCp3 = points.outerBust.shift(-110, measurements.biceps * 0.15)
+
+ points.innerElbowCp1 = points.innerElbow.shift(70, measurements.biceps * 0.05)
+ points.innerElbowCp2 = points.innerElbow.shift(-97, measurements.biceps * 0.25)
+
+ points.innerWristCp1 = points.innerWrist.shift(70, measurements.wrist * 0.25)
+ points.innerWristCp2 = points.innerWrist.shift(-110, measurements.wrist * 0.1)
+
+ points.outerWristCp1 = points.outerWrist.shift(-97, measurements.wrist * 0.05)
+ points.outerWristCp2 = points.outerWrist.shift(83, measurements.wrist * 0.9)
+
+ points.outerElbowCp1 = points.outerElbow.shift(-107, measurements.biceps * 0.25)
+ points.outerElbowCp2 = points.outerElbow.shift(73, measurements.biceps * 0.3)
+
+ points.outerArmCp1 = points.outerArm.shift(-97, measurements.biceps * 0.25)
+ points.outerArmCp2 = points.outerArm.shift(83, measurements.biceps * 0.2)
+
+ points.outerShoulderLowerCp1 = points.outerShoulderLower.shift(
+ points.outerArm.angle(points.outerShoulder) - 10,
+ measurements.biceps * -0.05
+ )
+ points.outerShoulderLowerCp2 = points.outerShoulderLower.shift(
+ points.outerArm.angle(points.outerShoulder) - 10,
+ measurements.biceps * 0.25
+ )
+ //
+ // points.outerShoulderCp1 = points.outerShoulder.shift(
+ // points.outerShoulderLower.angle(points.outerNeck),
+ // measurements.shoulderToShoulder * -0.10
+ // )
+ // points.outerShoulderCp2 = points.outerShoulder.shift(
+ // points.outerShoulderLower.angle(points.outerNeck),
+ // measurements.shoulderToShoulder * 0.13
+ // )
+
+ points.outerNeckCp1 = points.outerNeck.shift(
+ points.outerShoulder.angle(points.outerUpperNeck) + 15,
+ measurements.neck * -0.09
+ )
+ points.outerNeckCp2 = points.outerNeck.shift(
+ points.outerShoulder.angle(points.outerUpperNeck) + 15,
+ measurements.neck * 0.05
+ )
+
+ points.bustPointCenter = points.bust.shift(180, measurements.bustSpan * 0.5)
+ points.bustPointOuter = points.bustPointCenter.shift(180, measurements.bustFront * 0.016)
+
+ points.underBustLine = points.underbust.shift(180, measurements.bustSpan * 0.5)
+ points.underBustLineOuter = points.underBustLine.shift(160, measurements.bustSpan * 0.08)
+ points.underBustLineInner = points.underBustLine.shift(23, measurements.bustSpan * 0.28)
+
+ points.underBustLineCp1 = points.underBustLine.shift(170, measurements.bustSpan * 0.05)
+ points.underBustLineCp2 = points.underBustLine.shift(-10, measurements.bustSpan * 0.17)
+
+ points.belowEar = points.neck.shift(130, measurements.head * 0.18)
+ points.earBottom = points.neck.shift(131, measurements.head * 0.2)
+ points.earLeftLow = points.neck.shift(131, measurements.head * 0.225)
+ points.earLeftHigh = points.neck.shift(125, measurements.head * 0.27)
+ points.earTop = points.neck.shift(120.5, measurements.head * 0.28)
+ points.aboveEar = points.neck.shift(117, measurements.head * 0.29)
+
+ points.belowEarCp1 = points.belowEar.shift(-75, measurements.head * 0.01)
+ points.belowEarCp2 = points.belowEar.shift(-75, measurements.head * -0.01)
+ points.earBottomCp1 = points.earBottom.shift(-5, measurements.head * 0.01)
+ points.earBottomCp2 = points.earBottom.shift(-5, measurements.head * -0.01)
+ points.earLeftLowCp1 = points.earLeftLow.shift(-75, measurements.head * 0.01)
+ points.earLeftLowCp2 = points.earLeftLow.shift(-75, measurements.head * -0.01)
+ points.earLeftHighCp1 = points.earLeftHigh.shift(-85, measurements.head * 0.01)
+ points.earLeftHighCp2 = points.earLeftHigh.shift(-85, measurements.head * -0.01)
+ points.earTopCp1 = points.earTop.shift(160, measurements.head * 0.01)
+ points.earTopCp2 = points.earTop.shift(160, measurements.head * -0.01)
+ points.aboveEarCp1 = points.aboveEar.shift(-90, measurements.head * 0.01)
+ points.aboveEarCp2 = points.aboveEar.shift(-90, measurements.head * -0.1)
+ points.headCp1 = points.head.shift(180, measurements.head * 0.1)
+
+ points.upperEye = points.neck.shift(102.5, measurements.head * 0.25)
+ points.lowerEye = points.neck.shift(105, measurements.head * 0.237)
+ points.outerEye = points.neck.shift(108.3, measurements.head * 0.247)
+ points.innerEye = points.neck.shift(99, measurements.head * 0.235)
+ points.upperEyeCp1 = points.upperEye.shift(0, measurements.head * 0.01)
+ points.upperEyeCp2 = points.upperEye.shift(180, measurements.head * 0.01)
+ points.lowerEyeCp1 = points.lowerEye.shift(180, measurements.head * 0.01)
+ points.lowerEyeCp2 = points.lowerEye.shift(0, measurements.head * 0.01)
+ points.outerEyeCp1 = points.outerEye.shift(90, measurements.head * 0.005)
+ points.outerEyeCp2 = points.outerEye.shift(-90, measurements.head * 0.005)
+ points.innerEyeCp1 = points.innerEye.shift(-90, measurements.head * 0.003)
+ points.innerEyeCp2 = points.innerEye.shift(90, measurements.head * 0.01)
+
+ points.innerNose = points.neck.shift(94.5, measurements.head * 0.16)
+ points.innerNoseCp = points.neck.shift(95.5, measurements.head * 0.163)
+ points.outerNose = points.neck.shift(96.8, measurements.head * 0.162)
+
+ points.innerMouth = points.neck.shift(90, measurements.head * 0.112)
+ points.innerMouthCp = points.innerMouth.shift(180, measurements.head * 0.02)
+ points.outerMouth = points.neck.shift(111, measurements.head * 0.117)
+
+ points.lowerEar = points.neck.shift(128, measurements.head * 0.217)
+ points.lowerEarCp = points.neck.shift(126, measurements.head * 0.23)
+ points.upperEar = points.neck.shift(123.5, measurements.head * 0.24)
+
+ const handScale = measurements.wrist * 0.85
+
+ points.handA = points.wristMain.shift(-65, handScale * 0.5)
+ points.handB = points.wristMain.shift(-65, handScale * 0.7)
+ points.handC = points.wristMain.shift(-70, handScale * 0.79)
+ points.handD = points.wristMain.shift(-77, handScale * 0.7)
+ points.handE = points.wristMain.shift(-83, handScale * 0.53)
+ points.handF = points.wristMain.shift(-90, handScale * 0.7)
+ points.handZ = points.wristMain.shift(-92, handScale * 0.9)
+ points.handG = points.wristMain.shift(-89, handScale * 1.2)
+ points.handFork = points.wristMain.shift(-90.6, handScale * 1.32)
+ points.handH = points.wristMain.shift(-93, handScale * 1.42)
+ points.handJ = points.wristMain.shift(-109, handScale * 0.7)
+ points.handInner = points.wristMain.shift(-105, handScale * 0.74)
+
+ points.handACp1 = points.handA.shift(110, handScale * 0.1)
+ points.handACp2 = points.handA.shift(-70, handScale * 0.1)
+ points.handBCp1 = points.handB.shift(115, handScale * 0.1)
+ points.handBCp2 = points.handB.shift(-65, handScale * 0.05)
+ points.handCCp1 = points.handC.shift(20, handScale * 0.05)
+ points.handCCp2 = points.handC.shift(200, handScale * 0.05)
+ points.handDCp1 = points.handD.shift(-65, handScale * 0.05)
+ points.handDCp2 = points.handD.shift(115, handScale * 0.1)
+ points.handECp1 = points.handE.shift(-55, handScale * 0.05)
+ points.handECp2 = points.handE.shift(-125, handScale * 0.05)
+ points.handFCp1 = points.handF.shift(80, handScale * 0.1)
+ points.handFCp2 = points.handF.shift(-100, handScale * 0.1)
+ points.handZCp1 = points.handZ.shift(90, handScale * 0.1)
+ points.handZCp2 = points.handZ.shift(-90, handScale * 0.1)
+ points.handGCp1 = points.handG.shift(100, handScale * 0.1)
+ points.handGCp2 = points.handG.shift(-80, handScale * 0.1)
+ points.handForkCp1 = points.handFork.shift(40, handScale * 0.05)
+ points.handForkCp2 = points.handFork.shift(-180, handScale * 0.07)
+ points.handForkCp3 = points.handFork.shift(-90, handScale * 0.05)
+ points.handHCp1 = points.handH.shift(0, handScale * 0.05)
+ points.handHCp2 = points.handH.shift(110, handScale * 0.1)
+ points.handJCp1 = points.handJ.shift(-90, handScale * 0.4)
+ points.handJCp2 = points.handJ.shift(90, handScale * 0.4)
+ points.handInnerCp1 = points.handInner.shift(-90, handScale * 0.2)
+
+ paths.front = new Path()
+ .move(points.crotchMain)
+ .curve(points.crotchMainCp2, points.crotchCp1, points.innerCrotch)
+ .curve(points.crotchCp2, points.innerKneeCp1, points.innerKnee)
+ .curve(points.innerKneeCp2, points.innerCalfCp1, points.innerCalf)
+ .curve(points.innerCalfCp2, points.innerAnkleCp1, points.innerAnkle)
+ .curve(points.innerAnkleCp2, points.innerSideFootCp1, points.innerSideFoot)
+ .curve(points.innerSideFootCp2, points.innerFootCp1, points.innerFoot)
+ .line(points.outerFoot)
+ .curve(points.outerFootCp2, points.outerSideFootCp1, points.outerSideFoot)
+ .curve(points.outerSideFootCp2, points.outerAnkleCp1, points.outerAnkle)
+ .curve(points.outerAnkleCp2, points.outerCalfCp1, points.outerCalf)
+ .curve(points.outerCalfCp2, points.outerKneeCp1, points.outerKnee)
+ .curve(points.outerKneeCp2, points.outerUpperLegCp1, points.outerUpperLeg)
+ .curve(points.outerUpperLegCp2, points.outerSeatCp1, points.outerSeat)
+ .curve(points.outerSeatCp2, points.outerHipsCp1, points.outerHips)
+ .curve(points.outerHipsCp2, points.outerWaistCp1, points.outerWaist)
+ .curve(points.outerWaistCp2, points.outerBustCp1, points.outerBust)
+ .curve_(points.outerBustCp2, points.outerArmpit)
+ .move(points.outerBust)
+ .curve(points.outerBustCp3, points.innerElbowCp1, points.innerElbow)
+ .curve(points.innerElbowCp2, points.innerWristCp1, points.innerWrist)
+ .curve(points.innerWristCp2, points.handACp1, points.handA)
+ .curve(points.handACp2, points.handBCp1, points.handB)
+ .curve(points.handBCp2, points.handCCp1, points.handC)
+ .curve(points.handCCp2, points.handDCp1, points.handD)
+ .curve(points.handDCp2, points.handECp1, points.handE)
+ .curve(points.handECp2, points.handFCp1, points.handF)
+ .curve(points.handFCp2, points.handZCp1, points.handZ)
+ .curve(points.handZCp2, points.handGCp1, points.handG)
+ .curve(points.handGCp2, points.handForkCp1, points.handFork)
+ .curve(points.handForkCp2, points.handInnerCp1, points.handInner)
+ .move(points.handFork)
+ .curve(points.handForkCp3, points.handHCp1, points.handH)
+ .curve(points.handHCp2, points.handJCp1, points.handJ)
+ .curve(points.handJCp2, points.outerWristCp1, points.outerWrist)
+ .curve(points.outerWristCp2, points.outerElbowCp1, points.outerElbow)
+ .curve(points.outerElbowCp2, points.outerArmCp1, points.outerArm)
+ .curve(points.outerArmCp2, points.outerShoulderLowerCp1, points.outerShoulderLower)
+ .curve(points.outerShoulderLowerCp2, points.outerNeckCp1, points.outerNeck)
+ .curve_(points.outerNeckCp2, points.outerUpperNeck)
+ .move(points.chin)
+ .line(points.outerUpperNeck)
+ ._curve(points.belowEarCp1, points.belowEar)
+ .curve(points.belowEarCp2, points.earBottomCp1, points.earBottom)
+ .curve(points.earBottomCp2, points.earLeftLowCp1, points.earLeftLow)
+ .curve(points.earLeftLowCp2, points.earLeftHighCp1, points.earLeftHigh)
+ .curve(points.earLeftHighCp2, points.earTopCp1, points.earTop)
+ .curve(points.earTopCp2, points.aboveEarCp1, points.aboveEar)
+ .curve(points.aboveEarCp2, points.headCp1, points.head)
+ .attr('class', 'stroke-xl')
+
+ paths.bustPoint = new Path()
+ .move(points.bustPointOuter)
+ .circleSegment(360, points.bustPointCenter)
+ .attr('class', 'stroke-xl')
+
+ if (store.showBust) {
+ paths.bustLine = new Path()
+ .move(points.underBustLineOuter)
+ ._curve(points.underBustLineCp1, points.underBustLine)
+ .curve_(points.underBustLineCp2, points.underBustLineInner)
+ .attr('class', 'stroke-xl')
+ }
+
+ paths.crotch = new Path()
+ .move(points.crotchMain)
+ .curve_(points.crotchCurveCp1, points.crotchCurve)
+ .attr('class', 'stroke-xl')
+
+ paths.eye = new Path()
+ .move(points.upperEye)
+ .curve(points.upperEyeCp2, points.outerEyeCp1, points.outerEye)
+ .curve(points.outerEyeCp2, points.lowerEyeCp1, points.lowerEye)
+ .curve(points.lowerEyeCp2, points.innerEyeCp1, points.innerEye)
+ .curve(points.innerEyeCp2, points.upperEyeCp1, points.upperEye)
+ .circleSegment(-120, points.upperEye.shiftFractionTowards(points.lowerEye, 0.5))
+ .move(points.lowerEye)
+ .circleSegment(-100, points.upperEye.shiftFractionTowards(points.lowerEye, 0.5))
+ .attr('class', 'stroke-xl')
+
+ paths.nose = new Path()
+ .move(points.innerNose)
+ .curve_(points.innerNoseCp, points.outerNose)
+ .attr('class', 'stroke-xl')
+
+ paths.mouth = new Path()
+ .move(points.innerMouth)
+ .curve_(points.innerMouthCp, points.outerMouth)
+ .attr('class', 'stroke-xl')
+
+ paths.ear = new Path()
+ .move(points.lowerEar)
+ .curve_(points.lowerEarCp, points.upperEar)
+ .attr('class', 'stroke-xl')
+
+ macro('mirror', {
+ clone: true,
+ mirror: [points.floor, points.head],
+ paths: Object.keys(paths).filter((it) => !it.startsWith('side')),
+ })
+
+ const warnings = []
+ checkDescendingSets(warnings, measurements)
+ checkConstraints(warnings, measurements)
+ const fac = paths.sideFullCrossSeam.intersectsY(
+ points.sideCrotchMain.shiftFractionTowards(points.sideCrotch, 0.1).y
+ ).length
+ if (fac > 2) {
+ warnings.push('crossseam')
+ }
+ if (paths.sideCrossSeamFront.length() === 0 || paths.sideCrossSeamBack.length() === 0) {
+ warnings.push('crossseamfront')
+ }
+
+ if (warnings.length === 0) {
+ store.flag.info({ msg: 'bonny:validationOk' })
+ } else {
+ for (const warning of warnings) {
+ store.flag.warn({ msg: `bonny:${warning}` })
+ }
+ }
+
+ return part
+}
+
+export const front = {
+ name: 'front',
+ from: side,
+ options: {},
+ measurements: [
+ 'ankle',
+ 'biceps',
+ 'bustFront',
+ 'bustPointToUnderbust',
+ 'bustSpan',
+ 'chest',
+ 'crossSeam',
+ 'crossSeamFront',
+ 'crotchDepth',
+ 'heel',
+ 'head',
+ 'highBust',
+ 'highBustFront',
+ 'hips',
+ 'hpsToBust',
+ 'hpsToWaistBack',
+ 'hpsToWaistFront',
+ 'inseam',
+ 'knee',
+ 'neck',
+ 'seat',
+ 'seatBack',
+ 'shoulderSlope',
+ 'shoulderToElbow',
+ 'shoulderToShoulder',
+ 'shoulderToWrist',
+ 'underbust',
+ 'upperLeg',
+ 'waist',
+ 'waistBack',
+ 'waistToArmpit',
+ 'waistToFloor',
+ 'waistToHips',
+ 'waistToKnee',
+ 'waistToSeat',
+ 'waistToUnderbust',
+ 'waistToUpperLeg',
+ 'wrist',
+ ],
+ draft: draftFront,
+}
diff --git a/designs/bonny/src/index.mjs b/designs/bonny/src/index.mjs
new file mode 100644
index 00000000000..72de5b3d6ea
--- /dev/null
+++ b/designs/bonny/src/index.mjs
@@ -0,0 +1,15 @@
+import { Design } from '@freesewing/core'
+import { i18n } from '../i18n/index.mjs'
+import about from '../about.json' with { type: 'json' }
+// Parts
+import { front } from './front.mjs'
+import { side } from './side.mjs'
+
+// Create new design
+const Bonny = new Design({
+ data: about,
+ parts: [side, front],
+})
+
+// Named exports
+export { side, i18n, Bonny, about }
diff --git a/designs/bonny/src/side.mjs b/designs/bonny/src/side.mjs
new file mode 100644
index 00000000000..c96dcb59ac8
--- /dev/null
+++ b/designs/bonny/src/side.mjs
@@ -0,0 +1,704 @@
+function draftSide({ measurements, Point, Path, points, paths, complete, store, utils, part }) {
+ function safeSplit(path, point) {
+ let result = [new Path(), new Path()]
+ let beforeSplit = true
+ for (const op of path.ops) {
+ if (beforeSplit) {
+ result[0].ops.push(op)
+ if (op.to.sitsOn(point)) {
+ beforeSplit = false
+ result[1].move(op.to)
+ }
+ } else {
+ result[1].ops.push(op)
+ }
+ }
+ if (beforeSplit) {
+ result = path.split(point)
+ if (result[0] === null && result[1] === null) {
+ result[1] = path
+ }
+ if (result[0] === null) result[0] = new Path().move(path.start()).close()
+ if (result[1] === null) result[1] = new Path().move(path.end()).close()
+ }
+ return result
+ }
+
+ const sideOffset = measurements.shoulderToShoulder * 1.6
+
+ // The 'bg' that we use here must match the id we set on the SVG tag
+ // snippets.backgroundSide = new Snippet('side', new Point(-170 + sideOffset, -1660)).attr(
+ // 'data-scale',
+ // 0.631
+ // )
+
+ points.sideFloor = new Point(sideOffset, 0)
+
+ points.sideAnkle = new Point(sideOffset, -measurements.heel * 0.35)
+
+ points.sideWaist = new Point(sideOffset, -measurements.waistToFloor)
+
+ points.sideHips = points.sideWaist.shift(-90, measurements.waistToHips)
+
+ points.sideSeat = points.sideWaist.shift(-90, measurements.waistToSeat)
+
+ points.sideKnee = points.sideWaist.shift(-90, measurements.waistToKnee)
+
+ points.sideCrotch = points.sideWaist.shift(-90, measurements.waistToUpperLeg)
+
+ points.sideUnderbust = points.sideWaist.shift(90, measurements.waistToUnderbust)
+
+ const y = measurements.bustPointToUnderbust
+ const x = Math.min(y, 0.3 * (measurements.chest - measurements.underbust))
+ const bustPointToUnderbust = Math.sqrt(y * y - x * x)
+ points.sideBust1 = points.sideUnderbust.shift(90, bustPointToUnderbust)
+
+ points.sideArmpit = points.sideWaist.shift(90, measurements.waistToArmpit)
+
+ points.sideNeck = points.sideWaist.shift(90, measurements.hpsToWaistBack * 0.88)
+
+ points.sideBust2 = points.sideNeck.shift(-90, measurements.hpsToBust * 0.82)
+
+ points.sideBust = points.sideBust1.shiftFractionTowards(points.sideBust2, 0.5)
+
+ points.sideShoulder = points.sideNeck.shift(
+ -90,
+ (Math.sin((measurements.shoulderSlope / 180) * Math.PI) * measurements.shoulderToShoulder) / 2
+ )
+ points.sideHead = points.sideNeck.shift(90, measurements.head * 0.43)
+
+ points.sideArmStart = points.sideArmpit.shiftFractionTowards(points.sideWaist, 0.1)
+
+ points.sideElbow = points.sideShoulder.shift(-90, measurements.shoulderToElbow * 0.95)
+ points.sideWrist = points.sideShoulder.shift(-90, measurements.shoulderToWrist * 0.95)
+ // points.sideFloor.addText('points.sideFloor')
+ // points.sideWaist.addText('points.sideWaist')
+ // points.sideHips.addText('points.sideHips')
+ // points.sideSeat.addText('points.sideSeat')
+ // points.sideKnee.addText('points.sideKnee')
+ // points.sideCrotch.addText('points.sideCrotch')
+ // points.sideArmpit.addText('points.sideArmpit')
+ // points.sideShoulder.addText('points.sideShoulder')
+ // points.sideNeck.addText('points.sideNeck')
+ // points.sideHead.addText('points.sideHead')
+ // points.sideBust.addText('points.sideBust')
+ // points.sideUnderbust.addText('points.sideUnderbust')
+ // points.sideElbow.addText('points.sideElbow')
+ // points.sideWrist.addText('points.sideWrist')
+
+ points.sideFootBottom = points.sideFloor.shift(180, measurements.heel * 0.3)
+ points.sideToeBottom = points.sideFloor.shift(180, measurements.heel * 0.5)
+ points.sideToeTop = points.sideToeBottom.shift(135, measurements.heel * 0.08)
+ points.sideHeelBottom = points.sideFloor.shift(0, measurements.heel * 0.1)
+ points.sideHeelBack = points.sideHeelBottom.shift(20, measurements.heel * 0.09)
+ points.sideToeGap = points.sideFootBottom.shift(175, measurements.heel * 0.15)
+
+ points.sideHeelFront = points.sideHeelBack.shift(145, measurements.heel * 0.39)
+ points.sideFootBottomCp1 = points.sideFootBottom.shift(0, measurements.heel * 0.1)
+ points.sideFootBottomCp2 = points.sideFootBottom.shift(180, measurements.heel * 0.1)
+ points.sideToeGapCp1 = points.sideToeGap.shift(0, measurements.heel * 0.05)
+ points.sideToeGapCp2 = points.sideToeGap.shift(180, measurements.heel * 0.03)
+
+ points.sideToeBottomCp1 = points.sideToeBottom.shift(0, measurements.heel * 0.03)
+ points.sideToeBottomCp2 = points.sideToeBottom.shift(180, measurements.heel * 0.05)
+
+ points.sideToeTopCp1 = points.sideToeTop.shift(195, measurements.heel * 0.03)
+ points.sideToeTopCp2 = points.sideToeTop.shift(15, measurements.heel * 0.03)
+
+ points.sideAnkleFront = points.sideAnkle.shift(180, measurements.ankle * 0.11)
+ points.sideAnkleBack = points.sideAnkle.shift(0, measurements.ankle * 0.26)
+
+ points.sideHeelFrontCp1 = points.sideHeelFront.shift(220, measurements.ankle * 0.36)
+ points.sideHeelFrontCp2 = points.sideHeelFront.shift(40, measurements.ankle * 0.05)
+
+ points.sideAnkleFrontCp1 = points.sideAnkleFront.shift(250, measurements.ankle * 0.05)
+ points.sideAnkleFrontCp2 = points.sideAnkleFront.shift(70, measurements.ankle * 0.2)
+
+ points.sideAnkleBackCp1 = points.sideAnkleBack.shift(85, measurements.ankle * 0.2)
+ points.sideAnkleBackCp2 = points.sideAnkleBack.shift(-95, measurements.ankle * 0.1)
+
+ points.sideHeelBackCp1 = points.sideHeelBack.shift(45, measurements.ankle * 0.1)
+ points.sideHeelBackCp2 = points.sideHeelBack.shift(225, measurements.ankle * 0.05)
+
+ points.sideCalf = points.sideKnee
+ .shiftFractionTowards(points.sideAnkle, 0.2)
+ .shift(0, points.sideKnee.dy(points.sideAnkle) * 0.06)
+ points.sideCalfFront = points.sideCalf.shift(180, measurements.knee * 0.17)
+ points.sideCalfBack = points.sideCalf.shift(0, measurements.knee * 0.16)
+
+ points.sideKneeFront = points.sideKnee.shift(180, measurements.knee * 0.18)
+ points.sideKneeBack = points.sideKnee.shift(0, measurements.knee * 0.16)
+
+ points.sideSeatFront = points.sideSeat.shift(
+ 180,
+ (measurements.seat - measurements.seatBack) * 0.2
+ )
+ points.sideSeatBack = points.sideSeat.shift(
+ 0,
+ measurements.seatBack * 0.07 + measurements.seat * 0.1
+ )
+
+ points.sideLegFront = points.sideSeat.shift(
+ 180,
+ (measurements.seat - measurements.seatBack) * 0.18
+ )
+ points.sideLegFork = points.sideSeat.shift(
+ 195,
+ (measurements.seat - measurements.seatBack) * 0.19
+ )
+
+ points.sideUpperLegFront = utils.beamIntersectsY(
+ points.sideLegFront,
+ points.sideLegFork,
+ points.sideCrotch.y
+ )
+ points.sideUpperLegBack = points.sideUpperLegFront.shift(0, measurements.upperLeg * 0.32)
+
+ points.sideSeatBackCp1 = points.sideSeatBack.shift(90, points.sideSeat.dy(points.sideHips) * -0.4)
+ points.sideSeatBackCp2 = points.sideSeatBack.shift(
+ -90,
+ points.sideSeat.dy(points.sideCrotch) * 0.4
+ )
+ points.sideUpperLegCp1 = points.sideUpperLegBack.shift(60, measurements.upperLeg * 0.07)
+ points.sideUpperLegCp2 = points.sideUpperLegBack.shift(60, measurements.upperLeg * -0.07)
+
+ const hipsBack = measurements.waistBack * 0.11 + measurements.seatBack * 0.1
+ points.sideHipsBack = points.sideHips.shift(0, hipsBack)
+ points.sideHipsFront = points.sideHips.shift(180, measurements.hips * 0.25 - hipsBack)
+
+ points.sideWaistFront = points.sideWaist.shift(
+ 180,
+ (measurements.waist - measurements.waistBack) * 0.3
+ )
+ points.sideWaistBack = points.sideWaist.shift(0, measurements.waistBack * 0.2)
+
+ points.sideUnderbustFront = points.sideUnderbust.shift(180, measurements.underbust * 0.13)
+ points.sideUnderbustBack = points.sideUnderbust.shift(0, measurements.underbust * 0.11)
+
+ points.sideNeckFront = points.sideNeck.shift(235, measurements.neck * 0.14)
+ points.sideNeckBack = points.sideNeck.shift(-15, measurements.neck * 0.17)
+
+ points.sideUpperNeckFront = points.sideNeck.shift(168, measurements.head * 0.1)
+ points.sideChin = points.sideNeck.shift(168, measurements.head * 0.19)
+ points.sideUpperChin = points.sideNeck.shift(158, measurements.head * 0.215)
+ points.sideLowerLip = points.sideNeck.shift(156, measurements.head * 0.23)
+ points.sideMouth = points.sideNeck.shift(150, measurements.head * 0.22)
+ points.sideUpperLip = points.sideNeck.shift(151, measurements.head * 0.25)
+ points.sideBelowNose = points.sideNeck.shift(145, measurements.head * 0.26)
+ points.sideNose = points.sideNeck.shift(143, measurements.head * 0.29)
+ points.sideEyeFront = points.sideNeck.shift(130, measurements.head * 0.305)
+ points.sideHeadFront = points.sideNeck.shift(126, measurements.head * 0.345)
+ points.sideHeadBack = points.sideNeck.shift(58, measurements.head * 0.29)
+ points.sideUpperNeckBack = points.sideNeck.shift(53, measurements.head * 0.16)
+
+ points.sideOuterNose = points.sideNeck.shift(143, measurements.head * 0.27)
+ points.sideInnerNose = points.sideNeck.shift(142, measurements.head * 0.258)
+
+ points.sideMouthCp1 = points.sideNeck.shift(152, measurements.head * 0.24)
+
+ points.sideNoseCp1 = points.sideNeck.shift(146, measurements.head * 0.285)
+ points.sideNoseCp2 = points.sideNoseCp1.shiftFractionTowards(points.sideNose, 2)
+
+ points.sideEyeFrontCp1 = points.sideEyeFront.shift(-90, measurements.head * 0.01)
+ points.sideEyeFrontCp2 = points.sideEyeFront.shift(90, measurements.head * 0.01)
+
+ points.sideEyeBottom = points.sideNeck.shift(130, measurements.head * 0.283)
+ points.sideEyeDown = points.sideNeck.shift(129, measurements.head * 0.29)
+ points.sideEyeDart = points.sideNeck.shift(126, measurements.head * 0.29)
+ points.sideEyeUp = points.sideNeck.shift(127, measurements.head * 0.305)
+ points.sideEyeTop = points.sideNeck.shift(126.3, measurements.head * 0.313)
+ points.sideEyeCenter = points.sideNeck.shift(127.5, measurements.head * 0.295)
+
+ points.sideEarTop = points.sideNeck.shift(96, measurements.head * 0.24)
+ points.sideEarBack = points.sideNeck.shift(86, measurements.head * 0.2)
+ points.sideEarBottom = points.sideNeck.shift(96, measurements.head * 0.155)
+ points.sideEarTip = points.sideNeck.shift(102, measurements.head * 0.153)
+ points.sideOuterEar = points.sideNeck.shift(100, measurements.head * 0.18)
+ points.sideInnerEar = points.sideNeck.shift(92, measurements.head * 0.185)
+
+ points.sideEarTopCp2 = points.sideEarTop.shift(30, measurements.head * 0.03)
+ points.sideEarBackCp1 = points.sideEarBack.shift(90, measurements.head * 0.025)
+ points.sideEarBackCp2 = points.sideEarBack.shift(-90, measurements.head * 0.02)
+ points.sideEarBottomCp1 = points.sideEarBottom.shift(50, measurements.head * 0.02)
+ points.sideEarBottomCp2 = points.sideEarBottom.shift(230, measurements.head * 0.005)
+
+ paths.sideEye = new Path()
+ .move(points.sideEyeTop)
+ .line(points.sideEyeUp)
+ .line(points.sideEyeDart)
+ .line(points.sideEyeDown)
+ .line(points.sideEyeBottom)
+ .move(points.sideEyeUp)
+ .line(points.sideEyeCenter)
+ .attr('class', 'stroke-xl')
+
+ paths.sideNose = new Path()
+ .move(points.sideInnerNose)
+ .line(points.sideOuterNose)
+ .attr('class', 'stroke-xl')
+
+ paths.sideEar = new Path()
+ .move(points.sideEarTop)
+ .curve(points.sideEarTopCp2, points.sideEarBackCp1, points.sideEarBack)
+ .curve(points.sideEarBackCp2, points.sideEarBottomCp1, points.sideEarBottom)
+ .curve_(points.sideEarBottomCp2, points.sideEarTip)
+ .move(points.sideOuterEar)
+ .line(points.sideInnerEar)
+ .attr('class', 'stroke-xl')
+
+ points.sideShoulderFront = points.sideNeck
+ .shiftFractionTowards(points.sideBust, 0.75)
+ .shift(150, measurements.highBustFront * 0.18)
+
+ points.sideShoulderBack = points.sideNeck
+ .shiftFractionTowards(points.sideArmpit, 0.5)
+ .shift(0, (measurements.highBust - measurements.highBustFront) * 0.266)
+ points.sideShoulderBackLow = points.sideArmpit.shift(
+ 0,
+ (measurements.chest - measurements.bustFront) * 0.14 +
+ (measurements.highBust - measurements.highBustFront) * 0.13
+ )
+
+ points.sideBustBack = utils.beamIntersectsY(
+ points.sideShoulderBackLow,
+ points.sideUnderbustBack,
+ points.sideBust.y
+ )
+ points.sideBustFront = points.sideBustBack.shift(180, measurements.chest * 0.24)
+ points.sideBustFrontExtension = points.sideUnderbustFront
+ .shiftFractionTowards(points.sideBust, 0.35)
+ .shiftFractionTowards(points.sideBustFront, 0.18)
+
+ points.sideBustFrontCp1 = points.sideBustFront.shift(-90, measurements.bustPointToUnderbust * 0.4)
+ points.sideBustFrontCp2 = points.sideBustFront.shift(90, measurements.bustFront * 0.03)
+
+ points.sideUnderbustFrontCp1 = points.sideUnderbustFront.shift(-15, measurements.underbust * 0.02)
+ points.sideUnderbustFrontCp2 = points.sideUnderbustFront.shift(
+ -45,
+ measurements.underbust * -0.005
+ )
+
+ points.sideBustFrontExtensionCp2 = points.sideBustFrontExtension.shift(
+ -100,
+ measurements.underbust * 0.02
+ )
+
+ points.sideBustPointLeft = points.sideBustFront.shiftFractionTowards(points.sideBust, 0.01)
+ points.sideBustPointRight = points.sideBustFront.shiftFractionTowards(points.sideBust, 0.08)
+ points.sideBustPointCenter = points.sideBustPointLeft.shiftFractionTowards(
+ points.sideBustPointRight,
+ 0.5
+ )
+ points.sideBustPointUp = points.sideBustPointCenter.shift(90, measurements.bustFront * 0.01)
+ points.sideBustPointDown = points.sideBustPointCenter.shift(-90, measurements.bustFront * 0.02)
+ points.sideBustPointUpLeft = new Point(points.sideBustPointLeft.x, points.sideBustPointUp.y)
+ points.sideBustPointDownLeft = new Point(points.sideBustPointLeft.x, points.sideBustPointDown.y)
+ points.sideBustPointUpRight = new Point(points.sideBustPointRight.x, points.sideBustPointUp.y)
+ points.sideBustPointDownRight = new Point(points.sideBustPointRight.x, points.sideBustPointDown.y)
+
+ points.sideShoulderFrontCp1 = points.sideShoulderFront.shift(
+ points.sideBustFront.angle(points.sideNeckFront),
+ measurements.highBustFront * -0.04
+ )
+ points.sideShoulderFrontCp2 = points.sideShoulderFront.shift(
+ points.sideBustFront.angle(points.sideNeckFront),
+ measurements.highBustFront * 0.14
+ )
+
+ points.sideArmTopFront = points.sideArmStart.shift(135, measurements.biceps * 0.18)
+ points.sideUpperArmFront = points.sideArmStart.shift(220, measurements.biceps * 0.09)
+ points.sideElbowFront = points.sideElbow.shift(180, measurements.biceps * 0.05)
+ points.sideWristFront = points.sideWrist.shift(180, measurements.wrist * 0.07)
+ points.sideWristBack = points.sideWrist.shift(0, measurements.wrist * 0.24)
+ points.sideElbowBack = points.sideElbow.shift(0, measurements.biceps * 0.22)
+ points.sideUpperArmBack = points.sideArmStart.shift(-40, measurements.biceps * 0.34)
+ points.sideArmTopBack = points.sideArmStart.shift(27, measurements.biceps * 0.31)
+
+ points.sideArmTopFrontCp2 = points.sideArmTopFront.shift(-60, measurements.biceps * 0.08)
+ points.sideUpperArmFrontCp1 = points.sideUpperArmFront.shift(87, measurements.biceps * 0.03)
+ points.sideUpperArmFrontCp2 = points.sideUpperArmFront.shift(-93, measurements.biceps * 0.2)
+ points.sideElbowFrontCp1 = points.sideElbowFront.shift(97, measurements.biceps * 0.2)
+ points.sideElbowFrontCp2 = points.sideElbowFront.shift(-83, measurements.biceps * 0.1)
+ points.sideWristFrontCp1 = points.sideWristFront.shift(87, measurements.wrist * 0.2)
+ points.sideWristFrontCp2 = points.sideWristFront.shift(-93, measurements.wrist * 0.05)
+ points.sideWristBackCp1 = points.sideWristBack.shift(-95, measurements.wrist * 0.05)
+ points.sideWristBackCp2 = points.sideWristBack.shift(85, measurements.wrist * 0.2)
+ points.sideElbowBackCp1 = points.sideElbowBack.shift(-85, measurements.biceps * 0.1)
+ points.sideElbowBackCp2 = points.sideElbowBack.shift(95, measurements.biceps * 0.1)
+ points.sideUpperArmBackCp1 = points.sideUpperArmBack.shift(-90, measurements.biceps * 0.15)
+ points.sideUpperArmBackCp2 = points.sideUpperArmBack.shift(90, measurements.biceps * 0.15)
+ points.sideArmTopBackCp1 = points.sideArmTopBack.shift(-95, measurements.biceps * 0.15)
+
+ points.sideHeadFrontCp2 = points.sideHeadFront.shift(90, measurements.head * 0.06)
+ points.sideHeadCp1 = points.sideHead.shift(175, measurements.head * 0.14)
+ points.sideHeadCp2 = points.sideHead.shift(-5, measurements.head * 0.12)
+
+ points.sideHeadBackCp1 = points.sideHeadBack.shift(80, measurements.head * 0.1)
+ points.sideHeadBackCp2 = points.sideHeadBack.shift(-100, measurements.head * 0.07)
+
+ points.sideUpperNeckBackCp1 = points.sideUpperNeckBack.shift(80, measurements.head * 0.03)
+ points.sideUpperNeckBackCp2 = points.sideUpperNeckBack.shift(-100, measurements.head * 0.05)
+
+ points.sideNeckBackCp1 = points.sideNeckBack.shift(120, measurements.head * 0.05)
+ points.sideNeckBackCp2 = points.sideNeckBack.shift(-60, measurements.head * 0.05)
+
+ points.sideShoulderBackCp1 = points.sideShoulderBack.shift(100, measurements.highBust * 0.04)
+ points.sideShoulderBackCp2 = points.sideShoulderBack.shift(-80, measurements.highBust * 0.04)
+
+ points.sideShoulderBackLowCp1 = points.sideShoulderBackLow.shift(80, measurements.highBust * 0.02)
+ points.sideShoulderBackLowCp2 = points.sideShoulderBackLow.shift(
+ -100,
+ measurements.highBust * 0.01
+ )
+
+ points.sideChinCp1 = points.sideChin.shift(-40, measurements.head * 0.02)
+ points.sideChinCp2 = points.sideChin.shift(140, measurements.head * 0.02)
+
+ points.sideUpperChinCp1 = points.sideUpperChin.shift(-60, measurements.head * 0.01)
+ points.sideUpperChinCp2 = points.sideUpperChin.shift(120, measurements.head * 0.01)
+
+ points.sideUpperNeckFrontCp1 = points.sideUpperNeckFront.shift(-40, measurements.head * 0.02)
+ points.sideUpperNeckFrontCp2 = points.sideUpperNeckFront.shift(140, measurements.head * 0.02)
+
+ points.sideShoulderCp1 = points.sideNeckFront.shift(-80, measurements.head * 0.03)
+ points.sideShoulderCp2 = points.sideNeckFront.shift(100, measurements.head * 0.03)
+
+ points.sideUpperLegFrontCp1 = points.sideLegFork.shiftFractionTowards(
+ points.sideUpperLegFront,
+ 2.4
+ )
+
+ points.sideKneeFrontCp1 = points.sideKneeFront.shift(-80, measurements.knee * 0.1)
+ points.sideKneeFrontCp2 = points.sideKneeFront.shift(100, measurements.knee * 0.5)
+
+ points.sideCalfFrontCp1 = points.sideCalfFront.shift(-85, measurements.knee * 0.1)
+ points.sideCalfFrontCp2 = points.sideCalfFront.shift(95, measurements.knee * 0.1)
+
+ points.sideKneeBackCp1 = points.sideKneeBack.shift(95, measurements.knee * 0.1)
+ points.sideKneeBackCp2 = points.sideKneeBack.shift(-85, measurements.knee * 0.05)
+
+ points.sideCalfBackCp1 = points.sideCalfBack.shift(105, measurements.knee * 0.1)
+ points.sideCalfBackCp2 = points.sideCalfBack.shift(-75, measurements.knee * 0.2)
+
+ points.sideSeatFrontCp1 = points.sideSeatFront.shift(
+ points.sideLegFront.angle(points.sideHipsFront),
+ measurements.seat * -0.01
+ )
+ points.sideSeatFrontCp2 = points.sideSeatFront.shift(
+ points.sideLegFront.angle(points.sideHipsFront),
+ measurements.seat * 0.05
+ )
+
+ points.sideHipsFrontCp1 = points.sideHipsFront.shift(
+ points.sideSeatFront.angle(points.sideWaistFront),
+ measurements.hips * -0.06
+ )
+ points.sideHipsFrontCp2 = points.sideHipsFront.shift(
+ points.sideSeatFront.angle(points.sideWaistFront),
+ measurements.hips * 0.06
+ )
+
+ points.sideWaistFrontCp1 = points.sideWaistFront.shift(
+ points.sideHipsFront.angle(points.sideUnderbustFront) + 5,
+ measurements.waist * -0.05
+ )
+ points.sideWaistFrontCp2 = points.sideWaistFront.shift(
+ points.sideHipsFront.angle(points.sideUnderbustFront) + 5,
+ measurements.waist * 0.05
+ )
+
+ points.sideUnderbustBackCp1 = points.sideUnderbustBack.shift(
+ points.sideShoulderBackLow.angle(points.sideWaistBack),
+ measurements.underbust * -0.03
+ )
+ points.sideUnderbustBackCp2 = points.sideUnderbustBack.shift(
+ points.sideShoulderBackLow.angle(points.sideWaistBack),
+ measurements.underbust * 0.03
+ )
+
+ points.sideWaistBackCp1 = points.sideWaistBack.shift(
+ points.sideUnderbustBack.angle(points.sideHipsBack),
+ measurements.waist * -0.03
+ )
+ points.sideWaistBackCp2 = points.sideWaistBack.shift(
+ points.sideUnderbustBack.angle(points.sideHipsBack),
+ measurements.waist * 0.03
+ )
+
+ points.sideHipsBackCp1 = points.sideHipsBack.shift(
+ points.sideWaistBack.angle(points.sideSeatBack),
+ measurements.hips * -0.05
+ )
+ points.sideHipsBackCp2 = points.sideHipsBack.shift(
+ points.sideWaistBack.angle(points.sideSeatBack),
+ measurements.hips * 0.05
+ )
+
+ points.sideLegForkCp1 = points.sideLegFork.shift(
+ points.sideCrotch.angle(points.sideSeat) + 20,
+ measurements.crossSeam * 0.01
+ )
+
+ points.sideHipsBackCp3 = points.sideHipsBack.shiftFractionTowards(points.sideHipsBackCp2, 0.8)
+
+ points.sideHandA = points.sideWrist.shift(223, measurements.wrist * 0.4)
+ points.sideHandB = points.sideWrist.shift(226, measurements.wrist * 0.5)
+ points.sideHandC = points.sideWrist.shift(228, measurements.wrist * 0.63)
+ points.sideHandD = points.sideWrist.shift(233, measurements.wrist * 0.8)
+ points.sideHandE = points.sideWrist.shift(243, measurements.wrist * 0.52)
+ points.sideHandF = points.sideWrist.shift(253, measurements.wrist * 0.7)
+ points.sideHandG = points.sideWrist.shift(259, measurements.wrist * 1.17)
+ points.sideHandH = points.sideWrist.shift(263, measurements.wrist * 0.73)
+ points.sideHandI = points.sideWrist.shift(268, measurements.wrist * 1.23)
+ points.sideHandJ = points.sideWrist.shift(272.5, measurements.wrist * 0.73)
+ points.sideHandK = points.sideWrist.shift(275, measurements.wrist * 1.18)
+ points.sideHandL = points.sideWrist.shift(282, measurements.wrist * 0.7)
+ points.sideHandM = points.sideWrist.shift(283, measurements.wrist * 1.01)
+ points.sideHandN = points.sideWrist.shift(291, measurements.wrist * 0.7)
+ points.sideHandO = points.sideWrist.shift(314, measurements.wrist * 0.4)
+
+ points.sideHandACp1 = points.sideHandA.shift(50, measurements.wrist * 0.05)
+ points.sideHandACp2 = points.sideHandA.shift(50, measurements.wrist * -0.05)
+ points.sideHandBCp1 = points.sideHandB.shift(50, measurements.wrist * 0.05)
+ points.sideHandBCp2 = points.sideHandB.shift(50, measurements.wrist * -0.05)
+ points.sideHandCCp1 = points.sideHandC.shift(50, measurements.wrist * 0.05)
+ points.sideHandCCp2 = points.sideHandC.shift(50, measurements.wrist * -0.05)
+ points.sideHandDCp1 = points.sideHandD.shift(65, measurements.wrist * 0.05)
+ points.sideHandDCp2 = points.sideHandD.shift(-15, measurements.wrist * 0.1)
+ points.sideHandECp1 = points.sideHandE.shift(150, measurements.wrist * 0.05)
+ points.sideHandECp2 = points.sideHandE.shift(150, measurements.wrist * -0.05)
+ points.sideHandFCp1 = points.sideHandF.shift(79, measurements.wrist * 0.05)
+ points.sideHandFCp2 = points.sideHandF.shift(79, measurements.wrist * -0.45)
+ points.sideHandGCp1 = points.sideHandG.shift(-10, measurements.wrist * -0.05)
+ points.sideHandGCp2 = points.sideHandG.shift(-10, measurements.wrist * 0.05)
+ points.sideHandHCp1 = points.sideHandH.shift(-103, measurements.wrist * 0.35)
+ points.sideHandHCp2 = points.sideHandH.shift(-92, measurements.wrist * 0.48)
+ points.sideHandICp1 = points.sideHandI.shift(-5, measurements.wrist * -0.05)
+ points.sideHandICp2 = points.sideHandI.shift(-5, measurements.wrist * 0.05)
+ points.sideHandJCp1 = points.sideHandJ.shift(-95, measurements.wrist * 0.45)
+ points.sideHandJCp2 = points.sideHandJ.shift(-87, measurements.wrist * 0.4)
+ points.sideHandKCp1 = points.sideHandK.shift(0, measurements.wrist * -0.05)
+ points.sideHandKCp2 = points.sideHandK.shift(0, measurements.wrist * 0.05)
+ points.sideHandLCp1 = points.sideHandL.shift(-90, measurements.wrist * 0.43)
+ points.sideHandLCp2 = points.sideHandL.shift(-80, measurements.wrist * 0.25)
+ points.sideHandMCp1 = points.sideHandM.shift(5, measurements.wrist * -0.05)
+ points.sideHandMCp2 = points.sideHandM.shift(5, measurements.wrist * 0.05)
+ points.sideHandNCp1 = points.sideHandN.shift(-85, measurements.wrist * 0.29)
+ points.sideHandNCp2 = points.sideHandN.shift(-85, measurements.wrist * -0.1)
+ points.sideHandOCp1 = points.sideHandO.shift(-90, measurements.wrist * 0.1)
+ points.sideHandOCp2 = points.sideHandO.shift(-90, measurements.wrist * -0.1)
+
+ paths.sideOutline = new Path()
+ .move(points.sideHeelBottom)
+ .line(points.sideFootBottom)
+ .curve(points.sideFootBottomCp2, points.sideToeGapCp1, points.sideToeGap)
+ .curve(points.sideToeGapCp2, points.sideToeBottomCp1, points.sideToeBottom)
+ .curve(points.sideToeBottomCp2, points.sideToeTopCp1, points.sideToeTop)
+ .curve(points.sideToeTopCp2, points.sideHeelFrontCp1, points.sideHeelFront)
+ .curve(points.sideHeelFrontCp2, points.sideAnkleFrontCp1, points.sideAnkleFront)
+ .curve(points.sideAnkleFrontCp2, points.sideCalfFrontCp1, points.sideCalfFront)
+ .curve(points.sideCalfFrontCp2, points.sideKneeFrontCp1, points.sideKneeFront)
+ .curve(points.sideKneeFrontCp2, points.sideUpperLegFrontCp1, points.sideUpperLegFront)
+ .line(points.sideLegFork)
+ .line(points.sideLegFront)
+ .move(points.sideLegFork)
+ .curve(points.sideLegForkCp1, points.sideSeatFrontCp1, points.sideSeatFront)
+ .curve(points.sideSeatFrontCp2, points.sideHipsFrontCp1, points.sideHipsFront)
+ .curve(points.sideHipsFrontCp2, points.sideWaistFrontCp1, points.sideWaistFront)
+ .curve_(points.sideWaistFrontCp2, points.sideUnderbustFront)
+
+ if (
+ points.sideBustFront.dx(points.sideUnderbustFront) >
+ points.sideUnderbustFront.dx(points.sideBustFrontExtension) * 0.5
+ ) {
+ store.showBust = 1
+ paths.sideOutline
+ .move(points.sideBustFrontExtension)
+ .curve(
+ points.sideBustFrontExtensionCp2,
+ points.sideUnderbustFrontCp1,
+ points.sideUnderbustFront
+ )
+ }
+
+ paths.sideOutline
+ .curve(points.sideUnderbustFrontCp2, points.sideBustFrontCp1, points.sideBustFront)
+ .curve(points.sideBustFrontCp2, points.sideShoulderFrontCp1, points.sideShoulderFront)
+ .curve(points.sideShoulderFrontCp2, points.sideShoulderCp1, points.sideNeckFront)
+ .curve(points.sideShoulderCp2, points.sideUpperNeckFrontCp1, points.sideUpperNeckFront)
+ .curve(points.sideUpperNeckFrontCp2, points.sideChinCp1, points.sideChin)
+ .curve(points.sideChinCp2, points.sideUpperChinCp1, points.sideUpperChin)
+ .curve_(points.sideUpperChinCp2, points.sideLowerLip)
+ ._curve(points.sideMouthCp1, points.sideMouth)
+ ._curve(points.sideMouthCp1, points.sideUpperLip)
+ .line(points.sideBelowNose)
+ ._curve(points.sideNoseCp1, points.sideNose)
+ .curve(points.sideNoseCp2, points.sideEyeFrontCp1, points.sideEyeFront)
+ .curve_(points.sideEyeFrontCp2, points.sideHeadFront)
+ .curve(points.sideHeadFrontCp2, points.sideHeadCp1, points.sideHead)
+ .curve(points.sideHeadCp2, points.sideHeadBackCp1, points.sideHeadBack)
+ .curve(points.sideHeadBackCp2, points.sideUpperNeckBackCp1, points.sideUpperNeckBack)
+ .curve(points.sideUpperNeckBackCp2, points.sideNeckBackCp1, points.sideNeckBack)
+ .curve(points.sideNeckBackCp2, points.sideShoulderBackCp1, points.sideShoulderBack)
+ .curve(points.sideShoulderBackCp2, points.sideShoulderBackLowCp1, points.sideShoulderBackLow)
+ .curve(points.sideShoulderBackLowCp2, points.sideUnderbustBackCp1, points.sideUnderbustBack)
+ .curve(points.sideUnderbustBackCp2, points.sideWaistBackCp1, points.sideWaistBack)
+ .curve(points.sideWaistBackCp2, points.sideHipsBackCp1, points.sideHipsBack)
+ .curve(points.sideHipsBackCp2, points.sideSeatBackCp1, points.sideSeatBack)
+ .curve(points.sideSeatBackCp2, points.sideUpperLegCp1, points.sideUpperLegBack)
+ .curve(points.sideUpperLegCp2, points.sideKneeBackCp1, points.sideKneeBack)
+ .curve(points.sideKneeBackCp2, points.sideCalfBackCp1, points.sideCalfBack)
+ .curve(points.sideCalfBackCp2, points.sideAnkleBackCp1, points.sideAnkleBack)
+ .curve(points.sideAnkleBackCp2, points.sideHeelBackCp1, points.sideHeelBack)
+ .curve_(points.sideHeelBackCp2, points.sideHeelBottom)
+ .attr('class', 'stroke-xl')
+
+ paths.sideArm = new Path()
+ .move(points.sideArmTopFront)
+ .curve(points.sideArmTopFrontCp2, points.sideUpperArmFrontCp1, points.sideUpperArmFront)
+ .curve(points.sideUpperArmFrontCp2, points.sideElbowFrontCp1, points.sideElbowFront)
+ .curve(points.sideElbowFrontCp2, points.sideWristFrontCp1, points.sideWristFront)
+ .curve(points.sideWristFrontCp2, points.sideHandACp1, points.sideHandA)
+ .curve(points.sideHandACp2, points.sideHandBCp1, points.sideHandB)
+ .curve(points.sideHandBCp2, points.sideHandCCp1, points.sideHandC)
+ .curve(points.sideHandCCp2, points.sideHandDCp1, points.sideHandD)
+ .curve(points.sideHandDCp2, points.sideHandECp1, points.sideHandE)
+ .curve(points.sideHandECp2, points.sideHandFCp1, points.sideHandF)
+ .curve(points.sideHandFCp2, points.sideHandGCp1, points.sideHandG)
+ .curve(points.sideHandGCp2, points.sideHandHCp1, points.sideHandH)
+ .curve(points.sideHandHCp2, points.sideHandICp1, points.sideHandI)
+ .curve(points.sideHandICp2, points.sideHandJCp1, points.sideHandJ)
+ .curve(points.sideHandJCp2, points.sideHandKCp1, points.sideHandK)
+ .curve(points.sideHandKCp2, points.sideHandLCp1, points.sideHandL)
+ .curve(points.sideHandLCp2, points.sideHandMCp1, points.sideHandM)
+ .curve(points.sideHandMCp2, points.sideHandNCp1, points.sideHandN)
+ .curve(points.sideHandNCp2, points.sideHandOCp1, points.sideHandO)
+ .curve(points.sideHandOCp2, points.sideWristBackCp1, points.sideWristBack)
+ .curve(points.sideWristBackCp2, points.sideElbowBackCp1, points.sideElbowBack)
+ .curve(points.sideElbowBackCp2, points.sideUpperArmBackCp1, points.sideUpperArmBack)
+ .curve(points.sideUpperArmBackCp2, points.sideArmTopBackCp1, points.sideArmTopBack)
+ .attr('class', 'stroke-xl')
+
+ paths.sideBustPoint = new Path()
+ .move(points.sideBustPointUp)
+ .curve(points.sideBustPointUpLeft, points.sideBustPointDownLeft, points.sideBustPointDown)
+ .curve(points.sideBustPointDownRight, points.sideBustPointUpRight, points.sideBustPointUp)
+ .close()
+ .attr('class', 'stroke-xl')
+
+ let crossSeamMaxFactor = 0.9
+ let crossSeamMinFactor = 0.7
+ for (let i = 0; i < 10; i++) {
+ let crossSeamFactor = (crossSeamMinFactor + crossSeamMaxFactor) / 2
+ points.sideLegForkCp2 = points.sideLegFork.shift(
+ points.sideCrotch.angle(points.sideSeat) + 20,
+ measurements.crossSeam * -0.06 * crossSeamFactor
+ )
+ points.sideCrotchMain = points.sideFloor.shift(90, measurements.inseam)
+ points.sideCrotchMainCp1 = points.sideCrotchMain.shift(170, measurements.crossSeam * 0.04)
+ points.sideCrotchMainCp2 = points.sideCrotchMain.shift(
+ -10,
+ measurements.crossSeam * 0.1 * crossSeamFactor
+ )
+ points.sideBackCrotch = points.sideSeat.shiftFractionTowards(
+ points.sideSeatBack,
+ crossSeamFactor
+ )
+ points.sideBackCrotchCp1 = points.sideBackCrotch.shift(
+ -100,
+ points.sideSeat.dy(points.sideCrotch) * 0.5 * crossSeamFactor
+ )
+ points.sideBackCrotchCp2 = points.sideBackCrotch.shift(
+ 80,
+ points.sideSeat.dy(points.sideCrotch) * 0.5 * crossSeamFactor
+ )
+
+ paths.sideFullCrossSeam = new Path()
+ .move(points.sideWaistFront)
+ .curve(points.sideWaistFrontCp1, points.sideHipsFrontCp2, points.sideHipsFront)
+ .curve(points.sideHipsFrontCp1, points.sideSeatFrontCp2, points.sideSeatFront)
+ .curve(points.sideSeatFrontCp1, points.sideLegForkCp1, points.sideLegFork)
+ .curve(points.sideLegForkCp2, points.sideCrotchMainCp1, points.sideCrotchMain)
+ .curve(points.sideCrotchMainCp2, points.sideBackCrotchCp1, points.sideBackCrotch)
+ .curve(points.sideBackCrotchCp2, points.sideHipsBackCp3, points.sideHipsBack)
+ .curve(points.sideHipsBackCp1, points.sideWaistBackCp2, points.sideWaistBack)
+ .hide()
+
+ const length = paths.sideFullCrossSeam.length()
+ store.log.debug(
+ 'crossseam length actual: ' +
+ length +
+ ' expected: ' +
+ measurements.crossSeam +
+ ' factor: ' +
+ crossSeamFactor
+ )
+
+ if (length > measurements.crossSeam) {
+ crossSeamMaxFactor = crossSeamFactor
+ } else {
+ crossSeamMinFactor = crossSeamFactor
+ }
+ }
+
+ points.sideCrossSeamFrontSplit = paths.sideFullCrossSeam.shiftAlong(measurements.crossSeamFront)
+
+ let tmp = safeSplit(paths.sideFullCrossSeam, points.sideLegFork)[1]
+ tmp = safeSplit(tmp, points.sideHipsBack)[0]
+ const split = safeSplit(tmp, points.sideCrossSeamFrontSplit)
+ paths.sideCrossSeamFront = split[0].attr('class', 'stroke-xl stroke-mark').hide()
+ paths.sideCrossSeamBack = split[1].attr('class', 'stroke-xl stroke-various').hide()
+
+ if (complete) {
+ paths.sideCrossSeamFront.unhide()
+ paths.sideCrossSeamBack.unhide()
+ }
+
+ return part.hide()
+}
+
+export const side = {
+ name: 'side',
+ options: {},
+ measurements: [
+ 'ankle',
+ 'biceps',
+ 'bustFront',
+ 'bustPointToUnderbust',
+ 'bustSpan',
+ 'chest',
+ 'crossSeam',
+ 'crossSeamFront',
+ 'crotchDepth',
+ 'heel',
+ 'head',
+ 'highBust',
+ 'highBustFront',
+ 'hips',
+ 'hpsToBust',
+ 'hpsToWaistBack',
+ 'hpsToWaistFront',
+ 'inseam',
+ 'knee',
+ 'neck',
+ 'seat',
+ 'seatBack',
+ 'shoulderSlope',
+ 'shoulderToElbow',
+ 'shoulderToShoulder',
+ 'shoulderToWrist',
+ 'underbust',
+ 'upperLeg',
+ 'waist',
+ 'waistBack',
+ 'waistToArmpit',
+ 'waistToFloor',
+ 'waistToHips',
+ 'waistToKnee',
+ 'waistToSeat',
+ 'waistToUnderbust',
+ 'waistToUpperLeg',
+ 'wrist',
+ ],
+ draft: draftSide,
+}
diff --git a/designs/bonny/tests/shared.test.mjs b/designs/bonny/tests/shared.test.mjs
new file mode 100644
index 00000000000..0dd87b0b122
--- /dev/null
+++ b/designs/bonny/tests/shared.test.mjs
@@ -0,0 +1,20 @@
+// This file is auto-generated | Any changes you make will be overwritten.
+import { Bonny, about, i18n } from '../src/index.mjs'
+
+// Shared tests
+import { testPatternConfig } from '../../../tests/designs/config.mjs'
+import { testPatternI18n } from '../../../tests/designs/i18n.mjs'
+import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
+import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
+
+// Test config
+testPatternConfig(Bonny, about)
+
+// Test translation
+testPatternI18n(Bonny, i18n)
+
+// Test drafting - Change the second parameter to `true` to log errors
+testPatternDrafting(Bonny, false)
+
+// Test sampling - Change the second parameter to `true` to log errors
+testPatternSampling(Bonny, false)
diff --git a/designs/breanna/README.md b/designs/breanna/README.md
index cdc8709fcd4..05c0c165e04 100644
--- a/designs/breanna/README.md
+++ b/designs/breanna/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/breanna
@@ -59,7 +44,7 @@ A FreeSewing pattern for a basic body block for womenswear
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/breanna/data.mjs b/designs/breanna/data.mjs
deleted file mode 100644
index b5488c72e50..00000000000
--- a/designs/breanna/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/breanna'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/breanna/i18n/de.json b/designs/breanna/i18n/de.json
deleted file mode 100644
index 7d690968804..00000000000
--- a/designs/breanna/i18n/de.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "t": "Breanna body block",
- "d": "Breanna is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "base": "Base",
- "frontBase": "Front base",
- "front": "Front",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "Controls the dart at the front of the arm opening. This can help control gaping at the armhole."
- },
- "shoulderDart": {
- "t": "Shoulder dart",
- "d": "Whether or not to inlude a dart at the shoulder to round the back"
- },
- "shoulderDartSize": {
- "t": "Shoulder dart size",
- "d": "The size of the shoulder dart"
- },
- "shoulderDartLength": {
- "t": "Shoulder dart length",
- "d": "The length of the shoulder dart"
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "waistDart": {
- "t": "Waist dart",
- "d": "Whether or not to inlude a dart at the waist to round the back"
- },
- "waistDartSize": {
- "t": "Waist dart size",
- "d": "The size of the waist dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "The length of the waist dart"
- },
- "verticalEase": {
- "t": "Vertical ease",
- "d": "The amount of ease to distribute along the length of the garment"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at the waist"
- },
- "primaryBustDart": {
- "t": "Bust dart",
- "d": "Where to place the bust dart to shape the chest"
- },
- "primaryBustDartLength": {
- "t": "Bust dart length",
- "d": "The length of the bust dart"
- },
- "secondaryBustDart": {
- "t": "Secondary bust dart",
- "d": "Optionally include a secondary bust dart to distribute the shaping of the chest"
- },
- "secondaryBustDartLength": {
- "t": "Secondary bust dart length",
- "d": "The length of the secondary bust dart"
- },
- "primaryBustDartShaping": {
- "t": "Bust darts shaping",
- "d": "Controls the balance between the main and secondary bust darts"
- }
- }
-}
diff --git a/designs/breanna/i18n/es.json b/designs/breanna/i18n/es.json
deleted file mode 100644
index 7d690968804..00000000000
--- a/designs/breanna/i18n/es.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "t": "Breanna body block",
- "d": "Breanna is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "base": "Base",
- "frontBase": "Front base",
- "front": "Front",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "Controls the dart at the front of the arm opening. This can help control gaping at the armhole."
- },
- "shoulderDart": {
- "t": "Shoulder dart",
- "d": "Whether or not to inlude a dart at the shoulder to round the back"
- },
- "shoulderDartSize": {
- "t": "Shoulder dart size",
- "d": "The size of the shoulder dart"
- },
- "shoulderDartLength": {
- "t": "Shoulder dart length",
- "d": "The length of the shoulder dart"
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "waistDart": {
- "t": "Waist dart",
- "d": "Whether or not to inlude a dart at the waist to round the back"
- },
- "waistDartSize": {
- "t": "Waist dart size",
- "d": "The size of the waist dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "The length of the waist dart"
- },
- "verticalEase": {
- "t": "Vertical ease",
- "d": "The amount of ease to distribute along the length of the garment"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at the waist"
- },
- "primaryBustDart": {
- "t": "Bust dart",
- "d": "Where to place the bust dart to shape the chest"
- },
- "primaryBustDartLength": {
- "t": "Bust dart length",
- "d": "The length of the bust dart"
- },
- "secondaryBustDart": {
- "t": "Secondary bust dart",
- "d": "Optionally include a secondary bust dart to distribute the shaping of the chest"
- },
- "secondaryBustDartLength": {
- "t": "Secondary bust dart length",
- "d": "The length of the secondary bust dart"
- },
- "primaryBustDartShaping": {
- "t": "Bust darts shaping",
- "d": "Controls the balance between the main and secondary bust darts"
- }
- }
-}
diff --git a/designs/breanna/i18n/fr.json b/designs/breanna/i18n/fr.json
deleted file mode 100644
index 7d690968804..00000000000
--- a/designs/breanna/i18n/fr.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "t": "Breanna body block",
- "d": "Breanna is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "base": "Base",
- "frontBase": "Front base",
- "front": "Front",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "Controls the dart at the front of the arm opening. This can help control gaping at the armhole."
- },
- "shoulderDart": {
- "t": "Shoulder dart",
- "d": "Whether or not to inlude a dart at the shoulder to round the back"
- },
- "shoulderDartSize": {
- "t": "Shoulder dart size",
- "d": "The size of the shoulder dart"
- },
- "shoulderDartLength": {
- "t": "Shoulder dart length",
- "d": "The length of the shoulder dart"
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "waistDart": {
- "t": "Waist dart",
- "d": "Whether or not to inlude a dart at the waist to round the back"
- },
- "waistDartSize": {
- "t": "Waist dart size",
- "d": "The size of the waist dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "The length of the waist dart"
- },
- "verticalEase": {
- "t": "Vertical ease",
- "d": "The amount of ease to distribute along the length of the garment"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at the waist"
- },
- "primaryBustDart": {
- "t": "Bust dart",
- "d": "Where to place the bust dart to shape the chest"
- },
- "primaryBustDartLength": {
- "t": "Bust dart length",
- "d": "The length of the bust dart"
- },
- "secondaryBustDart": {
- "t": "Secondary bust dart",
- "d": "Optionally include a secondary bust dart to distribute the shaping of the chest"
- },
- "secondaryBustDartLength": {
- "t": "Secondary bust dart length",
- "d": "The length of the secondary bust dart"
- },
- "primaryBustDartShaping": {
- "t": "Bust darts shaping",
- "d": "Controls the balance between the main and secondary bust darts"
- }
- }
-}
diff --git a/designs/breanna/i18n/index.mjs b/designs/breanna/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/breanna/i18n/index.mjs
+++ b/designs/breanna/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/breanna/i18n/nl.json b/designs/breanna/i18n/nl.json
deleted file mode 100644
index 7d690968804..00000000000
--- a/designs/breanna/i18n/nl.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "t": "Breanna body block",
- "d": "Breanna is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "base": "Base",
- "frontBase": "Front base",
- "front": "Front",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "Controls the dart at the front of the arm opening. This can help control gaping at the armhole."
- },
- "shoulderDart": {
- "t": "Shoulder dart",
- "d": "Whether or not to inlude a dart at the shoulder to round the back"
- },
- "shoulderDartSize": {
- "t": "Shoulder dart size",
- "d": "The size of the shoulder dart"
- },
- "shoulderDartLength": {
- "t": "Shoulder dart length",
- "d": "The length of the shoulder dart"
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "waistDart": {
- "t": "Waist dart",
- "d": "Whether or not to inlude a dart at the waist to round the back"
- },
- "waistDartSize": {
- "t": "Waist dart size",
- "d": "The size of the waist dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "The length of the waist dart"
- },
- "verticalEase": {
- "t": "Vertical ease",
- "d": "The amount of ease to distribute along the length of the garment"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at the waist"
- },
- "primaryBustDart": {
- "t": "Bust dart",
- "d": "Where to place the bust dart to shape the chest"
- },
- "primaryBustDartLength": {
- "t": "Bust dart length",
- "d": "The length of the bust dart"
- },
- "secondaryBustDart": {
- "t": "Secondary bust dart",
- "d": "Optionally include a secondary bust dart to distribute the shaping of the chest"
- },
- "secondaryBustDartLength": {
- "t": "Secondary bust dart length",
- "d": "The length of the secondary bust dart"
- },
- "primaryBustDartShaping": {
- "t": "Bust darts shaping",
- "d": "Controls the balance between the main and secondary bust darts"
- }
- }
-}
diff --git a/designs/breanna/i18n/uk.json b/designs/breanna/i18n/uk.json
deleted file mode 100644
index 7d690968804..00000000000
--- a/designs/breanna/i18n/uk.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "t": "Breanna body block",
- "d": "Breanna is a basic body block for people with breasts.",
- "p": {
- "back": "Back",
- "base": "Base",
- "frontBase": "Front base",
- "front": "Front",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "Controls the dart at the front of the arm opening. This can help control gaping at the armhole."
- },
- "shoulderDart": {
- "t": "Shoulder dart",
- "d": "Whether or not to inlude a dart at the shoulder to round the back"
- },
- "shoulderDartSize": {
- "t": "Shoulder dart size",
- "d": "The size of the shoulder dart"
- },
- "shoulderDartLength": {
- "t": "Shoulder dart length",
- "d": "The length of the shoulder dart"
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "waistDart": {
- "t": "Waist dart",
- "d": "Whether or not to inlude a dart at the waist to round the back"
- },
- "waistDartSize": {
- "t": "Waist dart size",
- "d": "The size of the waist dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "The length of the waist dart"
- },
- "verticalEase": {
- "t": "Vertical ease",
- "d": "The amount of ease to distribute along the length of the garment"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at the waist"
- },
- "primaryBustDart": {
- "t": "Bust dart",
- "d": "Where to place the bust dart to shape the chest"
- },
- "primaryBustDartLength": {
- "t": "Bust dart length",
- "d": "The length of the bust dart"
- },
- "secondaryBustDart": {
- "t": "Secondary bust dart",
- "d": "Optionally include a secondary bust dart to distribute the shaping of the chest"
- },
- "secondaryBustDartLength": {
- "t": "Secondary bust dart length",
- "d": "The length of the secondary bust dart"
- },
- "primaryBustDartShaping": {
- "t": "Bust darts shaping",
- "d": "Controls the balance between the main and secondary bust darts"
- }
- }
-}
diff --git a/designs/breanna/package.json b/designs/breanna/package.json
index a41467a8921..3da7db9b5b4 100644
--- a/designs/breanna/package.json
+++ b/designs/breanna/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/breanna",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a basic body block for womenswear",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/breanna/src/base.mjs b/designs/breanna/src/base.mjs
index b3d0b416cc1..917ecd1e2b4 100644
--- a/designs/breanna/src/base.mjs
+++ b/designs/breanna/src/base.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
function draftBreannaBase({ store, points, Point, measurements, options, utils, part }) {
// HPS
points.hps = new Point((measurements.neck * (1 + options.collarEase)) / options.collarFactor, 0)
@@ -158,17 +160,17 @@ export const base = {
acrossBackFactor: { pct: 96, min: 93, max: 100, menu: 'advanced' },
armholeDepthFactor: { pct: 100, min: 80, max: 120, menu: 'advanced' },
backNeckCutout: { pct: 5, min: 2, max: 8, menu: 'advanced' },
- bicepsEase: { pct: 15, min: 0, max: 50, menu: 'fit' },
+ bicepsEase: { pct: 15, min: 0, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
shoulderDartSize: { pct: 7, min: 4, max: 10, menu: onlyWithShoulderDart },
shoulderDartLength: { pct: 85, min: 60, max: 100, menu: onlyWithShoulderDart },
waistDartSize: { pct: 10, min: 4, max: 15, menu: onlyWithWaistDart },
waistDartLength: { pct: 85, min: 60, max: 100, menu: onlyWithWaistDart },
verticalEase: { pct: 2, min: 0, max: 8, menu: 'fit' },
frontArmholeDeeper: { pct: 1, min: 0, max: 5, menu: 'advanced' },
- shoulderEase: { pct: 0, min: 0, max: 4, menu: 'fit' },
- collarEase: { pct: 3.5, min: 0, max: 10, menu: 'fit' },
- chestEase: { pct: 10, min: 5, max: 20, menu: 'fit' },
- waistEase: { pct: 10, min: 5, max: 20, menu: 'fit' },
+ shoulderEase: { pct: 0, min: 0, max: 4, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
+ collarEase: { pct: 3.5, min: 0, max: 10, ...pctBasedOn('neck'), menu: 'fit' },
+ chestEase: { pct: 10, min: 5, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
+ waistEase: { pct: 10, min: 5, max: 20, ...pctBasedOn('waist'), menu: 'fit' },
primaryBustDartShaping: { pct: 50, min: 25, max: 75, menu: 'style' },
primaryBustDartLength: { pct: 85, min: 65, max: 95, menu: 'style' },
secondaryBustDartLength: { pct: 85, min: 65, max: 95, menu: 'style' },
diff --git a/designs/breanna/src/index.mjs b/designs/breanna/src/index.mjs
index f99a40ff862..989b977dac1 100644
--- a/designs/breanna/src/index.mjs
+++ b/designs/breanna/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { back } from './back.mjs'
import { front } from './front.mjs'
import { sleeve } from './sleeve.mjs'
@@ -10,9 +10,9 @@ import { i18n } from '../i18n/index.mjs'
// Create design
const Breanna = new Design({
- data,
+ data: about,
parts: [back, front, sleeve, base, frontBase, sleevecap],
})
// Named exports
-export { back, front, sleeve, base, frontBase, sleevecap, Breanna, i18n }
+export { back, front, sleeve, base, frontBase, sleevecap, Breanna, i18n, about }
diff --git a/designs/breanna/src/sleeve.mjs b/designs/breanna/src/sleeve.mjs
index 3b775cd4ddb..095f0fae021 100644
--- a/designs/breanna/src/sleeve.mjs
+++ b/designs/breanna/src/sleeve.mjs
@@ -2,6 +2,7 @@ import { sleevecap } from './sleevecap.mjs'
import { front } from './front.mjs'
import { frontBase } from './front-base.mjs'
import { back } from './back.mjs'
+import { pctBasedOn } from '@freesewing/core'
function draftBreannaSleeve(params) {
const {
@@ -147,7 +148,7 @@ export const sleeve = {
after: [front, frontBase, back],
measurements: ['shoulderToWrist', 'wrist'],
options: {
- cuffEase: { pct: 20, min: 0, max: 50, menu: 'fit' },
+ cuffEase: { pct: 20, min: 0, max: 50, ...pctBasedOn('wrist'), menu: 'fit' },
sleeveLengthBonus: { pct: 0, min: -40, max: 10, menu: 'style' },
},
draft: draftBreannaSleeve,
diff --git a/designs/breanna/tests/shared.test.mjs b/designs/breanna/tests/shared.test.mjs
index c15b4178525..0e344e4c616 100644
--- a/designs/breanna/tests/shared.test.mjs
+++ b/designs/breanna/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Breanna, i18n } from '../src/index.mjs'
+import { Breanna, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Breanna)
+testPatternConfig(Breanna, about)
// Test translation
testPatternI18n(Breanna, i18n)
diff --git a/designs/brian/CHANGELOG.md b/designs/brian/CHANGELOG.md
index bb42bba54b4..59b34ec33bc 100644
--- a/designs/brian/CHANGELOG.md
+++ b/designs/brian/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/brian
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Always load plugin-bust due to its changes in how it handle conditionality.
+
## 3.2.0 (2024-02-11)
### Fixed
diff --git a/designs/brian/README.md b/designs/brian/README.md
index 0ba0f3ca781..e8b5e949480 100644
--- a/designs/brian/README.md
+++ b/designs/brian/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/brian
@@ -59,7 +44,7 @@ A FreeSewing pattern for a basic body block for menswear
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/brian/data.mjs b/designs/brian/data.mjs
deleted file mode 100644
index 7919dc37f8a..00000000000
--- a/designs/brian/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/brian'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/brian/i18n/de.json b/designs/brian/i18n/de.json
deleted file mode 100644
index 2e1aa2d93a3..00000000000
--- a/designs/brian/i18n/de.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "t": "Brian, ein Grundschnitt",
- "d": "Brian ist ein Grundschnitt für Personen ohne Brüste.",
- "p": {
- "back": "Back",
- "front": "Front",
- "base": "Base",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Rückenweitenverhältnis",
- "d": "Beeinflusst das Verhältnis zwischen Rücken- und Schulterweite measurement."
- },
- "armholeDepthFactor": {
- "t": "Tiefenfaktor des Armloches",
- "d": "Steuert die Tiefe des Armloches. Höhere Werte ergeben ein tieferes Armloch."
- },
- "backNeckCutout": {
- "t": "Ausschnitt im Nacken",
- "d": "Wie tief der Hals am Rücken ausgeschnitten ist"
- },
- "bicepsEase": {
- "t": "Bizeps Zugabe",
- "d": "Die Menge an Bewegungszugabe am Oberarm. Während wir versuchen, dies zu respektieren, hat das genaue Anbringen des Ärmels am Armloch Vorrang vor der Einhaltung der genauen Zugabe."
- },
- "collarEase": {
- "t": "Kragen Zugabe",
- "d": "Die Menge an Bequemlichkeits-/Bewegungszugabe um deinen Hals herum"
- },
- "chestEase": {
- "t": "Brustzugabe",
- "d": "Die Menge an Bewegungs-/Bequemlichkeitszugabe an deiner Brust."
- },
- "cuffEase": {
- "t": "Manschette Zugabe",
- "d": "Die Bequemlichkeits-/Bewegungszugabe am Handgelenk."
- },
- "draftForHighBust": {
- "t": "Entwurf für hohe Büste",
- "d": "Zeichnen Sie das Muster für die hohe Büstenmessung (falls vorhanden) statt der (vollen) Truhe. Dies wird zu einem besser angepassten Kleidungsstück für Brustkleidung führen."
- },
- "frontArmholeDeeper": {
- "t": "Zusätzlicher Ausschnitt am vorderen Armloch",
- "d": "Um wie viel das vordere Armloch tiefer ausgeschnitten ist als im Rücken."
- },
- "lengthBonus": {
- "t": "Längenzugabe",
- "d": "Der Betrag, um den das Kleidungsstück verlängert wird. Ein negativer Wert verkürzt es."
- },
- "s3Collar": {
- "t": "Schulternahtverschiebung: Kragenseite",
- "d": "Vergrößern Sie diese Option, um die SchulterNaht auf der Kragenseite nach vorne zu verschieben. Verringert sie sie rückwärts."
- },
- "s3Armhole": {
- "t": "Schulternahtverschiebung: Armlochseite",
- "d": "Erhöhe diese Option, um die SchulterNaht auf der Armlochseite nach vorne zu verschieben. Verringert sie sie rückwärts."
- },
- "shoulderEase": {
- "t": "Schulter Zugabe",
- "d": "Die Menge an Bequemlichkeits-/Bewegungszugabe an der Schulter. Dies erhöht den Schulterabstand, um zusätzliche Lagen oder die Dicke des Stoffes zu beherbergen."
- },
- "shoulderSlopeReduction": {
- "t": "Verringerung der Schulterneigung",
- "d": "Der Betrag, um den die Schulterneigung reduziert wird, um eine Schulterpolsterung zu ermöglichen."
- },
- "sleeveLengthBonus": {
- "t": "Ärmel Längenzugabe",
- "d": "Der Betrag, um den der Ärmel verlängert wird. Ein negativer Wert verkürzt ihn."
- },
- "sleevecapEase": {
- "t": "Armkugel Zugabe",
- "d": "Der Betrag, um den die Armkugelnaht länger ist als die Armlochnaht."
- },
- "sleevecapTopFactorX": {
- "t": "Armkugel Oben X",
- "d": "Steuert die horizontale Position der Armkugel oben."
- },
- "sleevecapTopFactorY": {
- "t": "Armkugel Oben Y",
- "d": "Steuert die Höhe der Armkugel. Ein höherer Wert führt zu einer höheren und schmaleren Armkugel."
- },
- "sleevecapBackFactorX": {
- "t": "Armkugel Hinten X",
- "d": "Steuert die Platzierung des hinteren Neigungspunkts der Armkugel auf der X-Achse (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Armkugel Hinten Y",
- "d": "Steuert die Platzierung des hinteren Neigungspunkts der Armkugel auf der Y-Achse (vertikal)"
- },
- "sleevecapFrontFactorX": {
- "t": "Armkugel Vorne X",
- "d": "Steuert die Platzierung des vorderen Neigungspunkts der Armkugel auf der X-Achse (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Armkugel Vorne Y",
- "d": "Steuert die Platzierung des vorderen Neigungspunkts der Armkugel auf der Y-Achse (vertikal)"
- },
- "sleevecapQ1Offset": {
- "t": "Offset der Armkugel Q1",
- "d": "Steuert die Krümmung der Armkugel im ersten Quadranten (vorderes Armloch)"
- },
- "sleevecapQ2Offset": {
- "t": "Offset der Armkugel Q2",
- "d": "Steuert die Krümmung der Armkugel im zweiten Quadranten (vordere Schulter)"
- },
- "sleevecapQ3Offset": {
- "t": "Offset der Armkugel Q3",
- "d": "Steuert die Krümmung der Armkugel im dritten Quadranten (hintere Schulter)"
- },
- "sleevecapQ4Offset": {
- "t": "Offset der Armkugel Q4",
- "d": "Steuert die Krümmung der Armkugel im vierten Quadranten (hinteres Armloch)"
- },
- "sleevecapQ1Spread1": {
- "t": "Armkugel Q1 Spreizung nach unten",
- "d": "Steuert die Spreizung der Armkugel im ersten Quadranten in Richtung des Armlochs"
- },
- "sleevecapQ1Spread2": {
- "t": "Armkugel Q1 Spreizung nach oben",
- "d": "Steuert die Spreizung der Armkugel im ersten Quadranten in Richtung der Schulter"
- },
- "sleevecapQ2Spread1": {
- "t": "Armkugel Q2 Spreizung nach unten",
- "d": "Steuert die Spreizung der Armkugel im zweiten Quadranten in Richtung des Armlochs"
- },
- "sleevecapQ2Spread2": {
- "t": "Armkugel Q2 Spreizung nach oben",
- "d": "Steuert die Spreizung der Armkugel im zweiten Quadranten in Richtung der Schulter"
- },
- "sleevecapQ3Spread1": {
- "t": "Armkugel Q3 Spreizung nach oben",
- "d": "Steuert die Spreizung der Armkugel im dritten Quadranten in Richtung der Schulter"
- },
- "sleevecapQ3Spread2": {
- "t": "Armkugel Q3 Spreizung nach unten",
- "d": "Steuert die Spreizung der Armkugel im dritten Quadranten in Richtung des Armlochs"
- },
- "sleevecapQ4Spread1": {
- "t": "Armkugel Q4 Spreizung nach oben",
- "d": "Steuert die Spreizung der Armkugel im vierten Quadranten in Richtung der Schulter"
- },
- "sleevecapQ4Spread2": {
- "t": "Armkugel Q4 Spreizung nach unten",
- "d": "Steuert die Spreizung der Armkugel im vierten Quadranten in Richtung des Armlochs"
- },
- "sleeveWidthGuarantee": {
- "t": "Garantie der Ärmelbreite",
- "d": "Steuert, wie viel von der Ärmelbreite garantiert wird. Dies bestimmt, um wie viel wir die Ärmelbreite verändern können, um die Ärmel in das Armloch einzupassen."
- }
- }
-}
diff --git a/designs/brian/i18n/es.json b/designs/brian/i18n/es.json
deleted file mode 100644
index 2a03fc0e4b9..00000000000
--- a/designs/brian/i18n/es.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "t": "Brian, patrón base de torso sin pechos",
- "d": "Brian es un patrón base para personas sin pechos.",
- "p": {
- "back": "Back",
- "front": "Front",
- "base": "Base",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Factor de ancho de espalda",
- "d": "Controla el ancho de espalda como un factor de la medida de hombro a hombro."
- },
- "armholeDepthFactor": {
- "t": "Factor de profundidad de la sisa",
- "d": "Controla la profundidad de la sisa. Valores más altos producen sisas más profundas."
- },
- "backNeckCutout": {
- "t": "Corte trasero del cuello",
- "d": "Cómo de profundo es el cuello por detrás"
- },
- "bicepsEase": {
- "t": "Holgura del bíceps",
- "d": "La cantidad de holgura en la parte superior del brazo. Ten en cuenta que, aunque intentamos repetar esto, ajustar la manga a la sisa toma preferencia sobre respetar la cantidad exacta de holgura."
- },
- "collarEase": {
- "t": "Facilidad de cuello",
- "d": "La cantidad de facilidad alrededor de tu cuello."
- },
- "chestEase": {
- "t": "Holgura de pecho",
- "d": "La cantidad de holgura en el pecho"
- },
- "cuffEase": {
- "t": "Holgura de muñeca",
- "d": "La cantidad de holgura en la muñeca."
- },
- "draftForHighBust": {
- "t": "Borrador para alta caída",
- "d": "Borra el patrón para la medición alta del polvo (si está disponible) en lugar del cofre (completo). Esto dará lugar a una prenda más ajustada para las personas con senos."
- },
- "frontArmholeDeeper": {
- "t": "Sujetador delantero extra recorte",
- "d": "¿Cuánto quieres que se corte la sisa delantera más allá de la espalda?"
- },
- "lengthBonus": {
- "t": "Bonus de longitud",
- "d": "La cantidad a elongar. Valores negativos lo acortan."
- },
- "s3Collar": {
- "t": "Mayo de costura de hombro: lado de cuello",
- "d": "Aumenta esta opción para desplazar la costura del hombro hacia adelante en el lado del cuello. Disminuye su desplazamiento hacia atrás."
- },
- "s3Armhole": {
- "t": "Mayo de costura de hombro: lado del orificio",
- "d": "Aumenta esta opción para desplazar la costura del hombro hacia adelante en el lado del blindaje. Disminuye su desplazamiento hacia atrás."
- },
- "shoulderEase": {
- "t": "Holgura de hombro",
- "d": "La cantidad de holgura en los hombros. Esto incrementa la distancia de hombro a hombro para dejar espacio para la ropa que lleves debajo."
- },
- "shoulderSlopeReduction": {
- "t": "Reducción de caída del hombro",
- "d": "La cantidad en la que la caída del hombro se reduce para añadir hombreras."
- },
- "sleeveLengthBonus": {
- "t": "Longitud extra de manga",
- "d": "La cantidad a alargar la manga. Un valor negativo la acorta."
- },
- "sleevecapEase": {
- "t": "Holgura de la parte superior de la manga",
- "d": "La cantidad en la que la parte superior de la manga es más larga que la sisa"
- },
- "sleevecapTopFactorX": {
- "t": "Funda tapa X",
- "d": "Controla la ubicación horizontal de la parte superior de la funda"
- },
- "sleevecapTopFactorY": {
- "t": "Funda tapa Y",
- "d": "Controla la altura de la manga. Un valor más alto hace que la parte superior de la manga sea más alta y estrecha."
- },
- "sleevecapBackFactorX": {
- "t": "Funda atrás X",
- "d": "Controla la colocación del punto de inflexión posterior de la funda en el eje X (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Funda atrás X",
- "d": "Controla la colocación del punto de inflexión posterior de la funda en el eje Y (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Funda frontal X",
- "d": "Controla la colocación del punto de inflexión frontal de la funda en el eje X (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Funda frontal Y",
- "d": "Controla la colocación del punto de inflexión frontal de la funda en el eje Y (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Funda Q1 offset",
- "d": "Controla la curvatura de la funda en el primer cuadrante (sisa frontal)"
- },
- "sleevecapQ2Offset": {
- "t": "Funda Q2 offset",
- "d": "Controla la curvatura de la funda en el segundo cuadrante (hombro delantero)"
- },
- "sleevecapQ3Offset": {
- "t": "Funda Q3 offset",
- "d": "Controla la curvatura de la funda en el tercer cuadrante (hombro posterior)"
- },
- "sleevecapQ4Offset": {
- "t": "Funda Q4 offset",
- "d": "Controla la curvatura de la funda en el cuarto cuadrante (sisa trasera)"
- },
- "sleevecapQ1Spread1": {
- "t": "Funda Q1 propagación a la baja",
- "d": "Controla la propagación de la curvatura del primer cuadrante de la manga hacia la sisa."
- },
- "sleevecapQ1Spread2": {
- "t": "Funda Q1 propagación hacia arriba",
- "d": "Controla la propagación de la curvatura del primer cuadrante de manga hacia el hombro"
- },
- "sleevecapQ2Spread1": {
- "t": "Funda Q2 propagación a la baja",
- "d": "Controla la propagación de la curvatura del segundo cuadrante del manguito hacia la sisa."
- },
- "sleevecapQ2Spread2": {
- "t": "Funda Q2 extendido hacia arriba",
- "d": "Controla la propagación de la curvatura del segundo cuadrante de manga hacia el hombro"
- },
- "sleevecapQ3Spread1": {
- "t": "Funda Q3 extendido hacia arriba",
- "d": "Controla la propagación de la curvatura del tercer cuadrante de manga hacia el hombro"
- },
- "sleevecapQ3Spread2": {
- "t": "Funda Q3 propagación a la baja",
- "d": "Controla la propagación de la curvatura del tercer cuadrante de la manga hacia la sisa."
- },
- "sleevecapQ4Spread1": {
- "t": "Funda Q4 extendido hacia arriba",
- "d": "Controla la propagación de la curvatura del cuarto cuadrante de manga hacia el hombro"
- },
- "sleevecapQ4Spread2": {
- "t": "Funda Q4 propagación a la baja",
- "d": "Controla la propagación de la curvatura del cuarto cuadrante de manga hacia la sisa."
- },
- "sleeveWidthGuarantee": {
- "t": "Garantía de anchura de la manga",
- "d": "Controla cuánto del ancho de la manga se garantizará. Esto determina cuánto podemos alterar el ancho de la manga para que se ajuste a la manga en la sisa."
- }
- }
-}
diff --git a/designs/brian/i18n/fr.json b/designs/brian/i18n/fr.json
deleted file mode 100644
index a1d7a72884e..00000000000
--- a/designs/brian/i18n/fr.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "t": "Patron de base Brian",
- "d": "Brian est un bloc corporel de base pour les personnes sans sein.",
- "p": {
- "back": "Back",
- "front": "Front",
- "base": "Base",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Largeur du dos",
- "d": "Contrôle la largeur de votre dos en jouant sur la mesure d'une épaule à l'autre."
- },
- "armholeDepthFactor": {
- "t": "Hauteur de l'emmanchure",
- "d": "Contrôle la hauteur de l'emmanchure. Des valeurs plus élevées font une emmanchure plus profonde/basse."
- },
- "backNeckCutout": {
- "t": "Arrondi de l'encolure dos",
- "d": "Quelle est la profondeur de l'encolure dans le dos"
- },
- "bicepsEase": {
- "t": "Aisance au niveau des biceps",
- "d": "L'ampleur d'aisance au niveau de votre bras supérieur. Veuillez noter que bien que nous essayons de respecter ce critère, l'ajustement de la manche jusqu'à l'emmanchure est prioritaire sur le respect de la quantité exacte d'aisance."
- },
- "collarEase": {
- "t": "Aisance du col",
- "d": "L'ampleur d'aisance au niveau du cou."
- },
- "chestEase": {
- "t": "Aisance de poitrine",
- "d": "La quantité d'aisance à votre poitrine."
- },
- "cuffEase": {
- "t": "Aisance de poignet",
- "d": "L'ampleur d'aisance à votre poignet."
- },
- "draftForHighBust": {
- "t": "Tracé pour le haut de la poitrine",
- "d": "Tracez le patron pour la mesure du dessus de poitrine (si disponible) au lieu du torse. Cela donnera un vêtement plus ajusté pour les personnes avec des seins."
- },
- "frontArmholeDeeper": {
- "t": "Découpe supplémentaire sur l'emmanchure avant",
- "d": "Combien voulez-vous que l’emmanchure devant soit découpée plus profondément que le dos."
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "La quantité à ajouter pour rallonger le vêtement. Une valeur négative le raccourcira."
- },
- "s3Collar": {
- "t": "Changement de couture des épaules: côté col",
- "d": "Augmentez cette option pour déplacer la couture de l'épaule vers l'avant sur le côté. La diminuer la déplace vers l'arrière."
- },
- "s3Armhole": {
- "t": "Changement de couture des épaules: côté des bras",
- "d": "Augmente cette option pour déplacer la couture de l'épaule vers l'avant sur le côté de l'armure. Diminuer la glisse vers l'arrière."
- },
- "shoulderEase": {
- "t": "Aisance des épaules",
- "d": "La quantité d'aisance à votre épaule. Cela augmente la distance entre épaules pour accommoder des couches ou épaisseurs supplémentaires."
- },
- "shoulderSlopeReduction": {
- "t": "Réduction de la pente d'épaule",
- "d": "La quantité par laquelle la pente des épaules est réduite pour permettre un ajustement aux épaules."
- },
- "sleeveLengthBonus": {
- "t": "Bonus de longueur de manche",
- "d": "Le montant pour rallonger la manche. Une valeur négative le raccourcira."
- },
- "sleevecapEase": {
- "t": "Aisance tête de manche",
- "d": "Le montant par lequel la couture du tête de manche est plus longue que celle des emmanchures."
- },
- "sleevecapTopFactorX": {
- "t": "Tête de manche top X",
- "d": "Contrôle l'emplacement horizontal du tête de manche."
- },
- "sleevecapTopFactorY": {
- "t": "Tête de manche top Y",
- "d": "Contrôle la hauteur du tête de manche. Plus la valeur est élevée, plus la tête de manche est haute et étroite."
- },
- "sleevecapBackFactorX": {
- "t": "Tête de manche arrière X",
- "d": "Contrôle le positionnement du point d'inclinaison arrière du tête de manche sur l'axe des X (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Tête de manche arrière Y",
- "d": "Contrôle le positionnement du point d'inclinaison arrière du tête de manche sur l'axe des Y (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Tête de manche devant X",
- "d": "Contrôle le positionnement du point d'inclinaison avant du tête de manche sur l'axe des X (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Tête de manche devant Y",
- "d": "Contrôle le positionnement du point d'inclinaison avant du tête de manche sur l'axe des Y (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Tête de manche décalage Q1",
- "d": "Contrôle la courbure du tête de manche dans le premier quadrant (emmanchure devant)."
- },
- "sleevecapQ2Offset": {
- "t": "Tête de manche décalage Q2",
- "d": "Contrôle la courbure du tête de manche dans le deuxième quadrant (épaule avant)."
- },
- "sleevecapQ3Offset": {
- "t": "Tête de manche décalage Q3",
- "d": "Contrôle la courbure du tête de manche dans le troisième quadrant (épaule arrière)."
- },
- "sleevecapQ4Offset": {
- "t": "Tête de manche décalage Q4",
- "d": "Contrôle la courbure du tête de manche dans le quatrième quadrant (emmanchure au dos)."
- },
- "sleevecapQ1Spread1": {
- "t": "Tête de manche abaissement Q1",
- "d": "Contrôle l'abaissement de la courbure du premier quadrant de la tête de manche vers l'emmanchure"
- },
- "sleevecapQ1Spread2": {
- "t": "Tête de manche élévation Q1",
- "d": "Contrôle l'élévation de la courbure du premier quadrant de la tête de manche vers l'épaule"
- },
- "sleevecapQ2Spread1": {
- "t": "Tête de manche abaissement Q2",
- "d": "Contrôle l'abaissement de la courbure du second quadrant de la tête de manche vers l'emmanchure"
- },
- "sleevecapQ2Spread2": {
- "t": "Tête de manche élévation Q2",
- "d": "Contrôle l'élévation de la courbure du second quadrant de la tête de manche vers l'épaule"
- },
- "sleevecapQ3Spread1": {
- "t": "Tête de manche élévation Q3",
- "d": "Contrôle l'élévation de la courbure du troisième quadrant de la tête de manche vers l'épaule"
- },
- "sleevecapQ3Spread2": {
- "t": "Tête de manche abaissement Q3",
- "d": "Contrôle l'abaissement de la courbure du troisième quadrant de la tête de manche vers l'emmanchure"
- },
- "sleevecapQ4Spread1": {
- "t": "Tête de manche élévation Q4",
- "d": "Contrôle l'élévation de la courbure du quatrième quadrant de la tête de manche vers l'épaule"
- },
- "sleevecapQ4Spread2": {
- "t": "Tête de manche abaissement Q4",
- "d": "Contrôle l'abaissement de la courbure du quatrième quadrant de la tête de manche vers l'emmanchure"
- },
- "sleeveWidthGuarantee": {
- "t": "Largeur des manches garantie",
- "d": "Contrôle la largeur de manche garantie. Cela détermine à quel point nous pouvons modifier la largeur de la manche pour l'adapter à l'emmanchure."
- }
- }
-}
diff --git a/designs/brian/i18n/index.mjs b/designs/brian/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/brian/i18n/index.mjs
+++ b/designs/brian/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/brian/i18n/nl.json b/designs/brian/i18n/nl.json
deleted file mode 100644
index 324e821fe7f..00000000000
--- a/designs/brian/i18n/nl.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "t": "Brian Basisvorm",
- "d": "Brian is een basislichaam voor mensen zonder borsten.",
- "p": {
- "back": "Back",
- "front": "Front",
- "base": "Base",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Rugwijdte",
- "d": "Geeft controle over de breedte van je rug als een factor van je schouder tot schouder maat."
- },
- "armholeDepthFactor": {
- "t": "Diepte armsgat factor",
- "d": "Controleert de diepte van het armsgat. Hoe hoger deze waarde, hoe dieper het armsgat."
- },
- "backNeckCutout": {
- "t": "Hals uitsnijding achteraan",
- "d": "Hoe diep de nek wordt uitgesneden aan de rug"
- },
- "bicepsEase": {
- "t": "Overwijdte biceps",
- "d": "De hoeveelheid overwijdte aan je bovenarm. Let op dat we proberen dit te respecteren, maar dat de mouw in het armsgat laten passen voorrang krijgt op de hoeveelheid overwijdte. "
- },
- "collarEase": {
- "t": "Overwijdte kraag",
- "d": "De hoeveelheid overwijdte rond je nek."
- },
- "chestEase": {
- "t": "Overwijdte borst",
- "d": "De hoeveelheid overwijdte aan je borst."
- },
- "cuffEase": {
- "t": "Overwijdte manchet",
- "d": "De hoeveelheid overwijdte aan je pols."
- },
- "draftForHighBust": {
- "t": "Teken voor hoge buste",
- "d": "Teken het patroon voor de hoge bustemaat (indien beschikbaar) in plaats van de volle borstomtrek. Dit heeft een aansluitender kledingstuk als resultaat voor mensen met borsten."
- },
- "frontArmholeDeeper": {
- "t": "Extra uitsnijding armsgat vooraan",
- "d": "Hoeveel dieper moet het armsgat vooraan zijn uitgesneden, in vergelijking met het armsgat achteraan."
- },
- "lengthBonus": {
- "t": "Lengtebonus",
- "d": "De hoeveelheid waarmee het kledingstuk verlengd wordt. Een negatieve waarde maakte het korter."
- },
- "s3Collar": {
- "t": "Schoudernaad verschuiving: kraagkant",
- "d": "Verhoog deze optie om de schoudernaad vooruit aan de kant van de kraag te bewegen. Door deze te verschuiven wordt de naad achterwaarts verlegd."
- },
- "s3Armhole": {
- "t": "Schouder naad shift: armsgatzijde",
- "d": "Verhoog deze optie om de schoudernaad vooruit aan de zijkant van het armsgat naar voren te bewegen. Vermindering ervan verlegt de schoudernaad."
- },
- "shoulderEase": {
- "t": "Overwijdte schouder",
- "d": "De hoeveelheid overwijdte aan je schouder. Dit vergroot de afstand van schouder tot schouder om ruimte te maken voor wat je onder je jas draagt."
- },
- "shoulderSlopeReduction": {
- "t": "Reductie schouderhelling",
- "d": "Hoeveel de schouderhelling verminderd wordt om ruimte te maken voor epauletten."
- },
- "sleeveLengthBonus": {
- "t": "Bonus mouwlengte",
- "d": "De hoeveelheid waarmee de mouw verlengd wordt. Een negatieve waarde zal ze korter maken."
- },
- "sleevecapEase": {
- "t": "Extra ruimte mouwkop",
- "d": "Hoeveel langer de naad van de mouwkop is dan de naad van het armsgat."
- },
- "sleevecapTopFactorX": {
- "t": "Mouwkop top X",
- "d": "Bepaalt de horizontale locatie van de top van de mouwkop"
- },
- "sleevecapTopFactorY": {
- "t": "Mouwkop top X",
- "d": "Controleert de hoogte van de mouwkop. Een hogere waarde heeft als resultaat een hogere en smallere mouwkop."
- },
- "sleevecapBackFactorX": {
- "t": "Mouwkop X achteraan",
- "d": "Bepaalt de plaatsing op de X-as (horizontaal) van het ankerpunt van het achterste deel van de mouwkop"
- },
- "sleevecapBackFactorY": {
- "t": "Mouwkop Y achteraan",
- "d": "Bepaalt de plaatsing op de Y-as (verticaal) van het ankerpunt van het achterste deel van de mouwkop"
- },
- "sleevecapFrontFactorX": {
- "t": "Mouwkop X vooraan",
- "d": "Bepaalt de plaatsing op de X-as (horizontaal) van het ankerpunt van het voorste deel van de mouwkop"
- },
- "sleevecapFrontFactorY": {
- "t": "Mouwkop Y vooraan",
- "d": "Bepaalt de plaatsing op de Y-as (verticaal) van het ankerpunt van het voorste deel van de mouwkop"
- },
- "sleevecapQ1Offset": {
- "t": "Mouwkop Q1 offset",
- "d": "Bepaalt de kromming van de mouwkop in het eerste quadrant (armsgat vooraan)"
- },
- "sleevecapQ2Offset": {
- "t": "Mouwkop Q2 offset",
- "d": "Bepaalt de kromming van de mouwkop in het tweede quadrant (schouder vooraan)"
- },
- "sleevecapQ3Offset": {
- "t": "Mouwkop Q3 offset",
- "d": "Bepaalt de kromming van de mouwkop in het derde quadrant (schouder achteraan)"
- },
- "sleevecapQ4Offset": {
- "t": "Mouwkop Q4 offset",
- "d": "Bepaalt de kromming van de mouwkop in het vierde quadrant (armsgat vooraan)"
- },
- "sleevecapQ1Spread1": {
- "t": "Mouwkop Q1 neerwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het eerste quadrant van de mouwkop, in de richting van het armsgat"
- },
- "sleevecapQ1Spread2": {
- "t": "Mouwkop Q1 opwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het eerste quadrant van de mouwkop, in de richting van de shouder"
- },
- "sleevecapQ2Spread1": {
- "t": "Mouwkop Q2 neerwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het tweede quadrant van de mouwkop, in de richting van het armsgat"
- },
- "sleevecapQ2Spread2": {
- "t": "Mouwkop Q2 opwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het tweede quadrant van de mouwkop, in de richting van de shouder"
- },
- "sleevecapQ3Spread1": {
- "t": "Mouwkop Q3 opwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het derde quadrant van de mouwkop, in de richting van de shouder"
- },
- "sleevecapQ3Spread2": {
- "t": "Mouwkop Q3 neerwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het derde quadrant van de mouwkop, in de richting van het armsgat"
- },
- "sleevecapQ4Spread1": {
- "t": "Mouwkop Q4 opwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het vierde quadrant van de mouwkop, in de richting van de shouder"
- },
- "sleevecapQ4Spread2": {
- "t": "Mouwkop Q4 neerwaardse spreiding",
- "d": "Bepaalt de spreiding van de kromming in het vierde quadrant van de mouwkop, in de richting van het armsgat"
- },
- "sleeveWidthGuarantee": {
- "t": "Gegarandeerde mouw breedte",
- "d": "Bepaalt hoeveel van de mouwbreedte we garanderen wanneer we de mouw aan het armsgat aanpassen."
- }
- }
-}
diff --git a/designs/brian/i18n/uk.json b/designs/brian/i18n/uk.json
deleted file mode 100644
index 10d357160d3..00000000000
--- a/designs/brian/i18n/uk.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "t": "Brian body block",
- "d": "Brian is a basic body block for people without breasts.",
- "p": {
- "back": "Back",
- "front": "Front",
- "base": "Base",
- "sleevecap": "Sleevecap",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "acrossBackFactor": {
- "t": "Across back factor",
- "d": "Controls your across back width as a factor of your shoulder to shoulder measurement."
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of the armhole. Higher values make a deeper armhole."
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "How deep the neck is cut out at the back"
- },
- "bicepsEase": {
- "t": "Biceps ease",
- "d": "The amount of ease at your upper arm. Note that while we try to respect this, fitting the sleeve to the armhole takes precedence over respecting the exact amount of ease."
- },
- "collarEase": {
- "t": "Collar ease",
- "d": "The amount of ease around your neck"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "cuffEase": {
- "t": "Cuff ease",
- "d": "The amount of ease at your wrist."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- },
- "frontArmholeDeeper": {
- "t": "Front armhole extra cutout",
- "d": "How much do you want the front armhole to be cut out deeper than the back."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "The amount to lengthen the garment. A negative value will shorten it."
- },
- "s3Collar": {
- "t": "Shoulder seam shift: collar side",
- "d": "Increase this option to shift the shoulder seam forward on the collar side. Decreasing it shifts it backwards."
- },
- "s3Armhole": {
- "t": "Shoulder seam shift: armhole side",
- "d": "Increase this option to shift the shoulder seam forward on the armhole side. Decreasing it shifts it backwards."
- },
- "shoulderEase": {
- "t": "Shoulder ease",
- "d": "The amount of ease at your shoulder. This increases the shoulder to shoulder distance to accommodate additional layers or thickness."
- },
- "shoulderSlopeReduction": {
- "t": "Shoulder slope reduction",
- "d": "The amount by which the shoulder slope is reduced to allow for shoulder padding."
- },
- "sleeveLengthBonus": {
- "t": "Sleeve length bonus",
- "d": "The amount to lengthen the sleeve. A negative value will shorten it."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "The amount by which the sleevecap seam is longer than the armhole seam."
- },
- "sleevecapTopFactorX": {
- "t": "Sleevecap top X",
- "d": "Controls the horizontal location of the sleevecap top."
- },
- "sleevecapTopFactorY": {
- "t": "Sleevecap top Y",
- "d": "Controls the height of the sleevecap. A higher value results in a higher and more narrow sleevecap."
- },
- "sleevecapBackFactorX": {
- "t": "Sleevecap back X",
- "d": "Controls the placement of the sleevecap back pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapBackFactorY": {
- "t": "Sleevecap back Y",
- "d": "Controls the placement of the sleevecap back pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapFrontFactorX": {
- "t": "Sleevecap front X",
- "d": "Controls the placement of the sleevecap front pitchpoint on the X-axis (horizontal)"
- },
- "sleevecapFrontFactorY": {
- "t": "Sleevecap front Y",
- "d": "Controls the placement of the sleevecap front pitchpoint on the Y-axis (vertical)"
- },
- "sleevecapQ1Offset": {
- "t": "Sleevecap Q1 offset",
- "d": "Controls the curvature of the sleevecap in the first quadrant (front armhole)"
- },
- "sleevecapQ2Offset": {
- "t": "Sleevecap Q2 offset",
- "d": "Controls the curvature of the sleevecap in the second quadrant (front shoulder)"
- },
- "sleevecapQ3Offset": {
- "t": "Sleevecap Q3 offset",
- "d": "Controls the curvature of the sleevecap in the third quadrant (back shoulder)"
- },
- "sleevecapQ4Offset": {
- "t": "Sleevecap Q4 offset",
- "d": "Controls the curvature of the sleevecap in the fourth quadrant (back armhole)"
- },
- "sleevecapQ1Spread1": {
- "t": "Sleevecap Q1 downward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the armhole"
- },
- "sleevecapQ1Spread2": {
- "t": "Sleevecap Q1 upward spread",
- "d": "Controls the spread of the sleevecap first quadrant curvature towards the shoulder"
- },
- "sleevecapQ2Spread1": {
- "t": "Sleevecap Q2 downward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the armhole"
- },
- "sleevecapQ2Spread2": {
- "t": "Sleevecap Q2 upward spread",
- "d": "Controls the spread of the sleevecap second quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread1": {
- "t": "Sleevecap Q3 upward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the shoulder"
- },
- "sleevecapQ3Spread2": {
- "t": "Sleevecap Q3 downward spread",
- "d": "Controls the spread of the sleevecap third quadrant curvature towards the armhole"
- },
- "sleevecapQ4Spread1": {
- "t": "Sleevecap Q4 upward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the shoulder"
- },
- "sleevecapQ4Spread2": {
- "t": "Sleevecap Q4 downward spread",
- "d": "Controls the spread of the sleevecap fourth quadrant curvature towards the armhole"
- },
- "sleeveWidthGuarantee": {
- "t": "Sleeve width guarantee",
- "d": "Controls how much of the sleeve width will be guaranteed. This determines how much we can alter the sleeve width to fit the sleeve in the armhole."
- }
- }
-}
diff --git a/designs/brian/package.json b/designs/brian/package.json
index eb76ff2d8aa..dc0819b8231 100644
--- a/designs/brian/package.json
+++ b/designs/brian/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/brian",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a basic body block for menswear",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/brian/src/base.mjs b/designs/brian/src/base.mjs
index 3883fb07b42..c96ebfc1f7c 100644
--- a/designs/brian/src/base.mjs
+++ b/designs/brian/src/base.mjs
@@ -1,4 +1,5 @@
import { bustPlugin } from '@freesewing/plugin-bust'
+import { pctBasedOn } from '@freesewing/core'
export const base = {
name: 'brian.base',
@@ -21,15 +22,15 @@ export const base = {
brianFitCollar: true,
collarFactor: 4.8,
// Fit
- bicepsEase: { pct: 15, min: 0, max: 50, menu: 'fit' },
- chestEase: { pct: 15, min: -4, max: 35, menu: 'fit' },
- collarEase: { pct: 5, min: 0, max: 10, menu: 'fit' },
- cuffEase: { pct: 20, min: 0, max: 200, menu: 'fit' },
+ bicepsEase: { pct: 15, min: 0, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
+ chestEase: { pct: 15, min: -4, max: 35, ...pctBasedOn('chest'), menu: 'fit' },
+ collarEase: { pct: 5, min: 0, max: 10, ...pctBasedOn('neck'), menu: 'fit' },
+ cuffEase: { pct: 20, min: 0, max: 200, ...pctBasedOn('wrist'), menu: 'fit' },
draftForHighBust: {
bool: false,
menu: (settings) => (settings?.measurements?.highBust ? 'fit' : false),
},
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
// Style
lengthBonus: { pct: 0, min: -4, max: 60, menu: 'style' },
s3Collar: { pct: 0, min: -100, max: 100, menu: 'style' },
diff --git a/designs/brian/src/index.mjs b/designs/brian/src/index.mjs
index 62207631f97..0f01969ae2d 100644
--- a/designs/brian/src/index.mjs
+++ b/designs/brian/src/index.mjs
@@ -1,6 +1,6 @@
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { back } from './back.mjs'
import { front } from './front.mjs'
import { sleeve } from './sleeve.mjs'
@@ -10,9 +10,9 @@ import { sleevecap } from './sleevecap.mjs'
// Setup our new design
const Brian = new Design({
- data,
+ data: about,
parts: [back, front, sleeve],
})
// Named exports
-export { back, front, sleeve, base, sleevecap, Brian, i18n }
+export { back, front, sleeve, base, sleevecap, Brian, i18n, about }
diff --git a/designs/brian/tests/shared.test.mjs b/designs/brian/tests/shared.test.mjs
index 38c4b3188d5..90b01cb6cda 100644
--- a/designs/brian/tests/shared.test.mjs
+++ b/designs/brian/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Brian, i18n } from '../src/index.mjs'
+import { Brian, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Brian)
+testPatternConfig(Brian, about)
// Test translation
testPatternI18n(Brian, i18n)
diff --git a/designs/bruce/README.md b/designs/bruce/README.md
index 1310f1c609c..1807e8c8419 100644
--- a/designs/bruce/README.md
+++ b/designs/bruce/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/bruce
@@ -59,7 +44,7 @@ A FreeSewing pattern for boxer briefs
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/bruce/data.mjs b/designs/bruce/data.mjs
deleted file mode 100644
index c775637a242..00000000000
--- a/designs/bruce/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/bruce'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/bruce/i18n/de.json b/designs/bruce/i18n/de.json
deleted file mode 100644
index 7f6b45c79ad..00000000000
--- a/designs/bruce/i18n/de.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Bruce, die Retroshorts",
- "d": "Bruce sind bequeme und stylische Retroshorts.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "inset": "Einsatz",
- "side": "Seite"
- },
- "s": {},
- "o": {
- "bulge": {
- "t": "Wölbung",
- "d": "Vergrößert den Winkel, um mehr Platz in der vorderen Tasche zu schaffen."
- },
- "legBonus": {
- "t": "Beinlängen-Bonus",
- "d": "Zusätzliche Länge für die Beine."
- },
- "rise": {
- "t": "Anstieg",
- "d": "Betrag, um den die Taille angehoben wird. Ein negativer Wert senkt sie ab."
- },
- "stretch": {
- "t": "Dehnung",
- "d": "Die Menge an negativer Bewegungszugabe."
- },
- "legStretch": {
- "t": "Bein Dehnung",
- "d": "Das beste Ergebnis erzielst du, wenn du den Sitz der Beine etwas enger machst — Sag Nein zu klaffenden Lücken."
- },
- "backRise": {
- "t": "Hintere Anstieg",
- "d": "Betrag, um den die Taille hinten angehoben wird."
- }
- }
-}
diff --git a/designs/bruce/i18n/es.json b/designs/bruce/i18n/es.json
deleted file mode 100644
index 0210f9878ff..00000000000
--- a/designs/bruce/i18n/es.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "t": "Bruce, calzoncillos bóxer",
- "d": "Bruce es un bóxer cerrado cómodo y elegante.",
- "p": {
- "back": "Atrás",
- "backBase": "Base trasera",
- "backPocketWelt": "Ribete del bolsillo trasero",
- "base": "Base",
- "bentBack": "Trasero Bent",
- "bentBase": "Base Bent",
- "bentFront": "Frente Bent",
- "bentSleeve": "Manga Bent",
- "bentTopSleeve": "Manga superior Bent",
- "bentUnderSleeve": "Manga debajo Bent",
- "buttonholePlacket": "Tapeta de ojal",
- "buttonPlacket": "Tapeta de botones",
- "collar": "Cuello",
- "collarStand": "Soporte de collar",
- "cuff": "Cuffnl",
- "fabricTail": "Cola de tela",
- "fabricTip": "Punta de tela",
- "frontBase": "Base delantera",
- "frontFacing": "Delantero mirando hacia",
- "front": "Frente",
- "frontLeft": "Delantero izquierdo",
- "frontLining": "Delantero revestimiento",
- "frontRight": "Frente derecho",
- "gusset": "Gusset",
- "hoodCenter": "Centro de la capucha",
- "hood": "Capucha",
- "hoodSide": "Lado de la capucha",
- "inset": "Recuadro",
- "interfacingTail": "Cola de entretela",
- "interfacingTip": "Punta de entretela",
- "liningTail": "Cola de revestimiento",
- "liningTip": "Punta de revestimiento",
- "loop": "Lazo",
- "panel1": "Panel 1",
- "panel2": "Panel 2",
- "panel3": "Panel 3",
- "panel4": "Panel 4",
- "panel5": "Panel 5",
- "panel6": "Panel 6",
- "panels": "Paneles",
- "pocketBag": "Bolsa de bolsillo",
- "pocketFacing": "Cara de bolsillo",
- "pocketInterfacing": "Entretela de bolsillo",
- "pocket": "Bolsillo",
- "pocketWelt": "Ribete de bolsillo",
- "side": "Lado",
- "sleeveBase": "Base de la manga",
- "sleevecap": "Funda de manga",
- "sleevePlacketOverlap": "Top de manga tapeta",
- "sleevePlacketUnderlap": "Parte inferior de la tapeta de la manga",
- "sleeve": "Manga",
- "topSleeve": "Manga superior",
- "top": "Arriba",
- "underCollar": "Debajo del cuello",
- "underSleeve": "Manga debajo",
- "waistband": "Pretina",
- "yoke": "Yugo"
- },
- "s": {
- "inset": "Encarte",
- "side": "Lado"
- },
- "o": {
- "bulge": {
- "t": "Bulto",
- "d": "Incrementar el ángulo para crear más espacio en el bolsillo delantero."
- },
- "legBonus": {
- "t": "Extra de longitud de pierna",
- "d": "La longitud extra a añadir a las perneras."
- },
- "rise": {
- "t": "Elevación de la cintura",
- "d": "La cantidad a elevar la cintura. Valores negativos la bajan."
- },
- "stretch": {
- "t": "Extensión",
- "d": "La cantidad de holgura negativa."
- },
- "legStretch": {
- "t": "Estiramiento de la pernera",
- "d": "Para mejores resultados, junta tus piernas más; di no a los huecos."
- },
- "backRise": {
- "t": "Elevación de la espalda",
- "d": "Porcentaje en el que la cintura se elevará en la espalda."
- }
- }
-}
diff --git a/designs/bruce/i18n/fr.json b/designs/bruce/i18n/fr.json
deleted file mode 100644
index 0eca5c7e0df..00000000000
--- a/designs/bruce/i18n/fr.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Boxer Bruce",
- "d": "Bruce est un boxer confortable et élégant.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "inset": "Encart",
- "side": "Côté"
- },
- "s": {},
- "o": {
- "bulge": {
- "t": "Renflement",
- "d": "Augmentez l'angle pour créer plus d'espace dans la poche avant."
- },
- "legBonus": {
- "t": "Bonus de longueur de jambes",
- "d": "Longueur supplémentaire à ajouter aux jambes."
- },
- "rise": {
- "t": "Élévation de ceinture",
- "d": "Montant d'élévation pour la ceinture vers la taille. Une valeur négative l'abaissera."
- },
- "stretch": {
- "t": "Élasticité",
- "d": "La quantité d'aisance négative."
- },
- "legStretch": {
- "t": "Élasticité des jambes",
- "d": "Pour de meilleurs résultats, vous souhaitez ajuster vos jambes plus étroites - choisissez non à l'écart."
- },
- "backRise": {
- "t": "Élévation arrière",
- "d": "Pourcentage selon lequel la taille sera relevée à l'arrière."
- }
- }
-}
diff --git a/designs/bruce/i18n/index.mjs b/designs/bruce/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/bruce/i18n/index.mjs
+++ b/designs/bruce/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/bruce/i18n/nl.json b/designs/bruce/i18n/nl.json
deleted file mode 100644
index 1cd3e0ddb6a..00000000000
--- a/designs/bruce/i18n/nl.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Bruce boxershort",
- "d": "Bruce is een boxershort die zowel comfortabel als stylish is.",
- "p": {
- "back": "Achterzijde",
- "frontFacing": "Beleg vooraan",
- "inset": "Inzet",
- "side": "Zijkant"
- },
- "s": {},
- "o": {
- "bulge": {
- "t": "Kruisstuk",
- "d": "Maak de hoek groter voor meer ruimte in het kruisstuk."
- },
- "legBonus": {
- "t": "Bonus beenlengte",
- "d": "Extra lengte om aan de benen toe te voegen."
- },
- "rise": {
- "t": "Hoogte",
- "d": "Hoeveelheid waarmee de taille verhoogd wordt. Een negatieve waarde zal de taille verlagen."
- },
- "stretch": {
- "t": "Rek",
- "d": "Hoeveel kleiner de omtrek is dan je lichaamsmaten. In andere woorden, hoe strak alles zit."
- },
- "legStretch": {
- "t": "Stretch pijp",
- "d": "For best results, you want to fit your legs a bit more snugly — say no to gaping."
- },
- "backRise": {
- "t": "Hoogte achter",
- "d": "Het percentage waarmee de taille verhoogd wordt aan de rug."
- }
- }
-}
diff --git a/designs/bruce/i18n/uk.json b/designs/bruce/i18n/uk.json
deleted file mode 100644
index 2b4cfe967bc..00000000000
--- a/designs/bruce/i18n/uk.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Bruce boxer briefs",
- "d": "Bruce are comfortable yet stylish boxer briefs.",
- "p": {
- "back": "Back",
- "front": "Front",
- "inset": "Inset",
- "side": "Side"
- },
- "s": {},
- "o": {
- "bulge": {
- "t": "Bulge",
- "d": "Increase angle to create more room in the front pouch."
- },
- "legBonus": {
- "t": "Leg length bonus",
- "d": "Extra length to add to the legs."
- },
- "rise": {
- "t": "Rise",
- "d": "Amount to raise the waist. A negative value will lower it."
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of negative ease."
- },
- "legStretch": {
- "t": "Leg stretch",
- "d": "For best results, you want to fit your legs a bit more snugly — say no to gaping."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Percentage by which the waist will be raised at the back."
- }
- }
-}
diff --git a/designs/bruce/package.json b/designs/bruce/package.json
index f850a02162f..550ab2c7a0b 100644
--- a/designs/bruce/package.json
+++ b/designs/bruce/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/bruce",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for boxer briefs",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/bruce/src/index.mjs b/designs/bruce/src/index.mjs
index e75806df5a9..061d09753b0 100644
--- a/designs/bruce/src/index.mjs
+++ b/designs/bruce/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { back } from './back.mjs'
import { side } from './side.mjs'
import { front } from './front.mjs'
@@ -8,9 +8,9 @@ import { i18n } from '../i18n/index.mjs'
// Create design
const Bruce = new Design({
- data,
+ data: about,
parts: [back, side, front, inset],
})
// Named exports
-export { back, side, front, inset, Bruce, i18n }
+export { back, side, front, inset, Bruce, i18n, about }
diff --git a/designs/bruce/tests/shared.test.mjs b/designs/bruce/tests/shared.test.mjs
index 34dad324136..7bf29d903c1 100644
--- a/designs/bruce/tests/shared.test.mjs
+++ b/designs/bruce/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Bruce, i18n } from '../src/index.mjs'
+import { Bruce, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Bruce)
+testPatternConfig(Bruce, about)
// Test translation
testPatternI18n(Bruce, i18n)
diff --git a/designs/carlita/README.md b/designs/carlita/README.md
index e106b8be990..7219d93ab43 100644
--- a/designs/carlita/README.md
+++ b/designs/carlita/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/carlita
@@ -59,7 +44,7 @@ A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/carlita/data.mjs b/designs/carlita/data.mjs
deleted file mode 100644
index 3fac9984623..00000000000
--- a/designs/carlita/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/carlita'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/carlita/i18n/de.json b/designs/carlita/i18n/de.json
deleted file mode 100644
index ab83f33b366..00000000000
--- a/designs/carlita/i18n/de.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "t": "Carlita, der Mantel",
- "d": "Die Version für Brüste unseres Carlton-Mantels, aka Sherlock Holmes-Mantel.",
- "p": {
- "front": "Vorderseite",
- "side": "Seite"
- },
- "s": {},
- "o": {
- "contour": {
- "t": "Kontur",
- "d": "Legt fest, wie stark figurbetont die Wiener Nähte sind."
- }
- }
-}
diff --git a/designs/carlita/i18n/es.json b/designs/carlita/i18n/es.json
deleted file mode 100644
index d46ed7507f2..00000000000
--- a/designs/carlita/i18n/es.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "t": "Carlita, abrigo",
- "d": "La versión para gente con pechos de nuestro abrigo Carlton, también conocido como el abrigo de Sherlock Holmes.",
- "p": {
- "front": "Frente",
- "side": "Lado"
- },
- "s": {},
- "o": {
- "contour": {
- "t": "Contorno",
- "d": "Controla cómo de abrubtamente se ajustan las costuras princesa."
- }
- }
-}
diff --git a/designs/carlita/i18n/fr.json b/designs/carlita/i18n/fr.json
deleted file mode 100644
index 6214b4c2d63..00000000000
--- a/designs/carlita/i18n/fr.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "t": "Manteau Carlita",
- "d": "La version pour les seins de notre manteau Carlton, aka manteau Sherlock Holmes.",
- "p": {
- "front": "Avant",
- "side": "Côté"
- },
- "s": {},
- "o": {
- "contour": {
- "t": "Contour",
- "d": "Contrôle à quel point la courbe de la découpe princesse sera saillante ou adoucie."
- }
- }
-}
diff --git a/designs/carlita/i18n/index.mjs b/designs/carlita/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/carlita/i18n/index.mjs
+++ b/designs/carlita/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/carlita/i18n/nl.json b/designs/carlita/i18n/nl.json
deleted file mode 100644
index 0fdbc90da86..00000000000
--- a/designs/carlita/i18n/nl.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "t": "Carlita jas",
- "d": "De versie voor borsten van onze Carlton jas, aka Sherlock Holmes jas.",
- "p": {
- "front": "Voorzijde",
- "side": "Zijkant"
- },
- "s": {},
- "o": {
- "contour": {
- "t": "Contour",
- "d": "Controleert hoe nauw de prinsessennaad aansluit."
- }
- }
-}
diff --git a/designs/carlita/i18n/uk.json b/designs/carlita/i18n/uk.json
deleted file mode 100644
index 5d822aef5ee..00000000000
--- a/designs/carlita/i18n/uk.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "t": "Carlita coat",
- "d": "The version for breasts of our Carlton coat, aka Sherlock Holmes coat.",
- "p": {
- "front": "Front",
- "side": "Side"
- },
- "s": {},
- "o": {
- "contour": {
- "t": "Contour",
- "d": "Controls how sharply the princess seam is contoured."
- }
- }
-}
diff --git a/designs/carlita/package.json b/designs/carlita/package.json
index fe52755ef0e..66484aad7d3 100644
--- a/designs/carlita/package.json
+++ b/designs/carlita/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/carlita",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,52 +25,43 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/bent": "3.3.0-rc.1",
- "@freesewing/carlton": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/bent": "4.0.0",
+ "@freesewing/carlton": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/carlita/src/index.mjs b/designs/carlita/src/index.mjs
index c404e8e1724..cb58aeadf85 100644
--- a/designs/carlita/src/index.mjs
+++ b/designs/carlita/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { front } from './front.mjs'
import { side } from './side.mjs'
import { frontFacing } from './front-facing.mjs'
@@ -28,7 +28,7 @@ import { i18n as carlitaI18n } from '../i18n/index.mjs'
// Create new design
const Carlita = new Design({
- data,
+ data: about,
parts: [
front,
frontFacing,
@@ -82,4 +82,5 @@ export {
innerPocketTab,
Carlita,
i18n,
+ about,
}
diff --git a/designs/carlita/tests/shared.test.mjs b/designs/carlita/tests/shared.test.mjs
index 8235ca28566..ca6b8c56484 100644
--- a/designs/carlita/tests/shared.test.mjs
+++ b/designs/carlita/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Carlita, i18n } from '../src/index.mjs'
+import { Carlita, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Carlita)
+testPatternConfig(Carlita, about)
// Test translation
testPatternI18n(Carlita, i18n)
diff --git a/designs/carlton/README.md b/designs/carlton/README.md
index a85ae2b3abc..9ada2d0e17f 100644
--- a/designs/carlton/README.md
+++ b/designs/carlton/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/carlton
@@ -59,7 +44,7 @@ A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/carlton/data.mjs b/designs/carlton/data.mjs
deleted file mode 100644
index 56a947daa0c..00000000000
--- a/designs/carlton/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/carlton'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/carlton/i18n/de.json b/designs/carlton/i18n/de.json
deleted file mode 100644
index f216636c143..00000000000
--- a/designs/carlton/i18n/de.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "t": "Carlton, der Mantel",
- "d": "Für Sherlock Holmes-Cosplay, oder nur als wirklich netter Mantel.",
- "p": {
- "back": "Back",
- "belt": "Belt",
- "chestPocketWelt": "Chest pocket welt",
- "chestPocketBag": "Chest pocket bag",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuffFacing": "Cuff facing",
- "front": "Front",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketTab": "Inner pocket tab",
- "innerPocketWelt": "Inner pocket welt",
- "pocketFlap": "Pocket flap",
- "pocketLining": "Pocket lining",
- "pocket": "Pocket",
- "tail": "Tail",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "seatEase": {
- "t": "Hüftzugabe",
- "d": "Menge an Bequemlichkeits-/Bewegungszugabe an deinem Hintern"
- },
- "pocketPlacementHorizontal": {
- "t": "Horizontale Taschenplatzierung",
- "d": "Die (horizontale) Position der Taschen"
- },
- "pocketPlacementVertical": {
- "t": "Vertikale Taschenplatzierung",
- "d": "Die (vertikale) Position der Taschen"
- },
- "collarHeight": {
- "t": "Kragenhöhe",
- "d": "Höhe des Kragens"
- },
- "length": {
- "t": "Länge",
- "d": "Gesamtlänge"
- },
- "pocketFlapRadius": {
- "t": "Taschenlaschenradius",
- "d": "Der Betrag, um den die Taschenlasche abgerundet ist"
- },
- "pocketRadius": {
- "t": "Taschenradius",
- "d": "Der Betrag, um den die Tasche abgerundet ist"
- },
- "chestPocketHeight": {
- "t": "Brusttaschenhöhe",
- "d": "Höhe der Brusttasche"
- },
- "beltWidth": {
- "t": "Gürteilbreite",
- "d": "Breite des Gürtels"
- },
- "buttonSpacingHorizontal": {
- "t": "Horizontaler Knopfabstand",
- "d": "Horizontaler Abstand der Knöpfe, bestimmt auch den Übertritt des vorderen Verschlusses"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "Controls how much the lapel tip goes inwards."
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "Controls how much the right and left front of the garment overlap at the center front."
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the front pockets"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the front pockets"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "Controls the location of the chest pocket."
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "Controls the slant of the chest pocket."
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "Controls the width of the chest pocket."
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "Controls the location of the inner pocket."
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "Controls the depth of the inner pocket."
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "Controls the width of the inner pocket."
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "Controls the height of the inner pocket welts."
- },
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "The angle of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "Controls the amount of sleevecap ease."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "Controls the length (height if you wish) of the cuffs."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "Controls the flare of the collar by altering the fall length (between the neck and the tips) of the collar."
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "Controls how close the collar lies to the neck."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist."
- }
- }
-}
diff --git a/designs/carlton/i18n/es.json b/designs/carlton/i18n/es.json
deleted file mode 100644
index b5bab27ec77..00000000000
--- a/designs/carlton/i18n/es.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "t": "Carlton, abrigo",
- "d": "Para un cosplay de Sherlock Holms, o simplemente un abrigo muy bonito.",
- "p": {
- "back": "Back",
- "belt": "Belt",
- "chestPocketWelt": "Chest pocket welt",
- "chestPocketBag": "Chest pocket bag",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuffFacing": "Cuff facing",
- "front": "Front",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketTab": "Inner pocket tab",
- "innerPocketWelt": "Inner pocket welt",
- "pocketFlap": "Pocket flap",
- "pocketLining": "Pocket lining",
- "pocket": "Pocket",
- "tail": "Tail",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "seatEase": {
- "t": "Holgura de asiento",
- "d": "Cantidad de facilidad alrededor de tu trasero"
- },
- "pocketPlacementHorizontal": {
- "t": "Colocación horizontal del bolsillo",
- "d": "La ubicación (horizontal) de los bolsillos"
- },
- "pocketPlacementVertical": {
- "t": "Colocación vertical del bolsillo",
- "d": "La ubicación (vertical) de los bolsillos"
- },
- "collarHeight": {
- "t": "Altura del cuello",
- "d": "Altura del cuello"
- },
- "length": {
- "t": "Longitud",
- "d": "Largo total"
- },
- "pocketFlapRadius": {
- "t": "Radio de la tapa del bolsillo",
- "d": "La cantidad por la cual se redondea la solapa del bolsillo"
- },
- "pocketRadius": {
- "t": "Radio de bolsillo",
- "d": "La cantidad por la cual se redondea el bolsillo"
- },
- "chestPocketHeight": {
- "t": "Altura del bolsillo pecho",
- "d": "Altura del bolsillo del pecho"
- },
- "beltWidth": {
- "t": "Ancho del cinturón",
- "d": "Ancho del cinturón"
- },
- "buttonSpacingHorizontal": {
- "t": "Espaciado horizontal de los botones",
- "d": "El espaciado horizontal de los botones, también determina la superposición del cierre frontal"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "Controls how much the lapel tip goes inwards."
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "Controls how much the right and left front of the garment overlap at the center front."
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the front pockets"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the front pockets"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "Controls the location of the chest pocket."
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "Controls the slant of the chest pocket."
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "Controls the width of the chest pocket."
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "Controls the location of the inner pocket."
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "Controls the depth of the inner pocket."
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "Controls the width of the inner pocket."
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "Controls the height of the inner pocket welts."
- },
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "The angle of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "Controls the amount of sleevecap ease."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "Controls the length (height if you wish) of the cuffs."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "Controls the flare of the collar by altering the fall length (between the neck and the tips) of the collar."
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "Controls how close the collar lies to the neck."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist."
- }
- }
-}
diff --git a/designs/carlton/i18n/fr.json b/designs/carlton/i18n/fr.json
deleted file mode 100644
index 612f0bb28b0..00000000000
--- a/designs/carlton/i18n/fr.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "t": "Manteau Carlton",
- "d": "Pour le cosplay de Sherlock Holmes, ou juste un très beau manteau.",
- "p": {
- "back": "Back",
- "belt": "Belt",
- "chestPocketWelt": "Chest pocket welt",
- "chestPocketBag": "Chest pocket bag",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuffFacing": "Cuff facing",
- "front": "Front",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketTab": "Inner pocket tab",
- "innerPocketWelt": "Inner pocket welt",
- "pocketFlap": "Pocket flap",
- "pocketLining": "Pocket lining",
- "pocket": "Pocket",
- "tail": "Tail",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "seatEase": {
- "t": "Aisance d'assise",
- "d": "Quantité d'aisance autour de vos fesses"
- },
- "pocketPlacementHorizontal": {
- "t": "Placement horizontal des poches",
- "d": "L'emplacement (horizontal) des poches"
- },
- "pocketPlacementVertical": {
- "t": "Placement vertical des poches",
- "d": "L'emplacement (vertical) des poches"
- },
- "collarHeight": {
- "t": "Hauteur du col",
- "d": "Hauteur du col"
- },
- "length": {
- "t": "Longueur",
- "d": "Longueur totale"
- },
- "pocketFlapRadius": {
- "t": "Angle de rabat de poche",
- "d": "Le montant par lequel le rabat de poche est arrondi"
- },
- "pocketRadius": {
- "t": "Arrondi de poche",
- "d": "Le montant par lequel la poche est arrondie"
- },
- "chestPocketHeight": {
- "t": "Hauteur de la poche de poitrine",
- "d": "Hauteur de la poche de poitrine"
- },
- "beltWidth": {
- "t": "Largeur de ceinture",
- "d": "Largeur de ceinture"
- },
- "buttonSpacingHorizontal": {
- "t": "Espacement horizontal des boutons",
- "d": "L'espacement horizontal des boutons détermine également le chevauchement de la fermeture avant"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "Controls how much the lapel tip goes inwards."
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "Controls how much the right and left front of the garment overlap at the center front."
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the front pockets"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the front pockets"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "Controls the location of the chest pocket."
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "Controls the slant of the chest pocket."
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "Controls the width of the chest pocket."
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "Controls the location of the inner pocket."
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "Controls the depth of the inner pocket."
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "Controls the width of the inner pocket."
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "Controls the height of the inner pocket welts."
- },
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "The angle of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "Controls the amount of sleevecap ease."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "Controls the length (height if you wish) of the cuffs."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "Controls the flare of the collar by altering the fall length (between the neck and the tips) of the collar."
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "Controls how close the collar lies to the neck."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist."
- }
- }
-}
diff --git a/designs/carlton/i18n/index.mjs b/designs/carlton/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/carlton/i18n/index.mjs
+++ b/designs/carlton/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/carlton/i18n/nl.json b/designs/carlton/i18n/nl.json
deleted file mode 100644
index c0c9387ec28..00000000000
--- a/designs/carlton/i18n/nl.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "t": "Carlton jas",
- "d": "Voor als je Sherlock Holmes wil spelen, of gewoon een heel mooie jas zoekt.",
- "p": {
- "back": "Back",
- "belt": "Belt",
- "chestPocketWelt": "Chest pocket welt",
- "chestPocketBag": "Chest pocket bag",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuffFacing": "Cuff facing",
- "front": "Front",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketTab": "Inner pocket tab",
- "innerPocketWelt": "Inner pocket welt",
- "pocketFlap": "Pocket flap",
- "pocketLining": "Pocket lining",
- "pocket": "Pocket",
- "tail": "Tail",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "seatEase": {
- "t": "Overwijdte zitvlak",
- "d": "De hoeveelheid overwijdte aan je zitvlak"
- },
- "pocketPlacementHorizontal": {
- "t": "Plaatsing zakken (horizontaal)",
- "d": "De horizontale plaatsing van de zakken"
- },
- "pocketPlacementVertical": {
- "t": "Plaatsing zakken (verticaal)",
- "d": "De verticale plaatsing van de zakken"
- },
- "collarHeight": {
- "t": "Hoogte kraag",
- "d": "De hoogte van de kraag"
- },
- "length": {
- "t": "Lengte",
- "d": "De totale lengte"
- },
- "pocketFlapRadius": {
- "t": "Ronding zak flap",
- "d": "De mate waarin de flap van de zak is afgerond"
- },
- "pocketRadius": {
- "t": "Ronding zak",
- "d": "De mate waarin de zak is afgerond"
- },
- "chestPocketHeight": {
- "t": "Hoogte borstzak",
- "d": "De hoogte van de borstzak"
- },
- "beltWidth": {
- "t": "Breedte riem",
- "d": "De breedte van de riem"
- },
- "buttonSpacingHorizontal": {
- "t": "Spreiding knopen horizontaal",
- "d": "De spreiding van de knopen horizontaal. Bepaalt ook de mate waarin de sluiting vooraan overlapt"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "Controls how much the lapel tip goes inwards."
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "Controls how much the right and left front of the garment overlap at the center front."
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the front pockets"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the front pockets"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "Controls the location of the chest pocket."
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "Controls the slant of the chest pocket."
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "Controls the width of the chest pocket."
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "Controls the location of the inner pocket."
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "Controls the depth of the inner pocket."
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "Controls the width of the inner pocket."
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "Controls the height of the inner pocket welts."
- },
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "The angle of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "Controls the amount of sleevecap ease."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "Controls the length (height if you wish) of the cuffs."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "Controls the flare of the collar by altering the fall length (between the neck and the tips) of the collar."
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "Controls how close the collar lies to the neck."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist."
- }
- }
-}
diff --git a/designs/carlton/i18n/uk.json b/designs/carlton/i18n/uk.json
deleted file mode 100644
index 096185c767c..00000000000
--- a/designs/carlton/i18n/uk.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "t": "Carlton coat",
- "d": "For Sherlock Holmes cosplay, or just a really nice coat.",
- "p": {
- "back": "Back",
- "belt": "Belt",
- "chestPocketWelt": "Chest pocket welt",
- "chestPocketBag": "Chest pocket bag",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuffFacing": "Cuff facing",
- "front": "Front",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketTab": "Inner pocket tab",
- "innerPocketWelt": "Inner pocket welt",
- "pocketFlap": "Pocket flap",
- "pocketLining": "Pocket lining",
- "pocket": "Pocket",
- "tail": "Tail",
- "topSleeve": "Topsleeve",
- "underSleeve": "Undersleeve"
- },
- "s": {},
- "o": {
- "seatEase": {
- "t": "Seat ease",
- "d": "Amount of ease around your bum"
- },
- "pocketPlacementHorizontal": {
- "t": "Horizontal pocket placement",
- "d": "The (horizontal) location of the pockets"
- },
- "pocketPlacementVertical": {
- "t": "Vertical pocket placement",
- "d": "The (vertical) location of the pockets"
- },
- "collarHeight": {
- "t": "Collar height",
- "d": "Height of the collar"
- },
- "length": {
- "t": "Length",
- "d": "Total length"
- },
- "pocketFlapRadius": {
- "t": "Pocket flap radius",
- "d": "The amount by which the pocket flap is rounded"
- },
- "pocketRadius": {
- "t": "Pocket radius",
- "d": "The amount by which the pocket is rounded"
- },
- "chestPocketHeight": {
- "t": "Chest pocket height",
- "d": "Height of the chest pocket"
- },
- "beltWidth": {
- "t": "Belt width",
- "d": "Width of the belt"
- },
- "buttonSpacingHorizontal": {
- "t": "Horizontal button spacing",
- "d": "Horizontal spacing of the buttons, also determines the front closure overlap"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "Controls how much the lapel tip goes inwards."
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "Controls how much the right and left front of the garment overlap at the center front."
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the front pockets"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the front pockets"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "Controls the location of the chest pocket."
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "Controls the slant of the chest pocket."
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "Controls the width of the chest pocket."
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "Controls the location of the inner pocket."
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "Controls the depth of the inner pocket."
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "Controls the width of the inner pocket."
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "Controls the height of the inner pocket welts."
- },
- "sleeveBend": {
- "t": "Sleeve bend",
- "d": "The angle of the sleeve at the elbow."
- },
- "sleevecapHeight": {
- "t": "Sleevecap height",
- "d": "Controls the height of the sleevecap."
- },
- "sleevecapEase": {
- "t": "Sleevecap ease",
- "d": "Controls the amount of sleevecap ease."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "Controls the length (height if you wish) of the cuffs."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "Controls the flare of the collar by altering the fall length (between the neck and the tips) of the collar."
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "Controls how close the collar lies to the neck."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist."
- }
- }
-}
diff --git a/designs/carlton/package.json b/designs/carlton/package.json
index 6887c296cf4..6524d2dc471 100644
--- a/designs/carlton/package.json
+++ b/designs/carlton/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/carlton",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,51 +25,42 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/bent": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/bent": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/carlton/src/back.mjs b/designs/carlton/src/back.mjs
index 5ddfbe47287..72d0312f33c 100644
--- a/designs/carlton/src/back.mjs
+++ b/designs/carlton/src/back.mjs
@@ -1,6 +1,6 @@
import { back as bentBack } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function draftCarltonBack({
sa,
@@ -287,8 +287,8 @@ export const back = {
options: {
backPleat: 0.048,
beltWidth: { pct: 15, min: 10, max: 20, menu: 'style' },
- waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
- seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
+ waistEase: { pct: 14, min: 8, max: 25, ...pctBasedOn('waist'), menu: 'fit' },
+ seatEase: { pct: 14, min: 8, max: 25, ...pctBasedOn('seat'), menu: 'fit' },
},
draft: draftCarltonBack,
}
diff --git a/designs/carlton/src/front.mjs b/designs/carlton/src/front.mjs
index e88c235f061..f78cd8dcf66 100644
--- a/designs/carlton/src/front.mjs
+++ b/designs/carlton/src/front.mjs
@@ -1,6 +1,6 @@
import { front as bentFront } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function draftCarltonFront({
sa,
@@ -574,7 +574,7 @@ export const front = {
hide: hidePresets.HIDE_TREE,
measurements: ['waist', 'waistToFloor', 'waistToSeat', 'seat'],
options: {
- chestEase: { pct: 10, min: 5, max: 20, menu: 'fit' },
+ chestEase: { pct: 10, min: 5, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
buttonSpacingHorizontal: { pct: 43.5, min: 15, max: 60, menu: 'style' },
length: { pct: 69, min: 35, max: 100, menu: 'style' },
lapelReduction: { pct: 5, min: 0, max: 10, menu: 'advanced' },
@@ -591,8 +591,8 @@ export const front = {
chestPocketWidth: { pct: 25, min: 15, max: 50, menu: 'pockets' },
innerPocketPlacement: { pct: 53, min: 42, max: 62, menu: 'pockets' },
innerPocketWidth: { pct: 50, min: 45, max: 65, menu: 'pockets' },
- waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
- seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
+ waistEase: { pct: 14, min: 8, max: 25, ...pctBasedOn('waist'), menu: 'fit' },
+ seatEase: { pct: 14, min: 8, max: 25, ...pctBasedOn('seat'), menu: 'fit' },
innerPocketWeltHeight: { pct: 3.5, min: 2.5, max: 5, menu: 'pockets' },
},
draft: draftCarltonFront,
diff --git a/designs/carlton/src/index.mjs b/designs/carlton/src/index.mjs
index b62a704e568..a3daa0373b2 100644
--- a/designs/carlton/src/index.mjs
+++ b/designs/carlton/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n, Brian, sleevecap as brianSleevecap } from '@freesewing/brian'
import { i18n as carltonI18n } from '../i18n/index.mjs'
// Parts
@@ -26,7 +26,7 @@ import { innerPocketTab } from './innerpockettab.mjs'
// Create design
const Carlton = new Design({
- data,
+ data: about,
parts: [
front,
frontFacing,
@@ -90,4 +90,5 @@ export {
innerPocketTab,
Carlton,
i18n,
+ about,
}
diff --git a/designs/carlton/src/topsleeve.mjs b/designs/carlton/src/topsleeve.mjs
index 5c04f005244..3ba5f654255 100644
--- a/designs/carlton/src/topsleeve.mjs
+++ b/designs/carlton/src/topsleeve.mjs
@@ -2,6 +2,7 @@ import { topSleeve as bentTopSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent'
import { front } from './front.mjs'
import { back } from './back.mjs'
+import { pctBasedOn } from '@freesewing/core'
function draftCarltonTopSleeve({
sa,
@@ -253,9 +254,9 @@ export const topSleeve = {
collarEase: 0.145,
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'fit' },
armholeDepthFactor: { pct: 65, min: 50, max: 70, menu: 'fit' },
- bicepsEase: { pct: 20, min: 0, max: 50, menu: 'fit' },
- cuffEase: { pct: 60, min: 30, max: 100, menu: 'fit' },
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
+ bicepsEase: { pct: 20, min: 0, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
+ cuffEase: { pct: 60, min: 30, max: 100, ...pctBasedOn('wrist'), menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
sleeveBend: { deg: 10, min: 0, max: 20, menu: 'fit' },
sleeveLengthBonus: { pct: 7, min: 0, max: 20, menu: 'fit' },
s3Collar: { pct: 0, min: -100, max: 100, menu: 'style' },
diff --git a/designs/carlton/src/undersleeve.mjs b/designs/carlton/src/undersleeve.mjs
index ea67f83e4a3..f16d250d688 100644
--- a/designs/carlton/src/undersleeve.mjs
+++ b/designs/carlton/src/undersleeve.mjs
@@ -1,5 +1,6 @@
import { underSleeve as bentUnderSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent'
+import { pctBasedOn } from '@freesewing/core'
function draftCarltonUnderSleeve({
sa,
@@ -191,9 +192,9 @@ export const underSleeve = {
collarEase: 0.145,
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'fit' },
armholeDepthFactor: { pct: 65, min: 50, max: 70, menu: 'fit' },
- bicepsEase: { pct: 20, min: 0, max: 50, menu: 'fit' },
- cuffEase: { pct: 60, min: 30, max: 100, menu: 'fit' },
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
+ bicepsEase: { pct: 20, min: 0, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
+ cuffEase: { pct: 60, min: 30, max: 100, ...pctBasedOn('wrist'), menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
sleeveBend: { deg: 10, min: 0, max: 20, menu: 'fit' },
sleeveLengthBonus: { pct: 7, min: 0, max: 20, menu: 'fit' },
s3Collar: { pct: 0, min: -100, max: 100, menu: 'style' },
diff --git a/designs/carlton/tests/shared.test.mjs b/designs/carlton/tests/shared.test.mjs
index 8ea46fede64..fbb006fe111 100644
--- a/designs/carlton/tests/shared.test.mjs
+++ b/designs/carlton/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Carlton, i18n } from '../src/index.mjs'
+import { Carlton, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Carlton)
+testPatternConfig(Carlton, about)
// Test translation
testPatternI18n(Carlton, i18n)
diff --git a/designs/cathrin/CHANGELOG.md b/designs/cathrin/CHANGELOG.md
index 3a753ff9985..b34b2df8c37 100644
--- a/designs/cathrin/CHANGELOG.md
+++ b/designs/cathrin/CHANGELOG.md
@@ -1,6 +1,13 @@
# Change log for: @freesewing/cathrin
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Allow negative values in backDrop option. Fixes
+ - Allow negative values for the frontRise options. Fixes
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/cathrin/README.md b/designs/cathrin/README.md
index 8cacc553aa1..048bc5b8fe8 100644
--- a/designs/cathrin/README.md
+++ b/designs/cathrin/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/cathrin
@@ -59,7 +44,7 @@ A FreeSewing pattern for a underbust corset / waist trainer
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/cathrin/data.mjs b/designs/cathrin/data.mjs
deleted file mode 100644
index 812cb79b5cd..00000000000
--- a/designs/cathrin/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/cathrin'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/cathrin/i18n/de.json b/designs/cathrin/i18n/de.json
deleted file mode 100644
index 53f4c046767..00000000000
--- a/designs/cathrin/i18n/de.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "t": "Cathrin, das Korsett",
- "d": "Cathrin ist ein Unterbrustkorsett oder Taillentrainer.",
- "p": {
- "base": "Basis",
- "panel1": "Teil 1",
- "panel2": "Teil 2",
- "panel3": "Teil 3",
- "panel4": "Teil 4",
- "panel5": "Teil 5",
- "panel6": "Teil 6",
- "panels": "Teile"
- },
- "s": {},
- "o": {
- "panels": {
- "t": "Anzahl der Schnittteile",
- "d": "Die Anzahl der zu erstellenden Schnittteile. Mehr Schnittteile passen kurvenreicheren Modellen besser."
- },
- "waistReduction": {
- "t": "Taillenreduzierung",
- "d": "Der Betrag, um den das Korsett deine Taille einschnüren soll."
- },
- "backOpening": {
- "t": "Hintere Öffnung",
- "d": "Öffnung in der hinteren Mitte"
- },
- "backRise": {
- "t": "Anstieg hinten",
- "d": "Wie stark sich die hinteren Schnittteile von den Armen bis zur hinteren Mitte erstrecken."
- },
- "backDrop": {
- "t": "Rückenabsenkung",
- "d": "Wie weit sich die hinteren Schnittteile von den Hüften in Richtung Rückenmitte absenken. Negative Werte heben den Rücken an."
- },
- "frontRise": {
- "t": "Frontanstieg",
- "d": "Aufstieg der Frontteile in der Mitte zwischen den Brüsten. Negative Werte verringern sie."
- },
- "frontDrop": {
- "t": "Frontabsenkung",
- "d": "Wie weit sich die Frontteile von Ihrer Hüfte in Richtung Ihrer Mittelfront absenken."
- },
- "hipRise": {
- "t": "Hüftanstieg",
- "d": "Wie stark die Seitenteile auf den Hüften stehen."
- }
- }
-}
diff --git a/designs/cathrin/i18n/es.json b/designs/cathrin/i18n/es.json
deleted file mode 100644
index d57f4ef70f5..00000000000
--- a/designs/cathrin/i18n/es.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "t": "Cathrin, corset",
- "d": "Cathrin es un corset por debajo del pecho o faja.",
- "p": {
- "base": "Base",
- "panel1": "Panel 1",
- "panel2": "Panel 2",
- "panel3": "Panel 3",
- "panel4": "Panel 4",
- "panel5": "Panel 5",
- "panel6": "Panel 6",
- "panels": "Paneles"
- },
- "s": {},
- "o": {
- "panels": {
- "t": "Número de paneles",
- "d": "La cantidad de paneles a trazar. Más paneles permiten un mejor ajuste para cuerpos con más curvas."
- },
- "waistReduction": {
- "t": "Reducción de cintura",
- "d": "La cantidad en la que quieres que el corset reduzca la cintura."
- },
- "backOpening": {
- "t": "Abertura de la espalda",
- "d": "Abertura en el centro del cierre de la espalda."
- },
- "backRise": {
- "t": "Elevación de la espalda",
- "d": "Cantidad en que los paneles traseros se elevan sobre el centro de la espalda"
- },
- "backDrop": {
- "t": "Caída de la espalda",
- "d": "En qué medida los paneles posteriores se extienden bajo la cadera. Valores negativos los elevan sobre ella."
- },
- "frontRise": {
- "t": "Elevación frontal",
- "d": "Cuánto se eleva el panel frontal entre tus pechos. Valores negativos lo bajan."
- },
- "frontDrop": {
- "t": "Caída frontal",
- "d": "Cuánto los paneles frontales caen bajo la cadera en el centro por delate."
- },
- "hipRise": {
- "t": "Elevación de la cadera",
- "d": "Cuánto se elevan los paneles laterales sobre tu cadera."
- }
- }
-}
diff --git a/designs/cathrin/i18n/fr.json b/designs/cathrin/i18n/fr.json
deleted file mode 100644
index 6e8d254c3de..00000000000
--- a/designs/cathrin/i18n/fr.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "t": "Corset Cathrin",
- "d": "Cathrin est un corset sous-poitrine ou un serre-taille.",
- "p": {
- "base": "Base",
- "panel1": "Pièce 1",
- "panel2": "Pièce 2",
- "panel3": "Pièce 3",
- "panel4": "Pièce 4",
- "panel5": "Pièce 5",
- "panel6": "Pièce 6",
- "panels": "Pièces"
- },
- "s": {},
- "o": {
- "panels": {
- "t": "Nombre de pièces",
- "d": "Le nombre de pièces à tracer. Plus il y a de pièces, mieux c'est pour l'ajustement des modèles avec courbes."
- },
- "waistReduction": {
- "t": "Réduction de la taille",
- "d": "Le montant par lequel vous voulez que le corset resserre votre taille."
- },
- "backOpening": {
- "t": "Ouverture arrière",
- "d": "Ouverture au centre de la fermeture du dos."
- },
- "backRise": {
- "t": "Élévation dos",
- "d": "À quel point les panneaux arrière s’élèvent de vos bras au centre de votre dos."
- },
- "backDrop": {
- "t": "Abaissement du dos",
- "d": "Combien les panneaux arrière s'abaissent de vos hanches vers votre centre arrière Les valeurs négatives vont lever le dos."
- },
- "frontRise": {
- "t": "Élévation avant",
- "d": "Élévation des panneaux avant au centre avant, entre vos seins. Les valeurs négatives les diminueront."
- },
- "frontDrop": {
- "t": "Abaissement avant",
- "d": "Combien les panneaux avant s'abaissent de vos hanches vers votre centre avant."
- },
- "hipRise": {
- "t": "Élévation des hanches",
- "d": "Combien les panneaux latéraux montent sur vos hanches."
- }
- }
-}
diff --git a/designs/cathrin/i18n/index.mjs b/designs/cathrin/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/cathrin/i18n/index.mjs
+++ b/designs/cathrin/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/cathrin/i18n/nl.json b/designs/cathrin/i18n/nl.json
deleted file mode 100644
index a94bc372680..00000000000
--- a/designs/cathrin/i18n/nl.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "t": "Cathrin korset",
- "d": "Cathrin is een underbust korset of waist trainer.",
- "p": {
- "base": "Basis",
- "panel1": "Deel 1",
- "panel2": "Deel 2",
- "panel3": "Deel 3",
- "panel4": "Deel 4",
- "panel5": "Deel 5",
- "panel6": "Deel 6",
- "panels": "Panelen"
- },
- "s": {},
- "o": {
- "panels": {
- "t": "Aantal panelen",
- "d": "Het aantal panelen. Meer panelen werken beter voor een ronder figuur."
- },
- "waistReduction": {
- "t": "Reductie taille",
- "d": "Hoeveel smaller je wil dat het korset je taille maakt."
- },
- "backOpening": {
- "t": "Opening rug",
- "d": "Opening aan de sluiting op de middenrug."
- },
- "backRise": {
- "t": "Hoogte achter",
- "d": "Hoe ver de rugpanden stijgen van je armen tot je middenrug."
- },
- "backDrop": {
- "t": "Verlaging rug",
- "d": "Hoeveel lager de rugpanden worden vanaf de heupen tot de middenrug. Een negatieve waarde maakt ze hoger."
- },
- "frontRise": {
- "t": "Hoogte voorpand",
- "d": "De hoogte van de panelen middenvoor, tussen je borsten. Een negatieve waarde maakte ze lager."
- },
- "frontDrop": {
- "t": "Verlaging voorpand",
- "d": "Hoeveel de voorpanden verlagen van je heupen tot middenvoor."
- },
- "hipRise": {
- "t": "Hoogte heup",
- "d": "Hoe hoog de zijpanelen vallen op je heupen."
- }
- }
-}
diff --git a/designs/cathrin/i18n/uk.json b/designs/cathrin/i18n/uk.json
deleted file mode 100644
index 89e98b40617..00000000000
--- a/designs/cathrin/i18n/uk.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "t": "Cathrin corset",
- "d": "Cathrin is an underbust corset or waist trainer.",
- "p": {
- "base": "Base",
- "panel1": "Panel 1",
- "panel2": "Panel 2",
- "panel3": "Panel 3",
- "panel4": "Panel 4",
- "panel5": "Panel 5",
- "panel6": "Panel 6",
- "panels": "Panels"
- },
- "s": {},
- "o": {
- "panels": {
- "t": "Number of panels",
- "d": "The number of panels to draft. More panels are better to fit a curvier model."
- },
- "waistReduction": {
- "t": "Waist reduction",
- "d": "The amount by which you want the corset to pinch your waist."
- },
- "backOpening": {
- "t": "Back opening",
- "d": "Opening at the center back closure."
- },
- "backRise": {
- "t": "Back rise",
- "d": "How much the back panels rise from your arms to your center back."
- },
- "backDrop": {
- "t": "Back drop",
- "d": "How much the back panels lower from your hips towards your center back. Negative values will raise the back."
- },
- "frontRise": {
- "t": "Front rise",
- "d": "Rise of the front panels at center front, between your breasts. Negative values will lower them."
- },
- "frontDrop": {
- "t": "Front drop",
- "d": "How much the front panels lower from your hips towards your center front."
- },
- "hipRise": {
- "t": "Hip rise",
- "d": "How much the side panels rise on your hips."
- }
- }
-}
diff --git a/designs/cathrin/package.json b/designs/cathrin/package.json
index e4204189a56..6b73c9922fe 100644
--- a/designs/cathrin/package.json
+++ b/designs/cathrin/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/cathrin",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a underbust corset / waist trainer",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/cathrin/src/index.mjs b/designs/cathrin/src/index.mjs
index a18fb6b84fc..58290083b1c 100644
--- a/designs/cathrin/src/index.mjs
+++ b/designs/cathrin/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
//Parts
import { panel1 } from './panel1.mjs'
import { panel2 } from './panel2.mjs'
@@ -15,9 +15,9 @@ import { i18n } from '../i18n/index.mjs'
// Create design
const Cathrin = new Design({
- data,
+ data: about,
parts: [panel1, panel2, panel3, panel4, panel5, panel6],
})
// Named exports
-export { base, panels, panel1, panel2, panel3, panel4, panel5, panel6, Cathrin, i18n }
+export { base, panels, panel1, panel2, panel3, panel4, panel5, panel6, Cathrin, i18n, about }
diff --git a/designs/cathrin/tests/shared.test.mjs b/designs/cathrin/tests/shared.test.mjs
index 747985d256b..8c2e3719ec6 100644
--- a/designs/cathrin/tests/shared.test.mjs
+++ b/designs/cathrin/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Cathrin, i18n } from '../src/index.mjs'
+import { Cathrin, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Cathrin)
+testPatternConfig(Cathrin, about)
// Test translation
testPatternI18n(Cathrin, i18n)
diff --git a/designs/charlie/CHANGELOG.md b/designs/charlie/CHANGELOG.md
index a903b0235b3..ab28bdb08d7 100644
--- a/designs/charlie/CHANGELOG.md
+++ b/designs/charlie/CHANGELOG.md
@@ -1,6 +1,16 @@
# Change log for: @freesewing/charlie
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Fix crash when drawing the jseamStitchLine is not possible. Fixes
+
+### Fixed
+
+ - Fix cut instructions for fly facing, only 1 to be cut. Fixes
+
## 3.2.0 (2024-02-11)
### Fixed
diff --git a/designs/charlie/README.md b/designs/charlie/README.md
index 9c18336bfa3..e325d3bc3a2 100644
--- a/designs/charlie/README.md
+++ b/designs/charlie/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/charlie
@@ -59,7 +44,7 @@ A FreeSewing pattern for chino trousers
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/charlie/data.mjs b/designs/charlie/data.mjs
deleted file mode 100644
index dfe3ad5d1f2..00000000000
--- a/designs/charlie/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/charlie'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/charlie/i18n/de.json b/designs/charlie/i18n/de.json
deleted file mode 100644
index 10541891e4f..00000000000
--- a/designs/charlie/i18n/de.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Charlie, die Chinos",
- "d": "Charlie ist ein Schnittmuster für Chinos.",
- "p": {
- "back": "Back",
- "backPocket": "Back pocket",
- "backPocketFacing": "Back pocket facing",
- "backPocketInterfacing": "Back pocket interfacing",
- "backPocketWelt": "Back pocket welt",
- "beltLoops": "Beltloops",
- "flyExtension": "Fly extension",
- "flyFacing": "Fly facing",
- "front": "Front",
- "frontPocket": "Front pocket",
- "frontPocketFacing": "Front pocket facing",
- "waistband": "Waistband",
- "waistbandCurved": "Curved waistband"
- },
- "s": {},
- "o": {
- "backPocketHorizontalPlacement": {
- "t": "Horizontale Platzierung der hinteren Tasche",
- "d": "Steuert die horizontale Platzierung der hinteren Tasche"
- },
- "backPocketVerticalPlacement": {
- "t": "Vertikale Platzierung der hinteren Tasche",
- "d": "Steuert die vertikale Platzierung der hinteren Tasche"
- },
- "backPocketWidth": {
- "t": "Breite der hinteren Tasche",
- "d": "Steuert die Breite der hinteren Tasche"
- },
- "backPocketDepth": {
- "t": "Tiefe der hinteren Tasche",
- "d": "Steuert die Tiefe der hinteren Tasche"
- },
- "backPocketFacing": {
- "t": "Besatz der hinteren Tasche",
- "d": "Legt fest, ob die hinteren Taschen Besatz haben sollen oder nicht"
- },
- "frontPocketSlantDepth": {
- "t": "Vordertasche Schrägtiefe",
- "d": "Steuert die Tiefe des (vorder) Taschenschlitzes"
- },
- "frontPocketSlantWidth": {
- "t": "Fronttasche Schrägbreite",
- "d": "Steuert die Breite des (vorder) Taschenschlitzes"
- },
- "frontPocketSlantRound": {
- "t": "Vordertaschenschlitzrunde",
- "d": "Stellt fest, wie weit wir vom Ende der Schrägheit entfernt anfangen in das Aussennaht zu runden"
- },
- "frontPocketSlantBend": {
- "t": "Vordertaschenschräg Biegen",
- "d": "Steuert den Radius, mit dem wir die Taschenschiebung in die Außennaht umdrehen"
- },
- "frontPocketWidth": {
- "t": "Breite der Fronttasche",
- "d": "Steuert die Breite der Vordertasche"
- },
- "frontPocketDepth": {
- "t": "Tiefe der Vordertasche",
- "d": "Steuert die Tiefe der Vordertasche"
- },
- "frontPocketFacing": {
- "t": "Fronttasche",
- "d": "Legt fest, wie weit die Tasche in die Tasche hineinreicht"
- },
- "beltLoops": {
- "t": "Gürtelschlaufen",
- "d": "Steuert die Anzahl der Gürtelschlaufen"
- },
- "flyCurve": {
- "t": "Flugkurve",
- "d": "Steuert die Krümmung der Fliege J-Naht"
- },
- "flyLength": {
- "t": "Fluglänge",
- "d": "Steuert die Länge der Fliege"
- },
- "flyWidth": {
- "t": "Fly width",
- "d": "Bestimmt, wie weit die J-Naht-Versatz vom Fliegenrand entfernt ist"
- },
- "waistbandCurve": {
- "t": "Taillenband Kurve",
- "d": "Steuert die Kurven der Taille."
- }
- }
-}
diff --git a/designs/charlie/i18n/es.json b/designs/charlie/i18n/es.json
deleted file mode 100644
index 524ea883724..00000000000
--- a/designs/charlie/i18n/es.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Charlie, chinos",
- "d": "Charlie es un patrón de pantalón tipo chinos.",
- "p": {
- "back": "Back",
- "backPocket": "Back pocket",
- "backPocketFacing": "Back pocket facing",
- "backPocketInterfacing": "Back pocket interfacing",
- "backPocketWelt": "Back pocket welt",
- "beltLoops": "Beltloops",
- "flyExtension": "Fly extension",
- "flyFacing": "Fly facing",
- "front": "Front",
- "frontPocket": "Front pocket",
- "frontPocketFacing": "Front pocket facing",
- "waistband": "Waistband",
- "waistbandCurved": "Curved waistband"
- },
- "s": {},
- "o": {
- "backPocketHorizontalPlacement": {
- "t": "Colocación horizontal del bolsillo trasero",
- "d": "Controla la posición horizontal del bolsillo trasero"
- },
- "backPocketVerticalPlacement": {
- "t": "Colocación vertical del bolsillo trasero",
- "d": "Controla la posición vertical del bolsillo trasero"
- },
- "backPocketWidth": {
- "t": "Ancho del bolsillo trasero",
- "d": "Controla el ancho del bolsillo trasero"
- },
- "backPocketDepth": {
- "t": "Profundidad del bolsillo trasero",
- "d": "Controla la profundidad del bolsillo trasero"
- },
- "backPocketFacing": {
- "t": "Back pocket facing",
- "d": "Controls whether or not to include facing on the back pockets"
- },
- "frontPocketSlantDepth": {
- "t": "Profundidad delantera de bolsillo",
- "d": "Controla la profundidad de la capa delantera del bolsillo"
- },
- "frontPocketSlantWidth": {
- "t": "Anchura del bolsillo delantero",
- "d": "Controla el ancho de la franja del bolsillo (delante)"
- },
- "frontPocketSlantRound": {
- "t": "Pócket delantero slant round",
- "d": "Controla qué tan lejos del final del esclavizado empezamos a redondear hacia el exterior"
- },
- "frontPocketSlantBend": {
- "t": "Pócket delantero inclinado",
- "d": "Controla el radio por el cual redondeamos el bolsillo hacia el exterior"
- },
- "frontPocketWidth": {
- "t": "Ancho bolsillo frontal",
- "d": "Controla el ancho de la bolsa de bolsillo frontal"
- },
- "frontPocketDepth": {
- "t": "Profundidad de bolsillo frontal",
- "d": "Controla la profundidad de la bolsa de bolsillo frontal"
- },
- "frontPocketFacing": {
- "t": "Pócket frontal",
- "d": "Controla hasta qué punto la cara del bolsillo se extiende a la bolsa de bolsillo"
- },
- "beltLoops": {
- "t": "Bucles de cinturón",
- "d": "Controla la cantidad de bucles de cinta"
- },
- "flyCurve": {
- "t": "Curva de vuelo",
- "d": "Controla la curvatura de la mosca J-costura"
- },
- "flyLength": {
- "t": "Longitud del vuelo",
- "d": "Controla la longitud de la mosca"
- },
- "flyWidth": {
- "t": "Fly width",
- "d": "Controla hasta qué punto la costura J del desplazamiento del borde de la mosca"
- },
- "waistbandCurve": {
- "t": "Curva de Waistband",
- "d": "Controla lo curvada que es la banda de cintura."
- }
- }
-}
diff --git a/designs/charlie/i18n/fr.json b/designs/charlie/i18n/fr.json
deleted file mode 100644
index e338d04a657..00000000000
--- a/designs/charlie/i18n/fr.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Charlie chinos",
- "d": "Charlie est un modèle de pantalon en chino.",
- "p": {
- "back": "Back",
- "backPocket": "Back pocket",
- "backPocketFacing": "Back pocket facing",
- "backPocketInterfacing": "Back pocket interfacing",
- "backPocketWelt": "Back pocket welt",
- "beltLoops": "Beltloops",
- "flyExtension": "Fly extension",
- "flyFacing": "Fly facing",
- "front": "Front",
- "frontPocket": "Front pocket",
- "frontPocketFacing": "Front pocket facing",
- "waistband": "Waistband",
- "waistbandCurved": "Curved waistband"
- },
- "s": {},
- "o": {
- "backPocketHorizontalPlacement": {
- "t": "Placement horizontal de la poche arrière",
- "d": "Contrôle le placement horizontal de la poche arrière"
- },
- "backPocketVerticalPlacement": {
- "t": "Placement vertical de la poche arrière",
- "d": "Contrôle le placement vertical de la poche arrière"
- },
- "backPocketWidth": {
- "t": "Largeur de la poche arrière",
- "d": "Contrôle la largeur de la poche arrière"
- },
- "backPocketDepth": {
- "t": "Profondeur de la poche arrière",
- "d": "Contrôle la profondeur de la poche arrière"
- },
- "backPocketFacing": {
- "t": "Fond de poche arrière",
- "d": "Contrôle s'il faut inclure ou non un fond dans les poches arrière"
- },
- "frontPocketSlantDepth": {
- "t": "Profondeur de la poche avant",
- "d": "Contrôle la profondeur de la poche (frontale)"
- },
- "frontPocketSlantWidth": {
- "t": "Largeur de la poche frontale",
- "d": "Contrôle la largeur de la fenêtre de poche (frontale)"
- },
- "frontPocketSlantRound": {
- "t": "Arrondi de poche avant",
- "d": "Contrôle à quelle distance de la fin de l'objectif nous commençons à arrondir dans le dehors"
- },
- "frontPocketSlantBend": {
- "t": "courbure de la poche avant",
- "d": "Contrôle le rayon par lequel on arrondit la poche enfoncée dans la sortie"
- },
- "frontPocketWidth": {
- "t": "Largeur des poches avant",
- "d": "Contrôle la largeur du sac de poche avant"
- },
- "frontPocketDepth": {
- "t": "Profondeur des poches avant",
- "d": "Contrôle la profondeur du sac de poche avant"
- },
- "frontPocketFacing": {
- "t": "Poche avant face",
- "d": "Contrôle la distance à laquelle la poche est orientée dans le sac de poche"
- },
- "beltLoops": {
- "t": "Boucles de ceinture",
- "d": "Contrôle la quantité de boucles de ceinture"
- },
- "flyCurve": {
- "t": "Voler la courbe",
- "d": "Contrôle la courbure de la couture J-fly"
- },
- "flyLength": {
- "t": "Longueur de la mouche",
- "d": "Contrôle la longueur de la mouche"
- },
- "flyWidth": {
- "t": "Fly width",
- "d": "Contrôle à quelle distance le J-couture de décalage par rapport au bord de la volée"
- },
- "waistbandCurve": {
- "t": "Courbe de la ceinture",
- "d": "Contrôle la courbure de la ceinture."
- }
- }
-}
diff --git a/designs/charlie/i18n/index.mjs b/designs/charlie/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/charlie/i18n/index.mjs
+++ b/designs/charlie/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/charlie/i18n/nl.json b/designs/charlie/i18n/nl.json
deleted file mode 100644
index 0400b59bc4d..00000000000
--- a/designs/charlie/i18n/nl.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Charlie chinos",
- "d": "Charlie is een chino broekpatroon.",
- "p": {
- "back": "Back",
- "backPocket": "Back pocket",
- "backPocketFacing": "Back pocket facing",
- "backPocketInterfacing": "Back pocket interfacing",
- "backPocketWelt": "Back pocket welt",
- "beltLoops": "Beltloops",
- "flyExtension": "Fly extension",
- "flyFacing": "Fly facing",
- "front": "Front",
- "frontPocket": "Front pocket",
- "frontPocketFacing": "Front pocket facing",
- "waistband": "Waistband",
- "waistbandCurved": "Curved waistband"
- },
- "s": {},
- "o": {
- "backPocketHorizontalPlacement": {
- "t": "Plaatsing horizontale achterzak",
- "d": "Bepaalt de horizontale plaatsing van de achterzak"
- },
- "backPocketVerticalPlacement": {
- "t": "Verticale plaatsing achterzak",
- "d": "Bepaalt de verticale plaatsing van de achterzak"
- },
- "backPocketWidth": {
- "t": "Breedte achterzak",
- "d": "Bepaalt de breedte van de achterzak"
- },
- "backPocketDepth": {
- "t": "Diepte achterzak",
- "d": "Bepaalt de diepte van de achterzak"
- },
- "backPocketFacing": {
- "t": "Back pocket facing",
- "d": "Controls whether or not to include facing on the back pockets"
- },
- "frontPocketSlantDepth": {
- "t": "Diepte voorzak",
- "d": "Bepaalt de diepte van de voorste zakopening"
- },
- "frontPocketSlantWidth": {
- "t": "Schouderstuk voorzak breedte",
- "d": "Bepaalt de breedte van de voorste zakopening"
- },
- "frontPocketSlantRound": {
- "t": "Schuine zakdeel rond",
- "d": "Bepaalt hoe ver we van het einde van de schuine lijn beginnen met afronden in de outnaad"
- },
- "frontPocketSlantBend": {
- "t": "Schuine zakopening",
- "d": "Bepaalt de straal waarmee we het zakdeel op de rand afstemmen"
- },
- "frontPocketWidth": {
- "t": "Breedte zak",
- "d": "Bepaalt de breedte van het voorste zakdeel"
- },
- "frontPocketDepth": {
- "t": "Diepte zak",
- "d": "Bepaalt de diepte van het voorzakdeel"
- },
- "frontPocketFacing": {
- "t": "Beleg zak",
- "d": "Bepaalt hoever het beleg van de zak zich uitstrekt tot het zakdeel"
- },
- "beltLoops": {
- "t": "Rand lussen",
- "d": "Bepaalt de hoeveelheid riemlusjes"
- },
- "flyCurve": {
- "t": "Vlieg curve",
- "d": "Bepaalt de kromming van de gulpnaad"
- },
- "flyLength": {
- "t": "Vlieg lengte",
- "d": "Bepaalt de lengte van de gulp"
- },
- "flyWidth": {
- "t": "Fly width",
- "d": "Bepaalt hoe ver de J-naad van de rand van de gulp af staat"
- },
- "waistbandCurve": {
- "t": "Tailleband curve",
- "d": "Bepaalt hoe gebogen de tailleband is."
- }
- }
-}
diff --git a/designs/charlie/i18n/uk.json b/designs/charlie/i18n/uk.json
deleted file mode 100644
index 368c0d75ae0..00000000000
--- a/designs/charlie/i18n/uk.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "t": "Charlie chinos",
- "d": "Charlie is a chino trouser pattern.",
- "p": {
- "back": "Back",
- "backPocket": "Back pocket",
- "backPocketFacing": "Back pocket facing",
- "backPocketInterfacing": "Back pocket interfacing",
- "backPocketWelt": "Back pocket welt",
- "beltLoops": "Beltloops",
- "flyExtension": "Fly extension",
- "flyFacing": "Fly facing",
- "front": "Front",
- "frontPocket": "Front pocket",
- "frontPocketFacing": "Front pocket facing",
- "waistband": "Waistband",
- "waistbandCurved": "Curved waistband"
- },
- "s": {},
- "o": {
- "backPocketHorizontalPlacement": {
- "t": "Back pocket horizontal placement",
- "d": "Controls the horizontal placement of the back pocket"
- },
- "backPocketVerticalPlacement": {
- "t": "Back pocket vertical placement",
- "d": "Controls the vertical placement of the back pocket"
- },
- "backPocketWidth": {
- "t": "Back pocket width",
- "d": "Controls the width of the back pocket"
- },
- "backPocketDepth": {
- "t": "Back pocket depth",
- "d": "Controls the depth of the back pocket"
- },
- "backPocketFacing": {
- "t": "Back pocket facing",
- "d": "Controls whether or not to include facing on the back pockets"
- },
- "frontPocketSlantDepth": {
- "t": "Front pocket slant depth",
- "d": "Controls the depth of the (front) pocket slant"
- },
- "frontPocketSlantWidth": {
- "t": "Front pocket slant width",
- "d": "Controls the width of the (front) pocket slant"
- },
- "frontPocketSlantRound": {
- "t": "Front pocket slant round",
- "d": "Controls how far from the end of the slant we start rounding into the outseam"
- },
- "frontPocketSlantBend": {
- "t": "Front pocket slant bend",
- "d": "Controls the radius by which we round the pocket slant into the outseam"
- },
- "frontPocketWidth": {
- "t": "Front pocket width",
- "d": "Controls the width of the front pocket bag"
- },
- "frontPocketDepth": {
- "t": "Front pocket depth",
- "d": "Controls the depth of the front pocket bag"
- },
- "frontPocketFacing": {
- "t": "Front pocket facing",
- "d": "Controls how far the pocket facing extends into the pocket bag"
- },
- "beltLoops": {
- "t": "Belt loops",
- "d": "Controls the amount of belt loops"
- },
- "flyCurve": {
- "t": "Fly curve",
- "d": "Controls the curvature of the fly J-seam"
- },
- "flyLength": {
- "t": "Fly length",
- "d": "Controls the length of the fly"
- },
- "flyWidth": {
- "t": "Fly width",
- "d": "Controls how far the J-seam of offset from the fly edge"
- },
- "waistbandCurve": {
- "t": "Waistband Curve",
- "d": "Controls how curved the waistband is."
- }
- }
-}
diff --git a/designs/charlie/package.json b/designs/charlie/package.json
index 88e6a37884d..efff7055062 100644
--- a/designs/charlie/package.json
+++ b/designs/charlie/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/charlie",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for chino trousers",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/titan": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/titan": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/charlie/src/front.mjs b/designs/charlie/src/front.mjs
index a79b3ff4e30..60660325baf 100644
--- a/designs/charlie/src/front.mjs
+++ b/designs/charlie/src/front.mjs
@@ -533,9 +533,9 @@ export const front = {
waistbandFactor: 0.1,
// Fit (from Titan)
- waistEase: { pct: 1, min: 0, max: 5, menu: 'fit' },
- seatEase: { pct: 5, min: 0, max: 10, menu: 'fit' },
- kneeEase: { pct: 15, min: 10, max: 30, menu: 'fit' },
+ waistEase: { pct: 1, min: 0, max: 5, ...pctBasedOn('waist'), menu: 'fit' },
+ seatEase: { pct: 5, min: 0, max: 10, ...pctBasedOn('seat'), menu: 'fit' },
+ kneeEase: { pct: 15, min: 10, max: 30, ...pctBasedOn('knee'), menu: 'fit' },
// Style (from Titan)
waistHeight: { pct: -4, min: -15, max: 40, menu: 'style' },
diff --git a/designs/charlie/src/index.mjs b/designs/charlie/src/index.mjs
index b1b23dcf6b2..94a67fdcf8e 100644
--- a/designs/charlie/src/index.mjs
+++ b/designs/charlie/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as titanI18n } from '@freesewing/titan'
import { i18n as charlieI18n } from '../i18n/index.mjs'
// Parts
@@ -19,7 +19,7 @@ import { beltLoops } from './beltloops.mjs'
// Create design
const Charlie = new Design({
- data,
+ data: about,
parts: [
front,
back,
@@ -57,4 +57,5 @@ export {
beltLoops,
Charlie,
i18n,
+ about,
}
diff --git a/designs/charlie/tests/shared.test.mjs b/designs/charlie/tests/shared.test.mjs
index 193285bdfc5..e35ff866778 100644
--- a/designs/charlie/tests/shared.test.mjs
+++ b/designs/charlie/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Charlie, i18n } from '../src/index.mjs'
+import { Charlie, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Charlie)
+testPatternConfig(Charlie, about)
// Test translation
testPatternI18n(Charlie, i18n)
diff --git a/designs/cornelius/README.md b/designs/cornelius/README.md
index ef7d28b4c6d..f908207cebc 100644
--- a/designs/cornelius/README.md
+++ b/designs/cornelius/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/cornelius
@@ -59,7 +44,7 @@ A FreeSewing pattern for cycling breeches, based on the Keystone drafting system
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/cornelius/data.mjs b/designs/cornelius/data.mjs
deleted file mode 100644
index 1605e44e20e..00000000000
--- a/designs/cornelius/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/cornelius'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/cornelius/i18n/de.json b/designs/cornelius/i18n/de.json
deleted file mode 100644
index d171a73885c..00000000000
--- a/designs/cornelius/i18n/de.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "t": "Cornelius, die Kniebundhose zum Radfahren",
- "d": "Cornelius ist eine Kniebundhose zum Fahrradfahren, basierend auf der Entwurfsmethode nach Keystone.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontpoints": "Front points",
- "legband": "Legband",
- "legbandKeystone": "Legband Keystone",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "waistband": "Waistband",
- "zipperguard": "Zipperguard"
- },
- "s": {
- "Vent": "Schlitz",
- "PocketFacing": "Taschenbesatz"
- },
- "o": {
- "fullness": {
- "t": "Fülle",
- "d": "Steuert die Fülle der Hosen"
- },
- "waistbandBelowWaist": {
- "t": "Unterer Taillenband",
- "d": "Prozentsatz um die Taille unter die aktuelle Taille zu bewegen"
- },
- "waistReduction": {
- "t": "Taillenreduzierung",
- "d": "Prozentsatz um die Taille zu reduzieren"
- },
- "cuffWidth": {
- "t": "Cuff width",
- "d": "Breite der Beinschicht"
- },
- "cuffStyle": {
- "t": "Manschettenstil",
- "d": "Stil der Beinmanschette"
- },
- "bandBelowKnee": {
- "t": "Kuff unter dem Knie",
- "d": "Steuert die Manschettendistanz vom Knie"
- },
- "kneeToBelow": {
- "t": "Manschettenlänge",
- "d": "Steuert die Dichtheit der Manschette im Vergleich zum Knie"
- },
- "ventLength": {
- "t": "Ventillänge",
- "d": "Steuert die Länge des Schlot zwischen Knie und Manschette"
- }
- }
-}
diff --git a/designs/cornelius/i18n/es.json b/designs/cornelius/i18n/es.json
deleted file mode 100644
index bb71a4b02f2..00000000000
--- a/designs/cornelius/i18n/es.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "t": "Cornelius, pantalones cortos de ciclista",
- "d": "Cornelius son pantalones cortos de ciclista basados en el método de bocetado Keystone.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontpoints": "Front points",
- "legband": "Legband",
- "legbandKeystone": "Legband Keystone",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "waistband": "Waistband",
- "zipperguard": "Zipperguard"
- },
- "s": {
- "Vent": "Ventilador",
- "PocketFacing": "Cara de bolsillo"
- },
- "o": {
- "fullness": {
- "t": "Cumplimiento",
- "d": "Controla la integridad de los breeches"
- },
- "waistbandBelowWaist": {
- "t": "Banda inferior",
- "d": "Porcentaje para mover la cintura debajo de la cintura actual"
- },
- "waistReduction": {
- "t": "Reducción de cintura",
- "d": "Porcentaje para reducir la cintura"
- },
- "cuffWidth": {
- "t": "Cuff width",
- "d": "Ancho del corte de la pierna"
- },
- "cuffStyle": {
- "t": "Estilo del puño",
- "d": "Estilo del corte de la pierna"
- },
- "bandBelowKnee": {
- "t": "Corta debajo de la rodilla",
- "d": "Controla la distancia del corte desde la rodilla"
- },
- "kneeToBelow": {
- "t": "Longitud del puño",
- "d": "Controla la rigidez del corte en comparación con la rodilla"
- },
- "ventLength": {
- "t": "Longitud del ventilador",
- "d": "Controla la longitud del ventilador entre la rodilla y el corte"
- }
- }
-}
diff --git a/designs/cornelius/i18n/fr.json b/designs/cornelius/i18n/fr.json
deleted file mode 100644
index 4f7c02133c3..00000000000
--- a/designs/cornelius/i18n/fr.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "t": "Culotte de cyclisme Cornelius",
- "d": "Cornelius est une culotte de cyclisme basé sur la méthode Keystone.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontpoints": "Front points",
- "legband": "Legband",
- "legbandKeystone": "Legband Keystone",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "waistband": "Waistband",
- "zipperguard": "Zipperguard"
- },
- "s": {
- "Vent": "Fente",
- "PocketFacing": "Parement de poche"
- },
- "o": {
- "fullness": {
- "t": "Ampleur",
- "d": "Contrôle l'ampleur de la culotte"
- },
- "waistbandBelowWaist": {
- "t": "Abaissement de la ceinture",
- "d": "Pourcentage pour déplacer la ceinture sous la taille réelle"
- },
- "waistReduction": {
- "t": "Réduction de la taille",
- "d": "Pourcentage de réduction de la ceinture"
- },
- "cuffWidth": {
- "t": "Largeur du bracelet",
- "d": "Largeur du bracelet de la jambe"
- },
- "cuffStyle": {
- "t": "Style de poignet",
- "d": "Style du bracelet de la jambe"
- },
- "bandBelowKnee": {
- "t": "Bracelet sous le genou",
- "d": "Contrôle la distance du bracelet sous le genou"
- },
- "kneeToBelow": {
- "t": "Longueur de poignet",
- "d": "Contrôle l'épaisseur du bracelet par rapport au genou"
- },
- "ventLength": {
- "t": "Longueur de la fente",
- "d": "Contrôle la longueur de la fente entre le genou et le bracelet"
- }
- }
-}
diff --git a/designs/cornelius/i18n/index.mjs b/designs/cornelius/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/cornelius/i18n/index.mjs
+++ b/designs/cornelius/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/cornelius/i18n/nl.json b/designs/cornelius/i18n/nl.json
deleted file mode 100644
index 1c3be18cda6..00000000000
--- a/designs/cornelius/i18n/nl.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "t": "Cornelius fietsen boren",
- "d": "Cornelius zijn broeders aan het fietsen op basis van de methode van Sleutelsteen.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontpoints": "Front points",
- "legband": "Legband",
- "legbandKeystone": "Legband Keystone",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "waistband": "Waistband",
- "zipperguard": "Zipperguard"
- },
- "s": {
- "Vent": "Vuur",
- "PocketFacing": "Zak beleg"
- },
- "o": {
- "fullness": {
- "t": "Volle",
- "d": "Bepaalt de volledigheid van de broeders"
- },
- "waistbandBelowWaist": {
- "t": "Onderste tailleband",
- "d": "Percentage om de tailleband onder de tailleband te bewegen"
- },
- "waistReduction": {
- "t": "Reductie taille",
- "d": "Percentage om de tailleband te verminderen"
- },
- "cuffWidth": {
- "t": "Cuff width",
- "d": "Breedte van de manchet"
- },
- "cuffStyle": {
- "t": "Stijl manchet",
- "d": "Stijl van de manchet"
- },
- "bandBelowKnee": {
- "t": "Manchet onder knie",
- "d": "Bepaalt de afstand tussen de manchet en de knie"
- },
- "kneeToBelow": {
- "t": "Lengte manchet",
- "d": "Bepaalt de dikte van de manchet in vergelijking met de knie"
- },
- "ventLength": {
- "t": "Vent lengte",
- "d": "Bepaalt de lengte van de vent tussen de knie en de manchet"
- }
- }
-}
diff --git a/designs/cornelius/i18n/uk.json b/designs/cornelius/i18n/uk.json
deleted file mode 100644
index 6cd56c6100f..00000000000
--- a/designs/cornelius/i18n/uk.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "t": "Cornelius cycling breeches",
- "d": "Cornelius are cycling breeches based on the Keystone drafting method.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontpoints": "Front points",
- "legband": "Legband",
- "legbandKeystone": "Legband Keystone",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "waistband": "Waistband",
- "zipperguard": "Zipperguard"
- },
- "s": {
- "Vent": "Vent",
- "PocketFacing": "Pocket facing"
- },
- "o": {
- "fullness": {
- "t": "Fullness",
- "d": "Controls the fullness of the breeches"
- },
- "waistbandBelowWaist": {
- "t": "Lower waistband",
- "d": "Percentage to move the waistband below the actual waist"
- },
- "waistReduction": {
- "t": "Waist reduction",
- "d": "Percentage to reduce the waistband"
- },
- "cuffWidth": {
- "t": "Cuff width",
- "d": "Width of the leg cuff"
- },
- "cuffStyle": {
- "t": "Cuff style",
- "d": "Style of the leg cuff"
- },
- "bandBelowKnee": {
- "t": "Cuff below knee",
- "d": "Controls the cuff distance from the knee"
- },
- "kneeToBelow": {
- "t": "Cuff length",
- "d": "Controls the tightness of the cuff as compared to the knee"
- },
- "ventLength": {
- "t": "Vent length",
- "d": "Controls the length of the vent between knee and cuff"
- }
- }
-}
diff --git a/designs/cornelius/package.json b/designs/cornelius/package.json
index 8da27883a0f..c840732c0ce 100644
--- a/designs/cornelius/package.json
+++ b/designs/cornelius/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/cornelius",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for cycling breeches, based on the Keystone drafting system",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/cornelius/src/index.mjs b/designs/cornelius/src/index.mjs
index 29398576cad..4726fa93faa 100644
--- a/designs/cornelius/src/index.mjs
+++ b/designs/cornelius/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { frontpoints } from './frontpoints.mjs'
import { front } from './front.mjs'
@@ -15,7 +15,7 @@ import { i18n } from '../i18n/index.mjs'
// Create new design
const Cornelius = new Design({
- data,
+ data: about,
parts: [front, back, legband, legbandKeystone, waistband, pocketFacing, pocket, zipperguard],
})
@@ -32,4 +32,5 @@ export {
frontpoints,
Cornelius,
i18n,
+ about,
}
diff --git a/designs/cornelius/tests/shared.test.mjs b/designs/cornelius/tests/shared.test.mjs
index 55e384e0ae5..01923d5029b 100644
--- a/designs/cornelius/tests/shared.test.mjs
+++ b/designs/cornelius/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Cornelius, i18n } from '../src/index.mjs'
+import { Cornelius, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Cornelius)
+testPatternConfig(Cornelius, about)
// Test translation
testPatternI18n(Cornelius, i18n)
diff --git a/designs/diana/README.md b/designs/diana/README.md
index 85fa8d1f0e2..7f924a24818 100644
--- a/designs/diana/README.md
+++ b/designs/diana/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/diana
@@ -59,7 +44,7 @@ A FreeSewing pattern for a top with a draped neck
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/diana/data.mjs b/designs/diana/data.mjs
deleted file mode 100644
index b1ca151ae70..00000000000
--- a/designs/diana/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/diana'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/diana/i18n/de.json b/designs/diana/i18n/de.json
deleted file mode 100644
index 2b927a76815..00000000000
--- a/designs/diana/i18n/de.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Diana, das drapierte Oberteil",
- "d": "Diana ist ein Oberteil mit einem drapierten Halsausschnitt.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "sleeve": "Ärmel"
- },
- "s": {},
- "o": {
- "shoulderSeamLength": {
- "t": "Schulternahtlänge",
- "d": "Steuert die Länge der Schulternaht"
- },
- "drapeAngle": {
- "t": "Fallwinkel",
- "d": "Steuert die Stärke des Fallwinkels"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- }
- }
-}
diff --git a/designs/diana/i18n/es.json b/designs/diana/i18n/es.json
deleted file mode 100644
index cdebb19250e..00000000000
--- a/designs/diana/i18n/es.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Diana, top de escote drapeado",
- "d": "Diana es un top con un escote drapeado.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "sleeve": "Manga"
- },
- "s": {},
- "o": {
- "shoulderSeamLength": {
- "t": "Longitud de la costura de hombro",
- "d": "Controla la longitud de la costura de hombro"
- },
- "drapeAngle": {
- "t": "Ángulo del drapeado",
- "d": "Controla la cantidad de drapeado"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- }
- }
-}
diff --git a/designs/diana/i18n/fr.json b/designs/diana/i18n/fr.json
deleted file mode 100644
index f35a11a1975..00000000000
--- a/designs/diana/i18n/fr.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Haut drapé Diana",
- "d": "Diana est un top avec un col drapé.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "sleeve": "Manche"
- },
- "s": {},
- "o": {
- "shoulderSeamLength": {
- "t": "Longueur de couture d'épaule",
- "d": "Contrôle la longueur de la couture d'épaule"
- },
- "drapeAngle": {
- "t": "Angle du drapé",
- "d": "Contrôle le montant du drapé"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- }
- }
-}
diff --git a/designs/diana/i18n/index.mjs b/designs/diana/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/diana/i18n/index.mjs
+++ b/designs/diana/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/diana/i18n/nl.json b/designs/diana/i18n/nl.json
deleted file mode 100644
index a6dc4cad598..00000000000
--- a/designs/diana/i18n/nl.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Diana top met drapage",
- "d": "Diana is een top met een gedrapeerde halslijn.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "sleeve": "Mouw"
- },
- "s": {},
- "o": {
- "shoulderSeamLength": {
- "t": "Lengte schoudernaad",
- "d": "Bepaalt de lengte van de schoudernaad"
- },
- "drapeAngle": {
- "t": "Drape angle",
- "d": "Bepaalt het aantal drape"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- }
- }
-}
diff --git a/designs/diana/i18n/uk.json b/designs/diana/i18n/uk.json
deleted file mode 100644
index 773ffaaa18c..00000000000
--- a/designs/diana/i18n/uk.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Diana draped top",
- "d": "Diana is a top with a draped neckline.",
- "p": {
- "back": "Back",
- "front": "Front",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "shoulderSeamLength": {
- "t": "Shoulder seam length",
- "d": "Controls the length of the shoulder seam"
- },
- "drapeAngle": {
- "t": "Drape angle",
- "d": "Controls the amount of drape"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- }
- }
-}
diff --git a/designs/diana/package.json b/designs/diana/package.json
index b25d7fc9f54..ad326322acc 100644
--- a/designs/diana/package.json
+++ b/designs/diana/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/diana",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a top with a draped neck",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/diana/src/front.mjs b/designs/diana/src/front.mjs
index 4ba408068e6..7a7459c0988 100644
--- a/designs/diana/src/front.mjs
+++ b/designs/diana/src/front.mjs
@@ -1,6 +1,6 @@
import { front as frontBase } from '@freesewing/brian'
import { back as backBase } from '@freesewing/brian'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
export function draftDianaFrontOrBack({
measurements,
@@ -214,7 +214,7 @@ export const front = {
// Percentages
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'advanced' },
- cuffEase: { pct: 20, min: 0, max: 30, menu: 'fit' },
+ cuffEase: { pct: 20, min: 0, max: 30, ...pctBasedOn('wrist'), menu: 'fit' },
lengthBonus: { pct: 0, min: 0, max: 50, menu: 'fit' },
sleeveLengthBonus: { pct: 0, min: -40, max: 10, menu: 'fit' },
shoulderSeamLength: { pct: 35, min: 0.1, max: 60, menu: 'style' },
@@ -224,11 +224,11 @@ export const front = {
frontArmholeDeeper: { pct: 0, min: 0, max: 1.5, menu: 'advanced' },
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
- waistEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- hipsEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- chestEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- bicepsEase: { pct: 0, min: -5, max: 50, menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
+ waistEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('waist'), menu: 'fit' },
+ hipsEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('hips'), menu: 'fit' },
+ chestEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
+ bicepsEase: { pct: 0, min: -5, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
sleevecapEase: { pct: 0, min: 0, max: 10, menu: 'advanced.sleevecap' },
sleevecapTopFactorX: { pct: 50, min: 25, max: 75, menu: 'advanced.sleevecap' },
@@ -291,7 +291,7 @@ export const back = {
// Percentages
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'advanced' },
- cuffEase: { pct: 20, min: 0, max: 30, menu: 'fit' },
+ cuffEase: { pct: 20, min: 0, max: 30, ...pctBasedOn('wrist'), menu: 'fit' },
lengthBonus: { pct: 0, min: 0, max: 50, menu: 'fit' },
sleeveLengthBonus: { pct: 0, min: -40, max: 10, menu: 'fit' },
shoulderSeamLength: { pct: 35, min: 0.1, max: 60, menu: 'style' },
@@ -300,11 +300,11 @@ export const back = {
frontArmholeDeeper: { pct: 0, min: 0, max: 1.5, menu: 'advanced' },
- shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
- waistEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- hipsEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- chestEase: { pct: 0, min: -10, max: 20, menu: 'fit' },
- bicepsEase: { pct: 0, min: -5, max: 50, menu: 'fit' },
+ shoulderEase: { pct: 0, min: -2, max: 6, ...pctBasedOn('shoulderToShoulder'), menu: 'fit' },
+ waistEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('waist'), menu: 'fit' },
+ hipsEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('hips'), menu: 'fit' },
+ chestEase: { pct: 0, min: -10, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
+ bicepsEase: { pct: 0, min: -5, max: 50, ...pctBasedOn('biceps'), menu: 'fit' },
sleevecapEase: { pct: 0, min: 0, max: 10, menu: 'advanced.sleevecap' },
sleevecapTopFactorX: { pct: 50, min: 25, max: 75, menu: 'advanced.sleevecap' },
diff --git a/designs/diana/src/index.mjs b/designs/diana/src/index.mjs
index bb78bc9d62e..f68183194f1 100644
--- a/designs/diana/src/index.mjs
+++ b/designs/diana/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as dianaI18n } from '../i18n/index.mjs'
// Parts
@@ -8,7 +8,7 @@ import { sleeve } from './sleeve.mjs'
// Create design
const Diana = new Design({
- data,
+ data: about,
parts: [front, back, sleeve],
})
@@ -16,4 +16,4 @@ const Diana = new Design({
const i18n = mergeI18n([brianI18n, dianaI18n])
// Named exports
-export { front, back, sleeve, Diana, i18n }
+export { front, back, sleeve, Diana, i18n, about }
diff --git a/designs/diana/tests/shared.test.mjs b/designs/diana/tests/shared.test.mjs
index 552b2d7dc32..e7799c38561 100644
--- a/designs/diana/tests/shared.test.mjs
+++ b/designs/diana/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Diana, i18n } from '../src/index.mjs'
+import { Diana, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Diana)
+testPatternConfig(Diana, about)
// Test translation
testPatternI18n(Diana, i18n)
diff --git a/designs/examples/README.md b/designs/examples/README.md
index 7e28fd1d14a..9dcacedb007 100644
--- a/designs/examples/README.md
+++ b/designs/examples/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/examples
@@ -59,7 +44,7 @@ A FreeSewing pattern holding examples for our documentation
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/examples/data.mjs b/designs/examples/data.mjs
deleted file mode 100644
index b36a1446c92..00000000000
--- a/designs/examples/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/examples'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/examples/i18n/de.json b/designs/examples/i18n/de.json
deleted file mode 100644
index 3d6ebd1cffd..00000000000
--- a/designs/examples/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Examples",
- "d": "A FreeSewing pattern with examples used throughout our documentation",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/examples/i18n/es.json b/designs/examples/i18n/es.json
deleted file mode 100644
index 3d6ebd1cffd..00000000000
--- a/designs/examples/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Examples",
- "d": "A FreeSewing pattern with examples used throughout our documentation",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/examples/i18n/fr.json b/designs/examples/i18n/fr.json
deleted file mode 100644
index 3d6ebd1cffd..00000000000
--- a/designs/examples/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Examples",
- "d": "A FreeSewing pattern with examples used throughout our documentation",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/examples/i18n/index.mjs b/designs/examples/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/examples/i18n/index.mjs
+++ b/designs/examples/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/examples/i18n/nl.json b/designs/examples/i18n/nl.json
deleted file mode 100644
index 3d6ebd1cffd..00000000000
--- a/designs/examples/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Examples",
- "d": "A FreeSewing pattern with examples used throughout our documentation",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/examples/i18n/uk.json b/designs/examples/i18n/uk.json
deleted file mode 100644
index 3d6ebd1cffd..00000000000
--- a/designs/examples/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Examples",
- "d": "A FreeSewing pattern with examples used throughout our documentation",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/examples/package.json b/designs/examples/package.json
index fd38ccc7b87..9c4d4e1a6aa 100644
--- a/designs/examples/package.json
+++ b/designs/examples/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/examples",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern holding examples for our documentation",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -20,49 +20,40 @@
"parametric design"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/plugin-gore": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/plugin-gore": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/examples/src/index.mjs b/designs/examples/src/index.mjs
index b1c68e88445..0eab64aa3f2 100644
--- a/designs/examples/src/index.mjs
+++ b/designs/examples/src/index.mjs
@@ -1,6 +1,5 @@
import { Design } from '@freesewing/core'
import { gorePlugin } from '@freesewing/plugin-gore'
-import { data } from '../data.mjs'
import { i18n } from '../i18n/index.mjs'
// Stacks
@@ -19,7 +18,6 @@ import { settings_sa } from './settings.mjs'
// Setup our new design
const Examples = new Design({
- data,
parts: [
// Stacks
stacks_top,
diff --git a/designs/examples/tests/shared.test.mjs b/designs/examples/tests/shared.test.mjs
index 53517eca7cb..2ee0da801d3 100644
--- a/designs/examples/tests/shared.test.mjs
+++ b/designs/examples/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Examples, i18n } from '../src/index.mjs'
+import { Examples, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Examples)
+testPatternConfig(Examples, about)
// Test translation
testPatternI18n(Examples, i18n)
diff --git a/designs/florence/README.md b/designs/florence/README.md
index 3d51872952a..ba6195e064c 100644
--- a/designs/florence/README.md
+++ b/designs/florence/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/florence
@@ -59,7 +44,7 @@ A FreeSewing pattern for a face mask
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/florence/data.mjs b/designs/florence/data.mjs
deleted file mode 100644
index 71225352d75..00000000000
--- a/designs/florence/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/florence'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/florence/i18n/de.json b/designs/florence/i18n/de.json
deleted file mode 100644
index b8992f73e23..00000000000
--- a/designs/florence/i18n/de.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Florence, der Mundschutz",
- "d": "Florence ist ein Mundschutz.",
- "p": {
- "mask": "Mask"
- },
- "s": {},
- "o": {
- "height": {
- "t": "Höhe",
- "d": "Steuert die Höhe der Gesichtsmaske"
- },
- "length": {
- "t": "Länge",
- "d": "Steuert die Länge der Gesichtsmaske"
- },
- "curve": {
- "t": "Krümmung",
- "d": "Steuert die Krümmung der oberen Kante der Gesichtsmaske"
- }
- }
-}
diff --git a/designs/florence/i18n/es.json b/designs/florence/i18n/es.json
deleted file mode 100644
index 20f64763bb6..00000000000
--- a/designs/florence/i18n/es.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Máscara de Florencia",
- "d": "Florence es una mascarilla.",
- "p": {
- "mask": "Mask"
- },
- "s": {},
- "o": {
- "height": {
- "t": "Altura",
- "d": "Controla la altura de la mascarilla"
- },
- "length": {
- "t": "Longitud",
- "d": "Controla la longitud de la mascarilla"
- },
- "curve": {
- "t": "Curva",
- "d": "Controla la curvatura del borde superior de la mascarilla"
- }
- }
-}
diff --git a/designs/florence/i18n/fr.json b/designs/florence/i18n/fr.json
deleted file mode 100644
index ccbe64efeb8..00000000000
--- a/designs/florence/i18n/fr.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Masque Florence",
- "d": "Florence est un masque facial.",
- "p": {
- "mask": "Mask"
- },
- "s": {},
- "o": {
- "height": {
- "t": "Hauteur",
- "d": "Contrôle la hauteur du masque"
- },
- "length": {
- "t": "Longeur",
- "d": "Contrôle la longueur du masque"
- },
- "curve": {
- "t": "Courbe",
- "d": "Contrôle la courbe du bord supérieur du masque"
- }
- }
-}
diff --git a/designs/florence/i18n/index.mjs b/designs/florence/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/florence/i18n/index.mjs
+++ b/designs/florence/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/florence/i18n/nl.json b/designs/florence/i18n/nl.json
deleted file mode 100644
index ca9d7b28581..00000000000
--- a/designs/florence/i18n/nl.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Florence mondmasker",
- "d": "Florence is een mondmasker.",
- "p": {
- "mask": "Mask"
- },
- "s": {},
- "o": {
- "height": {
- "t": "Hoogte",
- "d": "Bepaalt de hoogte van het mondmasker"
- },
- "length": {
- "t": "Lengte",
- "d": "Bepaalt de lengte van het mondmasker"
- },
- "curve": {
- "t": "Boog",
- "d": "Bepaalt de curve van de bovenrand van het mondmasker"
- }
- }
-}
diff --git a/designs/florence/i18n/uk.json b/designs/florence/i18n/uk.json
deleted file mode 100644
index 8b9b1780b7d..00000000000
--- a/designs/florence/i18n/uk.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Florence face mask",
- "d": "Florence is a face mask.",
- "p": {
- "mask": "Mask"
- },
- "s": {},
- "o": {
- "height": {
- "t": "Height",
- "d": "Controls the height of the face mask"
- },
- "length": {
- "t": "Length",
- "d": "Controls the length of the face mask"
- },
- "curve": {
- "t": "Curve",
- "d": "Controls the curvature of the upper edge of the face mask"
- }
- }
-}
diff --git a/designs/florence/package.json b/designs/florence/package.json
index df59bb0eea1..53fc9c44972 100644
--- a/designs/florence/package.json
+++ b/designs/florence/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/florence",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a face mask",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/florence/src/index.mjs b/designs/florence/src/index.mjs
index 2c873a7ffb8..3b22285f668 100644
--- a/designs/florence/src/index.mjs
+++ b/designs/florence/src/index.mjs
@@ -1,13 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { mask } from './mask.mjs'
import { i18n } from '../i18n/index.mjs'
// Setup our new design
const Florence = new Design({
- data,
+ data: about,
parts: [mask],
})
// Named exports
-export { mask, Florence, i18n }
+export { mask, Florence, i18n, about }
diff --git a/designs/florence/tests/shared.test.mjs b/designs/florence/tests/shared.test.mjs
index 83b8856f783..694d266851d 100644
--- a/designs/florence/tests/shared.test.mjs
+++ b/designs/florence/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Florence, i18n } from '../src/index.mjs'
+import { Florence, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Florence)
+testPatternConfig(Florence, about)
// Test translation
testPatternI18n(Florence, i18n)
diff --git a/designs/florent/README.md b/designs/florent/README.md
index af03f204756..29d376c33a8 100644
--- a/designs/florent/README.md
+++ b/designs/florent/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/florent
@@ -59,7 +44,7 @@ A FreeSewing pattern for a flat cap
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/florent/data.mjs b/designs/florent/data.mjs
deleted file mode 100644
index 1b582939969..00000000000
--- a/designs/florent/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/florent'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/florent/i18n/de.json b/designs/florent/i18n/de.json
deleted file mode 100644
index bf60f509571..00000000000
--- a/designs/florent/i18n/de.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "t": "Florent, die Schiebermütze",
- "d": "Florent ist eine abgerundete Schiebermütze mit einem kleinen festen Schild an der Vorderseite.",
- "p": {
- "brimBottom": "Brim bottom",
- "brimInterfacing": "Brim interfacing",
- "brimTop": "Brim Top",
- "side": "Side",
- "top": "Top"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Kopfumfangszugabe",
- "d": "Bequemlichkeits-/Bewegungszugabe zum Umfang deines Kopfes"
- }
- }
-}
diff --git a/designs/florent/i18n/es.json b/designs/florent/i18n/es.json
deleted file mode 100644
index 60be245fc8a..00000000000
--- a/designs/florent/i18n/es.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "t": "Florent, boina",
- "d": "Florent es una boina, redondeada, con una pequeña visera rígida en en la parte de delante.",
- "p": {
- "brimBottom": "Brim bottom",
- "brimInterfacing": "Brim interfacing",
- "brimTop": "Brim Top",
- "side": "Side",
- "top": "Top"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Holgura de cabeza",
- "d": "La cantidad de holgura alrededor de la cabeza"
- }
- }
-}
diff --git a/designs/florent/i18n/fr.json b/designs/florent/i18n/fr.json
deleted file mode 100644
index 15826a658fb..00000000000
--- a/designs/florent/i18n/fr.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "t": "Casquette plate Florent",
- "d": "Florent est une casquette plate, une casquette arrondie avec un petit bord raide à l'avant.",
- "p": {
- "brimBottom": "Brim bottom",
- "brimInterfacing": "Brim interfacing",
- "brimTop": "Brim Top",
- "side": "Side",
- "top": "Top"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Aisance de tour de tête",
- "d": "La quantité d'aisance autour de votre tête"
- }
- }
-}
diff --git a/designs/florent/i18n/index.mjs b/designs/florent/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/florent/i18n/index.mjs
+++ b/designs/florent/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/florent/i18n/nl.json b/designs/florent/i18n/nl.json
deleted file mode 100644
index 38836fc9543..00000000000
--- a/designs/florent/i18n/nl.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "t": "Florent pet",
- "d": "Florent is een klassieke platte pet, rond bovenaan met een kleine klep vooraan.",
- "p": {
- "brimBottom": "Brim bottom",
- "brimInterfacing": "Brim interfacing",
- "brimTop": "Brim Top",
- "side": "Side",
- "top": "Top"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Overwijdte hoofd",
- "d": "De hoeveelheid overwijdte rond je hoofd"
- }
- }
-}
diff --git a/designs/florent/i18n/uk.json b/designs/florent/i18n/uk.json
deleted file mode 100644
index af8fb25220c..00000000000
--- a/designs/florent/i18n/uk.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "t": "Florent flat cap",
- "d": "Florent is a flat cap, a rounded cap with a small stiff brim in front.",
- "p": {
- "brimBottom": "Brim bottom",
- "brimInterfacing": "Brim interfacing",
- "brimTop": "Brim Top",
- "side": "Side",
- "top": "Top"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Head ease",
- "d": "The amound of ease around your head"
- }
- }
-}
diff --git a/designs/florent/package.json b/designs/florent/package.json
index fc816c5227f..55c71d16684 100644
--- a/designs/florent/package.json
+++ b/designs/florent/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/florent",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a flat cap",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/florent/src/brimbottom.mjs b/designs/florent/src/brimbottom.mjs
index 224a7a0ed46..260df600416 100644
--- a/designs/florent/src/brimbottom.mjs
+++ b/designs/florent/src/brimbottom.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
function draftFlorentBrimBottom({
sa,
store,
@@ -110,7 +112,7 @@ export const brimBottom = {
topSide: 0.8,
brim: 0,
// Percentages
- headEase: { pct: 2, min: 0, max: 5, menu: 'fit' },
+ headEase: { pct: 2, min: 0, max: 5, ...pctBasedOn('head'), menu: 'fit' },
},
draft: draftFlorentBrimBottom,
}
diff --git a/designs/florent/src/index.mjs b/designs/florent/src/index.mjs
index 07a4b7d86ff..789a3b31550 100644
--- a/designs/florent/src/index.mjs
+++ b/designs/florent/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
import { top } from './top.mjs'
@@ -10,9 +10,9 @@ import { brimInterfacing } from './briminterfacing.mjs'
// Create new design
const Florent = new Design({
- data,
+ data: about,
parts: [top, side, brimBottom, brimTop, brimInterfacing],
})
// Named exports
-export { top, side, brimBottom, brimTop, brimInterfacing, Florent, i18n }
+export { top, side, brimBottom, brimTop, brimInterfacing, Florent, i18n, about }
diff --git a/designs/florent/src/top.mjs b/designs/florent/src/top.mjs
index 2dbc4ed5e92..79ede08f107 100644
--- a/designs/florent/src/top.mjs
+++ b/designs/florent/src/top.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
function draftFlorentTop({
sa,
points,
@@ -250,7 +252,7 @@ export const top = {
topSide: 0.8,
brim: 0,
// Percentages
- headEase: { pct: 2, min: 0, max: 5, menu: 'fit' },
+ headEase: { pct: 2, min: 0, max: 5, ...pctBasedOn('head'), menu: 'fit' },
},
draft: draftFlorentTop,
}
diff --git a/designs/florent/tests/shared.test.mjs b/designs/florent/tests/shared.test.mjs
index 549f1aab0b0..b3005c122c2 100644
--- a/designs/florent/tests/shared.test.mjs
+++ b/designs/florent/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Florent, i18n } from '../src/index.mjs'
+import { Florent, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Florent)
+testPatternConfig(Florent, about)
// Test translation
testPatternI18n(Florent, i18n)
diff --git a/designs/gozer/README.md b/designs/gozer/README.md
index 937cf708729..0c1f0d6fb35 100644
--- a/designs/gozer/README.md
+++ b/designs/gozer/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/gozer
@@ -59,7 +44,7 @@ A FreeSewing pattern for a ghost costume
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/gozer/data.mjs b/designs/gozer/data.mjs
deleted file mode 100644
index 2ca97be3e33..00000000000
--- a/designs/gozer/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/gozer'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/gozer/i18n/de.json b/designs/gozer/i18n/de.json
deleted file mode 100644
index 51ffe6da861..00000000000
--- a/designs/gozer/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Gozer",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/gozer/i18n/es.json b/designs/gozer/i18n/es.json
deleted file mode 100644
index 51ffe6da861..00000000000
--- a/designs/gozer/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Gozer",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/gozer/i18n/fr.json b/designs/gozer/i18n/fr.json
deleted file mode 100644
index 51ffe6da861..00000000000
--- a/designs/gozer/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Gozer",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/gozer/i18n/index.mjs b/designs/gozer/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/gozer/i18n/index.mjs
+++ b/designs/gozer/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/gozer/i18n/nl.json b/designs/gozer/i18n/nl.json
deleted file mode 100644
index 51ffe6da861..00000000000
--- a/designs/gozer/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Gozer",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/gozer/i18n/uk.json b/designs/gozer/i18n/uk.json
deleted file mode 100644
index 51ffe6da861..00000000000
--- a/designs/gozer/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Gozer",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/gozer/package.json b/designs/gozer/package.json
index 6814368b2dc..6e9ba40dc1e 100644
--- a/designs/gozer/package.json
+++ b/designs/gozer/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/gozer",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a ghost costume",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/gozer/src/index.mjs b/designs/gozer/src/index.mjs
index e7eaddaa418..96075c89ad2 100644
--- a/designs/gozer/src/index.mjs
+++ b/designs/gozer/src/index.mjs
@@ -1,16 +1,14 @@
-//
-
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { ghost } from './ghost.mjs'
// Create new design
const Gozer = new Design({
- data,
+ data: about,
parts: [ghost],
})
// Named exports
-export { ghost, i18n, Gozer }
+export { ghost, Gozer, i18n, about }
diff --git a/designs/gozer/tests/shared.test.mjs b/designs/gozer/tests/shared.test.mjs
index 7d3887720d8..029ae3269f8 100644
--- a/designs/gozer/tests/shared.test.mjs
+++ b/designs/gozer/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Gozer, i18n } from '../src/index.mjs'
+import { Gozer, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Gozer)
+testPatternConfig(Gozer, about)
// Test translation
testPatternI18n(Gozer, i18n)
diff --git a/designs/hi/README.md b/designs/hi/README.md
index e86cd1bbe4b..8f194ff12df 100644
--- a/designs/hi/README.md
+++ b/designs/hi/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/hi
@@ -59,7 +44,7 @@ A FreeSewing pattern for a shark plush toy
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/hi/data.mjs b/designs/hi/data.mjs
deleted file mode 100644
index b3233f48725..00000000000
--- a/designs/hi/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/hi'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/hi/i18n/de.json b/designs/hi/i18n/de.json
deleted file mode 100644
index 2d6f974b5e1..00000000000
--- a/designs/hi/i18n/de.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Hi, der Hai",
- "d": "Der freundlichste Hai der Welt",
- "p": {
- "aboveMouth": "Above mouth",
- "belly": "Belly",
- "body": "Body",
- "bottomFin": "Bottom fin",
- "lowerTeeth": "Lower teetch",
- "mouth": "Mouth",
- "tail": "Tail",
- "topFin": "Top fin",
- "upperTeeth": "Upper teeth"
- },
- "s": {},
- "o": {
- "hungry": {
- "t": "Hungrig",
- "d": "Ändert die Mundform, um zu vermitteln, dass Hi hungrig ist"
- },
- "nosePointiness": {
- "t": "Nasenspitzigkeit",
- "d": "Steuert, wie spitz die Nase von Hi ist"
- },
- "aggressive": {
- "t": "Aggressiv",
- "d": "Gibt Hi spitze Zähne, oder nicht"
- },
- "size": {
- "t": "Größe",
- "d": "Haie gibt es in allen Größen, und Hi genauso"
- }
- }
-}
diff --git a/designs/hi/i18n/es.json b/designs/hi/i18n/es.json
deleted file mode 100644
index d39a8459593..00000000000
--- a/designs/hi/i18n/es.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Hi shark plush toy",
- "d": "The world's friendliest shark",
- "p": {
- "aboveMouth": "Above mouth",
- "belly": "Belly",
- "body": "Body",
- "bottomFin": "Bottom fin",
- "lowerTeeth": "Lower teetch",
- "mouth": "Mouth",
- "tail": "Tail",
- "topFin": "Top fin",
- "upperTeeth": "Upper teeth"
- },
- "s": {},
- "o": {
- "hungry": {
- "t": "Hambre",
- "d": "Cambios en la forma de la boca para expresar que Hi tiene hambre"
- },
- "nosePointiness": {
- "t": "Agudeza de la nariz",
- "d": "Controla cómo de puntiaguda es la nariz de Hi"
- },
- "aggressive": {
- "t": "Agresividad",
- "d": "Ponle o no dientes puntiagudos a Hi"
- },
- "size": {
- "t": "Tamaño",
- "d": "Los tiburones vienen en todos los tamaños, y Hi también"
- }
- }
-}
diff --git a/designs/hi/i18n/fr.json b/designs/hi/i18n/fr.json
deleted file mode 100644
index cce151f0f14..00000000000
--- a/designs/hi/i18n/fr.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Hi le requin",
- "d": "Le requin le plus amical du monde",
- "p": {
- "aboveMouth": "Above mouth",
- "belly": "Belly",
- "body": "Body",
- "bottomFin": "Bottom fin",
- "lowerTeeth": "Lower teetch",
- "mouth": "Mouth",
- "tail": "Tail",
- "topFin": "Top fin",
- "upperTeeth": "Upper teeth"
- },
- "s": {},
- "o": {
- "hungry": {
- "t": "Affamé",
- "d": "Change la forme de la bouche pour voir que Hi a faim"
- },
- "nosePointiness": {
- "t": "Forme pointue du nez",
- "d": "Contrôle comment le nez de Hi est pointu"
- },
- "aggressive": {
- "t": "Agressif",
- "d": "Donnez des dents pointues à Hi, ou non"
- },
- "size": {
- "t": "Taille",
- "d": "Les requins sont disponibles dans toutes les tailles, tout comme Hi"
- }
- }
-}
diff --git a/designs/hi/i18n/index.mjs b/designs/hi/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/hi/i18n/index.mjs
+++ b/designs/hi/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/hi/i18n/nl.json b/designs/hi/i18n/nl.json
deleted file mode 100644
index 95f873bc589..00000000000
--- a/designs/hi/i18n/nl.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Hi shark plush toy",
- "d": "The world's friendliest shark",
- "p": {
- "aboveMouth": "Above mouth",
- "belly": "Belly",
- "body": "Body",
- "bottomFin": "Bottom fin",
- "lowerTeeth": "Lower teetch",
- "mouth": "Mouth",
- "tail": "Tail",
- "topFin": "Top fin",
- "upperTeeth": "Upper teeth"
- },
- "s": {},
- "o": {
- "hungry": {
- "t": "Hungry",
- "d": "Changes the mouth shape to convey Hi is hungry"
- },
- "nosePointiness": {
- "t": "Nose pointiness",
- "d": "Controls how pointy Hi's nose is"
- },
- "aggressive": {
- "t": "Aggressive",
- "d": "Give Hi pointy teeth, or not"
- },
- "size": {
- "t": "Maat",
- "d": "Sharks come in all sizes, and so does Hi"
- }
- }
-}
diff --git a/designs/hi/i18n/uk.json b/designs/hi/i18n/uk.json
deleted file mode 100644
index fe70d574b9c..00000000000
--- a/designs/hi/i18n/uk.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Hi the shark",
- "d": "The world's friendliest shark",
- "p": {
- "aboveMouth": "Above mouth",
- "belly": "Belly",
- "body": "Body",
- "bottomFin": "Bottom fin",
- "lowerTeeth": "Lower teetch",
- "mouth": "Mouth",
- "tail": "Tail",
- "topFin": "Top fin",
- "upperTeeth": "Upper teeth"
- },
- "s": {},
- "o": {
- "hungry": {
- "t": "Hungry",
- "d": "Changes the mouth shape to convey Hi is hungry"
- },
- "nosePointiness": {
- "t": "Nose pointiness",
- "d": "Controls how pointy Hi's nose is"
- },
- "aggressive": {
- "t": "Aggressive",
- "d": "Give Hi pointy teeth, or not"
- },
- "size": {
- "t": "Size",
- "d": "Sharks come in all sizes, and so does Hi"
- }
- }
-}
diff --git a/designs/hi/package.json b/designs/hi/package.json
index 78d387a78ca..89ecdd39b9d 100644
--- a/designs/hi/package.json
+++ b/designs/hi/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/hi",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a shark plush toy",
"author": "woutervdub (https://github.com/woutervdub)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/hi/src/index.mjs b/designs/hi/src/index.mjs
index 9dd53d8fd20..5ddc78f1c48 100644
--- a/designs/hi/src/index.mjs
+++ b/designs/hi/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
import { body } from './body.mjs'
@@ -14,7 +14,7 @@ import { upperTeeth } from './upperTeeth.mjs'
// Create design
const Hi = new Design({
- data,
+ data: about,
parts: [body, tail, mouth, aboveMouth, belly, topOfFin, bottomOfFin, lowerTeeth, upperTeeth],
})
@@ -31,4 +31,5 @@ export {
upperTeeth,
Hi,
i18n,
+ about,
}
diff --git a/designs/hi/tests/shared.test.mjs b/designs/hi/tests/shared.test.mjs
index 60cc9afc985..b66ce7f65a4 100644
--- a/designs/hi/tests/shared.test.mjs
+++ b/designs/hi/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Hi, i18n } from '../src/index.mjs'
+import { Hi, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Hi)
+testPatternConfig(Hi, about)
// Test translation
testPatternI18n(Hi, i18n)
diff --git a/designs/holmes/README.md b/designs/holmes/README.md
index caf08eef862..2702a2fa6d7 100644
--- a/designs/holmes/README.md
+++ b/designs/holmes/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/holmes
@@ -59,7 +44,7 @@ A FreeSewing pattern for a Sherlock Holmes hat
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/holmes/data.mjs b/designs/holmes/data.mjs
deleted file mode 100644
index 595c51600a3..00000000000
--- a/designs/holmes/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/holmes'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/holmes/i18n/de.json b/designs/holmes/i18n/de.json
deleted file mode 100644
index 5b7768ffb98..00000000000
--- a/designs/holmes/i18n/de.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "t": "Holmes Deerstalker-Hut",
- "d": "Für Sherlock Holmes-Cosplay oder einfach nur als niedlicher Hut.",
- "p": {
- "ear": "Ear",
- "gore": "Gore",
- "visor": "Visor"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Kopfumfangszugabe",
- "d": "Bequemlichkeits-/Bewegungszugabe zum Umfang deines Kopfes."
- },
- "lengthRatio": {
- "t": "Längenverhältnis",
- "d": "Kontrolliert die Länge der Hutkrone und Ohrklappen"
- },
- "gores": {
- "t": "Anzahl der Keile",
- "d": "Anzahl der Keile, die die Hutkrone zu bilden"
- },
- "visorAngle": {
- "t": "Winkel des Mützenschirms",
- "d": "Winkel, der die innere Kurve des Mützenschirms beschreibt"
- },
- "visorWidth": {
- "t": "Breite des Mützenschirms",
- "d": "Steuert die Breite des Mützenschirms"
- },
- "earLength": {
- "t": "Länge der Ohrklappen",
- "d": "Steuert die Länge der Ohrklappen unabhängig von den Kronenstücken"
- },
- "earWidth": {
- "t": "Breite der Ohrklappen",
- "d": "Steuert die Breite der Ohrklappen"
- },
- "buttonhole": {
- "t": "Führung für das Knopfloch",
- "d": "Fügt der Ohrklappe einen Knopfloch hinzu, um die Variante mit Knopflochs zu entwerfen"
- },
- "visorLength": {
- "t": "Länge des Mützenschirmes",
- "d": "Steuert die Länge des Mützenschirms"
- }
- }
-}
diff --git a/designs/holmes/i18n/es.json b/designs/holmes/i18n/es.json
deleted file mode 100644
index b2d8d132748..00000000000
--- a/designs/holmes/i18n/es.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "t": "Holmes, sombrero deerstalker o cervadora",
- "d": "Para un cosplay de Sherlock Holmes o simplemente un sombrero bonito.",
- "p": {
- "ear": "Ear",
- "gore": "Gore",
- "visor": "Visor"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Holgura de cabeza",
- "d": "La cantidad de facilidad alrededor de tu cabeza."
- },
- "lengthRatio": {
- "t": "Ratio de longitud",
- "d": "Controls the length of the crown and ear flaps"
- },
- "gores": {
- "t": "Número de paneles",
- "d": "The number of gores used to construct the crown"
- },
- "visorAngle": {
- "t": "Visor angle",
- "d": "The arc angle used to draft the inner curve of the visor"
- },
- "visorWidth": {
- "t": "Visor width",
- "d": "Controls the width of the visor"
- },
- "earLength": {
- "t": "Ear flap length",
- "d": "Controls the length of the ear flaps independently from the crown pieces"
- },
- "earWidth": {
- "t": "Ear flap width",
- "d": "Controls the width of the ear flaps"
- },
- "buttonhole": {
- "t": "Buttonhole guide",
- "d": "Adds a buttonhole to the ear flap to help you draft the buttonhole ear flap variant"
- },
- "visorLength": {
- "t": "Visor length",
- "d": "Controls the length of the visor"
- }
- }
-}
diff --git a/designs/holmes/i18n/fr.json b/designs/holmes/i18n/fr.json
deleted file mode 100644
index 04096544898..00000000000
--- a/designs/holmes/i18n/fr.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "t": "Casquette de détective Holmes",
- "d": "Pour un cosplay Sherlock Holmes, ou juste un joli manteau.",
- "p": {
- "ear": "Ear",
- "gore": "Gore",
- "visor": "Visor"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Aisance du tour de tête",
- "d": "La quantité d'aisance autour de votre tête."
- },
- "lengthRatio": {
- "t": "Profondeur de tête",
- "d": "Contrôle la longueur de la couronne et des rabats d'oreilles"
- },
- "gores": {
- "t": "Nombre de pans",
- "d": "Le nombre de pans utilisés pour construire la couronne"
- },
- "visorAngle": {
- "t": "Angle de la visière",
- "d": "L'angle d'arc utilisé pour tracer la courbe intérieure de la visière"
- },
- "visorWidth": {
- "t": "Largeur de la visière",
- "d": "Contrôle la largeur de la visière"
- },
- "earLength": {
- "t": "Longueur du rabat de l'oreille",
- "d": "Contrôle la longueur des rabats de l'oreille indépendamment des autres pièces de contour"
- },
- "earWidth": {
- "t": "Largeur du rabat de l'oreille",
- "d": "Contrôle la largeur des rabats de l'oreille"
- },
- "buttonhole": {
- "t": "Guide des boutonnières",
- "d": "Ajoute une boutonnière au rabat d'oreille pour vous aider à tracer la variante du rabat de l'oreille avec boutonnière"
- },
- "visorLength": {
- "t": "Longueur de la visière",
- "d": "Contrôle la longueur de la visière"
- }
- }
-}
diff --git a/designs/holmes/i18n/index.mjs b/designs/holmes/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/holmes/i18n/index.mjs
+++ b/designs/holmes/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/holmes/i18n/nl.json b/designs/holmes/i18n/nl.json
deleted file mode 100644
index 7dbfcd3d694..00000000000
--- a/designs/holmes/i18n/nl.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "t": "Holmes deerstanker hoed",
- "d": "Voor als je Sherlock Holmes wil spelen, of gewoon een leuk hoedje zoekt.",
- "p": {
- "ear": "Ear",
- "gore": "Gore",
- "visor": "Visor"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Overwijdte hoofd",
- "d": "De hoeveelheid overwijdte rond je hoofd."
- },
- "lengthRatio": {
- "t": "Lengteratio",
- "d": "Controls the length of the crown and ear flaps"
- },
- "gores": {
- "t": "Aantal panden",
- "d": "The number of gores used to construct the crown"
- },
- "visorAngle": {
- "t": "Visor hoek",
- "d": "The arc angle used to draft the inner curve of the visor"
- },
- "visorWidth": {
- "t": "Visor breedte",
- "d": "Bepaalt de breedte van de visor"
- },
- "earLength": {
- "t": "Ear flap length",
- "d": "Controls the length of the ear flaps independently from the crown pieces"
- },
- "earWidth": {
- "t": "Ear flap width",
- "d": "Controls the width of the ear flaps"
- },
- "buttonhole": {
- "t": "Buttonhole guide",
- "d": "Adds a buttonhole to the ear flap to help you draft the buttonhole ear flap variant"
- },
- "visorLength": {
- "t": "Visor lengte",
- "d": "Bepaalt de lengte van de visor"
- }
- }
-}
diff --git a/designs/holmes/i18n/uk.json b/designs/holmes/i18n/uk.json
deleted file mode 100644
index 142de1e8b37..00000000000
--- a/designs/holmes/i18n/uk.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "t": "Holmes deerstalker hat",
- "d": "For Sherlock Holmes cosplay or just a cute hat.",
- "p": {
- "ear": "Ear",
- "gore": "Gore",
- "visor": "Visor"
- },
- "s": {},
- "o": {
- "headEase": {
- "t": "Head ease",
- "d": "The amount of ease around your head."
- },
- "lengthRatio": {
- "t": "Length ratio",
- "d": "Controls the length of the crown and ear flaps"
- },
- "gores": {
- "t": "Number of gores",
- "d": "The number of gores used to construct the crown"
- },
- "visorAngle": {
- "t": "Visor angle",
- "d": "The arc angle used to draft the inner curve of the visor"
- },
- "visorWidth": {
- "t": "Visor width",
- "d": "Controls the width of the visor"
- },
- "earLength": {
- "t": "Ear flap length",
- "d": "Controls the length of the ear flaps independently from the crown pieces"
- },
- "earWidth": {
- "t": "Ear flap width",
- "d": "Controls the width of the ear flaps"
- },
- "buttonhole": {
- "t": "Buttonhole guide",
- "d": "Adds a buttonhole to the ear flap to help you draft the buttonhole ear flap variant"
- },
- "visorLength": {
- "t": "Visor length",
- "d": "Controls the length of the visor"
- }
- }
-}
diff --git a/designs/holmes/package.json b/designs/holmes/package.json
index 72cad7eaaaf..3934f62f333 100644
--- a/designs/holmes/package.json
+++ b/designs/holmes/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/holmes",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a Sherlock Holmes hat",
"author": "AlfaLyr (https://github.com/alfalyr)",
"homepage": "https://freesewing.org/",
@@ -25,51 +25,42 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {
- "@freesewing/plugin-gore": "3.3.0-rc.1"
+ "@freesewing/plugin-gore": "4.0.0"
},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/holmes/src/crown.mjs b/designs/holmes/src/crown.mjs
index 215a0672527..371402e7d57 100644
--- a/designs/holmes/src/crown.mjs
+++ b/designs/holmes/src/crown.mjs
@@ -1,4 +1,5 @@
import { pluginGore } from '@freesewing/plugin-gore'
+import { pctBasedOn } from '@freesewing/core'
function draftHolmesCrown({
Point,
@@ -101,7 +102,7 @@ export const crown = {
metric: [6, 13, 19, 25, 32, 38, 44, 50],
imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1, 44.45, 50.8],
},
- toAbs: (pct, { measurements }) => measurements.head * pct,
+ ...pctBasedOn('head'),
menu: 'fit',
},
lengthRatio: { pct: 55, min: 40, max: 60, menu: 'style' },
diff --git a/designs/holmes/src/ear.mjs b/designs/holmes/src/ear.mjs
index 7f548fa4a13..1fb25c4839f 100644
--- a/designs/holmes/src/ear.mjs
+++ b/designs/holmes/src/ear.mjs
@@ -1,3 +1,5 @@
+import { pctBasedOn } from '@freesewing/core'
+
function draftHolmesEar({
Point,
points,
@@ -104,7 +106,7 @@ export const ear = {
metric: [6, 13, 19, 25, 32, 38, 44, 50],
imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1, 44.45, 50.8],
},
- toAbs: (pct, { measurements }) => measurements.head * pct,
+ ...pctBasedOn('head'),
menu: 'fit',
},
lengthRatio: { pct: 55, min: 40, max: 60, menu: 'style' },
diff --git a/designs/holmes/src/index.mjs b/designs/holmes/src/index.mjs
index eae9ba7a3d5..2caa5b1e7b0 100644
--- a/designs/holmes/src/index.mjs
+++ b/designs/holmes/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
@@ -9,9 +9,9 @@ import { ear } from './ear.mjs'
// Create new design
const Holmes = new Design({
- data,
+ data: about,
parts: [crown, visor, ear],
})
// Named exports
-export { crown, visor, ear, Holmes, i18n }
+export { crown, visor, ear, Holmes, i18n, about }
diff --git a/designs/holmes/src/visor.mjs b/designs/holmes/src/visor.mjs
index 814c6f18259..0ad54c32cae 100644
--- a/designs/holmes/src/visor.mjs
+++ b/designs/holmes/src/visor.mjs
@@ -123,7 +123,7 @@ export const visor = {
metric: [6, 13, 19, 25, 32, 38, 44, 50],
imperial: [6.35, 12.7, 19.05, 25.4, 31.75, 38.1, 44.45, 50.8],
},
- toAbs: (pct, { measurements }) => measurements.head * pct,
+ ...pctBasedOn('head'),
menu: 'fit',
},
visorAngle: { deg: 45, min: 10, max: 90, menu: 'style' },
diff --git a/designs/holmes/tests/shared.test.mjs b/designs/holmes/tests/shared.test.mjs
index 3ba6f3cc3a8..bd0cfa35e6a 100644
--- a/designs/holmes/tests/shared.test.mjs
+++ b/designs/holmes/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Holmes, i18n } from '../src/index.mjs'
+import { Holmes, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Holmes)
+testPatternConfig(Holmes, about)
// Test translation
testPatternI18n(Holmes, i18n)
diff --git a/designs/hortensia/README.md b/designs/hortensia/README.md
index 9c36c8a489b..e37485d093f 100644
--- a/designs/hortensia/README.md
+++ b/designs/hortensia/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/hortensia
@@ -59,7 +44,7 @@ A FreeSewing pattern for a handbag
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/hortensia/data.mjs b/designs/hortensia/data.mjs
deleted file mode 100644
index 123d7b2bcb5..00000000000
--- a/designs/hortensia/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/hortensia'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/hortensia/i18n/de.json b/designs/hortensia/i18n/de.json
deleted file mode 100644
index 169be419fac..00000000000
--- a/designs/hortensia/i18n/de.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Hortensia, die Handtasche",
- "d": "Hortensia ist eine Handtasche.",
- "p": {
- "bottompanel": "Bottom panel",
- "frontpanel": "Front panel",
- "sidepanel": "Side panel",
- "sidepanelreinforcement": "Side panel reinforcement",
- "strap": "Strap",
- "zipperpanel": "Zipper panel"
- },
- "s": {
- "SidePanel": "Seitenstück",
- "FrontBackPanel": "Vorder- und Rückseite",
- "BottomPanel": "Unteres Teil",
- "ZipperPanel": "Reißverschluss",
- "Strap": "Griff",
- "strapLength": "Länge der Griffe",
- "handleWidth": "Breite der Griffe",
- "zipperSize": "Standard Reißverschlussgröße",
- "SidePanelReinforcement": "Seitenverstärker"
- },
- "o": {
- "size": {
- "t": "Grösse",
- "d": "Steuert die Gesamtgröße der Handtasche"
- },
- "zipperSize": {
- "t": "Größe des Reißverschlusses",
- "d": "Welche Reißverschlussgröße verwendet werden soll"
- },
- "strapLength": {
- "t": "Riemenlänge",
- "d": "Steuert die Riemenlänge"
- },
- "handleWidth": {
- "t": "Breite des Griffes",
- "d": "Steuert die Breite des Griffes"
- }
- }
-}
diff --git a/designs/hortensia/i18n/es.json b/designs/hortensia/i18n/es.json
deleted file mode 100644
index 016eb388d9e..00000000000
--- a/designs/hortensia/i18n/es.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Hortensia, bolso de mano",
- "d": "Hortensia es un bolso de mano.",
- "p": {
- "bottompanel": "Bottom panel",
- "frontpanel": "Front panel",
- "sidepanel": "Side panel",
- "sidepanelreinforcement": "Side panel reinforcement",
- "strap": "Strap",
- "zipperpanel": "Zipper panel"
- },
- "s": {
- "SidePanel": "Panel lateral",
- "FrontBackPanel": "Panel frontal y trasero",
- "BottomPanel": "Panel Principal",
- "ZipperPanel": "Panel de Caparazón",
- "Strap": "Referencia",
- "strapLength": "Longitud de los Manejos",
- "handleWidth": "Ancho de las asas",
- "zipperSize": "Tamaño estándar de zipper",
- "SidePanelReinforcement": "Ocultar Panel de Refuerzos"
- },
- "o": {
- "size": {
- "t": "Tamaño",
- "d": "Controla el tamaño total del bolso"
- },
- "zipperSize": {
- "t": "Tamaño Zipper",
- "d": "Qué tamaño de zipper usar"
- },
- "strapLength": {
- "t": "Longitud del Strp",
- "d": "Controla la longitud de la correa"
- },
- "handleWidth": {
- "t": "Anchura del Manejo",
- "d": "Controla el ancho del asa"
- }
- }
-}
diff --git a/designs/hortensia/i18n/fr.json b/designs/hortensia/i18n/fr.json
deleted file mode 100644
index f7bd708085b..00000000000
--- a/designs/hortensia/i18n/fr.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Sac à main Hortensia",
- "d": "Hortensia est un sac à main.",
- "p": {
- "bottompanel": "Bottom panel",
- "frontpanel": "Front panel",
- "sidepanel": "Side panel",
- "sidepanelreinforcement": "Side panel reinforcement",
- "strap": "Strap",
- "zipperpanel": "Zipper panel"
- },
- "s": {
- "SidePanel": "Panneau latéral",
- "FrontBackPanel": "Panneau avant et arrière",
- "BottomPanel": "Panneau inférieur",
- "ZipperPanel": "Panneau de zip",
- "Strap": "Référence",
- "strapLength": "Longueur des anses",
- "handleWidth": "Largeur des anses",
- "zipperSize": "Taille standard de zip",
- "SidePanelReinforcement": "Panneau de renforcement latéral"
- },
- "o": {
- "size": {
- "t": "Taille",
- "d": "Contrôle la taille globale du sac à main"
- },
- "zipperSize": {
- "t": "Taille du Zip",
- "d": "Quelle taille de zip utliser"
- },
- "strapLength": {
- "t": "Longueur du lien",
- "d": "Contrôle la longueur des anses"
- },
- "handleWidth": {
- "t": "Largeur d'anse",
- "d": "Contrôle la largeur de l'anse"
- }
- }
-}
diff --git a/designs/hortensia/i18n/index.mjs b/designs/hortensia/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/hortensia/i18n/index.mjs
+++ b/designs/hortensia/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/hortensia/i18n/nl.json b/designs/hortensia/i18n/nl.json
deleted file mode 100644
index 99ae8e6ed83..00000000000
--- a/designs/hortensia/i18n/nl.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Hortensia handtas",
- "d": "Hortensie is een handzak.",
- "p": {
- "bottompanel": "Bottom panel",
- "frontpanel": "Front panel",
- "sidepanel": "Side panel",
- "sidepanelreinforcement": "Side panel reinforcement",
- "strap": "Strap",
- "zipperpanel": "Zipper panel"
- },
- "s": {
- "SidePanel": "Zijkant paneel",
- "FrontBackPanel": "Voor- en achterpaneel",
- "BottomPanel": "Onderste paneel",
- "ZipperPanel": "Rits Paneel",
- "Strap": "Referentie",
- "strapLength": "Lengte van de hengsels",
- "handleWidth": "Breedte van de handvatten",
- "zipperSize": "Standaard ritsgrootte",
- "SidePanelReinforcement": "Zijkant Versterking Paneel"
- },
- "o": {
- "size": {
- "t": "Maat",
- "d": "Bepaalt de totale grootte van de handtas"
- },
- "zipperSize": {
- "t": "Rits grootte",
- "d": "Welke afmeting van de rits te gebruiken"
- },
- "strapLength": {
- "t": "Rep lengte",
- "d": "Bepaalt de lengte van de band"
- },
- "handleWidth": {
- "t": "Afhandeling breedte",
- "d": "Bepaalt de breedte van het handvat"
- }
- }
-}
diff --git a/designs/hortensia/i18n/uk.json b/designs/hortensia/i18n/uk.json
deleted file mode 100644
index a1ef7162e72..00000000000
--- a/designs/hortensia/i18n/uk.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Hortensia handbag",
- "d": "Hortensia is a handbag.",
- "p": {
- "bottompanel": "Bottom panel",
- "frontpanel": "Front panel",
- "sidepanel": "Side panel",
- "sidepanelreinforcement": "Side panel reinforcement",
- "strap": "Strap",
- "zipperpanel": "Zipper panel"
- },
- "s": {
- "SidePanel": "Side Panel",
- "FrontBackPanel": "Front and Back Panel",
- "BottomPanel": "Bottom Panel",
- "ZipperPanel": "Zipper Panel",
- "Strap": "Handle",
- "strapLength": "Length of the Handles",
- "handleWidth": "Width of the handles",
- "zipperSize": "Standard zipper size",
- "SidePanelReinforcement": "Side Reinforcement Panel"
- },
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size of the handbag"
- },
- "zipperSize": {
- "t": "Zipper size",
- "d": "Which size of zipper to use"
- },
- "strapLength": {
- "t": "Strap length",
- "d": "Controls the length of the strap"
- },
- "handleWidth": {
- "t": "Handle width",
- "d": "Controls the width of the handle"
- }
- }
-}
diff --git a/designs/hortensia/package.json b/designs/hortensia/package.json
index eddcaf3c016..de6ae5f43f6 100644
--- a/designs/hortensia/package.json
+++ b/designs/hortensia/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/hortensia",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a handbag",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/hortensia/src/index.mjs b/designs/hortensia/src/index.mjs
index 24c27502460..83bb93ee951 100644
--- a/designs/hortensia/src/index.mjs
+++ b/designs/hortensia/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
import { sidePanel } from './sidepanel.mjs'
@@ -11,7 +11,7 @@ import { strap } from './strap.mjs'
// Create new design
const Hortensia = new Design({
- data,
+ data: about,
parts: [sidePanel, frontPanel, bottomPanel, zipperPanel, sidePanelReinforcement, strap],
})
@@ -25,4 +25,5 @@ export {
strap,
Hortensia,
i18n,
+ about,
}
diff --git a/designs/hortensia/tests/shared.test.mjs b/designs/hortensia/tests/shared.test.mjs
index cc20e4c843d..1eee2f2b476 100644
--- a/designs/hortensia/tests/shared.test.mjs
+++ b/designs/hortensia/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Hortensia, i18n } from '../src/index.mjs'
+import { Hortensia, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Hortensia)
+testPatternConfig(Hortensia, about)
// Test translation
testPatternI18n(Hortensia, i18n)
diff --git a/designs/huey/CHANGELOG.md b/designs/huey/CHANGELOG.md
index 679f1e0e8a9..ad0e06cef43 100644
--- a/designs/huey/CHANGELOG.md
+++ b/designs/huey/CHANGELOG.md
@@ -1,6 +1,18 @@
# Change log for: @freesewing/huey
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - The lengthBonus option default was changed from 0% to 15%. Fixes
+
+### Fixed
+
+ - Fixed an issue where ribbing height would distort the pocket under certain conditions. Fixes
+ - Adding missing translation for ribbing option
+ - Hide unused ribbing parts when ribbing option is disabled
+
## 3.1.0 (2023-12-26)
### Changed
diff --git a/designs/huey/README.md b/designs/huey/README.md
index b91235a9d67..374709bee94 100644
--- a/designs/huey/README.md
+++ b/designs/huey/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/huey
@@ -59,7 +44,7 @@ A FreeSewing pattern for a zip-up hoodie
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/huey/data.mjs b/designs/huey/data.mjs
deleted file mode 100644
index 8c8a6363328..00000000000
--- a/designs/huey/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/huey'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/huey/i18n/de.json b/designs/huey/i18n/de.json
deleted file mode 100644
index a2fb8b3346b..00000000000
--- a/designs/huey/i18n/de.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Huey, der Hoodie",
- "d": "Huey ist ein Hoodie mit Reißverschluss und optionalen Taschen auf der Vorderseite.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hood": "Hood",
- "pocket": "Pocket",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "pocket": {
- "t": "Tasche",
- "d": "Legt fest, ob vordere Taschen integriert werden oder nicht"
- },
- "pocketHeight": {
- "t": "Taschenhöhe",
- "d": "Steuert die Höhe der Tasche"
- },
- "hoodHeight": {
- "t": "Kapuzenhöhe",
- "d": "Steuert die Höhe der Kapuze"
- },
- "hoodCutback": {
- "t": "Kapuzenausschnitt",
- "d": "Leg fest, wie weit die Öffnung der Kapuze zurückgeschnitten wird"
- },
- "hoodClosure": {
- "t": "Kapuzenverschluss",
- "d": "Legt fest, wie viel von der der Kapuze zum vorderen Verschluss gehört"
- },
- "hoodDepth": {
- "t": "Kapuzentiefe",
- "d": "Steuert die Tiefe der Kapuze"
- },
- "hoodAngle": {
- "t": "Winkel der Kapuze",
- "d": "Steuert den Winkel, mit welchem die Kapuze angebracht wird"
- }
- }
-}
diff --git a/designs/huey/i18n/es.json b/designs/huey/i18n/es.json
deleted file mode 100644
index f8007096e37..00000000000
--- a/designs/huey/i18n/es.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Huey, sudadera con capucha",
- "d": "Huey es una sudadera con capucha, cremallera y bolsillos delanteros opcionales.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hood": "Hood",
- "pocket": "Pocket",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "pocket": {
- "t": "Bolsillo",
- "d": "Si se añade un bolsillo delantero o no"
- },
- "pocketHeight": {
- "t": "Altura de bolsillo",
- "d": "Controla la altura del bolsillo"
- },
- "hoodHeight": {
- "t": "Altura de capucha",
- "d": "Controla la altura del capucha"
- },
- "hoodCutback": {
- "t": "Recorta capucha",
- "d": "Controla cómo abrir el capó se recorta"
- },
- "hoodClosure": {
- "t": "Cierre de capucha",
- "d": "Controla la parte del capó que forma parte del cierre frontal"
- },
- "hoodDepth": {
- "t": "Profundidad de capucha",
- "d": "Controla la profundidad del capucha"
- },
- "hoodAngle": {
- "t": "Angulo de capucha",
- "d": "Controla el ángulo en el que la capucha es unida"
- }
- }
-}
diff --git a/designs/huey/i18n/fr.json b/designs/huey/i18n/fr.json
deleted file mode 100644
index 2005fefdf47..00000000000
--- a/designs/huey/i18n/fr.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Sweat zippé à capuche Huey",
- "d": "Huey est un sweat à capuche zippé avec poches avant optionnelles.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hood": "Hood",
- "pocket": "Pocket",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "pocket": {
- "t": "Poche",
- "d": "S'il faut inclure une poche avant ou non"
- },
- "pocketHeight": {
- "t": "Hauteur de la poche",
- "d": "Contrôle la hauteur de la poche"
- },
- "hoodHeight": {
- "t": "Hauteur de capuche",
- "d": "Contrôle la hauteur de la capuche"
- },
- "hoodCutback": {
- "t": "Coupe arrière de capuche",
- "d": "Contrôle la courbure à l'arrière de la capuche"
- },
- "hoodClosure": {
- "t": "Fermeture de capuche",
- "d": "Contrôle la quantité de capuche sur la partie avant"
- },
- "hoodDepth": {
- "t": "Profondeur du capuche",
- "d": "Contrôle la profondeur de la capuche"
- },
- "hoodAngle": {
- "t": "Angle de capuche",
- "d": "Contrôle l'angle de fixation de la capuche"
- }
- }
-}
diff --git a/designs/huey/i18n/index.mjs b/designs/huey/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/huey/i18n/index.mjs
+++ b/designs/huey/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/huey/i18n/nl.json b/designs/huey/i18n/nl.json
deleted file mode 100644
index 5183cab23d4..00000000000
--- a/designs/huey/i18n/nl.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Huey Hoodie",
- "d": "Huey is een trui met kap met een rits, en optionele voorzakken.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hood": "Hood",
- "pocket": "Pocket",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "pocket": {
- "t": "Zak",
- "d": "Of een voorzak moet worden toegevoegd of niet"
- },
- "pocketHeight": {
- "t": "Zak hoogte",
- "d": "Bepaalt de hoogte van de zak"
- },
- "hoodHeight": {
- "t": "Capuchon hoogte",
- "d": "Bepaalt de hoogte van de capuchon"
- },
- "hoodCutback": {
- "t": "Capuchon inkorting",
- "d": "Bepaalt hoever de capuchon opening is ingekort"
- },
- "hoodClosure": {
- "t": "Capuchon sluiting",
- "d": "Bepaalt hoeveel van de capuchon deel uitmaakt van de sluiting vooraan"
- },
- "hoodDepth": {
- "t": "Capuchon diepte",
- "d": "Bepaalt de diepte van de capuchon"
- },
- "hoodAngle": {
- "t": "Capuchon hoek",
- "d": "Bepaalt de hoek waaronder de capuchon is geplaatst"
- }
- }
-}
diff --git a/designs/huey/i18n/uk.json b/designs/huey/i18n/uk.json
deleted file mode 100644
index 41df6bc18e1..00000000000
--- a/designs/huey/i18n/uk.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "t": "Huey hoodie",
- "d": "Huey is a zip-up hoodie with optional front pockets.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hood": "Hood",
- "pocket": "Pocket",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "pocket": {
- "t": "Pocket",
- "d": "Whether to include a front pocket or not"
- },
- "pocketHeight": {
- "t": "Pocket height",
- "d": "Controls the height of the pocket"
- },
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls the height of the hood"
- },
- "hoodCutback": {
- "t": "Hood cutback",
- "d": "Controls how far the hood opening is cut back"
- },
- "hoodClosure": {
- "t": "Hood closure",
- "d": "Controls how much of the hood is part of the front closure"
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls the depth of the hood"
- },
- "hoodAngle": {
- "t": "Hood angle",
- "d": "Controls the angle at which the hood is attached"
- },
- "ribbing": {
- "t": "Ribbing",
- "d": "Whether or not to include ribbing on the pattern."
- },
- "ribbingHeight": {
- "t": "Ribbing height",
- "d": "Controls the height of the ribbing"
- },
- "ribbingStretch": {
- "t": "Ribbing stretch",
- "d": "Use this to adapt the pattern to how stretchy the ribbing that you are using is."
- },
- "hipsEase": {
- "t": "Hops ease",
- "d": "Controls the amount of ease at the hips"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Controls the width of the pocket"
- }
- }
-}
diff --git a/designs/huey/package.json b/designs/huey/package.json
index c8206a7d112..66d174870e5 100644
--- a/designs/huey/package.json
+++ b/designs/huey/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/huey",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a zip-up hoodie",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/huey/src/back.mjs b/designs/huey/src/back.mjs
index 999ce0287e7..eba87d5bd6c 100644
--- a/designs/huey/src/back.mjs
+++ b/designs/huey/src/back.mjs
@@ -1,5 +1,6 @@
import { back as brianBack } from '@freesewing/brian'
import { sharedDimensions } from './shared.mjs'
+import { pctBasedOn } from '@freesewing/core'
function draftHueyBack({
store,
@@ -100,7 +101,7 @@ export const back = {
options: {
ribbing: { bool: true, menu: 'style' },
ribbingHeight: { pct: 10, min: 5, max: 15, menu: 'style' },
- hipsEase: { pct: 8, min: 4, max: 12, menu: 'fit' },
+ hipsEase: { pct: 8, min: 4, max: 12, ...pctBasedOn('hips'), menu: 'fit' },
// Override Brian's lengthbonus. See #6596
lengthBonus: { pct: 15, min: -4, max: 60, menu: 'style' },
},
diff --git a/designs/huey/src/index.mjs b/designs/huey/src/index.mjs
index b46df362446..c036e556bb1 100644
--- a/designs/huey/src/index.mjs
+++ b/designs/huey/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as hueyI18n } from '../i18n/index.mjs'
// Parts
@@ -13,7 +13,7 @@ import { cuff } from './cuff.mjs'
// Create design
const Huey = new Design({
- data,
+ data: about,
parts: [back, front, sleeve, pocket, hood, waistband, cuff],
})
@@ -21,4 +21,4 @@ const Huey = new Design({
const i18n = mergeI18n([brianI18n, hueyI18n])
// Named exports
-export { back, front, sleeve, pocket, hood, waistband, cuff, Huey, i18n }
+export { back, front, sleeve, pocket, hood, waistband, cuff, Huey, i18n, about }
diff --git a/designs/huey/tests/shared.test.mjs b/designs/huey/tests/shared.test.mjs
index 7704b53efbe..a59cbc8577e 100644
--- a/designs/huey/tests/shared.test.mjs
+++ b/designs/huey/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Huey, i18n } from '../src/index.mjs'
+import { Huey, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Huey)
+testPatternConfig(Huey, about)
// Test translation
testPatternI18n(Huey, i18n)
diff --git a/designs/hugo/CHANGELOG.md b/designs/hugo/CHANGELOG.md
index 2317f6e69ae..a7434e36df0 100644
--- a/designs/hugo/CHANGELOG.md
+++ b/designs/hugo/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/hugo
+## 4.0.0 (2024-04-01)
+
+### Fixed
+
+ - Add missing dimension id attributes
+
## 3.2.0 (2024-02-11)
### Fixed
diff --git a/designs/hugo/README.md b/designs/hugo/README.md
index 5ab5f9daba6..379c13df175 100644
--- a/designs/hugo/README.md
+++ b/designs/hugo/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/hugo
@@ -59,7 +44,7 @@ A FreeSewing pattern for a hooded jumper with raglan sleeves
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/hugo/data.mjs b/designs/hugo/data.mjs
deleted file mode 100644
index 43eb6ee70bb..00000000000
--- a/designs/hugo/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/hugo'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/hugo/i18n/de.json b/designs/hugo/i18n/de.json
deleted file mode 100644
index 86eb728aebb..00000000000
--- a/designs/hugo/i18n/de.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "t": "Hugo, der Hoodie",
- "d": "Hugo ist ein Kapuzensweatshirt mit Raglanärmeln.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Manschette",
- "hoodCenter": "Mitte der Kapuze",
- "hoodSide": "Kapuzenseite",
- "pocketFacing": "Taschenbesatz",
- "pocket": "Tasche",
- "waistband": "Bund"
- },
- "o": {
- "hipsEase": {
- "t": "Zugabe Hüfte",
- "d": "Die Menge an Bequemlichkeitszugabe an deinen Hüften."
- }
- }
-}
diff --git a/designs/hugo/i18n/es.json b/designs/hugo/i18n/es.json
deleted file mode 100644
index 552822547c8..00000000000
--- a/designs/hugo/i18n/es.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "t": "Hugo, sudadera con capucha",
- "d": "Hugo es una sudadera con capucha y manga raglán.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Puño",
- "hoodCenter": "Centro de la capucha",
- "hoodSide": "Lado de la capucha",
- "pocketFacing": "Mirando hacia el bolsillo",
- "pocket": "Bolsillo",
- "waistband": "Pretina"
- },
- "o": {
- "hipsEase": {
- "t": "Holgura de cadera",
- "d": "La cantidad de holgura en la cadera."
- }
- }
-}
diff --git a/designs/hugo/i18n/fr.json b/designs/hugo/i18n/fr.json
deleted file mode 100644
index ac193fab74d..00000000000
--- a/designs/hugo/i18n/fr.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "t": "Sweat à capuche Hugo",
- "d": "Hugo est un sweat à capuche avec des manches raglan.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Poignet",
- "hoodCenter": "Milieu de capuche",
- "hoodSide": "Côté de capuche",
- "pocketFacing": "Doublure de poche",
- "pocket": "Poche",
- "waistband": "Ceinture"
- },
- "o": {
- "hipsEase": {
- "t": "Aisance des hanches",
- "d": "La marge d'aisance aux hanches."
- }
- }
-}
diff --git a/designs/hugo/i18n/index.mjs b/designs/hugo/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/hugo/i18n/index.mjs
+++ b/designs/hugo/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/hugo/i18n/nl.json b/designs/hugo/i18n/nl.json
deleted file mode 100644
index a55f79d5ce2..00000000000
--- a/designs/hugo/i18n/nl.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "t": "Hugo hoodie",
- "d": "Hugo is een trui met kap en een raglanmouw.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Manchette",
- "hoodCenter": "Capuchon midden",
- "hoodSide": "Capuchon zijkant",
- "pocketFacing": "Zak doublure",
- "pocket": "Zak",
- "waistband": "Tailleband"
- },
- "o": {
- "hipsEase": {
- "t": "Overwijdte heup",
- "d": "De hoeveelheid overwijdte aan je heupen."
- }
- }
-}
diff --git a/designs/hugo/i18n/uk.json b/designs/hugo/i18n/uk.json
deleted file mode 100644
index c923c2bdd80..00000000000
--- a/designs/hugo/i18n/uk.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Hugo hoodie",
- "d": "Hugo is a hooded jumper with raglan sleeves.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Cuff",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocketFacing": "Pocket facing",
- "pocket": "Pocket",
- "waistband": "Waistband"
- },
- "o": {
- "ribbingHeight": {
- "t": "Ribbing height",
- "d": "Controls the height of the ribbing"
- },
- "ribbingStretch": {
- "t": "Ribbing stretch",
- "d": "Use this to adapt the pattern to how stretchy the ribbing that you are using is."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "The amount of ease at your hips."
- }
- }
-}
diff --git a/designs/hugo/package.json b/designs/hugo/package.json
index bcdae445f52..4030861417f 100644
--- a/designs/hugo/package.json
+++ b/designs/hugo/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/hugo",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a hooded jumper with raglan sleeves",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/hugo/src/index.mjs b/designs/hugo/src/index.mjs
index 4aa759a0776..d1801570add 100644
--- a/designs/hugo/src/index.mjs
+++ b/designs/hugo/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as hugoI18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
@@ -15,7 +15,7 @@ import { neckBinding } from './neckbinding.mjs'
// Setup our new design
const Hugo = new Design({
- data,
+ data: about,
parts: [
back,
front,
@@ -47,4 +47,5 @@ export {
neckBinding,
Hugo,
i18n,
+ about,
}
diff --git a/designs/hugo/tests/shared.test.mjs b/designs/hugo/tests/shared.test.mjs
index 82efb50a139..7a042e41455 100644
--- a/designs/hugo/tests/shared.test.mjs
+++ b/designs/hugo/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Hugo, i18n } from '../src/index.mjs'
+import { Hugo, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Hugo)
+testPatternConfig(Hugo, about)
// Test translation
testPatternI18n(Hugo, i18n)
diff --git a/designs/jaeger/README.md b/designs/jaeger/README.md
index 8bc4b736d25..382be65a199 100644
--- a/designs/jaeger/README.md
+++ b/designs/jaeger/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/jaeger
@@ -59,7 +44,7 @@ A FreeSewing pattern for a sport coat style jacket
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/jaeger/data.mjs b/designs/jaeger/data.mjs
deleted file mode 100644
index 3e9ce905b30..00000000000
--- a/designs/jaeger/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/jaeger'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/jaeger/i18n/de.json b/designs/jaeger/i18n/de.json
deleted file mode 100644
index a67ec2af3c2..00000000000
--- a/designs/jaeger/i18n/de.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Jaeger, das Sakko",
- "d": "Jaeger ist ein sportliches Sakko mit zwei Knöpfen und aufgesetzten Taschen.",
- "p": {
- "backBase": "Back base",
- "chestPocketBag": "Chest pocket bag",
- "chestPocketWelt": "Chest pocket welt",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "frontBase": "Front base",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketWelt": "Inner pocket welt",
- "pocket": "Pocket",
- "pocketLining": "Pocket lining",
- "side": "Side",
- "topSleeve": "Top sleeve",
- "underCollar": "Under collar",
- "underSleeve": "Under sleeve"
- },
- "s": {},
- "o": {
- "centerBackDart": {
- "t": "Abnäher in der hinteren Mitte",
- "d": "Abnäher in der hinteren Mitte, um einen abgerundeten Rücken unterzubringen"
- },
- "sleeveVentLength": {
- "t": "Ärmellüftungslänge",
- "d": "Länge der Ärmelöffnung"
- },
- "sleeveVentWidth": {
- "t": "Ärmelschlitzbreite",
- "d": "Breite der Ärmelöffnung"
- },
- "chestShaping": {
- "t": "Brustformung",
- "d": "Anzahl der Formatierung für die Brustkurve"
- },
- "frontDartPlacement": {
- "t": "Platzierung des vorderen Abnähers",
- "d": "Position der vorderen Abnäher"
- },
- "frontOverlap": {
- "t": "Übertritt vorne",
- "d": "Wie weit der Stoff über die Schließknöpfe hinausragt"
- },
- "sideFrontPlacement": {
- "t": "Seitliche / vordere Platzierung",
- "d": "Die Position der Seiten- / Frontgrenze"
- },
- "chestPocketDepth": {
- "t": "Brusttasche Tiefe",
- "d": "Die Tiefe der Brusttasche"
- },
- "chestPocketWidth": {
- "t": "Brusttaschenbreite",
- "d": "Die Breite der Brusttasche"
- },
- "chestPocketPlacement": {
- "t": "Platzierung der Brusttasche",
- "d": "Die Position der Brusttasche"
- },
- "chestPocketAngle": {
- "t": "Brusttaschenwinkel",
- "d": "Der Winkel, unter dem die Brusttasche platziert wird"
- },
- "chestPocketWeltSize": {
- "t": "Brusttasche Rahmengröße",
- "d": "Die Größe der Brusttasche"
- },
- "frontPocketPlacement": {
- "t": "Fronttaschenplatzierung",
- "d": "Position der Fronttasche"
- },
- "frontPocketWidth": {
- "t": "Breite der Fronttasche",
- "d": "Die Breite der Fronttasche"
- },
- "frontPocketDepth": {
- "t": "Tiefe der Vordertasche",
- "d": "Die Tiefe der Fronttasche"
- },
- "frontPocketRadius": {
- "t": "Radius der Vordertasche",
- "d": "Der Radius, um den die Fronttasche gerundet ist"
- },
- "innerPocketPlacement": {
- "t": "Innentaschenplatzierung",
- "d": "Die Position der Innentasche"
- },
- "innerPocketWidth": {
- "t": "Innentaschenbreite",
- "d": "Die Breite der Innentasche"
- },
- "innerPocketDepth": {
- "t": "Innentaschentiefe",
- "d": "Die Tiefe der Innentasche"
- },
- "innerPocketWeltHeight": {
- "t": "Innentasche Rahmenhöhe",
- "d": "Die Höhe der Innentasche"
- },
- "pocketFoldover": {
- "t": "Taschenfalte",
- "d": "Der Betrag, um den sich der Hauptstoff in der Tasche befindet"
- },
- "centerFrontHemDrop": {
- "t": "Saumabfall in der Mitte",
- "d": "Der Betrag, um den der Saum zur vorderen Mitte hin abgesenkt wird"
- },
- "backVent": {
- "t": "Hinterer Gehschlitz",
- "d": "Die Anzahl der hinteren Öffnungen"
- },
- "backVentLength": {
- "t": "Hinterer Gehschlitz Länge",
- "d": "Die Länge der Hinterlüftung(en)"
- },
- "buttonLength": {
- "t": "Knopflänge",
- "d": "Die Strecke, über die Knöpfe verteilt werden"
- },
- "frontCutawayAngle": {
- "t": "Frontschnittwinkel",
- "d": "Der Winkel, unter dem die Vorderseite zum Saum hin abgeschnitten wird"
- },
- "frontCutawayStart": {
- "t": "Stern vorne",
- "d": "Die Stelle, an der sich die Vorderseite zum Saum hin öffnet"
- },
- "frontCutawayEnd": {
- "t": "Vorderes Cutaway-Ende",
- "d": "Wenn Sie diesen Wert erhöhen, bleibt der vordere Schnitt näher an der vorderen Mitte"
- },
- "collarSpread": {
- "t": "Kragen ausgebreitet",
- "d": "Der Kragenausschnitt steuert, wie der Kragen über die Schultern drapiert"
- },
- "lapelStart": {
- "t": "Revers Beginn",
- "d": "Position, wo die Mittelfront in das Revers geht"
- },
- "lapelReduction": {
- "t": "Reversverkleinerung",
- "d": "Wie weit ist die Spitze der Revers nach innen gedreht?"
- },
- "collarHeight": {
- "t": "Kragenhöhe",
- "d": "Höhe des Kragens"
- },
- "collarNotchDepth": {
- "t": "Kragentiefe",
- "d": "Tiefe der Kragenkerbe"
- },
- "collarNotchAngle": {
- "t": "Kragenwinkel",
- "d": "Winkel der Kragenkerbe"
- },
- "collarNotchReturn": {
- "t": "Kragenrückkehr",
- "d": "Wie viel Kragen kommt von der Kerbe im Vergleich zum Revers zurück?"
- },
- "rollLineCollarHeight": {
- "t": "Rollkragenhöhe",
- "d": "Wie sehr die Rollschnur den Hals umarmt"
- },
- "hemRadius": {
- "t": "Saumradius",
- "d": "Der Betrag, um den der Saum gerundet ist"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "Controls the amount of buttons"
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "Controls the amount of roll in the collar; how much the topcollar is higher than the undercollar."
- }
- }
-}
diff --git a/designs/jaeger/i18n/es.json b/designs/jaeger/i18n/es.json
deleted file mode 100644
index 153eb2ef71c..00000000000
--- a/designs/jaeger/i18n/es.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Jaeger, chaqueta",
- "d": "Jaeger es una chaqueta de estilo deportivo con dos botones y bolsillos de parche.",
- "p": {
- "backBase": "Back base",
- "chestPocketBag": "Chest pocket bag",
- "chestPocketWelt": "Chest pocket welt",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "frontBase": "Front base",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketWelt": "Inner pocket welt",
- "pocket": "Pocket",
- "pocketLining": "Pocket lining",
- "side": "Side",
- "topSleeve": "Top sleeve",
- "underCollar": "Under collar",
- "underSleeve": "Under sleeve"
- },
- "s": {},
- "o": {
- "centerBackDart": {
- "t": "Pinza en el centro de la espalda",
- "d": "Dardos en el centro de la parte trasera del cuello para acomodar una espalda redondeada"
- },
- "sleeveVentLength": {
- "t": "Longitud de la vista de la manga",
- "d": "Longitud de la vista de la manga"
- },
- "sleeveVentWidth": {
- "t": "Ancho de la vista de la manga",
- "d": "Ancho de la vista de la manga"
- },
- "chestShaping": {
- "t": "Forma del pecho",
- "d": "Cantidad de configuración a tener en cuenta para la curva del cofre"
- },
- "frontDartPlacement": {
- "t": "Colocación de la pinza delantera",
- "d": "Ubicación de las pinzas delanteras"
- },
- "frontOverlap": {
- "t": "Superposición frontal",
- "d": "Cuánto se extiende la tela más allá de los botones de cierre"
- },
- "sideFrontPlacement": {
- "t": "Colocación lateral / frontal",
- "d": "La ubicación del borde lateral / frontal"
- },
- "chestPocketDepth": {
- "t": "Profundidad del bolsillo del pecho",
- "d": "La profundidad del bolsillo del pecho"
- },
- "chestPocketWidth": {
- "t": "Ancho bolsillo del pecho",
- "d": "El ancho del bolsillo del pecho"
- },
- "chestPocketPlacement": {
- "t": "Colocación de bolsillo en el pecho",
- "d": "La ubicación del bolsillo del pecho"
- },
- "chestPocketAngle": {
- "t": "Ángulo de bolsillo del pecho",
- "d": "El ángulo bajo el cual se coloca el bolsillo del pecho"
- },
- "chestPocketWeltSize": {
- "t": "Talla de bolsillo de bolsillo",
- "d": "El tamaño de la bolsa de pecho"
- },
- "frontPocketPlacement": {
- "t": "Colocación frontal del bolsillo",
- "d": "Colocación frontal del bolsillo"
- },
- "frontPocketWidth": {
- "t": "Ancho bolsillo frontal",
- "d": "El ancho del bolsillo delantero"
- },
- "frontPocketDepth": {
- "t": "Profundidad de bolsillo frontal",
- "d": "La profundidad del bolsillo frontal"
- },
- "frontPocketRadius": {
- "t": "Radio de bolsillo delantero",
- "d": "El radio por el cual se redondea el bolsillo delantero"
- },
- "innerPocketPlacement": {
- "t": "Colocación del bolsillo interior",
- "d": "La ubicación del bolsillo interior"
- },
- "innerPocketWidth": {
- "t": "Ancho bolsillo interior",
- "d": "El ancho del bolsillo interior"
- },
- "innerPocketDepth": {
- "t": "Profundidad del bolsillo interior",
- "d": "La profundidad del bolsillo interior"
- },
- "innerPocketWeltHeight": {
- "t": "Altura interior de los bolsillos",
- "d": "La altura de la bolsa interior"
- },
- "pocketFoldover": {
- "t": "Bolsillo plegable",
- "d": "La cantidad por la cual el tejido principal es la carpeta sobre el bolsillo"
- },
- "centerFrontHemDrop": {
- "t": "Dobladillo delantero central",
- "d": "La cantidad por la que se baja el dobladillo hacia el centro delantero"
- },
- "backVent": {
- "t": "Abertura trasera",
- "d": "La cantidad de respiraderos traseros"
- },
- "backVentLength": {
- "t": "Longitud de la abertura trasera",
- "d": "La longitud de la (s) ventilación (es) posterior (es)"
- },
- "buttonLength": {
- "t": "Longitud del botón",
- "d": "La distancia sobre la cual los botones se extienden"
- },
- "frontCutawayAngle": {
- "t": "Ángulo de corte frontal",
- "d": "El ángulo bajo el cual se corta el frente hacia el dobladillo"
- },
- "frontCutawayStart": {
- "t": "Estrella de corte frontal",
- "d": "La ubicación en la que el frente comienza a abrirse hacia el dobladillo."
- },
- "frontCutawayEnd": {
- "t": "Extremo frontal cortado",
- "d": "Aumentar esto hará que el corte frontal permanezca más cerca del centro delantero"
- },
- "collarSpread": {
- "t": "Cuello extendido",
- "d": "La extensión del collar controla cómo el collar cubre los hombros"
- },
- "lapelStart": {
- "t": "Inicio de la solapa",
- "d": "Lugar donde el frente central pasa por las solapas"
- },
- "lapelReduction": {
- "t": "Reducción de la solapa",
- "d": "Cuánto gira hacia adentro la punta de las solapas"
- },
- "collarHeight": {
- "t": "Altura del collar",
- "d": "Altura del cuello"
- },
- "collarNotchDepth": {
- "t": "Profundidad de la muesca del cuello",
- "d": "Profundidad de la muesca del cuello"
- },
- "collarNotchAngle": {
- "t": "Ángulo de la muesca del cuello",
- "d": "Ángulo de la muesca del cuello"
- },
- "collarNotchReturn": {
- "t": "Cuello muesca retorno",
- "d": "Cuánto retorna el cuello de la muesca, en comparación con la solapa"
- },
- "rollLineCollarHeight": {
- "t": "Altura de cuello de línea de rodadura",
- "d": "¿Qué tanto la línea de balanceo abraza el cuello?"
- },
- "hemRadius": {
- "t": "Radio del dobladillo",
- "d": "La cantidad por la cual se redondea el dobladillo"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "Controls the amount of buttons"
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "Controls the amount of roll in the collar; how much the topcollar is higher than the undercollar."
- }
- }
-}
diff --git a/designs/jaeger/i18n/fr.json b/designs/jaeger/i18n/fr.json
deleted file mode 100644
index cb7f8920546..00000000000
--- a/designs/jaeger/i18n/fr.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Veste Jaeger",
- "d": "Jaeger est une veste de sport de style manteau avec deux boutons et des poches plaquées.",
- "p": {
- "backBase": "Back base",
- "chestPocketBag": "Chest pocket bag",
- "chestPocketWelt": "Chest pocket welt",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "frontBase": "Front base",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketWelt": "Inner pocket welt",
- "pocket": "Pocket",
- "pocketLining": "Pocket lining",
- "side": "Side",
- "topSleeve": "Top sleeve",
- "underCollar": "Under collar",
- "underSleeve": "Under sleeve"
- },
- "s": {},
- "o": {
- "centerBackDart": {
- "t": "Pinces milieu dos",
- "d": "Fléchette au centre du cou pour accommoder un dos arrondi"
- },
- "sleeveVentLength": {
- "t": "Longueur de la fente des manches",
- "d": "Longueur de la fente des manches"
- },
- "sleeveVentWidth": {
- "t": "Largeur de la fente des manches",
- "d": "Largeur de la fente des manches"
- },
- "chestShaping": {
- "t": "Courbe du col poitrine",
- "d": "Quantité de mise en forme pour la courbe de la poitrine"
- },
- "frontDartPlacement": {
- "t": "Emplacement des pinces devant",
- "d": "Emplacement des pinces devant"
- },
- "frontOverlap": {
- "t": "Chevauchement avant",
- "d": "Taux de chevauchement du pan des boutonnières vers le pan des boutons (largeur de la croisure)"
- },
- "sideFrontPlacement": {
- "t": "Placement latéral/avant",
- "d": "L'emplacement de la séparation côté / devant"
- },
- "chestPocketDepth": {
- "t": "Profondeur de la poche de poitrine",
- "d": "La profondeur de la poche de poitrine"
- },
- "chestPocketWidth": {
- "t": "Largeur de la poche poitrine",
- "d": "Largeur de la poche poitrine"
- },
- "chestPocketPlacement": {
- "t": "Emplacement poche de poitrine",
- "d": "L'emplacement de la poche de poitrine"
- },
- "chestPocketAngle": {
- "t": "Angle de poche de poitrine",
- "d": "Angle d'inclinaison de la poche de poitrine"
- },
- "chestPocketWeltSize": {
- "t": "Taille du revers de la poche poitrine",
- "d": "La taille du revers de la poche de poitrine"
- },
- "frontPocketPlacement": {
- "t": "Emplacement des poches avant",
- "d": "Positionnement des poches avant"
- },
- "frontPocketWidth": {
- "t": "Largeur des poches avant",
- "d": "La largeur des poches avant"
- },
- "frontPocketDepth": {
- "t": "Profondeur des poches avant",
- "d": "La profondeur des poches avant"
- },
- "frontPocketRadius": {
- "t": "Arrondi des poches avant",
- "d": "Le rayon par lequel la poche avant est arrondie"
- },
- "innerPocketPlacement": {
- "t": "Placement de la poche intérieure",
- "d": "L'emplacement de la poche intérieure"
- },
- "innerPocketWidth": {
- "t": "Largeur de la poche intérieure",
- "d": "La largeur de la poche intérieure"
- },
- "innerPocketDepth": {
- "t": "Profondeur de la poche intérieure",
- "d": "La profondeur de la poche intérieure"
- },
- "innerPocketWeltHeight": {
- "t": "Hauteur du revers de la poche intérieure",
- "d": "La hauteur du revers de la poche intérieure"
- },
- "pocketFoldover": {
- "t": "Recouvrement de la poche",
- "d": "Montant de recouvrement du tissu principal sur la poche"
- },
- "centerFrontHemDrop": {
- "t": "Décalage de la longueur à l'avant",
- "d": "La valeur par laquelle la longueur de l'avant est abaissée"
- },
- "backVent": {
- "t": "Fente dos",
- "d": "Nombre de fentes à l'arrière"
- },
- "backVentLength": {
- "t": "Longueur de la fente arrière",
- "d": "La longueur du ou des fente(s) arrière(s)"
- },
- "buttonLength": {
- "t": "Longueur de boutonnage",
- "d": "La distance sur laquelle les boutons sont répartis"
- },
- "frontCutawayAngle": {
- "t": "Angle de coupe avant",
- "d": "L'angle de découpe du pan avant"
- },
- "frontCutawayStart": {
- "t": "Départ de l'arrondi de coupe avant",
- "d": "L'endroit où le pan de la veste commence à s'ouvrir vers l'ourlet du bas"
- },
- "frontCutawayEnd": {
- "t": "Fin de l'arrondi de coupe avant",
- "d": "En augmentant cette valeur, l'arrondi du pan se terminera plus proche du milieu devant"
- },
- "collarSpread": {
- "t": "Écartement du col",
- "d": "L'écartement du col contrôle la position des pointes du col - plus c'est grand, plus elles seront vers les épaules"
- },
- "lapelStart": {
- "t": "Début des revers",
- "d": "Emplacement où les revers démarrent sur le milieu devant"
- },
- "lapelReduction": {
- "t": "Réduction de revers",
- "d": "Combien la pointe des revers se réduit vers l'intérieur"
- },
- "collarHeight": {
- "t": "Hauteur du col",
- "d": "Hauteur du col"
- },
- "collarNotchDepth": {
- "t": "Profondeur du col cranté",
- "d": "Profondeur du col cranté"
- },
- "collarNotchAngle": {
- "t": "Angle du col cranté",
- "d": "Angle du col cranté"
- },
- "collarNotchReturn": {
- "t": "Revers du col cranté",
- "d": "Combien le col dépasse du cran, par rapport au revers du bas"
- },
- "rollLineCollarHeight": {
- "t": "Hauteur de la ligne de cassure du col",
- "d": "Combien la ligne de cassure épouse le cou"
- },
- "hemRadius": {
- "t": "Rayon d'ourlet",
- "d": "Le montant par lequel l'ourlet est arrondi"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "Controls the amount of buttons"
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "Controls the amount of roll in the collar; how much the topcollar is higher than the undercollar."
- }
- }
-}
diff --git a/designs/jaeger/i18n/index.mjs b/designs/jaeger/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/jaeger/i18n/index.mjs
+++ b/designs/jaeger/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/jaeger/i18n/nl.json b/designs/jaeger/i18n/nl.json
deleted file mode 100644
index 7991c43f8f2..00000000000
--- a/designs/jaeger/i18n/nl.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Jaeger jasje",
- "d": "Jaeger is a sport coat style jacket with two buttons and patch pockets.",
- "p": {
- "backBase": "Back base",
- "chestPocketBag": "Chest pocket bag",
- "chestPocketWelt": "Chest pocket welt",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "frontBase": "Front base",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketWelt": "Inner pocket welt",
- "pocket": "Pocket",
- "pocketLining": "Pocket lining",
- "side": "Side",
- "topSleeve": "Top sleeve",
- "underCollar": "Under collar",
- "underSleeve": "Under sleeve"
- },
- "s": {},
- "o": {
- "centerBackDart": {
- "t": "Middenrug neep",
- "d": "Neep midden in het midden van je nek om een afgeronde rug op te vangen"
- },
- "sleeveVentLength": {
- "t": "Lengte mouwvent",
- "d": "De lengte van de mouwvent"
- },
- "sleeveVentWidth": {
- "t": "Breedte mouwvent",
- "d": "De breedte van de mouwvent"
- },
- "chestShaping": {
- "t": "Borstvorming",
- "d": "Hoeveelheid vormgeving voor de borstcurve"
- },
- "frontDartPlacement": {
- "t": "Plaatsing neep vooraan",
- "d": "Locatie van de nepen vooraan"
- },
- "frontOverlap": {
- "t": "Overlap voorzijde",
- "d": "De mate waaarin de stof verder reikt dat de sluitingsknopen"
- },
- "sideFrontPlacement": {
- "t": "Voor/Zijkant plaatsing",
- "d": "De grens tussen het voor en zij paneel"
- },
- "chestPocketDepth": {
- "t": "Borstzakdiepte",
- "d": "De diepte van de borstzak"
- },
- "chestPocketWidth": {
- "t": "Borstzakbreedte",
- "d": "De breedte van de borstzak"
- },
- "chestPocketPlacement": {
- "t": "Plaatsting borstzak",
- "d": "De locatie van de borszak"
- },
- "chestPocketAngle": {
- "t": "Hoek borstzak",
- "d": "De hoek van de borstzak"
- },
- "chestPocketWeltSize": {
- "t": "Afmeting paspel borstzak",
- "d": "Grootte van de paspel van de borstzak"
- },
- "frontPocketPlacement": {
- "t": "Plaatsing voorzak",
- "d": "Plaatsing van de zakken"
- },
- "frontPocketWidth": {
- "t": "Breedte voorzak",
- "d": "Breedte van de zakken"
- },
- "frontPocketDepth": {
- "t": "Diepte zak",
- "d": "Diepte van de zakken"
- },
- "frontPocketRadius": {
- "t": "Ronding zak",
- "d": "De mate waarin de zakken zijn afgerond"
- },
- "innerPocketPlacement": {
- "t": "Plaatsing binnenzak",
- "d": "De locatie van de binnenzakken"
- },
- "innerPocketWidth": {
- "t": "Breedte binnenzak",
- "d": "De breedte van de binnenzakken"
- },
- "innerPocketDepth": {
- "t": "Diepte binnenzak",
- "d": "De diepte van de binnenzakken"
- },
- "innerPocketWeltHeight": {
- "t": "Paspel binnenzak",
- "d": "de maat van de paspel van de binnenzakken"
- },
- "pocketFoldover": {
- "t": "Zak overvouw",
- "d": "De mate waarin de hoofstof doorloopt binnenin de zakken"
- },
- "centerFrontHemDrop": {
- "t": "Verlaging zoom vooraan",
- "d": "De mate waarin de zoom vooraan verlaagd is"
- },
- "backVent": {
- "t": "Split achter",
- "d": "Het aantal vents achteraan"
- },
- "backVentLength": {
- "t": "Lengte split achter",
- "d": "De lengte van de vent(s) achteraan"
- },
- "buttonLength": {
- "t": "Lengte knopen",
- "d": "De lengte waarover de knopen zijn gespreid"
- },
- "frontCutawayAngle": {
- "t": "Hoek uitsnijding vooraan",
- "d": "De hoek waaronder de voorzijde wordt weggesneden naar de zoom toe"
- },
- "frontCutawayStart": {
- "t": "Start uitsnijding vooraan",
- "d": "De plaats waar de voorzijde begint te verlopen naar de zoom toe"
- },
- "frontCutawayEnd": {
- "t": "Einde uitsnijding vooraan",
- "d": "Door dit te verhogen blijft de verloping vooraan bij het midden"
- },
- "collarSpread": {
- "t": "Spreiding kraag",
- "d": "De kraagspreiding bepaalt hoe de kraag over de schouders valt"
- },
- "lapelStart": {
- "t": "Start revers",
- "d": "Start van de revers"
- },
- "lapelReduction": {
- "t": "Reductie revers",
- "d": "Mate waarin het einde van de revers weer inwaards keren"
- },
- "collarHeight": {
- "t": "Hoogte kraag",
- "d": "De hoogte van de kraag"
- },
- "collarNotchDepth": {
- "t": "Diepte inkeping kraag",
- "d": "Diepte van de inkeping van de kraag"
- },
- "collarNotchAngle": {
- "t": "Hoek inkeping kraag",
- "d": "Hoek van de inkeping van de kraag"
- },
- "collarNotchReturn": {
- "t": "Kraag inkeping terugloop",
- "d": "De mate waarin de kraag terugkomt na de inkeping, in vergelijking met de revers"
- },
- "rollLineCollarHeight": {
- "t": "Rollijn kraaghoogte",
- "d": "Hoeveel de kraag de nek omhelst"
- },
- "hemRadius": {
- "t": "Straal zoom",
- "d": "De mate waarin de zoom is afgerond"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "Controls the amount of buttons"
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "Controls the amount of roll in the collar; how much the topcollar is higher than the undercollar."
- }
- }
-}
diff --git a/designs/jaeger/i18n/uk.json b/designs/jaeger/i18n/uk.json
deleted file mode 100644
index c5aa613d6d5..00000000000
--- a/designs/jaeger/i18n/uk.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Jaeger jacket",
- "d": "Jaeger is a sport coat style jacket with two buttons and patch pockets.",
- "p": {
- "backBase": "Back base",
- "chestPocketBag": "Chest pocket bag",
- "chestPocketWelt": "Chest pocket welt",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "frontBase": "Front base",
- "innerPocketBag": "Inner pocket bag",
- "innerPocketWelt": "Inner pocket welt",
- "pocket": "Pocket",
- "pocketLining": "Pocket lining",
- "side": "Side",
- "topSleeve": "Top sleeve",
- "underCollar": "Under collar",
- "underSleeve": "Under sleeve"
- },
- "s": {},
- "o": {
- "centerBackDart": {
- "t": "Center back dart",
- "d": "Dart at the center back of your neck to accommodate a rounded back"
- },
- "sleeveVentLength": {
- "t": "Sleeve vent length",
- "d": "Length of the sleeve vent"
- },
- "sleeveVentWidth": {
- "t": "Sleeve vent width",
- "d": "Width of the sleeve vent"
- },
- "chestShaping": {
- "t": "Chest shaping",
- "d": "Amount of shaping to accommodate for the chest curve"
- },
- "frontDartPlacement": {
- "t": "Front dart placement",
- "d": "Location of the front darts"
- },
- "frontOverlap": {
- "t": "Front overlap",
- "d": "How far the fabric extends beyond the closing buttons"
- },
- "sideFrontPlacement": {
- "t": "Side/Front placement",
- "d": "The location of the side/front boundary"
- },
- "chestPocketDepth": {
- "t": "Chest pocket depth",
- "d": "The depth of the chest pocket"
- },
- "chestPocketWidth": {
- "t": "Chest pocket width",
- "d": "The width of the chest pocket"
- },
- "chestPocketPlacement": {
- "t": "Chest pocket placement",
- "d": "The location of the chest pocket"
- },
- "chestPocketAngle": {
- "t": "Chest pocket angle",
- "d": "The angle under which the chest pocket is placed"
- },
- "chestPocketWeltSize": {
- "t": "Chest pocket welt size",
- "d": "The size of the chest pocket welt"
- },
- "frontPocketPlacement": {
- "t": "Front pocket placement",
- "d": "Location of the front pocket"
- },
- "frontPocketWidth": {
- "t": "Front pocket width",
- "d": "The width of the front pocket"
- },
- "frontPocketDepth": {
- "t": "Front pocket depth",
- "d": "The depth of the front pocket"
- },
- "frontPocketRadius": {
- "t": "Front pocket radius",
- "d": "The radius by which the front pocket is rounded"
- },
- "innerPocketPlacement": {
- "t": "Inner pocket placement",
- "d": "The location of the inner pocket"
- },
- "innerPocketWidth": {
- "t": "Inner pocket width",
- "d": "The width of the inner pocket"
- },
- "innerPocketDepth": {
- "t": "Inner pocket depth",
- "d": "The depth of the inner pocket"
- },
- "innerPocketWeltHeight": {
- "t": "Inner pocket welt height",
- "d": "The height of the inner pocket welt"
- },
- "pocketFoldover": {
- "t": "Pocket fold-over",
- "d": "The amount by which the main fabric is folder over into the pocket"
- },
- "centerFrontHemDrop": {
- "t": "Center front hem drop",
- "d": "The amount by which the hem is lowered towards the center front"
- },
- "backVent": {
- "t": "Back vent",
- "d": "The amount of back vents"
- },
- "backVentLength": {
- "t": "Back vent length",
- "d": "The length of the back vent(s)"
- },
- "buttonLength": {
- "t": "Button length",
- "d": "The distance over which buttons are spread"
- },
- "frontCutawayAngle": {
- "t": "Front cutaway angle",
- "d": "The angle under which the front is cut away towards the hem"
- },
- "frontCutawayStart": {
- "t": "Front cutaway start",
- "d": "The location at which the front starts opening up towards the hem"
- },
- "frontCutawayEnd": {
- "t": "Front cutaway end",
- "d": "Increasing this will make the front cutaway stay closer to the center front"
- },
- "collarSpread": {
- "t": "Collar spread",
- "d": "The collar spread controls how the collar drapes over the shoulders"
- },
- "lapelStart": {
- "t": "Lapel start",
- "d": "Location where the center front goes over into the lapels"
- },
- "lapelReduction": {
- "t": "Lapel reduction",
- "d": "How much the tip of the lapels turns inwards"
- },
- "collarHeight": {
- "t": "Collar height",
- "d": "Height of the collar"
- },
- "collarNotchDepth": {
- "t": "Collar notch depth",
- "d": "Depth of the collar notch"
- },
- "collarNotchAngle": {
- "t": "Collar notch angle",
- "d": "Angle of the collar notch"
- },
- "collarNotchReturn": {
- "t": "Collar notch return",
- "d": "How much the collar returns from the notch, in comparison to the lapel"
- },
- "rollLineCollarHeight": {
- "t": "Roll-line collar height",
- "d": "How much the roll-line hugs the neck"
- },
- "hemRadius": {
- "t": "Hem radius",
- "d": "The amount by which the hem is rounded"
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at your waist"
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "Controls the amount of buttons"
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "Controls the amount of roll in the collar; how much the topcollar is higher than the undercollar."
- }
- }
-}
diff --git a/designs/jaeger/package.json b/designs/jaeger/package.json
index 44caaab57dc..613c0d46ee2 100644
--- a/designs/jaeger/package.json
+++ b/designs/jaeger/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/jaeger",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a sport coat style jacket",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,51 +25,42 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/bent": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/bent": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/jaeger/src/index.mjs b/designs/jaeger/src/index.mjs
index bff991865a4..3f2c88bc501 100644
--- a/designs/jaeger/src/index.mjs
+++ b/designs/jaeger/src/index.mjs
@@ -1,7 +1,7 @@
import { Design, mergeI18n } from '@freesewing/core'
import { i18n as bentI18n } from '@freesewing/bent'
import { i18n as jaegerI18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { backBase } from './backbase.mjs'
import { frontBase } from './frontbase.mjs'
import { side } from './side.mjs'
@@ -22,7 +22,7 @@ import { frontLining } from './front-lining.mjs'
// Setup our new design
const Jaeger = new Design({
- data,
+ data: about,
parts: [
backBase,
frontBase,
@@ -68,4 +68,5 @@ export {
innerPocketWelt,
Jaeger,
i18n,
+ about,
}
diff --git a/designs/jaeger/tests/shared.test.mjs b/designs/jaeger/tests/shared.test.mjs
index b9b99fc527b..42ba86afab0 100644
--- a/designs/jaeger/tests/shared.test.mjs
+++ b/designs/jaeger/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Jaeger, i18n } from '../src/index.mjs'
+import { Jaeger, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Jaeger)
+testPatternConfig(Jaeger, about)
// Test translation
testPatternI18n(Jaeger, i18n)
diff --git a/designs/jane/README.md b/designs/jane/README.md
index 1965c97ac07..59487753a8c 100644
--- a/designs/jane/README.md
+++ b/designs/jane/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/jane
@@ -59,7 +44,7 @@ A FreeSewing pattern for a 1790s shift
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/jane/data.mjs b/designs/jane/data.mjs
deleted file mode 100644
index 075ca5f203a..00000000000
--- a/designs/jane/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/jane'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/jane/i18n/de.json b/designs/jane/i18n/de.json
deleted file mode 100644
index 3cf0748914a..00000000000
--- a/designs/jane/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Jane",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/jane/i18n/es.json b/designs/jane/i18n/es.json
deleted file mode 100644
index 3cf0748914a..00000000000
--- a/designs/jane/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Jane",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/jane/i18n/fr.json b/designs/jane/i18n/fr.json
deleted file mode 100644
index 3cf0748914a..00000000000
--- a/designs/jane/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Jane",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/jane/i18n/index.mjs b/designs/jane/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/jane/i18n/index.mjs
+++ b/designs/jane/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/jane/i18n/nl.json b/designs/jane/i18n/nl.json
deleted file mode 100644
index 3cf0748914a..00000000000
--- a/designs/jane/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Jane",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/jane/i18n/uk.json b/designs/jane/i18n/uk.json
deleted file mode 100644
index 3cf0748914a..00000000000
--- a/designs/jane/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Jane",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/jane/package.json b/designs/jane/package.json
index 00104f0fb00..277099c46ec 100644
--- a/designs/jane/package.json
+++ b/designs/jane/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/jane",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a 1790s shift",
"author": "SeaZeeZee (https://github.com/SeaZeeZee)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/jane/src/index.mjs b/designs/jane/src/index.mjs
index 1e9cb535531..208ce102acf 100644
--- a/designs/jane/src/index.mjs
+++ b/designs/jane/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { body } from './body.mjs'
import { sleeve } from './sleeve.mjs'
import { gusset } from './gusset.mjs'
@@ -7,8 +7,8 @@ import { i18n } from '../i18n/index.mjs'
// Create new design
const Jane = new Design({
- data,
+ data: about,
parts: [body, sleeve, gusset],
})
-export { body, sleeve, gusset, i18n, Jane }
+export { body, sleeve, gusset, Jane, i18n, about }
diff --git a/designs/jane/src/sleeve.mjs b/designs/jane/src/sleeve.mjs
index a226f963262..d95e18e48fb 100644
--- a/designs/jane/src/sleeve.mjs
+++ b/designs/jane/src/sleeve.mjs
@@ -1,8 +1,10 @@
+import { pctBasedOn } from '@freesewing/core'
+
export const sleeve = {
name: 'jane.sleeve',
measurements: ['biceps', 'shoulderToElbow'],
options: {
- bicepsEase: { pct: 18, min: 18, max: 51, menu: 'fit' },
+ bicepsEase: { pct: 18, min: 18, max: 51, ...pctBasedOn('biceps'), menu: 'fit' },
sleeveLength: { pct: 80, min: 60, max: 100, menu: 'style' },
},
diff --git a/designs/jane/tests/shared.test.mjs b/designs/jane/tests/shared.test.mjs
index 02068edb011..6a5b897115f 100644
--- a/designs/jane/tests/shared.test.mjs
+++ b/designs/jane/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Jane, i18n } from '../src/index.mjs'
+import { Jane, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Jane)
+testPatternConfig(Jane, about)
// Test translation
testPatternI18n(Jane, i18n)
diff --git a/designs/legend/README.md b/designs/legend/README.md
index ae13ce79014..2d07c515808 100644
--- a/designs/legend/README.md
+++ b/designs/legend/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/legend
@@ -59,7 +44,7 @@ A FreeSewing pattern to document pattern notation
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/legend/data.mjs b/designs/legend/data.mjs
deleted file mode 100644
index c2811a3d137..00000000000
--- a/designs/legend/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/legend'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/legend/i18n/de.json b/designs/legend/i18n/de.json
deleted file mode 100644
index d9ff1b4cb2d..00000000000
--- a/designs/legend/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Legend",
- "d": "A FreeSewing pattern used in our documentation to illustrate pattern notations",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/legend/i18n/es.json b/designs/legend/i18n/es.json
deleted file mode 100644
index d9ff1b4cb2d..00000000000
--- a/designs/legend/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Legend",
- "d": "A FreeSewing pattern used in our documentation to illustrate pattern notations",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/legend/i18n/fr.json b/designs/legend/i18n/fr.json
deleted file mode 100644
index d9ff1b4cb2d..00000000000
--- a/designs/legend/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Legend",
- "d": "A FreeSewing pattern used in our documentation to illustrate pattern notations",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/legend/i18n/index.mjs b/designs/legend/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/legend/i18n/index.mjs
+++ b/designs/legend/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/legend/i18n/nl.json b/designs/legend/i18n/nl.json
deleted file mode 100644
index d9ff1b4cb2d..00000000000
--- a/designs/legend/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Legend",
- "d": "A FreeSewing pattern used in our documentation to illustrate pattern notations",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/legend/i18n/uk.json b/designs/legend/i18n/uk.json
deleted file mode 100644
index d9ff1b4cb2d..00000000000
--- a/designs/legend/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Legend",
- "d": "A FreeSewing pattern used in our documentation to illustrate pattern notations",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/legend/package.json b/designs/legend/package.json
index ab235513886..25a589f1a29 100644
--- a/designs/legend/package.json
+++ b/designs/legend/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/legend",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern to document pattern notation",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/legend/src/index.mjs b/designs/legend/src/index.mjs
index f0afbbc669e..e52b7223d2f 100644
--- a/designs/legend/src/index.mjs
+++ b/designs/legend/src/index.mjs
@@ -1,5 +1,4 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
import { i18n } from '../i18n/index.mjs'
import { fabricLines, saLines, otherLines, lineWidths, lineStrokes } from './lines.mjs'
import { notches } from './notches.mjs'
@@ -17,7 +16,6 @@ import { sa } from './sa.mjs'
// Setup our new design
const Legend = new Design({
- data,
parts: [
fabricLines,
saLines,
diff --git a/designs/legend/tests/shared.test.mjs b/designs/legend/tests/shared.test.mjs
index 722c092e1f3..eb64038ef36 100644
--- a/designs/legend/tests/shared.test.mjs
+++ b/designs/legend/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Legend, i18n } from '../src/index.mjs'
+import { Legend, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Legend)
+testPatternConfig(Legend, about)
// Test translation
testPatternI18n(Legend, i18n)
diff --git a/designs/lily/README.md b/designs/lily/README.md
index 11c6ba23ee5..3dea2bcb11d 100644
--- a/designs/lily/README.md
+++ b/designs/lily/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/lily
@@ -59,7 +44,7 @@ A FreeSewing pattern for basic leggings
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/lily/data.mjs b/designs/lily/data.mjs
deleted file mode 100644
index 660ffa9242d..00000000000
--- a/designs/lily/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/lily'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/lily/i18n/de.json b/designs/lily/i18n/de.json
deleted file mode 100644
index 185dfb452be..00000000000
--- a/designs/lily/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lily",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lily/i18n/es.json b/designs/lily/i18n/es.json
deleted file mode 100644
index 185dfb452be..00000000000
--- a/designs/lily/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lily",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lily/i18n/fr.json b/designs/lily/i18n/fr.json
deleted file mode 100644
index 185dfb452be..00000000000
--- a/designs/lily/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lily",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lily/i18n/index.mjs b/designs/lily/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/lily/i18n/index.mjs
+++ b/designs/lily/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/lily/i18n/nl.json b/designs/lily/i18n/nl.json
deleted file mode 100644
index 185dfb452be..00000000000
--- a/designs/lily/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lily",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lily/i18n/uk.json b/designs/lily/i18n/uk.json
deleted file mode 100644
index 185dfb452be..00000000000
--- a/designs/lily/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lily",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lily/package.json b/designs/lily/package.json
index 9acb5f50312..14c619abf73 100644
--- a/designs/lily/package.json
+++ b/designs/lily/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/lily",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for basic leggings",
"author": "Anna Puk (https://github.com/anna-puk)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/titan": "3.3.0-rc.1",
- "@freesewing/paco": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/titan": "4.0.0",
+ "@freesewing/paco": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/lily/src/back.mjs b/designs/lily/src/back.mjs
index 7e356a2d51e..51bc58b42ec 100644
--- a/designs/lily/src/back.mjs
+++ b/designs/lily/src/back.mjs
@@ -1,4 +1,5 @@
import { back as titanBack } from '@freesewing/titan'
+import { pctBasedOn } from '@freesewing/core'
function draftLilyBack({
points,
@@ -569,9 +570,9 @@ export const back = {
crotchDrop: { pct: 0, min: 0, max: 15, menu: 'advanced' }, // 'downgrade' to advanced menu
waistHeight: { ...titanBack.options.waistHeight, pct: 50 }, // halfway between waist and hips
fabricStretch: { pct: 40, min: 0, max: 50, menu: 'fit' },
- waistEase: { pct: -4, min: -20, max: 0, menu: 'fit' }, // -fabricStretch/10,
- seatEase: { pct: -4, min: -20, max: 0, menu: 'fit' }, // -fabricStretch/10,
- kneeEase: { pct: -4, min: -20, max: 0, menu: 'fit' }, // -fabricStretch/10,
+ waistEase: { pct: -4, min: -20, max: 0, ...pctBasedOn('waist'), menu: 'fit' }, // -fabricStretch/10,
+ seatEase: { pct: -4, min: -20, max: 0, ...pctBasedOn('seat'), menu: 'fit' }, // -fabricStretch/10,
+ kneeEase: { pct: -4, min: -20, max: 0, ...pctBasedOn('knee'), menu: 'fit' }, // -fabricStretch/10,
lengthBonus: 0,
lengthReduction: {
pct: 0,
diff --git a/designs/lily/src/index.mjs b/designs/lily/src/index.mjs
index 1a831522031..d0943c002bf 100644
--- a/designs/lily/src/index.mjs
+++ b/designs/lily/src/index.mjs
@@ -1,6 +1,6 @@
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { front } from './front.mjs'
import { back } from './back.mjs'
@@ -8,9 +8,9 @@ import { waistband } from './waistband.mjs'
// Create new design
const Lily = new Design({
- data,
+ data: about,
parts: [front, back, waistband],
})
// Named exports
-export { front, back, waistband, i18n, Lily }
+export { front, back, waistband, Lily, i18n, about }
diff --git a/designs/lily/tests/shared.test.mjs b/designs/lily/tests/shared.test.mjs
index e587224479e..c1b276cd327 100644
--- a/designs/lily/tests/shared.test.mjs
+++ b/designs/lily/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Lily, i18n } from '../src/index.mjs'
+import { Lily, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Lily)
+testPatternConfig(Lily, about)
// Test translation
testPatternI18n(Lily, i18n)
diff --git a/designs/lucy/README.md b/designs/lucy/README.md
index dcddf45fda8..aaf14378aed 100644
--- a/designs/lucy/README.md
+++ b/designs/lucy/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/lucy
@@ -59,7 +44,7 @@ A FreeSewing pattern for a historical tie-on pocket
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/lucy/data.mjs b/designs/lucy/data.mjs
deleted file mode 100644
index d9d12a327a0..00000000000
--- a/designs/lucy/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/lucy'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/lucy/i18n/de.json b/designs/lucy/i18n/de.json
deleted file mode 100644
index b805004dfa7..00000000000
--- a/designs/lucy/i18n/de.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lucy, die Umbindetasche",
- "d": "Lucy ist eine historische Tasche, die du um deine Taille binden kannst.",
- "p": {
- "pocket": "Tasche"
- },
- "s": {},
- "o": {
- "width": {
- "t": "Breite",
- "d": "Breite der Tasche"
- },
- "length": {
- "t": "Länge",
- "d": "Länge (Tiefe) der Tasche"
- },
- "edge": {
- "t": "Abschrägung",
- "d": "Steuert, wie sehr die Öffnung der Tasche nach innen abgeschrägt ist"
- }
- }
-}
diff --git a/designs/lucy/i18n/es.json b/designs/lucy/i18n/es.json
deleted file mode 100644
index 5f769579e46..00000000000
--- a/designs/lucy/i18n/es.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lucy tie-on pocket",
- "d": "Lucy is a historical pocket that you can tie around your waist.",
- "p": {
- "pocket": "Bolsillo"
- },
- "s": {},
- "o": {
- "width": {
- "t": "Anchura",
- "d": "Width of the pocket"
- },
- "length": {
- "t": "Longitud",
- "d": "Length (depth) of the pocket"
- },
- "edge": {
- "t": "Taper",
- "d": "Controls how much the pocket opening tapers inwards"
- }
- }
-}
diff --git a/designs/lucy/i18n/fr.json b/designs/lucy/i18n/fr.json
deleted file mode 100644
index 7a286ae77fc..00000000000
--- a/designs/lucy/i18n/fr.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Poche à nouer Lucy",
- "d": "Lucy est une poche historique que vous pouvez nouer autour de votre taille.",
- "p": {
- "pocket": "Poche"
- },
- "s": {},
- "o": {
- "width": {
- "t": "Largeur",
- "d": "Largeur de la poche"
- },
- "length": {
- "t": "Longueur",
- "d": "Longueur (profondeur) de la poche"
- },
- "edge": {
- "t": "Rétrécissement",
- "d": "Contrôle comment l'ouverture de la poche rétrécie à l'intérieur"
- }
- }
-}
diff --git a/designs/lucy/i18n/index.mjs b/designs/lucy/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/lucy/i18n/index.mjs
+++ b/designs/lucy/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/lucy/i18n/nl.json b/designs/lucy/i18n/nl.json
deleted file mode 100644
index 4506c00190b..00000000000
--- a/designs/lucy/i18n/nl.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lucy tie-on pocket",
- "d": "Lucy is a historical pocket that you can tie around your waist.",
- "p": {
- "pocket": "Zak"
- },
- "s": {},
- "o": {
- "width": {
- "t": "Breedte",
- "d": "Width of the pocket"
- },
- "length": {
- "t": "Lengte",
- "d": "Length (depth) of the pocket"
- },
- "edge": {
- "t": "Taper",
- "d": "Controls how much the pocket opening tapers inwards"
- }
- }
-}
diff --git a/designs/lucy/i18n/uk.json b/designs/lucy/i18n/uk.json
deleted file mode 100644
index 3036fd2a5cb..00000000000
--- a/designs/lucy/i18n/uk.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lucy tie-on pocket",
- "d": "Lucy is a historical pocket that you can tie around your waist.",
- "p": {
- "pocket": "Pocket"
- },
- "s": {},
- "o": {
- "width": {
- "t": "Width",
- "d": "Width of the pocket"
- },
- "length": {
- "t": "Length",
- "d": "Length (depth) of the pocket"
- },
- "edge": {
- "t": "Taper",
- "d": "Controls how much the pocket opening tapers inwards"
- }
- }
-}
diff --git a/designs/lucy/package.json b/designs/lucy/package.json
index fc0b02cd5bc..c3dfdeec6e3 100644
--- a/designs/lucy/package.json
+++ b/designs/lucy/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/lucy",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a historical tie-on pocket",
"author": "SeaZeeZee (https://github.com/SeaZeeZee)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/lucy/src/index.mjs b/designs/lucy/src/index.mjs
index a837aa5f514..6554ddd71b7 100644
--- a/designs/lucy/src/index.mjs
+++ b/designs/lucy/src/index.mjs
@@ -1,10 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { pocket } from './pocket.mjs'
// Setup our new design
-const Lucy = new Design({ data, parts: [pocket] })
+const Lucy = new Design({
+ data: about,
+ parts: [pocket],
+})
// Named exports
-export { pocket, Lucy, i18n }
+export { pocket, Lucy, i18n, about }
diff --git a/designs/lucy/tests/shared.test.mjs b/designs/lucy/tests/shared.test.mjs
index c9c1ad22f24..ddef3acae05 100644
--- a/designs/lucy/tests/shared.test.mjs
+++ b/designs/lucy/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Lucy, i18n } from '../src/index.mjs'
+import { Lucy, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Lucy)
+testPatternConfig(Lucy, about)
// Test translation
testPatternI18n(Lucy, i18n)
diff --git a/designs/lumina/README.md b/designs/lumina/README.md
index 2250fadc29f..3b44b474605 100644
--- a/designs/lumina/README.md
+++ b/designs/lumina/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/lumina
@@ -59,7 +44,7 @@ A FreeSewing pattern for leggings
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/lumina/data.mjs b/designs/lumina/data.mjs
deleted file mode 100644
index ab5827cc8b3..00000000000
--- a/designs/lumina/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/lumina'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/lumina/i18n/de.json b/designs/lumina/i18n/de.json
deleted file mode 100644
index 8cf0182cebd..00000000000
--- a/designs/lumina/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumina",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumina/i18n/es.json b/designs/lumina/i18n/es.json
deleted file mode 100644
index 8cf0182cebd..00000000000
--- a/designs/lumina/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumina",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumina/i18n/fr.json b/designs/lumina/i18n/fr.json
deleted file mode 100644
index 8cf0182cebd..00000000000
--- a/designs/lumina/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumina",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumina/i18n/index.mjs b/designs/lumina/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/lumina/i18n/index.mjs
+++ b/designs/lumina/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/lumina/i18n/nl.json b/designs/lumina/i18n/nl.json
deleted file mode 100644
index 8cf0182cebd..00000000000
--- a/designs/lumina/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumina",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumina/i18n/uk.json b/designs/lumina/i18n/uk.json
deleted file mode 100644
index 8cf0182cebd..00000000000
--- a/designs/lumina/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumina",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumina/package.json b/designs/lumina/package.json
index 9b4cb6bbb8d..351eca3bf58 100644
--- a/designs/lumina/package.json
+++ b/designs/lumina/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/lumina",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for leggings",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/lumina/src/index.mjs b/designs/lumina/src/index.mjs
index 85f68e79c47..c3dc8dcd600 100644
--- a/designs/lumina/src/index.mjs
+++ b/designs/lumina/src/index.mjs
@@ -1,8 +1,6 @@
-//
-
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { shape } from './shape.mjs'
import { panel } from './panel.mjs'
@@ -12,9 +10,9 @@ import { waistband } from './waistband.mjs'
// Create new design
const Lumina = new Design({
- data,
+ data: about,
parts: [shape, panel, leg, waistband, pocket],
})
// Named exports
-export { i18n, Lumina, shape, panel, leg, waistband, pocket }
+export { shape, panel, leg, waistband, pocket, Lumina, i18n, about }
diff --git a/designs/lumina/tests/shared.test.mjs b/designs/lumina/tests/shared.test.mjs
index 36dafb5c605..f9241bc30fa 100644
--- a/designs/lumina/tests/shared.test.mjs
+++ b/designs/lumina/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Lumina, i18n } from '../src/index.mjs'
+import { Lumina, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Lumina)
+testPatternConfig(Lumina, about)
// Test translation
testPatternI18n(Lumina, i18n)
diff --git a/designs/lumira/README.md b/designs/lumira/README.md
index 6dd25d9ec4a..c2f7a1a7f28 100644
--- a/designs/lumira/README.md
+++ b/designs/lumira/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/lumira
@@ -59,7 +44,7 @@ A FreeSewing pattern for leggings
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/lumira/data.mjs b/designs/lumira/data.mjs
deleted file mode 100644
index 078f82a6dcc..00000000000
--- a/designs/lumira/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/lumira'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/lumira/i18n/de.json b/designs/lumira/i18n/de.json
deleted file mode 100644
index 77cc756d4dd..00000000000
--- a/designs/lumira/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumira",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumira/i18n/es.json b/designs/lumira/i18n/es.json
deleted file mode 100644
index 77cc756d4dd..00000000000
--- a/designs/lumira/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumira",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumira/i18n/fr.json b/designs/lumira/i18n/fr.json
deleted file mode 100644
index 77cc756d4dd..00000000000
--- a/designs/lumira/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumira",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumira/i18n/index.mjs b/designs/lumira/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/lumira/i18n/index.mjs
+++ b/designs/lumira/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/lumira/i18n/nl.json b/designs/lumira/i18n/nl.json
deleted file mode 100644
index 77cc756d4dd..00000000000
--- a/designs/lumira/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumira",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumira/i18n/uk.json b/designs/lumira/i18n/uk.json
deleted file mode 100644
index 77cc756d4dd..00000000000
--- a/designs/lumira/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Lumira",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/lumira/package.json b/designs/lumira/package.json
index 5e7b56b697f..96445fc2b03 100644
--- a/designs/lumira/package.json
+++ b/designs/lumira/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/lumira",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for leggings",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/lumira/src/index.mjs b/designs/lumira/src/index.mjs
index 447fc8c31bd..02a9e094bf5 100644
--- a/designs/lumira/src/index.mjs
+++ b/designs/lumira/src/index.mjs
@@ -2,7 +2,7 @@
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { extendPath, controlPoints, createControlPoints, shape } from './shape.mjs'
import { leg } from './leg.mjs'
@@ -11,14 +11,12 @@ import { waistband } from './waistband.mjs'
// Create new design
const Lumira = new Design({
- data,
+ data: about,
parts: [shape, gusset, leg, waistband],
})
// Named exports
export {
- i18n,
- Lumira,
shape,
gusset,
leg,
@@ -26,4 +24,7 @@ export {
extendPath,
controlPoints,
createControlPoints,
+ Lumira,
+ i18n,
+ about,
}
diff --git a/designs/lumira/tests/shared.test.mjs b/designs/lumira/tests/shared.test.mjs
index 99fc7a84087..acb76fc5ad0 100644
--- a/designs/lumira/tests/shared.test.mjs
+++ b/designs/lumira/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Lumira, i18n } from '../src/index.mjs'
+import { Lumira, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Lumira)
+testPatternConfig(Lumira, about)
// Test translation
testPatternI18n(Lumira, i18n)
diff --git a/designs/lunetius/README.md b/designs/lunetius/README.md
index 8fd59755b6d..f7e250fd716 100644
--- a/designs/lunetius/README.md
+++ b/designs/lunetius/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/lunetius
@@ -59,7 +44,7 @@ A FreeSewing pattern for a lacerna, a historical Roman cloak
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/lunetius/data.mjs b/designs/lunetius/data.mjs
deleted file mode 100644
index b4fb2215ad3..00000000000
--- a/designs/lunetius/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/lunetius'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/lunetius/i18n/de.json b/designs/lunetius/i18n/de.json
deleted file mode 100644
index 6fac26caebb..00000000000
--- a/designs/lunetius/i18n/de.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lunetius, die Lacerna",
- "d": "Lunetius ist eine Lacerna, ein historischer römischer Mantel",
- "p": {
- "lacerna": "Lacerna"
- },
- "s": {},
- "o": {
- "lengthRatio": {
- "t": "Längenverhältnis",
- "d": "Steuert die Länge des Kleidungsstückes"
- },
- "widthRatio": {
- "t": "Breitenverhältnis",
- "d": "Steuert die Breite des Kleidungsstückes"
- },
- "length": {
- "t": "Länge",
- "d": "Wähle zwischen verschiedenen Längenarten"
- }
- }
-}
diff --git a/designs/lunetius/i18n/es.json b/designs/lunetius/i18n/es.json
deleted file mode 100644
index c8f76db1064..00000000000
--- a/designs/lunetius/i18n/es.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lunetius, lacerna",
- "d": "Lunetius es una lacerna, una capa histórica romana",
- "p": {
- "lacerna": "Lacerna"
- },
- "s": {},
- "o": {
- "lengthRatio": {
- "t": "Ratio de longitud",
- "d": "Controls the length of the garment"
- },
- "widthRatio": {
- "t": "Width ratio",
- "d": "Controls the width of the garment"
- },
- "length": {
- "t": "Longitud",
- "d": "Choose from the different length styles"
- }
- }
-}
diff --git a/designs/lunetius/i18n/fr.json b/designs/lunetius/i18n/fr.json
deleted file mode 100644
index 6177a68b8f4..00000000000
--- a/designs/lunetius/i18n/fr.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lacerne Lunetius",
- "d": "Lunetius est une lacerne, un manteau romain historique",
- "p": {
- "lacerna": "Lacerna"
- },
- "s": {},
- "o": {
- "lengthRatio": {
- "t": "Ratio de longueur",
- "d": "Contrôle la longueur du vêtement"
- },
- "widthRatio": {
- "t": "Ratio de largeur",
- "d": "Contrôle la largeur du vêtement"
- },
- "length": {
- "t": "Longueur",
- "d": "Choisit parmi les différents styles de longueur"
- }
- }
-}
diff --git a/designs/lunetius/i18n/index.mjs b/designs/lunetius/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/lunetius/i18n/index.mjs
+++ b/designs/lunetius/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/lunetius/i18n/nl.json b/designs/lunetius/i18n/nl.json
deleted file mode 100644
index c97a58cfaed..00000000000
--- a/designs/lunetius/i18n/nl.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lunetius Lacerna",
- "d": "Lunetius is a lacerna, a historical Roman cloak",
- "p": {
- "lacerna": "Lacerna"
- },
- "s": {},
- "o": {
- "lengthRatio": {
- "t": "Lengteratio",
- "d": "Controls the length of the garment"
- },
- "widthRatio": {
- "t": "Width ratio",
- "d": "Controls the width of the garment"
- },
- "length": {
- "t": "Lengte",
- "d": "Choose from the different length styles"
- }
- }
-}
diff --git a/designs/lunetius/i18n/uk.json b/designs/lunetius/i18n/uk.json
deleted file mode 100644
index 80a2afefbbb..00000000000
--- a/designs/lunetius/i18n/uk.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "t": "Lunetius Lacerna",
- "d": "Lunetius is a lacerna, a historical Roman cloak",
- "p": {
- "lacerna": "Lacerna"
- },
- "s": {},
- "o": {
- "lengthRatio": {
- "t": "Length ratio",
- "d": "Controls the length of the garment"
- },
- "widthRatio": {
- "t": "Width ratio",
- "d": "Controls the width of the garment"
- },
- "length": {
- "t": "Length",
- "d": "Choose from the different length styles"
- }
- }
-}
diff --git a/designs/lunetius/package.json b/designs/lunetius/package.json
index 54a6053739a..7f319472cca 100644
--- a/designs/lunetius/package.json
+++ b/designs/lunetius/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/lunetius",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a lacerna, a historical Roman cloak",
"author": "Starfetch (https://github.com/starfetch)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/lunetius/src/index.mjs b/designs/lunetius/src/index.mjs
index 0430964ee80..fdd11969d71 100644
--- a/designs/lunetius/src/index.mjs
+++ b/designs/lunetius/src/index.mjs
@@ -1,13 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { lacerna } from './lacerna.mjs'
// Setup our new design
const Lunetius = new Design({
- data,
+ data: about,
parts: [lacerna],
})
// Named exports
-export { lacerna, Lunetius, i18n }
+export { lacerna, Lunetius, i18n, about }
diff --git a/designs/lunetius/tests/shared.test.mjs b/designs/lunetius/tests/shared.test.mjs
index 1a935ff18b3..9f0d4d1dbdd 100644
--- a/designs/lunetius/tests/shared.test.mjs
+++ b/designs/lunetius/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Lunetius, i18n } from '../src/index.mjs'
+import { Lunetius, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Lunetius)
+testPatternConfig(Lunetius, about)
// Test translation
testPatternI18n(Lunetius, i18n)
diff --git a/designs/magde/README.md b/designs/magde/README.md
index da928012a1e..de152b163cd 100644
--- a/designs/magde/README.md
+++ b/designs/magde/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/magde
@@ -59,7 +44,7 @@ A FreeSewing pattern for a bike messenger bag
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/magde/data.mjs b/designs/magde/data.mjs
deleted file mode 100644
index 5edb9e6a4c0..00000000000
--- a/designs/magde/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/magde'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/magde/i18n/de.json b/designs/magde/i18n/de.json
deleted file mode 100644
index f55c3fe5f31..00000000000
--- a/designs/magde/i18n/de.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Magde messenger bag",
- "d": "Magde is a pattern for a (bike) messenger bag",
- "p": {
- "backPanel": "Back panel",
- "bodyLiner": "Body liner",
- "frontPanel": "Front panel",
- "frontOrganiserBase": "Front organiser base",
- "frontOrganiserFront": "Front organiser front",
- "internalOrganiser": "Internal organiser",
- "lidOnePiece": "Lid one piece",
- "sidePanel": "Side panel",
- "strapAttachments": "Strap attachments",
- "twoPieceLidBottom": "Two-piece lid bottom",
- "twoPieceLidTop": "Two-piece lid top"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "FIXME: Provide description for this option"
- },
- "taperRatio": {
- "t": "Taper ratio",
- "d": "FIXME: Provide description for this option"
- },
- "flapHeightRatio": {
- "t": "Flap height",
- "d": "FIXME: Provide description for this option"
- },
- "openingRatio": {
- "t": "Opening ratio",
- "d": "FIXME: Provide description for this option"
- },
- "onePieceLid": {
- "t": "One piece lid",
- "d": "FIXME: Provide description for this option"
- },
- "useCommonWebbingSizes": {
- "t": "Use common webbing size",
- "d": "FIXME: Provide description for this option"
- }
- }
-}
diff --git a/designs/magde/i18n/es.json b/designs/magde/i18n/es.json
deleted file mode 100644
index f55c3fe5f31..00000000000
--- a/designs/magde/i18n/es.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Magde messenger bag",
- "d": "Magde is a pattern for a (bike) messenger bag",
- "p": {
- "backPanel": "Back panel",
- "bodyLiner": "Body liner",
- "frontPanel": "Front panel",
- "frontOrganiserBase": "Front organiser base",
- "frontOrganiserFront": "Front organiser front",
- "internalOrganiser": "Internal organiser",
- "lidOnePiece": "Lid one piece",
- "sidePanel": "Side panel",
- "strapAttachments": "Strap attachments",
- "twoPieceLidBottom": "Two-piece lid bottom",
- "twoPieceLidTop": "Two-piece lid top"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "FIXME: Provide description for this option"
- },
- "taperRatio": {
- "t": "Taper ratio",
- "d": "FIXME: Provide description for this option"
- },
- "flapHeightRatio": {
- "t": "Flap height",
- "d": "FIXME: Provide description for this option"
- },
- "openingRatio": {
- "t": "Opening ratio",
- "d": "FIXME: Provide description for this option"
- },
- "onePieceLid": {
- "t": "One piece lid",
- "d": "FIXME: Provide description for this option"
- },
- "useCommonWebbingSizes": {
- "t": "Use common webbing size",
- "d": "FIXME: Provide description for this option"
- }
- }
-}
diff --git a/designs/magde/i18n/fr.json b/designs/magde/i18n/fr.json
deleted file mode 100644
index f55c3fe5f31..00000000000
--- a/designs/magde/i18n/fr.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Magde messenger bag",
- "d": "Magde is a pattern for a (bike) messenger bag",
- "p": {
- "backPanel": "Back panel",
- "bodyLiner": "Body liner",
- "frontPanel": "Front panel",
- "frontOrganiserBase": "Front organiser base",
- "frontOrganiserFront": "Front organiser front",
- "internalOrganiser": "Internal organiser",
- "lidOnePiece": "Lid one piece",
- "sidePanel": "Side panel",
- "strapAttachments": "Strap attachments",
- "twoPieceLidBottom": "Two-piece lid bottom",
- "twoPieceLidTop": "Two-piece lid top"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "FIXME: Provide description for this option"
- },
- "taperRatio": {
- "t": "Taper ratio",
- "d": "FIXME: Provide description for this option"
- },
- "flapHeightRatio": {
- "t": "Flap height",
- "d": "FIXME: Provide description for this option"
- },
- "openingRatio": {
- "t": "Opening ratio",
- "d": "FIXME: Provide description for this option"
- },
- "onePieceLid": {
- "t": "One piece lid",
- "d": "FIXME: Provide description for this option"
- },
- "useCommonWebbingSizes": {
- "t": "Use common webbing size",
- "d": "FIXME: Provide description for this option"
- }
- }
-}
diff --git a/designs/magde/i18n/index.mjs b/designs/magde/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/magde/i18n/index.mjs
+++ b/designs/magde/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/magde/i18n/nl.json b/designs/magde/i18n/nl.json
deleted file mode 100644
index f55c3fe5f31..00000000000
--- a/designs/magde/i18n/nl.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Magde messenger bag",
- "d": "Magde is a pattern for a (bike) messenger bag",
- "p": {
- "backPanel": "Back panel",
- "bodyLiner": "Body liner",
- "frontPanel": "Front panel",
- "frontOrganiserBase": "Front organiser base",
- "frontOrganiserFront": "Front organiser front",
- "internalOrganiser": "Internal organiser",
- "lidOnePiece": "Lid one piece",
- "sidePanel": "Side panel",
- "strapAttachments": "Strap attachments",
- "twoPieceLidBottom": "Two-piece lid bottom",
- "twoPieceLidTop": "Two-piece lid top"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "FIXME: Provide description for this option"
- },
- "taperRatio": {
- "t": "Taper ratio",
- "d": "FIXME: Provide description for this option"
- },
- "flapHeightRatio": {
- "t": "Flap height",
- "d": "FIXME: Provide description for this option"
- },
- "openingRatio": {
- "t": "Opening ratio",
- "d": "FIXME: Provide description for this option"
- },
- "onePieceLid": {
- "t": "One piece lid",
- "d": "FIXME: Provide description for this option"
- },
- "useCommonWebbingSizes": {
- "t": "Use common webbing size",
- "d": "FIXME: Provide description for this option"
- }
- }
-}
diff --git a/designs/magde/i18n/uk.json b/designs/magde/i18n/uk.json
deleted file mode 100644
index f55c3fe5f31..00000000000
--- a/designs/magde/i18n/uk.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "t": "Magde messenger bag",
- "d": "Magde is a pattern for a (bike) messenger bag",
- "p": {
- "backPanel": "Back panel",
- "bodyLiner": "Body liner",
- "frontPanel": "Front panel",
- "frontOrganiserBase": "Front organiser base",
- "frontOrganiserFront": "Front organiser front",
- "internalOrganiser": "Internal organiser",
- "lidOnePiece": "Lid one piece",
- "sidePanel": "Side panel",
- "strapAttachments": "Strap attachments",
- "twoPieceLidBottom": "Two-piece lid bottom",
- "twoPieceLidTop": "Two-piece lid top"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "FIXME: Provide description for this option"
- },
- "taperRatio": {
- "t": "Taper ratio",
- "d": "FIXME: Provide description for this option"
- },
- "flapHeightRatio": {
- "t": "Flap height",
- "d": "FIXME: Provide description for this option"
- },
- "openingRatio": {
- "t": "Opening ratio",
- "d": "FIXME: Provide description for this option"
- },
- "onePieceLid": {
- "t": "One piece lid",
- "d": "FIXME: Provide description for this option"
- },
- "useCommonWebbingSizes": {
- "t": "Use common webbing size",
- "d": "FIXME: Provide description for this option"
- }
- }
-}
diff --git a/designs/magde/package.json b/designs/magde/package.json
index 84b7becfd3b..527fe376007 100644
--- a/designs/magde/package.json
+++ b/designs/magde/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/magde",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a bike messenger bag",
"author": "clegganator259 (https://github.com/clegganator259)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/magde/src/index.mjs b/designs/magde/src/index.mjs
index 28e8728cc04..3c767898de5 100644
--- a/designs/magde/src/index.mjs
+++ b/designs/magde/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
import { bodyLiner } from './bodyLiner.mjs'
@@ -16,7 +16,7 @@ import { strapAttachments } from './strapAttachments.mjs'
// Create new design
const Magde = new Design({
- data,
+ data: about,
parts: [
backPanel,
frontPanel,
@@ -47,4 +47,5 @@ export {
internalOrganiser,
Magde,
i18n,
+ about,
}
diff --git a/designs/magde/tests/shared.test.mjs b/designs/magde/tests/shared.test.mjs
index e2040472aec..71c298fcd73 100644
--- a/designs/magde/tests/shared.test.mjs
+++ b/designs/magde/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Magde, i18n } from '../src/index.mjs'
+import { Magde, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Magde)
+testPatternConfig(Magde, about)
// Test translation
testPatternI18n(Magde, i18n)
diff --git a/designs/noble/CHANGELOG.md b/designs/noble/CHANGELOG.md
index 7a141dd0717..9d3d3537428 100644
--- a/designs/noble/CHANGELOG.md
+++ b/designs/noble/CHANGELOG.md
@@ -1,6 +1,13 @@
# Change log for: @freesewing/noble
+## 4.0.0 (2024-04-01)
+
+### Fixed
+
+ - Fix 'cutonfold' text for Noble's back part. Fixes
+ - Improve dart shaping. Fixes
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/noble/README.md b/designs/noble/README.md
index 2fd76b6a1f3..304dcc9f444 100644
--- a/designs/noble/README.md
+++ b/designs/noble/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/noble
@@ -59,7 +44,7 @@ A FreeSewing pattern for a princess seam bodice block
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/noble/data.mjs b/designs/noble/data.mjs
deleted file mode 100644
index df2667612c6..00000000000
--- a/designs/noble/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/noble'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/noble/i18n/de.json b/designs/noble/i18n/de.json
deleted file mode 100644
index cfbdd5ff192..00000000000
--- a/designs/noble/i18n/de.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "t": "Noble, ein Grundschnitt",
- "d": "Noble ist ein Grundschnitt mit einer Englischen oder Wiener Naht",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base"
- },
- "s": {},
- "o": {
- "dartPosition": {
- "t": "Position Abnäher",
- "d": "Steuert, ob an der Schulter oder am Armloch geteilt werden soll"
- },
- "chestEase": {
- "t": "Brustumfangszugabe",
- "d": "Controls the amount of ease at the chest"
- },
- "waistEase": {
- "t": "Taillenzugabe",
- "d": "Controls the amount of ease at the waist"
- },
- "bustSpanEase": {
- "t": "Zugabe im Abstand der Brustpunkte",
- "d": "Controls the amount of ease along the bust span"
- },
- "backDartHeight": {
- "t": "Steuert die Höhe des Rückenabnähers",
- "d": "Höhe Rückenabnäher"
- },
- "waistDartLength": {
- "t": "Länge des Taillenabnähers",
- "d": "Steuert die Länge des Taillenabnähers"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Position der Schulterabnäher",
- "d": "Steuert die Position der Schulternaht"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "armholeDartPosition": {
- "t": "Armhole dart position",
- "d": "Controls the position of the armhole dart"
- },
- "armholeDepth": {
- "t": "Armlochtiefe",
- "d": "Steuert die Tiefe des Armloches"
- },
- "backArmholeSlant": {
- "t": "Hintere Armlochschiebung",
- "d": "Controls the slant of the armhole at the back"
- },
- "backArmholeCurvature": {
- "t": "Hintere Armlochkrümmung",
- "d": "Controls how deep the armhole is scooped out at the back"
- },
- "frontArmholeCurvature": {
- "t": "Vordere Armlochkrümmung",
- "d": "Steuert wie tief das Armloch nach vorne unten ausgeschnitten ist"
- },
- "frontArmholePitchDepth": {
- "t": "Vordere Armlochtiefe",
- "d": "Controls how deep the armhole cuts into the front"
- },
- "backArmholePitchDepth": {
- "t": "Rückenarmloch-Tiefe",
- "d": "Controls how deep the armhole cuts into the back"
- },
- "backNeckCutout": {
- "t": "Ausschnitt im Nacken",
- "d": "Controls how deep the neck is cutout in the back"
- },
- "backHemSlope": {
- "t": "Neigung des hinteren Saumes",
- "d": "Constrols the slope of the back hem"
- },
- "frontShoulderWidth": {
- "t": "Vordere Schulterbreite",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "Oberbrustweite",
- "d": "Controls the width of the high bust"
- },
- "shoulderToShoulderEase": {
- "t": "Zugabe des Schulterabstandes",
- "d": "Steuert die Menge an Zugabe entlang des Schulter-zu-Schulter Maßes"
- }
- }
-}
diff --git a/designs/noble/i18n/es.json b/designs/noble/i18n/es.json
deleted file mode 100644
index 1a3fa571bda..00000000000
--- a/designs/noble/i18n/es.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "t": "Noble, patrón base de torso",
- "d": "Noble es un patrón base de torso con corte de príncipe o princesa",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base"
- },
- "s": {},
- "o": {
- "dartPosition": {
- "t": "Posición de la pinza",
- "d": "Controls whether to split at the shoulder or armhole"
- },
- "chestEase": {
- "t": "Holgura de pecho",
- "d": "Controls the amount of ease at the chest"
- },
- "waistEase": {
- "t": "Holgura de cintura",
- "d": "Controls the amount of ease at the waist"
- },
- "bustSpanEase": {
- "t": "Holgura alrededor del busto",
- "d": "Controls the amount of ease along the bust span"
- },
- "backDartHeight": {
- "t": "Controla la altura del dart posterior",
- "d": "Altura del dart trasero"
- },
- "waistDartLength": {
- "t": "Longitud del dart de Waist",
- "d": "Controla la longitud del dardo de la cintura"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "armholeDartPosition": {
- "t": "Armhole dart position",
- "d": "Controls the position of the armhole dart"
- },
- "armholeDepth": {
- "t": "Profundidad del orificio",
- "d": "Controla la profundidad del orificio"
- },
- "backArmholeSlant": {
- "t": "Slant del orificio trasero",
- "d": "Controls the slant of the armhole at the back"
- },
- "backArmholeCurvature": {
- "t": "Curvatura del orificio trasero",
- "d": "Controls how deep the armhole is scooped out at the back"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "frontArmholePitchDepth": {
- "t": "Profundidad del tono del orificio delantero",
- "d": "Controls how deep the armhole cuts into the front"
- },
- "backArmholePitchDepth": {
- "t": "Profundidad del tono del orificio trasero",
- "d": "Controls how deep the armhole cuts into the back"
- },
- "backNeckCutout": {
- "t": "Corte trasero del cuello",
- "d": "Controls how deep the neck is cutout in the back"
- },
- "backHemSlope": {
- "t": "Pendiente trasera",
- "d": "Constrols the slope of the back hem"
- },
- "frontShoulderWidth": {
- "t": "Ancho del hombro frontal",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "Ancho de bust alto",
- "d": "Controls the width of the high bust"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- }
- }
-}
diff --git a/designs/noble/i18n/fr.json b/designs/noble/i18n/fr.json
deleted file mode 100644
index b8787ae4791..00000000000
--- a/designs/noble/i18n/fr.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "t": "Bloc de corps Noble",
- "d": "Noble est un bloc de corps avec des coutures prince(sse)",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base"
- },
- "s": {},
- "o": {
- "dartPosition": {
- "t": "Position de la pince",
- "d": "Contrôle s'il faut séparer à l'épaule ou à l'emmanchure"
- },
- "chestEase": {
- "t": "Aisance de poitrine",
- "d": "Contrôle la quantité d'aisance de votre poitrine"
- },
- "waistEase": {
- "t": "Aisance à la taille",
- "d": "Contrôle la quantité d'aisance au niveau de la taille"
- },
- "bustSpanEase": {
- "t": "Aisance de l'écart poitrine",
- "d": "Contrôle l'ampleur de l'aisance le long du buste"
- },
- "backDartHeight": {
- "t": "Contrôle la hauteur de la pince de dos",
- "d": "Hauteur de la pince de dos"
- },
- "waistDartLength": {
- "t": "Longueur de la pince de taille",
- "d": "Contrôle la longueur de la pince de taille"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Position de la pince d'épaule",
- "d": "Contrôle la position de la pince d'épaule"
- },
- "upperDartLength": {
- "t": "Longueur de la pince supérieure",
- "d": "Contrôle la longueur de la pince supérieure"
- },
- "armholeDartPosition": {
- "t": "Position de la pince d'emmanchure",
- "d": "Contrôle la position de la pince d'emmanchure"
- },
- "armholeDepth": {
- "t": "Profondeur d'emmanchure",
- "d": "Contrôle la profondeur de l'emmanchure"
- },
- "backArmholeSlant": {
- "t": "Inclinaison d'emmanchure dos",
- "d": "Contrôle l'inclinaison de l'emmanchure dos"
- },
- "backArmholeCurvature": {
- "t": "Courbure de l'emmanchure arrière",
- "d": "Contrôle la profondeur du bas de la courbure d'emmanchure dans le dos"
- },
- "frontArmholeCurvature": {
- "t": "Courbe de l'emmanchure avant",
- "d": "Contrôle la profondeur du bas de la courbure d'emmanchure sur le devant"
- },
- "frontArmholePitchDepth": {
- "t": "Profondeur du point de pivot de l'emmanchure avant",
- "d": "Contrôle la profondeur de l'emmanchure sur le devant"
- },
- "backArmholePitchDepth": {
- "t": "Profondeur du point de pivot de l'emmanchure dos",
- "d": "Contrôle la profondeur de l'emmanchure dans le dos"
- },
- "backNeckCutout": {
- "t": "Arrondi de l'encolure dos",
- "d": "Contrôle la profondeur de l'encolure dans le dos"
- },
- "backHemSlope": {
- "t": "Pente de l'ourlet arrière",
- "d": "Contrôle la pente de l'ourlet arrière"
- },
- "frontShoulderWidth": {
- "t": "Largeur d'épaule devant",
- "d": "Contrôle la largeur ajoutée devant les épaules"
- },
- "highBustWidth": {
- "t": "Largeur du haut de poitrine",
- "d": "Contrôle la largeur du haut de poitrine"
- },
- "shoulderToShoulderEase": {
- "t": "Aisance d'épaule à épaule",
- "d": "Contrôle l'aisance sur la mesure épaule à épaule"
- }
- }
-}
diff --git a/designs/noble/i18n/index.mjs b/designs/noble/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/noble/i18n/index.mjs
+++ b/designs/noble/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/noble/i18n/nl.json b/designs/noble/i18n/nl.json
deleted file mode 100644
index 6d79beaa917..00000000000
--- a/designs/noble/i18n/nl.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "t": "Noble body block",
- "d": "Noble is a body block with prince(ess) seams",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base"
- },
- "s": {},
- "o": {
- "dartPosition": {
- "t": "Dart position",
- "d": "Controls whether to split at the shoulder or armhole"
- },
- "chestEase": {
- "t": "Overwijdte borst",
- "d": "Controls the amount of ease at the chest"
- },
- "waistEase": {
- "t": "Overwijdte taille",
- "d": "Controls the amount of ease at the waist"
- },
- "bustSpanEase": {
- "t": "Overwijdte bustenwijdte",
- "d": "Controls the amount of ease along the bust span"
- },
- "backDartHeight": {
- "t": "Bepaalt de hoogte van de achterste neep",
- "d": "Hoogte neep rug"
- },
- "waistDartLength": {
- "t": "Lengte neep taille",
- "d": "Bepaalt de lengte van de neep van de taille"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "armholeDartPosition": {
- "t": "Armhole dart position",
- "d": "Controls the position of the armhole dart"
- },
- "armholeDepth": {
- "t": "Diepte armsgat",
- "d": "Bepaalt de diepte van het armsgat"
- },
- "backArmholeSlant": {
- "t": "Schuin armsgat achter",
- "d": "Controls the slant of the armhole at the back"
- },
- "backArmholeCurvature": {
- "t": "Kromming armsgat achter",
- "d": "Controls how deep the armhole is scooped out at the back"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "frontArmholePitchDepth": {
- "t": "Diepte armsgat vooraan",
- "d": "Controls how deep the armhole cuts into the front"
- },
- "backArmholePitchDepth": {
- "t": "Diepte armsgat achteraan",
- "d": "Controls how deep the armhole cuts into the back"
- },
- "backNeckCutout": {
- "t": "Hals uitsnijding achteraan",
- "d": "Controls how deep the neck is cutout in the back"
- },
- "backHemSlope": {
- "t": "Lope zoom achter",
- "d": "Constrols the slope of the back hem"
- },
- "frontShoulderWidth": {
- "t": "Schouderbreedte vooraan",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "Hoge buste-breedte",
- "d": "Controls the width of the high bust"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- }
- }
-}
diff --git a/designs/noble/i18n/uk.json b/designs/noble/i18n/uk.json
deleted file mode 100644
index 0dbed3b6ab6..00000000000
--- a/designs/noble/i18n/uk.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "t": "Noble body block",
- "d": "Noble is a body block with prince(ess) seams",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base"
- },
- "s": {},
- "o": {
- "dartPosition": {
- "t": "Dart position",
- "d": "Controls whether to split at the shoulder or armhole"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "backDartHeight": {
- "t": "Controls the height of the back dart",
- "d": "Back dart height"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "armholeDartPosition": {
- "t": "Armhole dart position",
- "d": "Controls the position of the armhole dart"
- },
- "armholeDepth": {
- "t": "Armhole depth",
- "d": "Controls the depth of the armhole"
- },
- "backArmholeSlant": {
- "t": "Back armhole slant",
- "d": "Controls the slant of the armhole at the back"
- },
- "backArmholeCurvature": {
- "t": "Back armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the back"
- },
- "frontArmholeCurvature": {
- "t": "Front armhole curvature",
- "d": "Controls how deep the armhole is scooped out at the front bottom"
- },
- "frontArmholePitchDepth": {
- "t": "Front armhole pitch depth",
- "d": "Controls how deep the armhole cuts into the front"
- },
- "backArmholePitchDepth": {
- "t": "Back armhole pitch depth",
- "d": "Controls how deep the armhole cuts into the back"
- },
- "backNeckCutout": {
- "t": "Back neck cutout",
- "d": "Controls how deep the neck is cutout in the back"
- },
- "backHemSlope": {
- "t": "Back hem slope",
- "d": "Constrols the slope of the back hem"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "FIXME: Document this option"
- }
- }
-}
diff --git a/designs/noble/package.json b/designs/noble/package.json
index 2953e126149..49fc70166cb 100644
--- a/designs/noble/package.json
+++ b/designs/noble/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/noble",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a princess seam bodice block",
"author": "woutervdub (https://github.com/woutervdub)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/bella": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/bella": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/noble/src/index.mjs b/designs/noble/src/index.mjs
index 0e3f95d863c..feedfc75e04 100644
--- a/designs/noble/src/index.mjs
+++ b/designs/noble/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { backPoints } from './backpoints.mjs'
import { backInside } from './backinside.mjs'
@@ -10,9 +10,19 @@ import { frontOutside } from './frontoutside.mjs'
// Setup our new design
const Noble = new Design({
- data,
+ data: about,
parts: [backPoints, backInside, backOutside, frontPoints, frontInside, frontOutside],
})
// Named exports
-export { backPoints, backInside, backOutside, frontPoints, frontInside, frontOutside, Noble, i18n }
+export {
+ backPoints,
+ backInside,
+ backOutside,
+ frontPoints,
+ frontInside,
+ frontOutside,
+ Noble,
+ i18n,
+ about,
+}
diff --git a/designs/noble/tests/shared.test.mjs b/designs/noble/tests/shared.test.mjs
index 06bea70b951..228ae48a9ad 100644
--- a/designs/noble/tests/shared.test.mjs
+++ b/designs/noble/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Noble, i18n } from '../src/index.mjs'
+import { Noble, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Noble)
+testPatternConfig(Noble, about)
// Test translation
testPatternI18n(Noble, i18n)
diff --git a/designs/octoplushy/README.md b/designs/octoplushy/README.md
index 3fe9a6f0ad4..b061c4494c6 100644
--- a/designs/octoplushy/README.md
+++ b/designs/octoplushy/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/octoplushy
@@ -59,7 +44,7 @@ A FreeSewing pattern for an octopus plushy toy
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/octoplushy/data.mjs b/designs/octoplushy/data.mjs
deleted file mode 100644
index b72c1f291f2..00000000000
--- a/designs/octoplushy/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/octoplushy'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/octoplushy/i18n/de.json b/designs/octoplushy/i18n/de.json
deleted file mode 100644
index c4229f0dd7d..00000000000
--- a/designs/octoplushy/i18n/de.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "t": "Octoplushy, der Oktopus",
- "d": "Ein mehrarmiger Begleiter für Umarmungen der nächsten Kategorie",
- "p": {
- "armSection1": "Arm section 1",
- "armSection2": "Arm section 2",
- "eye1": "Eye 1",
- "eye2": "Eye 2",
- "eye3": "Eye 3",
- "headSection1": "Head section 1",
- "headSection2": "Head section 2"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Größe",
- "d": "Steuert die Gesamtgröße"
- },
- "type": {
- "t": "Art",
- "d": "Erlaubt es dir, zwischen den Varianten dieses Designs zu wählen"
- },
- "armWidth": {
- "t": "Armbreite",
- "d": "Steuert die Breite der Arme"
- },
- "armLength": {
- "t": "Armlänge",
- "d": "Steuert die Länge der Arme"
- },
- "neckWidth": {
- "t": "Halsbreite",
- "d": "Bestimmt die Breite am Hals"
- },
- "armTaper": {
- "t": "Armabschrägung",
- "d": "Steuert, wie stark die Arme abgeschrägt sind"
- },
- "bottomTopArmRatio": {
- "t": "Verhältnis Arme Unten/Oben",
- "d": "FIXME: Keine Ahnung, was dies macht"
- },
- "bottomArmReduction": {
- "t": "Reduktion des unteren Arms",
- "d": "FIXME: Keine Ahnung, was dies macht"
- },
- "bottomArmReductionPlushy": {
- "t": "Reduktion des unteren Arms (plüschig)",
- "d": "FIXME: Keine Ahnung, was dies macht"
- }
- }
-}
diff --git a/designs/octoplushy/i18n/es.json b/designs/octoplushy/i18n/es.json
deleted file mode 100644
index dd7943d40d1..00000000000
--- a/designs/octoplushy/i18n/es.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "t": "Octoplushy the octopus",
- "d": "A multi-armed companion for next-level hugs",
- "p": {
- "armSection1": "Arm section 1",
- "armSection2": "Arm section 2",
- "eye1": "Eye 1",
- "eye2": "Eye 2",
- "eye3": "Eye 3",
- "headSection1": "Head section 1",
- "headSection2": "Head section 2"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Tamaño",
- "d": "Controls the overall size"
- },
- "type": {
- "t": "Tipo",
- "d": "Allows you to choose one of the variants of this design"
- },
- "armWidth": {
- "t": "Arm width",
- "d": "Controls the width of the arms"
- },
- "armLength": {
- "t": "Arm length",
- "d": "Controls the length of the arms"
- },
- "neckWidth": {
- "t": "Neck width",
- "d": "Determines the width at the neck"
- },
- "armTaper": {
- "t": "Arm tapering",
- "d": "Controls the amount by which the arms taper"
- },
- "bottomTopArmRatio": {
- "t": "Bottom/Top arm ratio",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReduction": {
- "t": "Bottom arm reduction",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReductionPlushy": {
- "t": "Bottom arm reduction (plushy)",
- "d": "FIXME: No idea what this does"
- }
- }
-}
diff --git a/designs/octoplushy/i18n/fr.json b/designs/octoplushy/i18n/fr.json
deleted file mode 100644
index 402b26db962..00000000000
--- a/designs/octoplushy/i18n/fr.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "t": "Octoplushy la pieuvre",
- "d": "Un compagnon à plusieurs bras pour des câlins de haut niveau",
- "p": {
- "armSection1": "Arm section 1",
- "armSection2": "Arm section 2",
- "eye1": "Eye 1",
- "eye2": "Eye 2",
- "eye3": "Eye 3",
- "headSection1": "Head section 1",
- "headSection2": "Head section 2"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Taille",
- "d": "Contrôle la taille globale"
- },
- "type": {
- "t": "Type",
- "d": "Vous permet de choisir une des variantes de ce design"
- },
- "armWidth": {
- "t": "Largeur de bras",
- "d": "Contrôle la largeur des bras"
- },
- "armLength": {
- "t": "Longueur des bras",
- "d": "Contrôle la longueur des bras"
- },
- "neckWidth": {
- "t": "Largeur du cou",
- "d": "Détermine la largeur du cou"
- },
- "armTaper": {
- "t": "Spirales des bras",
- "d": "Contrôle la quantité de spirales que les tentacules font"
- },
- "bottomTopArmRatio": {
- "t": "Ratio entre le bras supérieur et inférieur",
- "d": "FIXME: Aucune idée de ce que cela fait"
- },
- "bottomArmReduction": {
- "t": "Réduction du bras inférieur",
- "d": "FIXME: Aucune idée de ce que cela fait"
- },
- "bottomArmReductionPlushy": {
- "t": "Réduction du bras inférieur (en peluche)",
- "d": "FIXME: Aucune idée de ce que cela fait"
- }
- }
-}
diff --git a/designs/octoplushy/i18n/index.mjs b/designs/octoplushy/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/octoplushy/i18n/index.mjs
+++ b/designs/octoplushy/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/octoplushy/i18n/nl.json b/designs/octoplushy/i18n/nl.json
deleted file mode 100644
index f05cc424485..00000000000
--- a/designs/octoplushy/i18n/nl.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "t": "Octoplushy the octopus",
- "d": "A multi-armed companion for next-level hugs",
- "p": {
- "armSection1": "Arm section 1",
- "armSection2": "Arm section 2",
- "eye1": "Eye 1",
- "eye2": "Eye 2",
- "eye3": "Eye 3",
- "headSection1": "Head section 1",
- "headSection2": "Head section 2"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Maat",
- "d": "Controls the overall size"
- },
- "type": {
- "t": "Soort",
- "d": "Allows you to choose one of the variants of this design"
- },
- "armWidth": {
- "t": "Arm width",
- "d": "Controls the width of the arms"
- },
- "armLength": {
- "t": "Arm length",
- "d": "Controls the length of the arms"
- },
- "neckWidth": {
- "t": "Neck width",
- "d": "Determines the width at the neck"
- },
- "armTaper": {
- "t": "Arm tapering",
- "d": "Controls the amount by which the arms taper"
- },
- "bottomTopArmRatio": {
- "t": "Bottom/Top arm ratio",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReduction": {
- "t": "Bottom arm reduction",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReductionPlushy": {
- "t": "Bottom arm reduction (plushy)",
- "d": "FIXME: No idea what this does"
- }
- }
-}
diff --git a/designs/octoplushy/i18n/uk.json b/designs/octoplushy/i18n/uk.json
deleted file mode 100644
index 37c13efb474..00000000000
--- a/designs/octoplushy/i18n/uk.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "t": "Octoplushy the octopus",
- "d": "A multi-armed companion for next-level hugs",
- "p": {
- "armSection1": "Arm section 1",
- "armSection2": "Arm section 2",
- "eye1": "Eye 1",
- "eye2": "Eye 2",
- "eye3": "Eye 3",
- "headSection1": "Head section 1",
- "headSection2": "Head section 2"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size"
- },
- "type": {
- "t": "Type",
- "d": "Allows you to choose one of the variants of this design"
- },
- "armWidth": {
- "t": "Arm width",
- "d": "Controls the width of the arms"
- },
- "armLength": {
- "t": "Arm length",
- "d": "Controls the length of the arms"
- },
- "neckWidth": {
- "t": "Neck width",
- "d": "Determines the width at the neck"
- },
- "armTaper": {
- "t": "Arm tapering",
- "d": "Controls the amount by which the arms taper"
- },
- "bottomTopArmRatio": {
- "t": "Bottom/Top arm ratio",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReduction": {
- "t": "Bottom arm reduction",
- "d": "FIXME: No idea what this does"
- },
- "bottomArmReductionPlushy": {
- "t": "Bottom arm reduction (plushy)",
- "d": "FIXME: No idea what this does"
- }
- }
-}
diff --git a/designs/octoplushy/package.json b/designs/octoplushy/package.json
index 698758968ee..546af307a82 100644
--- a/designs/octoplushy/package.json
+++ b/designs/octoplushy/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/octoplushy",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for an octopus plushy toy",
"author": "woutervdub (https://github.com/woutervdub)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/octoplushy/src/index.mjs b/designs/octoplushy/src/index.mjs
index 9c044a95198..6efc9a789e7 100644
--- a/designs/octoplushy/src/index.mjs
+++ b/designs/octoplushy/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { headSection1, headSection2 } from './head.mjs'
import { armSection1, armSection2 } from './arm.mjs'
@@ -7,9 +7,20 @@ import { eye1, eye2, eye3 } from './eye.mjs'
// Setup our new design
const Octoplushy = new Design({
- data,
+ data: about,
parts: [headSection1, headSection2, armSection1, armSection2, eye1, eye2, eye3],
})
// Named exports
-export { headSection1, headSection2, armSection1, armSection2, eye1, eye2, eye3, Octoplushy, i18n }
+export {
+ headSection1,
+ headSection2,
+ armSection1,
+ armSection2,
+ eye1,
+ eye2,
+ eye3,
+ Octoplushy,
+ i18n,
+ about,
+}
diff --git a/designs/octoplushy/tests/shared.test.mjs b/designs/octoplushy/tests/shared.test.mjs
index 1e898c2cbf9..d35ccfae86d 100644
--- a/designs/octoplushy/tests/shared.test.mjs
+++ b/designs/octoplushy/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Octoplushy, i18n } from '../src/index.mjs'
+import { Octoplushy, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Octoplushy)
+testPatternConfig(Octoplushy, about)
// Test translation
testPatternI18n(Octoplushy, i18n)
diff --git a/designs/onyx/CHANGELOG.md b/designs/onyx/CHANGELOG.md
index e7a7379799b..df1a911dc75 100644
--- a/designs/onyx/CHANGELOG.md
+++ b/designs/onyx/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/onyx
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Always load plugin-bust due to its changes in how it handle conditionality.
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/onyx/README.md b/designs/onyx/README.md
index 55ec8dfdf75..1cfba246e7a 100644
--- a/designs/onyx/README.md
+++ b/designs/onyx/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/onyx
@@ -59,7 +44,7 @@ A FreeSewing pattern for one-piece garments
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/onyx/data.mjs b/designs/onyx/data.mjs
deleted file mode 100644
index 592d85873c1..00000000000
--- a/designs/onyx/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/onyx'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/onyx/i18n/de.json b/designs/onyx/i18n/de.json
deleted file mode 100644
index 984e2bb4f8d..00000000000
--- a/designs/onyx/i18n/de.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
- "t": "Onyx one-piece",
- "d": "Onyx is a versatile one-piece garment with several forms.",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front",
- "neckband": "Neckband",
- "raglanSleeve": "Sleeve",
- "zipperGuard": "Zipper guard",
- "crotchGusset": "Crotch gusset",
- "hood": "Hood back",
- "hoodFront": "Hood front",
- "skirt": "Swim skirt",
- "sleeveRibbing": "Sleeve ribbing",
- "legRibbing": "Leg ribbing"
- },
- "s": {},
- "o": {
- "neckbandLength": {
- "t": "Neckband length",
- "d": "Controls how long the neckband is, as a percentage of the circumference of the neckline."
- },
- "neckbandWidth": {
- "t": "Neckband width",
- "d": "Controls how wide the finished neckband will be."
- },
- "hoodHem": {
- "t": "Hood hem",
- "d": "Sets the hem allowance along the front of the hood, as a multiple of the seam allowance."
- },
- "sleeveRibbing": {
- "t": "Sleeve Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the sleeves or to use a hem."
- },
- "sleeveRibbingNo": {
- "t": "Hem",
- "d": "Finish the sleeves with a hem."
- },
- "sleeveRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the sleeves with a piece of ribbing."
- },
- "sleeveRibbingLength": {
- "t": "Sleeve Ribbing Length",
- "d": "Controls how long the ribbing around the sleeve is, as a percentage of the sleeve circumference."
- },
- "sleeveRibbingWidth": {
- "t": "Sleeve Ribbing Width",
- "d": "Controls how wide the ribbing around the sleeve is."
- },
- "sleeveHem": {
- "t": "Sleeve hem",
- "d": "Sets the hem allowance of the hem along the end of the sleeves, as a multiple of the seam allowance."
- },
- "legRibbing": {
- "t": "Leg Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the legs or to use a hem."
- },
- "legRibbingNo": {
- "t": "Hem",
- "d": "Finish the legs with a hem."
- },
- "legRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the legs with a piece of ribbing."
- },
- "legRibbingLength": {
- "t": "Leg Ribbing Length",
- "d": "Controls how long the ribbing around the leg is, as a percentage of the leg circumference."
- },
- "legRibbingWidth": {
- "t": "Leg Ribbing Width",
- "d": "Controls how wide the ribbing around the leg is."
- },
- "legHem": {
- "t": "Leg hem",
- "d": "Sets the hem allowance of the hem along the bottom of the legs, as a multiple of the seam allowance."
- },
- "backOnFold": {
- "t": "Back on fold",
- "d": "Enable this option to make the back out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a back zipper, and enable it otherwise."
- },
- "backOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored back pieces"
- },
- "backOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "frontOnFold": {
- "t": "Front on fold",
- "d": "Enable this option to make the front out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a front zipper, and enable it otherwise."
- },
- "frontOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored front pieces"
- },
- "frontOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "zipperLength": {
- "t": "Zipper length",
- "d": "The length of the zipper, as a percentage of the vertical trunk. It is recommended that you match this length (shown below in cm/in) to the length of the actual zipper, measured from lower stop to upper stop."
- },
- "zipperGuardWidth": {
- "t": "Zipper guard width",
- "d": "How wide to make the zipper guard."
- },
- "neckGuardLength": {
- "t": "Neck guard length",
- "d": "How far to have the zipper guard extend past the top of the zipper."
- },
- "skirtHem": {
- "t": "Skirt hem",
- "d": "Sets the hem allowance of the hem along the bottom of the skirt, as a multiple of the seam allowance."
- },
- "skirtWaistband": {
- "t": "Skirt waistband",
- "d": "Sets the width of the waistband along the top of the skirt, as a multiple of the seam allowance."
- },
-
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls how tall the hood will be."
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls how much room will be in the hood around the back of the head."
- },
- "centerSeamEase": {
- "t": "Center seam ease",
- "d": "Controls how long the center seam will be, and thus how low the crotch fork of the garment will be."
- },
- "outseamEase": {
- "t": "Outseam ease",
- "d": "Controls how far down the garment the waist, hips, seat, and upper leg points on the outseam will be."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls how wide the garment will be at the bottom hem. This option is only used if the straight sides option is disabled."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls how wide the seat is."
- },
- "crotchGussetWidth": {
- "t": "Crotch gusset Width",
- "d": "Controls how wide the crotch gusset will be. Adjust so that the front and back pieces look smooth and clean around the crotch fork and upper legs. Deeper thighs and abdomens require a larger value, while wider ones require a smaller value."
- },
- "upperLegEase": {
- "t": "Upper leg ease",
- "d": "Controls how wide the garment will be around the upper legs."
- },
- "legHemEase": {
- "t": "Leg hem ease",
- "d": "Controls how wide the bottom of the legs will be."
- },
- "neckBalance": {
- "t": "Neck position",
- "d": "Controls where the neck hole is placed on the garment."
- },
- "neckEase": {
- "t": "Neck ease",
- "d": "Controls how large the neck hole is."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Affects how wide the sleeve is at the armhole on all garments, and has some affect on the width at the hem of short sleeved garments."
- },
- "wristEase": {
- "t": "Wrist ease",
- "d": "Affects how wide the end of the sleeve is on sleeves that extend past the biceps. The effect is greater on longer sleeves."
- },
-
- "neckStyle": {
- "t": "Neck style",
- "d": "Select whether you want to add a hood to the garment, or finish the neck with a neckband."
- },
- "neckStyle.neckband": {
- "t": "Neckband",
- "d": "Finish the neck with a neckband."
- },
- "neckStyle.hood": {
- "t": "Hood",
- "d": "Generate a hood for the garment."
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls how long the sleeves of the garment will be."
- },
- "legLength": {
- "t": "Leg length",
- "d": "Controls how long the legs of the garment will be."
- },
- "hoodFrontPieceSize": {
- "t": "Hood front piece size",
- "d": "Controls if a front piece will be used, and how wide the front piece of the hood will be."
- },
- "hoodFrontBonus": {
- "t": "Hood front bonus",
- "d": "Controls how far forward the hood comes over the forehead."
- },
- "hoodFrontDip": {
- "t": "Hood Front dip",
- "d": "Controls far down the front of the hood drops over the forehead."
- },
- "skirt": {
- "t": "Skirt",
- "d": "Select whether or not you want to add a simple gathered skirt around the waist of the garment."
- },
- "skirtNo": {
- "t": "Nothing",
- "d": "A skirt will not be generated."
- },
- "skirtYes": {
- "t": "Swim skirt",
- "d": "A skirt will be generated."
- },
- "skirtLength": {
- "t": "Skirt length",
- "d": "Controls the length of the skirt, as a percentage of the waist to upper leg measurement."
- },
- "skirtWidth": {
- "t": "Skirt width",
- "d": "Controls the width of the skirt at the bottom, as a percentage of the waist measurement."
- },
-
- "legTaperPosition": {
- "t": "Leg taper position",
- "d": "Controls how the lower legs are laid out on the pattern."
- },
- "raglanScoopLength": {
- "t": "Raglan scoop length",
- "d": "Controls how far out from the armhole the raglan seam starts to scoop."
- },
- "raglanScoopMagnitude": {
- "t": "Raglan scoop depth",
- "d": "Controls how much extra material to place under the armpits."
- }
- }
-}
diff --git a/designs/onyx/i18n/es.json b/designs/onyx/i18n/es.json
deleted file mode 100644
index 984e2bb4f8d..00000000000
--- a/designs/onyx/i18n/es.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
- "t": "Onyx one-piece",
- "d": "Onyx is a versatile one-piece garment with several forms.",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front",
- "neckband": "Neckband",
- "raglanSleeve": "Sleeve",
- "zipperGuard": "Zipper guard",
- "crotchGusset": "Crotch gusset",
- "hood": "Hood back",
- "hoodFront": "Hood front",
- "skirt": "Swim skirt",
- "sleeveRibbing": "Sleeve ribbing",
- "legRibbing": "Leg ribbing"
- },
- "s": {},
- "o": {
- "neckbandLength": {
- "t": "Neckband length",
- "d": "Controls how long the neckband is, as a percentage of the circumference of the neckline."
- },
- "neckbandWidth": {
- "t": "Neckband width",
- "d": "Controls how wide the finished neckband will be."
- },
- "hoodHem": {
- "t": "Hood hem",
- "d": "Sets the hem allowance along the front of the hood, as a multiple of the seam allowance."
- },
- "sleeveRibbing": {
- "t": "Sleeve Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the sleeves or to use a hem."
- },
- "sleeveRibbingNo": {
- "t": "Hem",
- "d": "Finish the sleeves with a hem."
- },
- "sleeveRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the sleeves with a piece of ribbing."
- },
- "sleeveRibbingLength": {
- "t": "Sleeve Ribbing Length",
- "d": "Controls how long the ribbing around the sleeve is, as a percentage of the sleeve circumference."
- },
- "sleeveRibbingWidth": {
- "t": "Sleeve Ribbing Width",
- "d": "Controls how wide the ribbing around the sleeve is."
- },
- "sleeveHem": {
- "t": "Sleeve hem",
- "d": "Sets the hem allowance of the hem along the end of the sleeves, as a multiple of the seam allowance."
- },
- "legRibbing": {
- "t": "Leg Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the legs or to use a hem."
- },
- "legRibbingNo": {
- "t": "Hem",
- "d": "Finish the legs with a hem."
- },
- "legRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the legs with a piece of ribbing."
- },
- "legRibbingLength": {
- "t": "Leg Ribbing Length",
- "d": "Controls how long the ribbing around the leg is, as a percentage of the leg circumference."
- },
- "legRibbingWidth": {
- "t": "Leg Ribbing Width",
- "d": "Controls how wide the ribbing around the leg is."
- },
- "legHem": {
- "t": "Leg hem",
- "d": "Sets the hem allowance of the hem along the bottom of the legs, as a multiple of the seam allowance."
- },
- "backOnFold": {
- "t": "Back on fold",
- "d": "Enable this option to make the back out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a back zipper, and enable it otherwise."
- },
- "backOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored back pieces"
- },
- "backOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "frontOnFold": {
- "t": "Front on fold",
- "d": "Enable this option to make the front out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a front zipper, and enable it otherwise."
- },
- "frontOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored front pieces"
- },
- "frontOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "zipperLength": {
- "t": "Zipper length",
- "d": "The length of the zipper, as a percentage of the vertical trunk. It is recommended that you match this length (shown below in cm/in) to the length of the actual zipper, measured from lower stop to upper stop."
- },
- "zipperGuardWidth": {
- "t": "Zipper guard width",
- "d": "How wide to make the zipper guard."
- },
- "neckGuardLength": {
- "t": "Neck guard length",
- "d": "How far to have the zipper guard extend past the top of the zipper."
- },
- "skirtHem": {
- "t": "Skirt hem",
- "d": "Sets the hem allowance of the hem along the bottom of the skirt, as a multiple of the seam allowance."
- },
- "skirtWaistband": {
- "t": "Skirt waistband",
- "d": "Sets the width of the waistband along the top of the skirt, as a multiple of the seam allowance."
- },
-
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls how tall the hood will be."
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls how much room will be in the hood around the back of the head."
- },
- "centerSeamEase": {
- "t": "Center seam ease",
- "d": "Controls how long the center seam will be, and thus how low the crotch fork of the garment will be."
- },
- "outseamEase": {
- "t": "Outseam ease",
- "d": "Controls how far down the garment the waist, hips, seat, and upper leg points on the outseam will be."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls how wide the garment will be at the bottom hem. This option is only used if the straight sides option is disabled."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls how wide the seat is."
- },
- "crotchGussetWidth": {
- "t": "Crotch gusset Width",
- "d": "Controls how wide the crotch gusset will be. Adjust so that the front and back pieces look smooth and clean around the crotch fork and upper legs. Deeper thighs and abdomens require a larger value, while wider ones require a smaller value."
- },
- "upperLegEase": {
- "t": "Upper leg ease",
- "d": "Controls how wide the garment will be around the upper legs."
- },
- "legHemEase": {
- "t": "Leg hem ease",
- "d": "Controls how wide the bottom of the legs will be."
- },
- "neckBalance": {
- "t": "Neck position",
- "d": "Controls where the neck hole is placed on the garment."
- },
- "neckEase": {
- "t": "Neck ease",
- "d": "Controls how large the neck hole is."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Affects how wide the sleeve is at the armhole on all garments, and has some affect on the width at the hem of short sleeved garments."
- },
- "wristEase": {
- "t": "Wrist ease",
- "d": "Affects how wide the end of the sleeve is on sleeves that extend past the biceps. The effect is greater on longer sleeves."
- },
-
- "neckStyle": {
- "t": "Neck style",
- "d": "Select whether you want to add a hood to the garment, or finish the neck with a neckband."
- },
- "neckStyle.neckband": {
- "t": "Neckband",
- "d": "Finish the neck with a neckband."
- },
- "neckStyle.hood": {
- "t": "Hood",
- "d": "Generate a hood for the garment."
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls how long the sleeves of the garment will be."
- },
- "legLength": {
- "t": "Leg length",
- "d": "Controls how long the legs of the garment will be."
- },
- "hoodFrontPieceSize": {
- "t": "Hood front piece size",
- "d": "Controls if a front piece will be used, and how wide the front piece of the hood will be."
- },
- "hoodFrontBonus": {
- "t": "Hood front bonus",
- "d": "Controls how far forward the hood comes over the forehead."
- },
- "hoodFrontDip": {
- "t": "Hood Front dip",
- "d": "Controls far down the front of the hood drops over the forehead."
- },
- "skirt": {
- "t": "Skirt",
- "d": "Select whether or not you want to add a simple gathered skirt around the waist of the garment."
- },
- "skirtNo": {
- "t": "Nothing",
- "d": "A skirt will not be generated."
- },
- "skirtYes": {
- "t": "Swim skirt",
- "d": "A skirt will be generated."
- },
- "skirtLength": {
- "t": "Skirt length",
- "d": "Controls the length of the skirt, as a percentage of the waist to upper leg measurement."
- },
- "skirtWidth": {
- "t": "Skirt width",
- "d": "Controls the width of the skirt at the bottom, as a percentage of the waist measurement."
- },
-
- "legTaperPosition": {
- "t": "Leg taper position",
- "d": "Controls how the lower legs are laid out on the pattern."
- },
- "raglanScoopLength": {
- "t": "Raglan scoop length",
- "d": "Controls how far out from the armhole the raglan seam starts to scoop."
- },
- "raglanScoopMagnitude": {
- "t": "Raglan scoop depth",
- "d": "Controls how much extra material to place under the armpits."
- }
- }
-}
diff --git a/designs/onyx/i18n/fr.json b/designs/onyx/i18n/fr.json
deleted file mode 100644
index 984e2bb4f8d..00000000000
--- a/designs/onyx/i18n/fr.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
- "t": "Onyx one-piece",
- "d": "Onyx is a versatile one-piece garment with several forms.",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front",
- "neckband": "Neckband",
- "raglanSleeve": "Sleeve",
- "zipperGuard": "Zipper guard",
- "crotchGusset": "Crotch gusset",
- "hood": "Hood back",
- "hoodFront": "Hood front",
- "skirt": "Swim skirt",
- "sleeveRibbing": "Sleeve ribbing",
- "legRibbing": "Leg ribbing"
- },
- "s": {},
- "o": {
- "neckbandLength": {
- "t": "Neckband length",
- "d": "Controls how long the neckband is, as a percentage of the circumference of the neckline."
- },
- "neckbandWidth": {
- "t": "Neckband width",
- "d": "Controls how wide the finished neckband will be."
- },
- "hoodHem": {
- "t": "Hood hem",
- "d": "Sets the hem allowance along the front of the hood, as a multiple of the seam allowance."
- },
- "sleeveRibbing": {
- "t": "Sleeve Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the sleeves or to use a hem."
- },
- "sleeveRibbingNo": {
- "t": "Hem",
- "d": "Finish the sleeves with a hem."
- },
- "sleeveRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the sleeves with a piece of ribbing."
- },
- "sleeveRibbingLength": {
- "t": "Sleeve Ribbing Length",
- "d": "Controls how long the ribbing around the sleeve is, as a percentage of the sleeve circumference."
- },
- "sleeveRibbingWidth": {
- "t": "Sleeve Ribbing Width",
- "d": "Controls how wide the ribbing around the sleeve is."
- },
- "sleeveHem": {
- "t": "Sleeve hem",
- "d": "Sets the hem allowance of the hem along the end of the sleeves, as a multiple of the seam allowance."
- },
- "legRibbing": {
- "t": "Leg Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the legs or to use a hem."
- },
- "legRibbingNo": {
- "t": "Hem",
- "d": "Finish the legs with a hem."
- },
- "legRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the legs with a piece of ribbing."
- },
- "legRibbingLength": {
- "t": "Leg Ribbing Length",
- "d": "Controls how long the ribbing around the leg is, as a percentage of the leg circumference."
- },
- "legRibbingWidth": {
- "t": "Leg Ribbing Width",
- "d": "Controls how wide the ribbing around the leg is."
- },
- "legHem": {
- "t": "Leg hem",
- "d": "Sets the hem allowance of the hem along the bottom of the legs, as a multiple of the seam allowance."
- },
- "backOnFold": {
- "t": "Back on fold",
- "d": "Enable this option to make the back out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a back zipper, and enable it otherwise."
- },
- "backOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored back pieces"
- },
- "backOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "frontOnFold": {
- "t": "Front on fold",
- "d": "Enable this option to make the front out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a front zipper, and enable it otherwise."
- },
- "frontOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored front pieces"
- },
- "frontOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "zipperLength": {
- "t": "Zipper length",
- "d": "The length of the zipper, as a percentage of the vertical trunk. It is recommended that you match this length (shown below in cm/in) to the length of the actual zipper, measured from lower stop to upper stop."
- },
- "zipperGuardWidth": {
- "t": "Zipper guard width",
- "d": "How wide to make the zipper guard."
- },
- "neckGuardLength": {
- "t": "Neck guard length",
- "d": "How far to have the zipper guard extend past the top of the zipper."
- },
- "skirtHem": {
- "t": "Skirt hem",
- "d": "Sets the hem allowance of the hem along the bottom of the skirt, as a multiple of the seam allowance."
- },
- "skirtWaistband": {
- "t": "Skirt waistband",
- "d": "Sets the width of the waistband along the top of the skirt, as a multiple of the seam allowance."
- },
-
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls how tall the hood will be."
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls how much room will be in the hood around the back of the head."
- },
- "centerSeamEase": {
- "t": "Center seam ease",
- "d": "Controls how long the center seam will be, and thus how low the crotch fork of the garment will be."
- },
- "outseamEase": {
- "t": "Outseam ease",
- "d": "Controls how far down the garment the waist, hips, seat, and upper leg points on the outseam will be."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls how wide the garment will be at the bottom hem. This option is only used if the straight sides option is disabled."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls how wide the seat is."
- },
- "crotchGussetWidth": {
- "t": "Crotch gusset Width",
- "d": "Controls how wide the crotch gusset will be. Adjust so that the front and back pieces look smooth and clean around the crotch fork and upper legs. Deeper thighs and abdomens require a larger value, while wider ones require a smaller value."
- },
- "upperLegEase": {
- "t": "Upper leg ease",
- "d": "Controls how wide the garment will be around the upper legs."
- },
- "legHemEase": {
- "t": "Leg hem ease",
- "d": "Controls how wide the bottom of the legs will be."
- },
- "neckBalance": {
- "t": "Neck position",
- "d": "Controls where the neck hole is placed on the garment."
- },
- "neckEase": {
- "t": "Neck ease",
- "d": "Controls how large the neck hole is."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Affects how wide the sleeve is at the armhole on all garments, and has some affect on the width at the hem of short sleeved garments."
- },
- "wristEase": {
- "t": "Wrist ease",
- "d": "Affects how wide the end of the sleeve is on sleeves that extend past the biceps. The effect is greater on longer sleeves."
- },
-
- "neckStyle": {
- "t": "Neck style",
- "d": "Select whether you want to add a hood to the garment, or finish the neck with a neckband."
- },
- "neckStyle.neckband": {
- "t": "Neckband",
- "d": "Finish the neck with a neckband."
- },
- "neckStyle.hood": {
- "t": "Hood",
- "d": "Generate a hood for the garment."
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls how long the sleeves of the garment will be."
- },
- "legLength": {
- "t": "Leg length",
- "d": "Controls how long the legs of the garment will be."
- },
- "hoodFrontPieceSize": {
- "t": "Hood front piece size",
- "d": "Controls if a front piece will be used, and how wide the front piece of the hood will be."
- },
- "hoodFrontBonus": {
- "t": "Hood front bonus",
- "d": "Controls how far forward the hood comes over the forehead."
- },
- "hoodFrontDip": {
- "t": "Hood Front dip",
- "d": "Controls far down the front of the hood drops over the forehead."
- },
- "skirt": {
- "t": "Skirt",
- "d": "Select whether or not you want to add a simple gathered skirt around the waist of the garment."
- },
- "skirtNo": {
- "t": "Nothing",
- "d": "A skirt will not be generated."
- },
- "skirtYes": {
- "t": "Swim skirt",
- "d": "A skirt will be generated."
- },
- "skirtLength": {
- "t": "Skirt length",
- "d": "Controls the length of the skirt, as a percentage of the waist to upper leg measurement."
- },
- "skirtWidth": {
- "t": "Skirt width",
- "d": "Controls the width of the skirt at the bottom, as a percentage of the waist measurement."
- },
-
- "legTaperPosition": {
- "t": "Leg taper position",
- "d": "Controls how the lower legs are laid out on the pattern."
- },
- "raglanScoopLength": {
- "t": "Raglan scoop length",
- "d": "Controls how far out from the armhole the raglan seam starts to scoop."
- },
- "raglanScoopMagnitude": {
- "t": "Raglan scoop depth",
- "d": "Controls how much extra material to place under the armpits."
- }
- }
-}
diff --git a/designs/onyx/i18n/index.mjs b/designs/onyx/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/onyx/i18n/index.mjs
+++ b/designs/onyx/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/onyx/i18n/nl.json b/designs/onyx/i18n/nl.json
deleted file mode 100644
index 984e2bb4f8d..00000000000
--- a/designs/onyx/i18n/nl.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
- "t": "Onyx one-piece",
- "d": "Onyx is a versatile one-piece garment with several forms.",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front",
- "neckband": "Neckband",
- "raglanSleeve": "Sleeve",
- "zipperGuard": "Zipper guard",
- "crotchGusset": "Crotch gusset",
- "hood": "Hood back",
- "hoodFront": "Hood front",
- "skirt": "Swim skirt",
- "sleeveRibbing": "Sleeve ribbing",
- "legRibbing": "Leg ribbing"
- },
- "s": {},
- "o": {
- "neckbandLength": {
- "t": "Neckband length",
- "d": "Controls how long the neckband is, as a percentage of the circumference of the neckline."
- },
- "neckbandWidth": {
- "t": "Neckband width",
- "d": "Controls how wide the finished neckband will be."
- },
- "hoodHem": {
- "t": "Hood hem",
- "d": "Sets the hem allowance along the front of the hood, as a multiple of the seam allowance."
- },
- "sleeveRibbing": {
- "t": "Sleeve Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the sleeves or to use a hem."
- },
- "sleeveRibbingNo": {
- "t": "Hem",
- "d": "Finish the sleeves with a hem."
- },
- "sleeveRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the sleeves with a piece of ribbing."
- },
- "sleeveRibbingLength": {
- "t": "Sleeve Ribbing Length",
- "d": "Controls how long the ribbing around the sleeve is, as a percentage of the sleeve circumference."
- },
- "sleeveRibbingWidth": {
- "t": "Sleeve Ribbing Width",
- "d": "Controls how wide the ribbing around the sleeve is."
- },
- "sleeveHem": {
- "t": "Sleeve hem",
- "d": "Sets the hem allowance of the hem along the end of the sleeves, as a multiple of the seam allowance."
- },
- "legRibbing": {
- "t": "Leg Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the legs or to use a hem."
- },
- "legRibbingNo": {
- "t": "Hem",
- "d": "Finish the legs with a hem."
- },
- "legRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the legs with a piece of ribbing."
- },
- "legRibbingLength": {
- "t": "Leg Ribbing Length",
- "d": "Controls how long the ribbing around the leg is, as a percentage of the leg circumference."
- },
- "legRibbingWidth": {
- "t": "Leg Ribbing Width",
- "d": "Controls how wide the ribbing around the leg is."
- },
- "legHem": {
- "t": "Leg hem",
- "d": "Sets the hem allowance of the hem along the bottom of the legs, as a multiple of the seam allowance."
- },
- "backOnFold": {
- "t": "Back on fold",
- "d": "Enable this option to make the back out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a back zipper, and enable it otherwise."
- },
- "backOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored back pieces"
- },
- "backOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "frontOnFold": {
- "t": "Front on fold",
- "d": "Enable this option to make the front out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a front zipper, and enable it otherwise."
- },
- "frontOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored front pieces"
- },
- "frontOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "zipperLength": {
- "t": "Zipper length",
- "d": "The length of the zipper, as a percentage of the vertical trunk. It is recommended that you match this length (shown below in cm/in) to the length of the actual zipper, measured from lower stop to upper stop."
- },
- "zipperGuardWidth": {
- "t": "Zipper guard width",
- "d": "How wide to make the zipper guard."
- },
- "neckGuardLength": {
- "t": "Neck guard length",
- "d": "How far to have the zipper guard extend past the top of the zipper."
- },
- "skirtHem": {
- "t": "Skirt hem",
- "d": "Sets the hem allowance of the hem along the bottom of the skirt, as a multiple of the seam allowance."
- },
- "skirtWaistband": {
- "t": "Skirt waistband",
- "d": "Sets the width of the waistband along the top of the skirt, as a multiple of the seam allowance."
- },
-
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls how tall the hood will be."
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls how much room will be in the hood around the back of the head."
- },
- "centerSeamEase": {
- "t": "Center seam ease",
- "d": "Controls how long the center seam will be, and thus how low the crotch fork of the garment will be."
- },
- "outseamEase": {
- "t": "Outseam ease",
- "d": "Controls how far down the garment the waist, hips, seat, and upper leg points on the outseam will be."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls how wide the garment will be at the bottom hem. This option is only used if the straight sides option is disabled."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls how wide the seat is."
- },
- "crotchGussetWidth": {
- "t": "Crotch gusset Width",
- "d": "Controls how wide the crotch gusset will be. Adjust so that the front and back pieces look smooth and clean around the crotch fork and upper legs. Deeper thighs and abdomens require a larger value, while wider ones require a smaller value."
- },
- "upperLegEase": {
- "t": "Upper leg ease",
- "d": "Controls how wide the garment will be around the upper legs."
- },
- "legHemEase": {
- "t": "Leg hem ease",
- "d": "Controls how wide the bottom of the legs will be."
- },
- "neckBalance": {
- "t": "Neck position",
- "d": "Controls where the neck hole is placed on the garment."
- },
- "neckEase": {
- "t": "Neck ease",
- "d": "Controls how large the neck hole is."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Affects how wide the sleeve is at the armhole on all garments, and has some affect on the width at the hem of short sleeved garments."
- },
- "wristEase": {
- "t": "Wrist ease",
- "d": "Affects how wide the end of the sleeve is on sleeves that extend past the biceps. The effect is greater on longer sleeves."
- },
-
- "neckStyle": {
- "t": "Neck style",
- "d": "Select whether you want to add a hood to the garment, or finish the neck with a neckband."
- },
- "neckStyle.neckband": {
- "t": "Neckband",
- "d": "Finish the neck with a neckband."
- },
- "neckStyle.hood": {
- "t": "Hood",
- "d": "Generate a hood for the garment."
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls how long the sleeves of the garment will be."
- },
- "legLength": {
- "t": "Leg length",
- "d": "Controls how long the legs of the garment will be."
- },
- "hoodFrontPieceSize": {
- "t": "Hood front piece size",
- "d": "Controls if a front piece will be used, and how wide the front piece of the hood will be."
- },
- "hoodFrontBonus": {
- "t": "Hood front bonus",
- "d": "Controls how far forward the hood comes over the forehead."
- },
- "hoodFrontDip": {
- "t": "Hood Front dip",
- "d": "Controls far down the front of the hood drops over the forehead."
- },
- "skirt": {
- "t": "Skirt",
- "d": "Select whether or not you want to add a simple gathered skirt around the waist of the garment."
- },
- "skirtNo": {
- "t": "Nothing",
- "d": "A skirt will not be generated."
- },
- "skirtYes": {
- "t": "Swim skirt",
- "d": "A skirt will be generated."
- },
- "skirtLength": {
- "t": "Skirt length",
- "d": "Controls the length of the skirt, as a percentage of the waist to upper leg measurement."
- },
- "skirtWidth": {
- "t": "Skirt width",
- "d": "Controls the width of the skirt at the bottom, as a percentage of the waist measurement."
- },
-
- "legTaperPosition": {
- "t": "Leg taper position",
- "d": "Controls how the lower legs are laid out on the pattern."
- },
- "raglanScoopLength": {
- "t": "Raglan scoop length",
- "d": "Controls how far out from the armhole the raglan seam starts to scoop."
- },
- "raglanScoopMagnitude": {
- "t": "Raglan scoop depth",
- "d": "Controls how much extra material to place under the armpits."
- }
- }
-}
diff --git a/designs/onyx/i18n/uk.json b/designs/onyx/i18n/uk.json
deleted file mode 100644
index 984e2bb4f8d..00000000000
--- a/designs/onyx/i18n/uk.json
+++ /dev/null
@@ -1,252 +0,0 @@
-{
- "t": "Onyx one-piece",
- "d": "Onyx is a versatile one-piece garment with several forms.",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front",
- "neckband": "Neckband",
- "raglanSleeve": "Sleeve",
- "zipperGuard": "Zipper guard",
- "crotchGusset": "Crotch gusset",
- "hood": "Hood back",
- "hoodFront": "Hood front",
- "skirt": "Swim skirt",
- "sleeveRibbing": "Sleeve ribbing",
- "legRibbing": "Leg ribbing"
- },
- "s": {},
- "o": {
- "neckbandLength": {
- "t": "Neckband length",
- "d": "Controls how long the neckband is, as a percentage of the circumference of the neckline."
- },
- "neckbandWidth": {
- "t": "Neckband width",
- "d": "Controls how wide the finished neckband will be."
- },
- "hoodHem": {
- "t": "Hood hem",
- "d": "Sets the hem allowance along the front of the hood, as a multiple of the seam allowance."
- },
- "sleeveRibbing": {
- "t": "Sleeve Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the sleeves or to use a hem."
- },
- "sleeveRibbingNo": {
- "t": "Hem",
- "d": "Finish the sleeves with a hem."
- },
- "sleeveRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the sleeves with a piece of ribbing."
- },
- "sleeveRibbingLength": {
- "t": "Sleeve Ribbing Length",
- "d": "Controls how long the ribbing around the sleeve is, as a percentage of the sleeve circumference."
- },
- "sleeveRibbingWidth": {
- "t": "Sleeve Ribbing Width",
- "d": "Controls how wide the ribbing around the sleeve is."
- },
- "sleeveHem": {
- "t": "Sleeve hem",
- "d": "Sets the hem allowance of the hem along the end of the sleeves, as a multiple of the seam allowance."
- },
- "legRibbing": {
- "t": "Leg Ribbing",
- "d": "Choose whether to make ribbed knit cuffs for the legs or to use a hem."
- },
- "legRibbingNo": {
- "t": "Hem",
- "d": "Finish the legs with a hem."
- },
- "legRibbingYes": {
- "t": "Ribbing",
- "d": "Finish the legs with a piece of ribbing."
- },
- "legRibbingLength": {
- "t": "Leg Ribbing Length",
- "d": "Controls how long the ribbing around the leg is, as a percentage of the leg circumference."
- },
- "legRibbingWidth": {
- "t": "Leg Ribbing Width",
- "d": "Controls how wide the ribbing around the leg is."
- },
- "legHem": {
- "t": "Leg hem",
- "d": "Sets the hem allowance of the hem along the bottom of the legs, as a multiple of the seam allowance."
- },
- "backOnFold": {
- "t": "Back on fold",
- "d": "Enable this option to make the back out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a back zipper, and enable it otherwise."
- },
- "backOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored back pieces"
- },
- "backOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "frontOnFold": {
- "t": "Front on fold",
- "d": "Enable this option to make the front out of a single piece, or disable to make it out of two mirrored pieces joined by a seam. It is recommended to disable this if placing a front zipper, and enable it otherwise."
- },
- "frontOnFoldNo": {
- "t": "Cut separate",
- "d": "Cut two separate mirrored front pieces"
- },
- "frontOnFoldYes": {
- "t": "Cut on fold",
- "d": "Cut the back as a single piece, on the fold"
- },
- "zipperLength": {
- "t": "Zipper length",
- "d": "The length of the zipper, as a percentage of the vertical trunk. It is recommended that you match this length (shown below in cm/in) to the length of the actual zipper, measured from lower stop to upper stop."
- },
- "zipperGuardWidth": {
- "t": "Zipper guard width",
- "d": "How wide to make the zipper guard."
- },
- "neckGuardLength": {
- "t": "Neck guard length",
- "d": "How far to have the zipper guard extend past the top of the zipper."
- },
- "skirtHem": {
- "t": "Skirt hem",
- "d": "Sets the hem allowance of the hem along the bottom of the skirt, as a multiple of the seam allowance."
- },
- "skirtWaistband": {
- "t": "Skirt waistband",
- "d": "Sets the width of the waistband along the top of the skirt, as a multiple of the seam allowance."
- },
-
- "hoodHeight": {
- "t": "Hood height",
- "d": "Controls how tall the hood will be."
- },
- "hoodDepth": {
- "t": "Hood depth",
- "d": "Controls how much room will be in the hood around the back of the head."
- },
- "centerSeamEase": {
- "t": "Center seam ease",
- "d": "Controls how long the center seam will be, and thus how low the crotch fork of the garment will be."
- },
- "outseamEase": {
- "t": "Outseam ease",
- "d": "Controls how far down the garment the waist, hips, seat, and upper leg points on the outseam will be."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls how wide the garment will be around the chest."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls how wide the garment will be at the bottom hem. This option is only used if the straight sides option is disabled."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls how wide the seat is."
- },
- "crotchGussetWidth": {
- "t": "Crotch gusset Width",
- "d": "Controls how wide the crotch gusset will be. Adjust so that the front and back pieces look smooth and clean around the crotch fork and upper legs. Deeper thighs and abdomens require a larger value, while wider ones require a smaller value."
- },
- "upperLegEase": {
- "t": "Upper leg ease",
- "d": "Controls how wide the garment will be around the upper legs."
- },
- "legHemEase": {
- "t": "Leg hem ease",
- "d": "Controls how wide the bottom of the legs will be."
- },
- "neckBalance": {
- "t": "Neck position",
- "d": "Controls where the neck hole is placed on the garment."
- },
- "neckEase": {
- "t": "Neck ease",
- "d": "Controls how large the neck hole is."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Affects how wide the sleeve is at the armhole on all garments, and has some affect on the width at the hem of short sleeved garments."
- },
- "wristEase": {
- "t": "Wrist ease",
- "d": "Affects how wide the end of the sleeve is on sleeves that extend past the biceps. The effect is greater on longer sleeves."
- },
-
- "neckStyle": {
- "t": "Neck style",
- "d": "Select whether you want to add a hood to the garment, or finish the neck with a neckband."
- },
- "neckStyle.neckband": {
- "t": "Neckband",
- "d": "Finish the neck with a neckband."
- },
- "neckStyle.hood": {
- "t": "Hood",
- "d": "Generate a hood for the garment."
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls how long the sleeves of the garment will be."
- },
- "legLength": {
- "t": "Leg length",
- "d": "Controls how long the legs of the garment will be."
- },
- "hoodFrontPieceSize": {
- "t": "Hood front piece size",
- "d": "Controls if a front piece will be used, and how wide the front piece of the hood will be."
- },
- "hoodFrontBonus": {
- "t": "Hood front bonus",
- "d": "Controls how far forward the hood comes over the forehead."
- },
- "hoodFrontDip": {
- "t": "Hood Front dip",
- "d": "Controls far down the front of the hood drops over the forehead."
- },
- "skirt": {
- "t": "Skirt",
- "d": "Select whether or not you want to add a simple gathered skirt around the waist of the garment."
- },
- "skirtNo": {
- "t": "Nothing",
- "d": "A skirt will not be generated."
- },
- "skirtYes": {
- "t": "Swim skirt",
- "d": "A skirt will be generated."
- },
- "skirtLength": {
- "t": "Skirt length",
- "d": "Controls the length of the skirt, as a percentage of the waist to upper leg measurement."
- },
- "skirtWidth": {
- "t": "Skirt width",
- "d": "Controls the width of the skirt at the bottom, as a percentage of the waist measurement."
- },
-
- "legTaperPosition": {
- "t": "Leg taper position",
- "d": "Controls how the lower legs are laid out on the pattern."
- },
- "raglanScoopLength": {
- "t": "Raglan scoop length",
- "d": "Controls how far out from the armhole the raglan seam starts to scoop."
- },
- "raglanScoopMagnitude": {
- "t": "Raglan scoop depth",
- "d": "Controls how much extra material to place under the armpits."
- }
- }
-}
diff --git a/designs/onyx/package.json b/designs/onyx/package.json
index 29acd1a7b93..56d09eb844e 100644
--- a/designs/onyx/package.json
+++ b/designs/onyx/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/onyx",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for one-piece garments",
"author": "Thrunic (https://github.com/Thrunic)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/onyx/src/index.mjs b/designs/onyx/src/index.mjs
index c09e0bf3714..332a54e2ba1 100644
--- a/designs/onyx/src/index.mjs
+++ b/designs/onyx/src/index.mjs
@@ -1,6 +1,6 @@
// Import Design constructor
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Import Parts
import { front } from './front.mjs'
@@ -17,7 +17,7 @@ import { legRibbing } from './legribbing.mjs'
// Create new design
const Onyx = new Design({
- data,
+ data: about,
parts: [
front,
back,
@@ -48,4 +48,5 @@ export {
legRibbing,
Onyx,
i18n,
+ about,
}
diff --git a/designs/onyx/tests/shared.test.mjs b/designs/onyx/tests/shared.test.mjs
index 56b156f3ef2..a0c19ae38e1 100644
--- a/designs/onyx/tests/shared.test.mjs
+++ b/designs/onyx/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Onyx, i18n } from '../src/index.mjs'
+import { Onyx, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Onyx)
+testPatternConfig(Onyx, about)
// Test translation
testPatternI18n(Onyx, i18n)
diff --git a/designs/opal/README.md b/designs/opal/README.md
index 26d1b52f417..756b1e39d25 100644
--- a/designs/opal/README.md
+++ b/designs/opal/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/opal
@@ -59,7 +44,7 @@ A FreeSewing pattern for overalls
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/opal/data.mjs b/designs/opal/data.mjs
deleted file mode 100644
index 58984d86295..00000000000
--- a/designs/opal/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/opal'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/opal/i18n/de.json b/designs/opal/i18n/de.json
deleted file mode 100644
index 15ff85543e0..00000000000
--- a/designs/opal/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Opal",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/opal/i18n/es.json b/designs/opal/i18n/es.json
deleted file mode 100644
index 15ff85543e0..00000000000
--- a/designs/opal/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Opal",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/opal/i18n/fr.json b/designs/opal/i18n/fr.json
deleted file mode 100644
index 15ff85543e0..00000000000
--- a/designs/opal/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Opal",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/opal/i18n/index.mjs b/designs/opal/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/opal/i18n/index.mjs
+++ b/designs/opal/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/opal/i18n/nl.json b/designs/opal/i18n/nl.json
deleted file mode 100644
index 15ff85543e0..00000000000
--- a/designs/opal/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Opal",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/opal/i18n/uk.json b/designs/opal/i18n/uk.json
deleted file mode 100644
index 15ff85543e0..00000000000
--- a/designs/opal/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Opal",
- "d": "A FreeSewing pattern that needs a description",
- "p": { },
- "s": { },
- "o": { }
-}
diff --git a/designs/opal/package.json b/designs/opal/package.json
index 5e6cef2dd99..e7134b50c21 100644
--- a/designs/opal/package.json
+++ b/designs/opal/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/opal",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for overalls",
"author": "Thrunic (https://github.com/Thrunic)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/opal/src/index.mjs b/designs/opal/src/index.mjs
index 010bef67feb..a0dbf46316f 100644
--- a/designs/opal/src/index.mjs
+++ b/designs/opal/src/index.mjs
@@ -1,6 +1,6 @@
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { front } from './front.mjs'
import { back } from './back.mjs'
@@ -17,7 +17,7 @@ import { hammerLoop } from './hammerloop.mjs'
// Create new design
const Opal = new Design({
- data,
+ data: about,
parts: [
front,
back,
@@ -50,4 +50,5 @@ export {
hammerLoop,
i18n,
Opal,
+ about,
}
diff --git a/designs/opal/tests/shared.test.mjs b/designs/opal/tests/shared.test.mjs
index 9267c200845..32803f362b7 100644
--- a/designs/opal/tests/shared.test.mjs
+++ b/designs/opal/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Opal, i18n } from '../src/index.mjs'
+import { Opal, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Opal)
+testPatternConfig(Opal, about)
// Test translation
testPatternI18n(Opal, i18n)
diff --git a/designs/otis/README.md b/designs/otis/README.md
index b9cb131b2b8..e68b91a4689 100644
--- a/designs/otis/README.md
+++ b/designs/otis/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/otis
@@ -59,7 +44,7 @@ A FreeSewing pattern for a baby romper
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/otis/data.mjs b/designs/otis/data.mjs
deleted file mode 100644
index e161d86dad0..00000000000
--- a/designs/otis/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/otis'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/otis/i18n/de.json b/designs/otis/i18n/de.json
deleted file mode 100644
index 7dbaf3b1927..00000000000
--- a/designs/otis/i18n/de.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Otis",
- "d": "A FreeSewing pattern for a romper",
- "p": {
- "back": "Back",
- "front": "Front",
- "shortsleeve": "Short sleeve",
- "longsleeve": "Long sleeve",
- "bindingNeckBack": "Neck back binding",
- "bindingNeckFront": "Neck front binding",
- "bindingLeg": "Leg binding"
- },
- "s": {
- "bindingNeckBack.t": "The Back Neck Binding is not shown",
- "bindingNeckBack.d": "The **Back Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingNeckFront.t": "The Front Neck Binding is not shown",
- "bindingNeckFront.d": "The **Front Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingLeg.t": "The Leg Binding is not shown",
- "bindingLeg.d": "The **Leg Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long."
- },
- "o": {
- "binding": {
- "t": "Binding",
- "d": "Binding determines the size of the binding for the neck and leg openings."
- },
- "ease": {
- "t": "Ease",
- "d": "The ease is a percentage of the waist measurement. Default is 14%"
- },
- "hem": {
- "t": "Hem",
- "d": "Hem determines the size of the hem on the sleeves."
- },
- "sleeveType": {
- "t": "Sleeve Type",
- "d": "Otis can be made with short or long sleeves."
- },
- "sleeveType.long": {
- "t": "Long Sleeve",
- "d": "Long sleeves, to the wrist."
- },
- "sleeveType.short": {
- "t": "Short Sleeve",
- "d": "Short sleeves, to the biceps."
- },
- "snapPlacket": {
- "t": "Snap Placket",
- "d": "This option controls the depth of the placket that holds the snaps. "
- }
- }
-}
diff --git a/designs/otis/i18n/es.json b/designs/otis/i18n/es.json
deleted file mode 100644
index 7dbaf3b1927..00000000000
--- a/designs/otis/i18n/es.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Otis",
- "d": "A FreeSewing pattern for a romper",
- "p": {
- "back": "Back",
- "front": "Front",
- "shortsleeve": "Short sleeve",
- "longsleeve": "Long sleeve",
- "bindingNeckBack": "Neck back binding",
- "bindingNeckFront": "Neck front binding",
- "bindingLeg": "Leg binding"
- },
- "s": {
- "bindingNeckBack.t": "The Back Neck Binding is not shown",
- "bindingNeckBack.d": "The **Back Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingNeckFront.t": "The Front Neck Binding is not shown",
- "bindingNeckFront.d": "The **Front Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingLeg.t": "The Leg Binding is not shown",
- "bindingLeg.d": "The **Leg Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long."
- },
- "o": {
- "binding": {
- "t": "Binding",
- "d": "Binding determines the size of the binding for the neck and leg openings."
- },
- "ease": {
- "t": "Ease",
- "d": "The ease is a percentage of the waist measurement. Default is 14%"
- },
- "hem": {
- "t": "Hem",
- "d": "Hem determines the size of the hem on the sleeves."
- },
- "sleeveType": {
- "t": "Sleeve Type",
- "d": "Otis can be made with short or long sleeves."
- },
- "sleeveType.long": {
- "t": "Long Sleeve",
- "d": "Long sleeves, to the wrist."
- },
- "sleeveType.short": {
- "t": "Short Sleeve",
- "d": "Short sleeves, to the biceps."
- },
- "snapPlacket": {
- "t": "Snap Placket",
- "d": "This option controls the depth of the placket that holds the snaps. "
- }
- }
-}
diff --git a/designs/otis/i18n/fr.json b/designs/otis/i18n/fr.json
deleted file mode 100644
index 7dbaf3b1927..00000000000
--- a/designs/otis/i18n/fr.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Otis",
- "d": "A FreeSewing pattern for a romper",
- "p": {
- "back": "Back",
- "front": "Front",
- "shortsleeve": "Short sleeve",
- "longsleeve": "Long sleeve",
- "bindingNeckBack": "Neck back binding",
- "bindingNeckFront": "Neck front binding",
- "bindingLeg": "Leg binding"
- },
- "s": {
- "bindingNeckBack.t": "The Back Neck Binding is not shown",
- "bindingNeckBack.d": "The **Back Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingNeckFront.t": "The Front Neck Binding is not shown",
- "bindingNeckFront.d": "The **Front Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingLeg.t": "The Leg Binding is not shown",
- "bindingLeg.d": "The **Leg Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long."
- },
- "o": {
- "binding": {
- "t": "Binding",
- "d": "Binding determines the size of the binding for the neck and leg openings."
- },
- "ease": {
- "t": "Ease",
- "d": "The ease is a percentage of the waist measurement. Default is 14%"
- },
- "hem": {
- "t": "Hem",
- "d": "Hem determines the size of the hem on the sleeves."
- },
- "sleeveType": {
- "t": "Sleeve Type",
- "d": "Otis can be made with short or long sleeves."
- },
- "sleeveType.long": {
- "t": "Long Sleeve",
- "d": "Long sleeves, to the wrist."
- },
- "sleeveType.short": {
- "t": "Short Sleeve",
- "d": "Short sleeves, to the biceps."
- },
- "snapPlacket": {
- "t": "Snap Placket",
- "d": "This option controls the depth of the placket that holds the snaps. "
- }
- }
-}
diff --git a/designs/otis/i18n/index.mjs b/designs/otis/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/otis/i18n/index.mjs
+++ b/designs/otis/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/otis/i18n/nl.json b/designs/otis/i18n/nl.json
deleted file mode 100644
index 7dbaf3b1927..00000000000
--- a/designs/otis/i18n/nl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Otis",
- "d": "A FreeSewing pattern for a romper",
- "p": {
- "back": "Back",
- "front": "Front",
- "shortsleeve": "Short sleeve",
- "longsleeve": "Long sleeve",
- "bindingNeckBack": "Neck back binding",
- "bindingNeckFront": "Neck front binding",
- "bindingLeg": "Leg binding"
- },
- "s": {
- "bindingNeckBack.t": "The Back Neck Binding is not shown",
- "bindingNeckBack.d": "The **Back Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingNeckFront.t": "The Front Neck Binding is not shown",
- "bindingNeckFront.d": "The **Front Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingLeg.t": "The Leg Binding is not shown",
- "bindingLeg.d": "The **Leg Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long."
- },
- "o": {
- "binding": {
- "t": "Binding",
- "d": "Binding determines the size of the binding for the neck and leg openings."
- },
- "ease": {
- "t": "Ease",
- "d": "The ease is a percentage of the waist measurement. Default is 14%"
- },
- "hem": {
- "t": "Hem",
- "d": "Hem determines the size of the hem on the sleeves."
- },
- "sleeveType": {
- "t": "Sleeve Type",
- "d": "Otis can be made with short or long sleeves."
- },
- "sleeveType.long": {
- "t": "Long Sleeve",
- "d": "Long sleeves, to the wrist."
- },
- "sleeveType.short": {
- "t": "Short Sleeve",
- "d": "Short sleeves, to the biceps."
- },
- "snapPlacket": {
- "t": "Snap Placket",
- "d": "This option controls the depth of the placket that holds the snaps. "
- }
- }
-}
diff --git a/designs/otis/i18n/uk.json b/designs/otis/i18n/uk.json
deleted file mode 100644
index 7dbaf3b1927..00000000000
--- a/designs/otis/i18n/uk.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Otis",
- "d": "A FreeSewing pattern for a romper",
- "p": {
- "back": "Back",
- "front": "Front",
- "shortsleeve": "Short sleeve",
- "longsleeve": "Long sleeve",
- "bindingNeckBack": "Neck back binding",
- "bindingNeckFront": "Neck front binding",
- "bindingLeg": "Leg binding"
- },
- "s": {
- "bindingNeckBack.t": "The Back Neck Binding is not shown",
- "bindingNeckBack.d": "The **Back Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingNeckFront.t": "The Front Neck Binding is not shown",
- "bindingNeckFront.d": "The **Front Neck Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long.",
- "bindingLeg.t": "The Leg Binding is not shown",
- "bindingLeg.d": "The **Leg Binding** is a rectangular piece of fabric {{{ width }}} wide and {{{ length }}} long."
- },
- "o": {
- "binding": {
- "t": "Binding",
- "d": "Binding determines the size of the binding for the neck and leg openings."
- },
- "ease": {
- "t": "Ease",
- "d": "The ease is a percentage of the waist measurement. Default is 14%"
- },
- "hem": {
- "t": "Hem",
- "d": "Hem determines the size of the hem on the sleeves."
- },
- "sleeveType": {
- "t": "Sleeve Type",
- "d": "Otis can be made with short or long sleeves."
- },
- "sleeveType.long": {
- "t": "Long Sleeve",
- "d": "Long sleeves, to the wrist."
- },
- "sleeveType.short": {
- "t": "Short Sleeve",
- "d": "Short sleeves, to the biceps."
- },
- "snapPlacket": {
- "t": "Snap Placket",
- "d": "This option controls the depth of the placket that holds the snaps. "
- }
- }
-}
diff --git a/designs/otis/package.json b/designs/otis/package.json
index 1638fb355f1..e9f40a53db6 100644
--- a/designs/otis/package.json
+++ b/designs/otis/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/otis",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a baby romper",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/otis/src/index.mjs b/designs/otis/src/index.mjs
index daf3165132c..85f7c11e8e3 100644
--- a/designs/otis/src/index.mjs
+++ b/designs/otis/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Parts
import { back } from './back.mjs'
@@ -12,7 +12,7 @@ import { bindingLeg } from './bindingLeg.mjs'
// Create new design
const Otis = new Design({
- data,
+ data: about,
parts: [back, front, shortsleeve, longsleeve, bindingNeckBack, bindingNeckFront, bindingLeg],
})
@@ -27,4 +27,5 @@ export {
bindingLeg,
i18n,
Otis,
+ about,
}
diff --git a/designs/otis/tests/shared.test.mjs b/designs/otis/tests/shared.test.mjs
index 8f3426a6452..3c325928269 100644
--- a/designs/otis/tests/shared.test.mjs
+++ b/designs/otis/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Otis, i18n } from '../src/index.mjs'
+import { Otis, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Otis)
+testPatternConfig(Otis, about)
// Test translation
testPatternI18n(Otis, i18n)
diff --git a/designs/paco/README.md b/designs/paco/README.md
index 0ca7f798695..c50cdbf3a38 100644
--- a/designs/paco/README.md
+++ b/designs/paco/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/paco
@@ -59,7 +44,7 @@ A FreeSewing pattern for summer pants
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/paco/data.mjs b/designs/paco/data.mjs
deleted file mode 100644
index 43a68d04e6f..00000000000
--- a/designs/paco/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/paco'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/paco/i18n/de.json b/designs/paco/i18n/de.json
deleted file mode 100644
index 8795716de51..00000000000
--- a/designs/paco/i18n/de.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Paco, die Hose",
- "d": "Paco ist eine lässige, aber stilvolle Sommerhose.",
- "p": {
- "back": "Back",
- "backPocketBag": "Back pocket bag",
- "backPocketWelt": "Back pocket welt",
- "backPocketWeltInterfacing": "Bacl pocket welt interfacing",
- "cuff": "Cuff",
- "front": "Front",
- "frontPocketBag": "Front pocket bag",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "heelEase": {
- "t": "Bequemlichkeitszugabe Ferse",
- "d": "Größe der Bequemlichkeitszugabe an der Ferse (wenn man in das Hosenbein hineinsteigt)"
- },
- "frontPockets": {
- "t": "Vordere Taschen",
- "d": "Ob vordere Taschen an der Seitennaht hinzugefügt werden sollen oder nicht"
- },
- "backPockets": {
- "t": "Gesäßtaschen",
- "d": "Hinzufügen einer Kedertasche zur Rückseite oder nicht"
- },
- "elasticatedHem": {
- "t": "Elastischer Saum",
- "d": "Ob ein elastischer Saum gewünscht ist oder nicht"
- },
- "ankleElastic": {
- "t": "Knöchel/Saum Gummizugbreite",
- "d": "Breite des (optionalen) Gummizugs am Knöchel/Saum"
- }
- }
-}
diff --git a/designs/paco/i18n/es.json b/designs/paco/i18n/es.json
deleted file mode 100644
index 836139455a2..00000000000
--- a/designs/paco/i18n/es.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Paco, pantalones largos",
- "d": "Paco son pantalones de verano casual pero con estilo.",
- "p": {
- "back": "Back",
- "backPocketBag": "Back pocket bag",
- "backPocketWelt": "Back pocket welt",
- "backPocketWeltInterfacing": "Bacl pocket welt interfacing",
- "cuff": "Cuff",
- "front": "Front",
- "frontPocketBag": "Front pocket bag",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "heelEase": {
- "t": "Heel ease",
- "d": "La cantidad de facilidad en tu talón (cuando pisas la pierna)"
- },
- "frontPockets": {
- "t": "Pockets delanteros",
- "d": "Añadir o no bolsillos frontales en la costura lateral"
- },
- "backPockets": {
- "t": "Paquetes de retroceso",
- "d": "Añadir o no bolsillos de soldadura a la espalda"
- },
- "elasticatedHem": {
- "t": "Hilo Elasticado",
- "d": "Si desea o no un llavero elasticado"
- },
- "ankleElastic": {
- "t": "Anchura elástica Ancla/Hem",
- "d": "Ancho de elástico (opcional) en el ancla/hem"
- }
- }
-}
diff --git a/designs/paco/i18n/fr.json b/designs/paco/i18n/fr.json
deleted file mode 100644
index 881370b3b34..00000000000
--- a/designs/paco/i18n/fr.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Pantalon Paco",
- "d": "Paco est un pantalon d'été décontracté mais élégant.",
- "p": {
- "back": "Back",
- "backPocketBag": "Back pocket bag",
- "backPocketWelt": "Back pocket welt",
- "backPocketWeltInterfacing": "Bacl pocket welt interfacing",
- "cuff": "Cuff",
- "front": "Front",
- "frontPocketBag": "Front pocket bag",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "heelEase": {
- "t": "Aisance de talon",
- "d": "La quantité d'aisance à votre talon (au passage la jambe de pantalon)"
- },
- "frontPockets": {
- "t": "Poches avant",
- "d": "Si oui ou non ajouter des poches avant sur la couture latérale"
- },
- "backPockets": {
- "t": "Poches arrière",
- "d": "Si oui ou non ajouter des poches à l'arrière"
- },
- "elasticatedHem": {
- "t": "Ourlet élastiqué",
- "d": "Si vous voulez ou non un ourlet élastiqué"
- },
- "ankleElastic": {
- "t": "Largeur élastique de cheville/ourlet",
- "d": "Largeur de l'élastique (optionnel) à la cheville/ourlet"
- }
- }
-}
diff --git a/designs/paco/i18n/index.mjs b/designs/paco/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/paco/i18n/index.mjs
+++ b/designs/paco/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/paco/i18n/nl.json b/designs/paco/i18n/nl.json
deleted file mode 100644
index 3ca5795f959..00000000000
--- a/designs/paco/i18n/nl.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "t": "Paco broek",
- "d": "Paco is een casual maar stijlvolle zomerbroek.",
- "p": {
- "back": "Back",
- "backPocketBag": "Back pocket bag",
- "backPocketWelt": "Back pocket welt",
- "backPocketWeltInterfacing": "Bacl pocket welt interfacing",
- "cuff": "Cuff",
- "front": "Front",
- "frontPocketBag": "Front pocket bag",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "heelEase": {
- "t": "Overwijdte hiel",
- "d": "De hoeveelheid overwijdte aan de hiel (wanneer je je been door de broekspijp steekt)"
- },
- "frontPockets": {
- "t": "Voorzakken",
- "d": "Of je al dan niet zakken in de zijnaad wil"
- },
- "backPockets": {
- "t": "Achterzakken",
- "d": "Of je al dan niet paspelzakken op de achterkant wil"
- },
- "elasticatedHem": {
- "t": "Elastische zoom",
- "d": "Of je wel of niet elastiek aan de zoom wil"
- },
- "ankleElastic": {
- "t": "Breedte enkel/zoom elastiek",
- "d": "Breedte van de (optionele) elastiek aan de enkel/zoom"
- }
- }
-}
diff --git a/designs/paco/i18n/uk.json b/designs/paco/i18n/uk.json
deleted file mode 100644
index 04ccfe73cc3..00000000000
--- a/designs/paco/i18n/uk.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "t": "Paco pants",
- "d": "Paco are casual yet stylish summer pants.",
- "p": {
- "back": "Back",
- "backPocketBag": "Back pocket bag",
- "backPocketWelt": "Back pocket welt",
- "backPocketWeltInterfacing": "Bacl pocket welt interfacing",
- "cuff": "Cuff",
- "front": "Front",
- "frontPocketBag": "Front pocket bag",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "heelEase": {
- "t": "Heel ease",
- "d": "The amount of ease at your heel (when stepping into the leg)"
- },
- "frontPockets": {
- "t": "Front pockets",
- "d": "Whether or not to add front pockets on the side seam"
- },
- "frontPocketFlapSize": {
- "t": "Front pocket flap size",
- "d": "This option controls the front pocket flap size, but it is not exposed to the UI"
- },
- "backPockets": {
- "t": "Back pockets",
- "d": "Whether or not to add welt pockets to the back"
- },
- "elasticatedHem": {
- "t": "Elasticated hem",
- "d": "Whether or not you want an elasticated hem"
- },
- "ankleElastic": {
- "t": "Ankle/Hem elastic width",
- "d": "Width of the (optional) elastic at the ankle/hem"
- }
- }
-}
diff --git a/designs/paco/package.json b/designs/paco/package.json
index 6d9f0e8fc9a..a7c963b687b 100644
--- a/designs/paco/package.json
+++ b/designs/paco/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/paco",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for summer pants",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/titan": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/titan": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/paco/src/back.mjs b/designs/paco/src/back.mjs
index 0c4bb980ec0..c65d9453aa8 100644
--- a/designs/paco/src/back.mjs
+++ b/designs/paco/src/back.mjs
@@ -358,8 +358,8 @@ export const back = {
// Disable this option from Titan
waistbandHeight: 0,
// Fit
- waistEase: { pct: 2, min: 0, max: 10, menu: 'fit' },
- seatEase: { pct: 5, min: 0, max: 15, menu: 'fit' },
+ waistEase: { pct: 2, min: 0, max: 10, ...pctBasedOn('waist'), menu: 'fit' },
+ seatEase: { pct: 5, min: 0, max: 15, ...pctBasedOn('seat'), menu: 'fit' },
// Style
waistHeight: { pct: 5, min: 0, max: 100, menu: 'style' },
lengthBonus: { pct: 0, min: -15, max: 10, menu: 'style' },
@@ -382,7 +382,7 @@ export const back = {
...pctBasedOn('waistToFloor'),
menu: 'elastic',
},
- heelEase: { pct: 5, min: 0, max: 50, menu: 'elastic' },
+ heelEase: { pct: 5, min: 0, max: 50, ...pctBasedOn('heel'), menu: 'elastic' },
// Pockets
frontPockets: { bool: true, menu: 'pockets' },
backPockets: { bool: false, menu: 'pockets' },
diff --git a/designs/paco/src/index.mjs b/designs/paco/src/index.mjs
index a0064129ba0..225ac76cf85 100644
--- a/designs/paco/src/index.mjs
+++ b/designs/paco/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as titanI18n } from '@freesewing/titan'
import { i18n as pacoI18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
@@ -13,7 +13,7 @@ import { waistband } from './waistband.mjs'
// Setup our new design
const Paco = new Design({
- data,
+ data: about,
parts: [
back,
front,
@@ -41,4 +41,5 @@ export {
waistband,
Paco,
i18n,
+ about,
}
diff --git a/designs/paco/tests/shared.test.mjs b/designs/paco/tests/shared.test.mjs
index 5d8139e78d3..52e8d0b6fdc 100644
--- a/designs/paco/tests/shared.test.mjs
+++ b/designs/paco/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Paco, i18n } from '../src/index.mjs'
+import { Paco, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Paco)
+testPatternConfig(Paco, about)
// Test translation
testPatternI18n(Paco, i18n)
diff --git a/designs/penelope/README.md b/designs/penelope/README.md
index 29d2e1f0a96..49561419260 100644
--- a/designs/penelope/README.md
+++ b/designs/penelope/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/penelope
@@ -59,7 +44,7 @@ A FreeSewing pattern for a pencil skirt
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/penelope/data.mjs b/designs/penelope/data.mjs
deleted file mode 100644
index 5d79bd75b70..00000000000
--- a/designs/penelope/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/penelope'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/penelope/i18n/de.json b/designs/penelope/i18n/de.json
deleted file mode 100644
index 431cd42320d..00000000000
--- a/designs/penelope/i18n/de.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "t": "Penelope, der Bleistiftrock",
- "d": "Penelope ist ein Bleistiftrock mit oder ohne Gehschlitz in rückwärtigen Teil.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "waistband": "Bund"
- },
- "s": {},
- "o": {
- "backDartDepthFactor": {
- "t": "Zurück zum Abnäherinhalttiefenfaktor",
- "d": "Wie weit der rückwärtige Abnäher vom Taillenbund nach unten geht. Dies ist ein Faktor des Abstandes von der natürlichen Taille bis zum Gesäßumfang."
- },
- "backVent": {
- "t": "Hinterlüftung",
- "d": "Fügt einen Bewegungschlitz hinten am Rock hinzu."
- },
- "backVentLength": {
- "t": "Rückenlüftungslänge",
- "d": "Die Länge des Bewegungschlitzes hinten als ein Prozentsatz der Gesamtrocklänge."
- },
- "curvedDarts": {
- "t": "Curved darts",
- "d": "Whether or not to used curved darts."
- },
- "dartToSideSeamFactor": {
- "t": "Abnäher zu Seitennaht Faktor",
- "d": "Prozentuales Verhältnis wieviel der Reduktion von der Hüftweite zur Taille über die Abnäher und wieviel über die Seitennäht erzielt wurde."
- },
- "frontDartDepthFactor": {
- "t": "Vorderer Abnäherinhälttiefenfaktor",
- "d": "Wie weit nach unten der vordere Abnäher von der Taillenlinie geht. Dies ist ein Faktor des Maßes von der natürlichen Taille zum Gesäßumfang."
- },
- "hem": {
- "t": "Höhe des Saumes",
- "d": "Breite des Saumes. Maß in absoluten Werten angeben."
- },
- "hemBonus": {
- "t": "Saumzugabe",
- "d": "Diese Option reduziert die Saumweite. Sie ist ein prozentualer Anteil des Gesäßumfangs."
- },
- "lengthBonus": {
- "t": "Längenbonus",
- "d": "Dies legt Länge des Rockes fest. Es ist einem Prozentsatz des Abstands natürliche Taille zu Knie definiert."
- },
- "nrOfDarts": {
- "t": "Anzahl Abnäher",
- "d": "Die Anzahl der Abnäher, die in dem Schnittmuster verwendet werden. Das Maximum ist 2. Dies kann reduziert werden, wenn das Schnittmuster zu kleine Abnäher erstellt."
- },
- "seatEase": {
- "t": "Zugabe Gesäß",
- "d": "Zugegebene Weite auf Höhe des Gesäßs."
- },
- "waistBand": {
- "t": "Taillenbund",
- "d": "Füge einen Taillenbund zum Schnittmuster hinzu."
- },
- "waistBandWidth": {
- "t": "Breite des Taillenbundes",
- "d": "Die Breite des Taillenbundes."
- },
- "waistEase": {
- "t": "Taille erleichtert",
- "d": "Zugegebene Weite auf Taillenhöhe."
- },
- "zipperLocation": {
- "t": "Platzierung Reißverschluss",
- "d": "Platzierung des Reißverschlusses."
- }
- }
-}
diff --git a/designs/penelope/i18n/es.json b/designs/penelope/i18n/es.json
deleted file mode 100644
index a9d247808b2..00000000000
--- a/designs/penelope/i18n/es.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "t": "Penelope, falda de tubo",
- "d": "Penelope es una falda de tubo una gorra de lápiz con o sin apertura en la parte de atrás.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "waistband": "Pretina"
- },
- "s": {},
- "o": {
- "backDartDepthFactor": {
- "t": "Factor de la pinza trasera",
- "d": "Hasta dónde llega la pinza trasera desde la cintura. Es proporción de la medida cintura natural a asiento."
- },
- "backVent": {
- "t": "Ventilación posterior",
- "d": "Añade una avertura en la parte trasera de la falda."
- },
- "backVentLength": {
- "t": "Longitud de ventilación posterior",
- "d": "Longitud de la abertura trasera como porcentaje de la longitud de la falda."
- },
- "curvedDarts": {
- "t": "Curved darts",
- "d": "Whether or not to used curved darts."
- },
- "dartToSideSeamFactor": {
- "t": "Factor pinza a costura lateral",
- "d": "Porcentaje de cuánta de la reducción de cadera a cintura se toma de las pinzas con respecto a las costuras laterales."
- },
- "frontDartDepthFactor": {
- "t": "Factor de la pinza delantera",
- "d": "Hasta dónde llega la pinza delantera desde la cintura. Es proporción de la medida cintura natural a asiento."
- },
- "hem": {
- "t": "Anchura del dobladillo",
- "d": "El tamaño del dobladillo. Medida en valores absolutos."
- },
- "hemBonus": {
- "t": "Bonus del dobladillo",
- "d": "Esta opción reduce la circunferencia de la falda en el dobladillo. Porcentaje de la medida de asiento."
- },
- "lengthBonus": {
- "t": "Extra de longitud",
- "d": "Esto ajusta la longitud de la falda. Porcentaje de la medida de cintura natural a rodilla."
- },
- "nrOfDarts": {
- "t": "Número de pinzas",
- "d": "El número de pinzas usadas en el patrón. El máximo es 2. Esta opción puede ser reducida por el patrón si los cálculos crean pinzas demasiado pequeñas."
- },
- "seatEase": {
- "t": "Facilidad de asiento",
- "d": "La holgura al nivel del asiento."
- },
- "waistBand": {
- "t": "Cinturilla",
- "d": "Añade una cinturilla al patrón."
- },
- "waistBandWidth": {
- "t": "Anchura de la cinturilla",
- "d": "La anchura de la cinturilla."
- },
- "waistEase": {
- "t": "Holgura de cintura",
- "d": "La holgura al nivel de la cintura."
- },
- "zipperLocation": {
- "t": "Ubicación de la cremallera",
- "d": "La ubicación de la cremallera."
- }
- }
-}
diff --git a/designs/penelope/i18n/fr.json b/designs/penelope/i18n/fr.json
deleted file mode 100644
index 4f40d635f93..00000000000
--- a/designs/penelope/i18n/fr.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "t": "Jupe crayon Penelope",
- "d": "Penelope est une jupe crayon avec ou sans fente dans le dos.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "waistband": "Ceinture"
- },
- "s": {},
- "o": {
- "backDartDepthFactor": {
- "t": "Profondeur de la pince dos",
- "d": "Jusqu'où va la pince arrière depuis la ceinture, facteur de la mensuration \"Hauteur taille bassin\"."
- },
- "backVent": {
- "t": "Fentes arrière",
- "d": "Ajouter une fente au dos de la jupe."
- },
- "backVentLength": {
- "t": "Longueur de fente arrière",
- "d": "Longueur de la fente dos par rapport à la longueur de la jupe."
- },
- "curvedDarts": {
- "t": "Curved darts",
- "d": "Whether or not to used curved darts."
- },
- "dartToSideSeamFactor": {
- "t": "Pince de côté",
- "d": "Pourcentage de la part de la réduction de la hanche à la taille par rapport à la couture latérale."
- },
- "frontDartDepthFactor": {
- "t": "Profondeur de la pince avant",
- "d": "Jusqu'où va la pince avant depuis la ceinture, facteur de la mensuration \"Hauteur taille bassin\"."
- },
- "hem": {
- "t": "Taille de l'ourlet",
- "d": "La taille de l'ourlet. Mesure en valeurs absolues."
- },
- "hemBonus": {
- "t": "Bonus d'ourlet",
- "d": "Cette option réduira la circonférence de la jupe à l'ourlet. Pourcentage de la mesure de l'assise."
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "Ceci définit la longueur de la jupe. Pourcentage de la mensuration \"Hauteur taille genou\"."
- },
- "nrOfDarts": {
- "t": "Nombre de pinces",
- "d": "Le nombre de pinces utilisées dans le patron. Maximum de 2. Cette option peut être réduite par le patron si les calculs créent des pinces trop petites."
- },
- "seatEase": {
- "t": "Aisance d'assise",
- "d": "Quantité d'aisance au niveau de l'assise."
- },
- "waistBand": {
- "t": "Ceinture",
- "d": "Ajouter une ceinture au patron."
- },
- "waistBandWidth": {
- "t": "Largeur de ceinture",
- "d": "La largeur de la ceinture."
- },
- "waistEase": {
- "t": "Aisance à la taille",
- "d": "Quantité d'aisance au niveau de la taille."
- },
- "zipperLocation": {
- "t": "Emplacement du Zip",
- "d": "L'emplacement du zip (fermeture éclair)."
- }
- }
-}
diff --git a/designs/penelope/i18n/index.mjs b/designs/penelope/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/penelope/i18n/index.mjs
+++ b/designs/penelope/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/penelope/i18n/nl.json b/designs/penelope/i18n/nl.json
deleted file mode 100644
index c49edb25c42..00000000000
--- a/designs/penelope/i18n/nl.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "t": "Penelope pencil skirt",
- "d": "Penelope is een smalle rok, met of zonder split achteraan.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "waistband": "Tailleband"
- },
- "s": {},
- "o": {
- "backDartDepthFactor": {
- "t": "Factor lengte neep rug",
- "d": "Hoe ver de neep achteraan naar beneden komt vanaf de tailleband. Dit is een factor van de Natuurlijke Taille Tot Zitvlak-maat."
- },
- "backVent": {
- "t": "Vent achteraan",
- "d": "Voeg een split toe aan de achterkant van de rok."
- },
- "backVentLength": {
- "t": "Lengte vent achteraan",
- "d": "Lengte van het loopsplit als een percentage van de lengte van de rok."
- },
- "curvedDarts": {
- "t": "Curved darts",
- "d": "Whether or not to used curved darts."
- },
- "dartToSideSeamFactor": {
- "t": "Factor neep tot zijnaad",
- "d": "Hoeveel van de reductie van heupen naar taille door de nepen ingenomen wordt, tegenover de zijnaad, uitgedrukt in een percentage."
- },
- "frontDartDepthFactor": {
- "t": "Factor lengte neep vooraan",
- "d": "Hoe ver de neep vooraan naar beneden komt vanaf de tailleband. Dit is een factor van de Natuurlijke Taille Tot Zitvlak-maat."
- },
- "hem": {
- "t": "Afmeting van de zoom",
- "d": "De afmeting van de zoom. Een maat in absolute waarden."
- },
- "hemBonus": {
- "t": "Bonus zoom",
- "d": "Deze optie maakt de omtrek van de rok aan de zoom kleiner. Percentage van de Omtrek Zitvlak-maat."
- },
- "lengthBonus": {
- "t": "Lengtebonus",
- "d": "Dit bepaalt de lengte van de rok. Een percentage van de Taille tot Knie-maat."
- },
- "nrOfDarts": {
- "t": "Aantal nepen",
- "d": "Het aantal nepen in het patroon. Het maximum is 2. Deze optie kan aangepast worden door het patroon als de berekeningen te kleine nepen als resultaat hebben."
- },
- "seatEase": {
- "t": "Overwijdte zitvlak",
- "d": "Hoeveelheid overwijdte aan het zitvlak."
- },
- "waistBand": {
- "t": "Tailleband",
- "d": "Voeg een tailleband toe aan het patroon."
- },
- "waistBandWidth": {
- "t": "Breedte tailleband",
- "d": "De breedte van de tailleband."
- },
- "waistEase": {
- "t": "Overwijdte taille",
- "d": "Hoeveelheid overwijdte aan de taille."
- },
- "zipperLocation": {
- "t": "Locatie rits",
- "d": "De locatie van de rits."
- }
- }
-}
diff --git a/designs/penelope/i18n/uk.json b/designs/penelope/i18n/uk.json
deleted file mode 100644
index 7ebf990ef59..00000000000
--- a/designs/penelope/i18n/uk.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "t": "Penelope pencil skirt",
- "d": "Penelope is a pencil skirt with or without a vent in the back.",
- "p": {
- "back": "Back",
- "front": "Front",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "backDartDepthFactor": {
- "t": "Back dart depth factor",
- "d": "How far down does the back dart go from the waistband. This is a factor of the Natural Waist To Seat measurement."
- },
- "backVent": {
- "t": "Back vent",
- "d": "Add a vent in the back of the skirt."
- },
- "backVentLength": {
- "t": "Back vent length",
- "d": "Length of the Back Vent as a percentage of the skirt length."
- },
- "curvedDarts": {
- "t": "Curved darts",
- "d": "Whether or not to used curved darts."
- },
- "dartToSideSeamFactor": {
- "t": "Dart to side seam factor",
- "d": "Percentage of how much of the hip to waist reduction has to be taken in by the darts versus the side seam."
- },
- "frontDartDepthFactor": {
- "t": "Front dart depth factor",
- "d": "How far down does the front dart go from the waistband. This is a factor of the Natural Waist To Seat measurement."
- },
- "hem": {
- "t": "Size of the hem",
- "d": "The size of the hem. Measurement in absolute values."
- },
- "hemBonus": {
- "t": "Hem bonus",
- "d": "This option will reduce the circumference of the skirt at the hem. Percentage of the Seat measurement."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "This sets the length of the skirt. Percentage of the Natural Waist to Knee measurement."
- },
- "nrOfDarts": {
- "t": "Number of darts",
- "d": "The number of darts used in the pattern. Maximum is 2. This option can be reduced by the pattern if the calculations create darts that are too small."
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Amount of ease at the seat level."
- },
- "waistBand": {
- "t": "Waist band",
- "d": "Add a waistband to the pattern."
- },
- "waistBandWidth": {
- "t": "Waist band width",
- "d": "The width of the waist band."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Amount of ease at the waist level."
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper."
- }
- }
-}
diff --git a/designs/penelope/package.json b/designs/penelope/package.json
index e9b9589f2bf..69da5eac38a 100644
--- a/designs/penelope/package.json
+++ b/designs/penelope/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/penelope",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a pencil skirt",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/penelope/src/index.mjs b/designs/penelope/src/index.mjs
index c15f98bd542..663a20eb3ba 100644
--- a/designs/penelope/src/index.mjs
+++ b/designs/penelope/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
import { front } from './front.mjs'
@@ -7,9 +7,9 @@ import { waistband } from './waistband.mjs'
// Setup our new design
const Penelope = new Design({
- data,
+ data: about,
parts: [back, front, waistband],
})
// Named exports
-export { back, front, waistband, Penelope, i18n }
+export { back, front, waistband, Penelope, i18n, about }
diff --git a/designs/penelope/tests/shared.test.mjs b/designs/penelope/tests/shared.test.mjs
index 11f624954d7..5780ca171e8 100644
--- a/designs/penelope/tests/shared.test.mjs
+++ b/designs/penelope/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Penelope, i18n } from '../src/index.mjs'
+import { Penelope, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Penelope)
+testPatternConfig(Penelope, about)
// Test translation
testPatternI18n(Penelope, i18n)
diff --git a/designs/plugintest/README.md b/designs/plugintest/README.md
index b3c1a260d81..595ee95570a 100644
--- a/designs/plugintest/README.md
+++ b/designs/plugintest/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/plugintest
@@ -59,7 +44,7 @@ A FreeSewing pattern to test (y)our plugins
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/plugintest/data.mjs b/designs/plugintest/data.mjs
deleted file mode 100644
index a9482572b24..00000000000
--- a/designs/plugintest/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/plugintest'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/plugintest/i18n/de.json b/designs/plugintest/i18n/de.json
deleted file mode 100644
index 68f89a53ad9..00000000000
--- a/designs/plugintest/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Plugin Test",
- "d": "A FreeSewing pattern to test our various plugins",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/plugintest/i18n/es.json b/designs/plugintest/i18n/es.json
deleted file mode 100644
index 68f89a53ad9..00000000000
--- a/designs/plugintest/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Plugin Test",
- "d": "A FreeSewing pattern to test our various plugins",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/plugintest/i18n/fr.json b/designs/plugintest/i18n/fr.json
deleted file mode 100644
index 68f89a53ad9..00000000000
--- a/designs/plugintest/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Plugin Test",
- "d": "A FreeSewing pattern to test our various plugins",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/plugintest/i18n/index.mjs b/designs/plugintest/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/plugintest/i18n/index.mjs
+++ b/designs/plugintest/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/plugintest/i18n/nl.json b/designs/plugintest/i18n/nl.json
deleted file mode 100644
index 68f89a53ad9..00000000000
--- a/designs/plugintest/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Plugin Test",
- "d": "A FreeSewing pattern to test our various plugins",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/plugintest/i18n/uk.json b/designs/plugintest/i18n/uk.json
deleted file mode 100644
index 68f89a53ad9..00000000000
--- a/designs/plugintest/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Plugin Test",
- "d": "A FreeSewing pattern to test our various plugins",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/plugintest/package.json b/designs/plugintest/package.json
index b93550da5f5..18e22ecf257 100644
--- a/designs/plugintest/package.json
+++ b/designs/plugintest/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/plugintest",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern to test (y)our plugins",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,59 +25,50 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/plugin-annotations": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1",
- "@freesewing/plugin-flip": "3.3.0-rc.1",
- "@freesewing/plugin-gore": "3.3.0-rc.1",
- "@freesewing/plugin-i18n": "3.3.0-rc.1",
- "@freesewing/plugin-measurements": "3.3.0-rc.1",
- "@freesewing/plugin-mirror": "3.3.0-rc.1",
- "@freesewing/plugin-round": "3.3.0-rc.1",
- "@freesewing/plugin-sprinkle": "3.3.0-rc.1",
- "@freesewing/plugin-svgattr": "3.3.0-rc.1",
- "@freesewing/plugin-theme": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/plugin-annotations": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0",
+ "@freesewing/plugin-flip": "4.0.0",
+ "@freesewing/plugin-gore": "4.0.0",
+ "@freesewing/plugin-i18n": "4.0.0",
+ "@freesewing/plugin-measurements": "4.0.0",
+ "@freesewing/plugin-mirror": "4.0.0",
+ "@freesewing/plugin-round": "4.0.0",
+ "@freesewing/plugin-sprinkle": "4.0.0",
+ "@freesewing/plugin-svgattr": "4.0.0",
+ "@freesewing/plugin-theme": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/plugintest/src/index.mjs b/designs/plugintest/src/index.mjs
index b6f9f731ee8..5bd63c7434c 100644
--- a/designs/plugintest/src/index.mjs
+++ b/designs/plugintest/src/index.mjs
@@ -1,5 +1,4 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
import { i18n } from '../i18n/index.mjs'
import { annotations } from './plugin-annotations.mjs'
import { flip } from './plugin-flip.mjs'
@@ -13,7 +12,6 @@ import { ringsector } from './plugin-ringsector.mjs'
// Setup our new design
const Plugintest = new Design({
- data,
parts: [annotations, flip, gore, i18nStack, measurements, mirror, round, sprinkle, ringsector],
})
diff --git a/designs/plugintest/tests/shared.test.mjs b/designs/plugintest/tests/shared.test.mjs
index 9270466593d..36713078f28 100644
--- a/designs/plugintest/tests/shared.test.mjs
+++ b/designs/plugintest/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Plugintest, i18n } from '../src/index.mjs'
+import { Plugintest, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Plugintest)
+testPatternConfig(Plugintest, about)
// Test translation
testPatternI18n(Plugintest, i18n)
diff --git a/designs/rendertest/README.md b/designs/rendertest/README.md
index 428eaffe418..3097c602669 100644
--- a/designs/rendertest/README.md
+++ b/designs/rendertest/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/rendertest
@@ -59,7 +44,7 @@ A FreeSewing pattern to test (y)our render engine our CSS
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/rendertest/data.mjs b/designs/rendertest/data.mjs
deleted file mode 100644
index 263c6f6aa69..00000000000
--- a/designs/rendertest/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/rendertest'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/rendertest/i18n/de.json b/designs/rendertest/i18n/de.json
deleted file mode 100644
index c5a90b5afd8..00000000000
--- a/designs/rendertest/i18n/de.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Render Test",
- "d": "A FreeSewing pattern to showcase how various elements are rendered/themed",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/rendertest/i18n/es.json b/designs/rendertest/i18n/es.json
deleted file mode 100644
index c5a90b5afd8..00000000000
--- a/designs/rendertest/i18n/es.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Render Test",
- "d": "A FreeSewing pattern to showcase how various elements are rendered/themed",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/rendertest/i18n/fr.json b/designs/rendertest/i18n/fr.json
deleted file mode 100644
index c5a90b5afd8..00000000000
--- a/designs/rendertest/i18n/fr.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Render Test",
- "d": "A FreeSewing pattern to showcase how various elements are rendered/themed",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/rendertest/i18n/index.mjs b/designs/rendertest/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/rendertest/i18n/index.mjs
+++ b/designs/rendertest/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/rendertest/i18n/nl.json b/designs/rendertest/i18n/nl.json
deleted file mode 100644
index c5a90b5afd8..00000000000
--- a/designs/rendertest/i18n/nl.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Render Test",
- "d": "A FreeSewing pattern to showcase how various elements are rendered/themed",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/rendertest/i18n/uk.json b/designs/rendertest/i18n/uk.json
deleted file mode 100644
index c5a90b5afd8..00000000000
--- a/designs/rendertest/i18n/uk.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "t": "Render Test",
- "d": "A FreeSewing pattern to showcase how various elements are rendered/themed",
- "p": {},
- "s": {},
- "o": {}
-}
diff --git a/designs/rendertest/package.json b/designs/rendertest/package.json
index f039e90b6ce..d446acaf963 100644
--- a/designs/rendertest/package.json
+++ b/designs/rendertest/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/rendertest",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern to test (y)our render engine our CSS",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/rendertest/src/index.mjs b/designs/rendertest/src/index.mjs
index 341c17d3334..e2e5d8eb8a6 100644
--- a/designs/rendertest/src/index.mjs
+++ b/designs/rendertest/src/index.mjs
@@ -1,11 +1,9 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
import { i18n } from '../i18n/index.mjs'
import { demo } from './demo.mjs'
// Setup our new design
const Rendertest = new Design({
- data,
parts: [demo],
})
diff --git a/designs/rendertest/tests/shared.test.mjs b/designs/rendertest/tests/shared.test.mjs
index 40441170cd3..1d596c109ac 100644
--- a/designs/rendertest/tests/shared.test.mjs
+++ b/designs/rendertest/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Rendertest, i18n } from '../src/index.mjs'
+import { Rendertest, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Rendertest)
+testPatternConfig(Rendertest, about)
// Test translation
testPatternI18n(Rendertest, i18n)
diff --git a/designs/sandy/README.md b/designs/sandy/README.md
index 4292f432c4c..b9f4c203333 100644
--- a/designs/sandy/README.md
+++ b/designs/sandy/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/sandy
@@ -59,7 +44,7 @@ A FreeSewing pattern for a circle skirt
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/sandy/data.mjs b/designs/sandy/data.mjs
deleted file mode 100644
index 4709206f46e..00000000000
--- a/designs/sandy/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/sandy'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/sandy/i18n/de.json b/designs/sandy/i18n/de.json
deleted file mode 100644
index 7805028bc50..00000000000
--- a/designs/sandy/i18n/de.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Sandy, der Tellerrock",
- "d": "Sandy ist ein anpassungsfähiges Tellerrockschnittmuster.",
- "p": {
- "skirt": "Skirt",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "waistbandWidth": {
- "t": "Taillenbundweite",
- "d": "Kontrolliert die Weite des Taillenbundes."
- },
- "waistbandPosition": {
- "t": "Position des Taillenbundes",
- "d": "Legt die Position des Taillenbundes fest."
- },
- "waistbandShape": {
- "t": "Taillenbundform",
- "d": "Hier stellen Sie ein, on sie einen geraden oder einen körpergeformten Bund wollen."
- },
- "circleRatio": {
- "t": "Kreisverhältnis",
- "d": "Die Prozente eines Kreises aus dem Sie den Rock erstellen möchten."
- },
- "waistbandOverlap": {
- "t": "Überlappung des Taillenbundes",
- "d": "Der Betrag, mit dem sich der Taillenbund überlappt."
- },
- "gathering": {
- "t": "Kräuseln",
- "d": "Der Prozentsatz um welcher die Oberkante des Rockteils länger ist als die Unterkante des Bundes."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Determines how long the skirt will be."
- },
- "seamlessFullCircle": {
- "t": "Nahtloser Vollkreis",
- "d": "Aktiviert einen nahtlosen Vollkreis für das Rockteil."
- },
- "hemWidth": {
- "t": "Saumbreite",
- "d": "Breite des Saumes"
- },
- "panels": {
- "t": "Panels",
- "d": "Number of panels"
- }
- }
-}
diff --git a/designs/sandy/i18n/es.json b/designs/sandy/i18n/es.json
deleted file mode 100644
index 6eeea28b061..00000000000
--- a/designs/sandy/i18n/es.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Sandy, falda de vuelo",
- "d": "Sandy es un patrón de falda de vuelo circular adaptable.",
- "p": {
- "skirt": "Skirt",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "waistbandWidth": {
- "t": "Anchura de la cinturilla",
- "d": "Controla la anchura de la cinturilla."
- },
- "waistbandPosition": {
- "t": "Posición de la cinturilla",
- "d": "Controla la posición de la cinturilla."
- },
- "waistbandShape": {
- "t": "Forma de la cinturilla",
- "d": "Si quieres una cinturilla recta o curvada."
- },
- "circleRatio": {
- "t": "Porcentaje de círculo",
- "d": "El porcentaje de círculo que quieres que tenga la falda."
- },
- "waistbandOverlap": {
- "t": "Superposición de la cinturilla",
- "d": "La cantidad en la que los extremos de la cinturilla se superponen."
- },
- "gathering": {
- "t": "Fruncido",
- "d": "El porcentaje por el que la parte superior de la falda es más largo que la parte inferior de la cinturilla."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Determines how long the skirt will be."
- },
- "seamlessFullCircle": {
- "t": "Círculo completo sin costura",
- "d": "Permite una falda de círculo completo sin costuras."
- },
- "hemWidth": {
- "t": "Hem width",
- "d": "Anchura del dobladillo"
- },
- "panels": {
- "t": "Panels",
- "d": "Number of panels"
- }
- }
-}
diff --git a/designs/sandy/i18n/fr.json b/designs/sandy/i18n/fr.json
deleted file mode 100644
index 17b44b65e62..00000000000
--- a/designs/sandy/i18n/fr.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Jupe cercle Sandy",
- "d": "Sandy est un patron de jupe cercle adaptable.",
- "p": {
- "skirt": "Skirt",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "waistbandWidth": {
- "t": "Largeur de ceinture",
- "d": "Contrôle la largeur de la ceinture."
- },
- "waistbandPosition": {
- "t": "Position de ceinture",
- "d": "Contrôle la position de la ceinture."
- },
- "waistbandShape": {
- "t": "Forme de ceinture",
- "d": "Si vous voulez une ceinture droite ou bien de forme particulière."
- },
- "circleRatio": {
- "t": "Ratio circulaire",
- "d": "Le pourcentage d'un cercle auquel vous souhaitez que la jupe corresponde."
- },
- "waistbandOverlap": {
- "t": "Chevauchement de la ceinture",
- "d": "Le montant par lequel la taille se chevauche."
- },
- "gathering": {
- "t": "Fronçage",
- "d": "Le pourcent par lequel le tissu du haut de la jupe est plus long que celui du bas de la ceinture."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Determines how long the skirt will be."
- },
- "seamlessFullCircle": {
- "t": "Cercle entier sans couture",
- "d": "Permet une jupe totalement circulaire sans couture."
- },
- "hemWidth": {
- "t": "Hem width",
- "d": "Largeur de l'ourlet"
- },
- "panels": {
- "t": "Panels",
- "d": "Number of panels"
- }
- }
-}
diff --git a/designs/sandy/i18n/index.mjs b/designs/sandy/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/sandy/i18n/index.mjs
+++ b/designs/sandy/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/sandy/i18n/nl.json b/designs/sandy/i18n/nl.json
deleted file mode 100644
index 540fd19c25f..00000000000
--- a/designs/sandy/i18n/nl.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Sandy cirkelrok",
- "d": "Sandy is een veelzijdig patroon voor een cirkelrok.",
- "p": {
- "skirt": "Skirt",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "waistbandWidth": {
- "t": "Breedte tailleband",
- "d": "De breedte van de tailleband."
- },
- "waistbandPosition": {
- "t": "Positie tailleband",
- "d": "Bepaalt de positie van de tailleband."
- },
- "waistbandShape": {
- "t": "Vorm tailleband",
- "d": "Wil je een rechte of gebogen tailleband?"
- },
- "circleRatio": {
- "t": "Cirkel ratio",
- "d": "Hoeveel procent van een cirkel wil je dat de rok is?"
- },
- "waistbandOverlap": {
- "t": "Overlap Tailleband",
- "d": "Hoeveel de tailleband overlapt."
- },
- "gathering": {
- "t": "Fronsen",
- "d": "Met hoeveel procent de bovenrand van de rok langer is dan de onderrand van de tailleband."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Determines how long the skirt will be."
- },
- "seamlessFullCircle": {
- "t": "Naadloze volledige cirkel",
- "d": "Maakt een naadloze volle cirkelrok mogelijk."
- },
- "hemWidth": {
- "t": "Breedte zoom",
- "d": "Breedte van de zoom"
- },
- "panels": {
- "t": "Panels",
- "d": "Number of panels"
- }
- }
-}
diff --git a/designs/sandy/i18n/uk.json b/designs/sandy/i18n/uk.json
deleted file mode 100644
index 5159894d495..00000000000
--- a/designs/sandy/i18n/uk.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "t": "Sandy circle skirt",
- "d": "Sandy is an adaptable circle skirt pattern.",
- "p": {
- "skirt": "Skirt",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "waistbandWidth": {
- "t": "Waistband width",
- "d": "Controls the width of the waistband."
- },
- "waistbandPosition": {
- "t": "Waistband position",
- "d": "Controls the position of the waistband."
- },
- "waistbandShape": {
- "t": "Waistband shape",
- "d": "Whether you want a straight or shaped waistband."
- },
- "circleRatio": {
- "t": "Circle ratio",
- "d": "The percentage of a circle you want the skirt to be."
- },
- "waistbandOverlap": {
- "t": "Waistband overlap",
- "d": "The amount by which the waistband overlaps."
- },
- "gathering": {
- "t": "Gathering",
- "d": "The percent by which the top of the skirt is longer than the bottom of the waistband."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Determines how long the skirt will be."
- },
- "seamlessFullCircle": {
- "t": "Seamless full circle",
- "d": "Enables a seamless full circle skirt."
- },
- "hemWidth": {
- "t": "Hem width",
- "d": "Width of the hem"
- },
- "panels": {
- "t": "Panels",
- "d": "Number of panels"
- }
- }
-}
diff --git a/designs/sandy/package.json b/designs/sandy/package.json
index fec0c160861..62777c48e5b 100644
--- a/designs/sandy/package.json
+++ b/designs/sandy/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/sandy",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a circle skirt",
"author": "AlfaLyr (https://github.com/alfalyr)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,42 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-ringsector": "4.0.0"
},
- "dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/sandy/src/index.mjs b/designs/sandy/src/index.mjs
index 6daa4ac8e2f..2ccc88e2a45 100644
--- a/designs/sandy/src/index.mjs
+++ b/designs/sandy/src/index.mjs
@@ -1,14 +1,14 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { skirt } from './skirt.mjs'
import { waistband } from './waistband.mjs'
// Setup our new design
const Sandy = new Design({
- data,
+ data: about,
parts: [skirt, waistband],
})
// Named exports
-export { skirt, waistband, Sandy, i18n }
+export { skirt, waistband, Sandy, i18n, about }
diff --git a/designs/sandy/tests/shared.test.mjs b/designs/sandy/tests/shared.test.mjs
index b120cb3988d..455ec65a64f 100644
--- a/designs/sandy/tests/shared.test.mjs
+++ b/designs/sandy/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Sandy, i18n } from '../src/index.mjs'
+import { Sandy, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Sandy)
+testPatternConfig(Sandy, about)
// Test translation
testPatternI18n(Sandy, i18n)
diff --git a/designs/shelly/CHANGELOG.md b/designs/shelly/CHANGELOG.md
index b17e28d71b0..fbba2591e93 100644
--- a/designs/shelly/CHANGELOG.md
+++ b/designs/shelly/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/shelly
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Always load plugin-bust due to its changes in how it handle conditionality.
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/shelly/README.md b/designs/shelly/README.md
index ca0be3f0132..6d69f5ebf2e 100644
--- a/designs/shelly/README.md
+++ b/designs/shelly/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/shelly
@@ -59,7 +44,7 @@ A FreeSewing pattern for a raglan shirt, perfect for swimshirts
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/shelly/data.mjs b/designs/shelly/data.mjs
deleted file mode 100644
index bf5ae76dbde..00000000000
--- a/designs/shelly/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/shelly'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/shelly/i18n/de.json b/designs/shelly/i18n/de.json
deleted file mode 100644
index d6b97ba7dce..00000000000
--- a/designs/shelly/i18n/de.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Hugo, der Hoodie",
- "d": "Hugo ist ein Kapuzensweatshirt mit Raglanärmeln.",
- "p": {
- "base": "Base",
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Manschette",
- "hoodCenter": "Mitte der Kapuze",
- "hoodSide": "Kapuzenseite",
- "pocketFacing": "Taschenbesatz",
- "pocket": "Tasche",
- "waistband": "Bund"
- },
- "o": {
- "hipsEase": {
- "t": "Zugabe Hüfte",
- "d": "Die Menge an Bequemlichkeitszugabe an deinen Hüften."
- }
- }
-}
diff --git a/designs/shelly/i18n/es.json b/designs/shelly/i18n/es.json
deleted file mode 100644
index 77a7326e09e..00000000000
--- a/designs/shelly/i18n/es.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Hugo, sudadera con capucha",
- "d": "Hugo es una sudadera con capucha y manga raglán.",
- "p": {
- "base": "Base",
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Puño",
- "hoodCenter": "Centro de la capucha",
- "hoodSide": "Lado de la capucha",
- "pocketFacing": "Mirando hacia el bolsillo",
- "pocket": "Bolsillo",
- "waistband": "Pretina"
- },
- "o": {
- "hipsEase": {
- "t": "Holgura de cadera",
- "d": "La cantidad de holgura en la cadera."
- }
- }
-}
diff --git a/designs/shelly/i18n/fr.json b/designs/shelly/i18n/fr.json
deleted file mode 100644
index 6cc98f0c018..00000000000
--- a/designs/shelly/i18n/fr.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sweat à capuche Hugo",
- "d": "Hugo est un sweat à capuche avec des manches raglan.",
- "p": {
- "base": "Base",
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Poignet",
- "hoodCenter": "Milieu de capuche",
- "hoodSide": "Côté de capuche",
- "pocketFacing": "Doublure de poche",
- "pocket": "Poche",
- "waistband": "Ceinture"
- },
- "o": {
- "hipsEase": {
- "t": "Aisance des hanches",
- "d": "La marge d'aisance aux hanches."
- }
- }
-}
diff --git a/designs/shelly/i18n/index.mjs b/designs/shelly/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/shelly/i18n/index.mjs
+++ b/designs/shelly/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/shelly/i18n/nl.json b/designs/shelly/i18n/nl.json
deleted file mode 100644
index 36193bb9f12..00000000000
--- a/designs/shelly/i18n/nl.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Hugo hoodie",
- "d": "Hugo is een trui met kap en een raglanmouw.",
- "p": {
- "base": "Base",
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Manchette",
- "hoodCenter": "Capuchon midden",
- "hoodSide": "Capuchon zijkant",
- "pocketFacing": "Zak doublure",
- "pocket": "Zak",
- "waistband": "Tailleband"
- },
- "o": {
- "hipsEase": {
- "t": "Overwijdte heup",
- "d": "De hoeveelheid overwijdte aan je heupen."
- }
- }
-}
diff --git a/designs/shelly/i18n/uk.json b/designs/shelly/i18n/uk.json
deleted file mode 100644
index 625d097fcc8..00000000000
--- a/designs/shelly/i18n/uk.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Hugo hoodie",
- "d": "Hugo is a hooded jumper with raglan sleeves.",
- "p": {
- "base": "Base",
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocket": "Pocket",
- "pocketFacing": "Pocket facing",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {
- "cuff": "Cuff",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "pocketFacing": "Pocket facing",
- "pocket": "Pocket",
- "waistband": "Waistband"
- },
- "o": {
- "ribbingHeight": {
- "t": "Ribbing height",
- "d": "Controls the height of the ribbing"
- },
- "ribbingStretch": {
- "t": "Ribbing stretch",
- "d": "Use this to adapt the pattern to how stretchy the ribbing that you are using is."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "The amount of ease at your hips."
- }
- }
-}
diff --git a/designs/shelly/package.json b/designs/shelly/package.json
index 9cab7eb42ff..a54e0abece1 100644
--- a/designs/shelly/package.json
+++ b/designs/shelly/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/shelly",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts",
"author": "Thrunic (https://github.com/Thrunic)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/shelly/src/index.mjs b/designs/shelly/src/index.mjs
index 2e4b4197179..f251062ebf4 100644
--- a/designs/shelly/src/index.mjs
+++ b/designs/shelly/src/index.mjs
@@ -1,6 +1,6 @@
// Import Design constructor
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
// Import parts
import { front } from './front.mjs'
@@ -10,7 +10,7 @@ import { neckband } from './neckband.mjs'
// Create the new design
const Shelly = new Design({
- data,
+ data: about,
// A list of parts is all that is required.
parts: [front, back, raglanSleeve, neckband],
})
@@ -22,4 +22,4 @@ const Shelly = new Design({
* This allows us to re-use these parts in other designs.
*/
-export { front, back, raglanSleeve, neckband, Shelly, i18n }
+export { front, back, raglanSleeve, neckband, Shelly, i18n, about }
diff --git a/designs/shelly/tests/shared.test.mjs b/designs/shelly/tests/shared.test.mjs
index 660a60b3d07..c4a7077524f 100644
--- a/designs/shelly/tests/shared.test.mjs
+++ b/designs/shelly/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Shelly, i18n } from '../src/index.mjs'
+import { Shelly, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Shelly)
+testPatternConfig(Shelly, about)
// Test translation
testPatternI18n(Shelly, i18n)
diff --git a/designs/shin/README.md b/designs/shin/README.md
index dc0d497e01c..5aa4e29a1c6 100644
--- a/designs/shin/README.md
+++ b/designs/shin/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/shin
@@ -59,7 +44,7 @@ A FreeSewing pattern for swim trunks
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/shin/data.mjs b/designs/shin/data.mjs
deleted file mode 100644
index e5b8485d68a..00000000000
--- a/designs/shin/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/shin'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/shin/i18n/de.json b/designs/shin/i18n/de.json
deleted file mode 100644
index a2291fe357a..00000000000
--- a/designs/shin/i18n/de.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Shin, die Badehose",
- "d": "Shin ist eine sportliche Badehose.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "waistband": "Bund"
- },
- "s": {},
- "o": {
- "legReduction": {
- "t": "Verjüngung am Bein",
- "d": "Reduziert die Hosenbeinöffnung um Anstehen zu verhindern"
- },
- "elasticWidth": {
- "t": "Breite des Gummis",
- "d": "Breite des Gummizugs an der Taille"
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of stretch to design for."
- },
- "bulge": {
- "t": "Bulge",
- "d": "Controls the amount of extra room to create at the front of the trunks."
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Controls how much the waist is higher in the back than the front."
- }
- }
-}
diff --git a/designs/shin/i18n/es.json b/designs/shin/i18n/es.json
deleted file mode 100644
index bbb4a4af928..00000000000
--- a/designs/shin/i18n/es.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Shin, bañador",
- "d": "Shin es un bañador de tipo pantalón corto.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "waistband": "Pretina"
- },
- "s": {},
- "o": {
- "legReduction": {
- "t": "Reducción de pierna",
- "d": "Reduce la apertura de la pierna para prevenir que se abra"
- },
- "elasticWidth": {
- "t": "Elastic width",
- "d": "Width of the elastic at the waist"
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of stretch to design for."
- },
- "bulge": {
- "t": "Bulge",
- "d": "Controls the amount of extra room to create at the front of the trunks."
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Controls how much the waist is higher in the back than the front."
- }
- }
-}
diff --git a/designs/shin/i18n/fr.json b/designs/shin/i18n/fr.json
deleted file mode 100644
index 3a36a0c0510..00000000000
--- a/designs/shin/i18n/fr.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Boxer de bain Shin",
- "d": "Les tiges sont des maillots de bain athlétiques.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "waistband": "Ceinture"
- },
- "s": {},
- "o": {
- "legReduction": {
- "t": "Réduction de jambe",
- "d": "Réduit l'ouverture de la jambe pour éviter les effets de flottement"
- },
- "elasticWidth": {
- "t": "Largeur d'élastique",
- "d": "Largeur de l'élastique à la taille"
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of stretch to design for."
- },
- "bulge": {
- "t": "Bulge",
- "d": "Controls the amount of extra room to create at the front of the trunks."
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Controls how much the waist is higher in the back than the front."
- }
- }
-}
diff --git a/designs/shin/i18n/index.mjs b/designs/shin/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/shin/i18n/index.mjs
+++ b/designs/shin/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/shin/i18n/nl.json b/designs/shin/i18n/nl.json
deleted file mode 100644
index 2929321851e..00000000000
--- a/designs/shin/i18n/nl.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Shin zwembroek",
- "d": "Shin is atletische zwembroek.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "waistband": "Tailleband"
- },
- "s": {},
- "o": {
- "legReduction": {
- "t": "Been reductie",
- "d": "Maakt de beenopening kleiner zodat ze niet openstaat"
- },
- "elasticWidth": {
- "t": "Breedte elastiek",
- "d": "Breedte van de elastiek aan de taille"
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of stretch to design for."
- },
- "bulge": {
- "t": "Bulge",
- "d": "Controls the amount of extra room to create at the front of the trunks."
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Controls how much the waist is higher in the back than the front."
- }
- }
-}
diff --git a/designs/shin/i18n/uk.json b/designs/shin/i18n/uk.json
deleted file mode 100644
index a644f521bcf..00000000000
--- a/designs/shin/i18n/uk.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Shin swim trunks",
- "d": "Shin are athletic swim trunks.",
- "p": {
- "back": "Back",
- "front": "Front",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "legReduction": {
- "t": "Leg reduction",
- "d": "Reduces the leg opening to prevent gaping"
- },
- "elasticWidth": {
- "t": "Elastic width",
- "d": "Width of the elastic at the waist"
- },
- "stretch": {
- "t": "Stretch",
- "d": "The amount of stretch to design for."
- },
- "bulge": {
- "t": "Bulge",
- "d": "Controls the amount of extra room to create at the front of the trunks."
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist."
- },
- "backRise": {
- "t": "Back rise",
- "d": "Controls how much the waist is higher in the back than the front."
- }
- }
-}
diff --git a/designs/shin/package.json b/designs/shin/package.json
index a7fcc564fd6..da4b10855c4 100644
--- a/designs/shin/package.json
+++ b/designs/shin/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/shin",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for swim trunks",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/shin/src/index.mjs b/designs/shin/src/index.mjs
index 8cadcc023e8..0ba2e9c11fa 100644
--- a/designs/shin/src/index.mjs
+++ b/designs/shin/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
import { front } from './front.mjs'
@@ -7,9 +7,9 @@ import { waistband } from './waistband.mjs'
// Setup our new design
const Shin = new Design({
- data,
+ data: about,
parts: [back, front, waistband],
})
// Named exports
-export { back, front, waistband, Shin, i18n }
+export { back, front, waistband, Shin, i18n, about }
diff --git a/designs/shin/tests/shared.test.mjs b/designs/shin/tests/shared.test.mjs
index bc4f0c8bea0..c5eddbd8bce 100644
--- a/designs/shin/tests/shared.test.mjs
+++ b/designs/shin/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Shin, i18n } from '../src/index.mjs'
+import { Shin, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Shin)
+testPatternConfig(Shin, about)
// Test translation
testPatternI18n(Shin, i18n)
diff --git a/designs/simon/CHANGELOG.md b/designs/simon/CHANGELOG.md
index 4c7f151c24b..774a2021f48 100644
--- a/designs/simon/CHANGELOG.md
+++ b/designs/simon/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/simon
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Allow negative values for the buttonFreeLength option. Fixes
+
## 3.1.0 (2023-12-26)
### Fixed
diff --git a/designs/simon/README.md b/designs/simon/README.md
index d1d4b2798dd..3982b79a6cd 100644
--- a/designs/simon/README.md
+++ b/designs/simon/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/simon
@@ -59,7 +44,7 @@ A FreeSewing pattern for a button down shirt
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/simon/data.mjs b/designs/simon/data.mjs
deleted file mode 100644
index 0d5fd3326c6..00000000000
--- a/designs/simon/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/simon'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/simon/i18n/de.json b/designs/simon/i18n/de.json
deleted file mode 100644
index 053a23a3914..00000000000
--- a/designs/simon/i18n/de.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Simon, das Hemd",
- "d": "Simon ist ein sehr anpassbares Hemdenschnittmuster für Personen ohne Brüste.",
- "p": {
- "back": "Rückseite",
- "buttonholePlacket": "Knopflochleiste",
- "buttonPlacket": "Knopfleiste",
- "collar": "Kragen",
- "collarStand": "Kragensteg",
- "cuff": "Manschette",
- "front": "Vorderseite",
- "frontLeft": "Vorderseite links",
- "frontRight": "Vorderseite rechts",
- "sleevePlacketOverlap": "Übertritt der Ärmelleiste",
- "sleevePlacketUnderlap": "Untertritt der Ärmelleiste",
- "sleeve": "Ärmel",
- "yoke": "Passe"
- },
- "s": {
- "buttonholePlacket": "Knopflochleiste",
- "buttonPlacket": "Knopfleiste",
- "collarAndUndercollar": "Kragen und Unterkragen",
- "collarStand": "Kragensteg",
- "cutUndercollarSlightlySmaller": "Unterkragen etwas kleiner schneiden",
- "frontLeft": "Vorne links",
- "frontRight": "Vorne rechts",
- "sideOfTheCollarStand": "Seite des Kragenstegs",
- "sleevePlacketOverlap": "Übertritt der Ärmelleiste",
- "sleevePlacketUnderlap": "Untertritt der Ärmelleiste",
- "yoke": "Passe",
- "matchHere": "Stoffe entlang dieser Linie aufeinander abpassen"
- },
- "o": {
- "backDarts": {
- "t": "Hintere Abnäher",
- "d": "Ob Abnäher am Rücken eingefügt werden sollen oder nicht"
- },
- "backDartShaping": {
- "t": "Formgebung der hinteren Abnäher",
- "d": "Wie stark die hinteren Abnäher die Figur betonen"
- },
- "barrelCuffNarrowButton": {
- "t": "Manschette schmaler Knopf",
- "d": "Gibt an, ob ein Knopf hinzugefügt wird, um die Manschetten enger zu binden. Diese Option ist nur für Einfachmanschetten relevant."
- },
- "boxPleat": {
- "t": "Kellerfalte",
- "d": "Ob eine Kellerfalte am Rückenteil eingefügt wird oder nicht"
- },
- "boxPleatWidth": {
- "t": "Kellerfaltenweite",
- "d": "Gesamtbreite der Kellerfalte"
- },
- "boxPleatFold": {
- "t": "Kellerfalte Falz",
- "d": "Der Betrag, um den die Kellerfalte nach innen gefaltet wird"
- },
- "buttonPlacketStyle": {
- "t": "Knopfleiste Stil",
- "d": "Stil der Knopfleiste."
- },
- "buttonPlacketWidth": {
- "t": "Knopfleiste Breite",
- "d": "Breite der Knopfleiste."
- },
- "buttonFreeLength": {
- "t": "Freie Länge Knopf",
- "d": "Wie viel am unteren Ende der Verschlussleiste knopf-frei bleiben soll."
- },
- "buttonholePlacketFoldWidth": {
- "t": "Knopflochleiste Falzbreite",
- "d": "Breite der Falz der Knopflochleiste."
- },
- "buttonholePlacketStyle": {
- "t": "Knopflochleiste Stil",
- "d": "Stil der Knoplochfleiste."
- },
- "buttonholePlacketWidth": {
- "t": "Knopflochleiste Breite",
- "d": "Breite der Knopflochleiste."
- },
- "buttons": {
- "t": "Anzahl der Knöpfe",
- "d": "Die Anzahl der Knöpfe am vorderen Verschluss."
- },
- "collarAngle": {
- "t": "Kragenwinkel",
- "d": "Der Winkel der Kragenspitzen."
- },
- "collarBend": {
- "t": "Kragenkrümmung",
- "d": "Die Krümmung des Kragens."
- },
- "collarFlare": {
- "t": "Kragenausstellung",
- "d": "Wie weit die Kragenspitzen ausgestellt sind."
- },
- "collarGap": {
- "t": "Kragenlücke",
- "d": "Der Spalt zwischen den beiden Kragenenden."
- },
- "collarRoll": {
- "t": "Kragenrolle",
- "d": "Der Betrag, um den der Oberkragen größer ist als der Unterkragen."
- },
- "collarStandBend": {
- "t": "Kragenstegbiegung",
- "d": "Die Biegung des Kragensstegs."
- },
- "collarStandCurve": {
- "t": "Kragenstegkrümmung",
- "d": "Die Krümmung des Kragensstegs."
- },
- "collarStandWidth": {
- "t": "Kragenstegbreite",
- "d": "Breite des Kragenstegs."
- },
- "cuffButtonRows": {
- "t": "Manschettenknopfreihen",
- "d": "Gibt an, ob eine einzelne oder doppelte Reihe von Manschettenknöpfen erstellt werden soll. Diese Option ist nur für Einfachmanschetten relevant."
- },
- "cuffDrape": {
- "t": "Manschette drapieren",
- "d": "Der Betrag, um den der Ärmel breiter ist als die Manschette, an der Stelle wo sie zusammengefügt werden."
- },
- "cuffLength": {
- "t": "Manschettenlänge",
- "d": "Die Länge der Manschetten."
- },
- "cuffStyle": {
- "t": "Manschettenstil",
- "d": "Der Stil der Manschetten."
- },
- "extraTopButton": {
- "t": "Zusätzlicher oberer Knopf",
- "d": "Gibt an, ob am vorderen Verschluss ein zusätzlicher oberer Knopf hinzugefügt werden soll."
- },
- "ffsa": {
- "t": "Flachgeplagte Naht erlaubt",
- "d": "Die Anzahl der Nahtzuschüsse für geflochtene Nähte im Verhältnis zum regulären Nahtzuschuss"
- },
- "hemCurve": {
- "t": "Saumkurve",
- "d": "Die Höhe der Kurve an einem abgerundeten Saum."
- },
- "hemStyle": {
- "t": "Saumstil",
- "d": "Der Stil des Hemdsaumes."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "roundBack": {
- "t": "Runder Rücken",
- "d": "Damit die Passform für einen runde(re)n Rücken besser ist, fügt diese Option etwas Länge in der hinteren Mitte (an der Passe) hinzu, die sich zu den Seiten hin verjüngt."
- },
- "separateButtonholePlacket": {
- "t": "Separate Knopflochleiste",
- "d": "Eine separate Knopflochleiste entwerfen."
- },
- "separateButtonPlacket": {
- "t": "Separate Knopfleiste",
- "d": "Eine separate Knopfleiste entwerfen"
- },
- "sleevePlacketLength": {
- "t": "Ärmelleistenlänge",
- "d": "Die Länge der Ärmelleiste."
- },
- "sleevePlacketWidth": {
- "t": "Ärmelleiste Breite",
- "d": "Die Breite der Ärmelleiste."
- },
- "splitYoke": {
- "t": "Geteilte Passe",
- "d": "Ob eine geteilte oder normale Passe erstellt werden soll."
- },
- "waistEase": {
- "t": "Taillenzugabe",
- "d": "Der Betrag, der an deiner (natürlichen) Taille als Bequemlichkeits-/Bewegslichkeitszugabe zugegeben wird."
- },
- "yokeHeight": {
- "t": "Passenhöhe",
- "d": "Steuert die Höhe der Passe"
- }
- }
-}
diff --git a/designs/simon/i18n/en.json b/designs/simon/i18n/en.json
index fdf0178ab35..6e087cf2f55 100644
--- a/designs/simon/i18n/en.json
+++ b/designs/simon/i18n/en.json
@@ -6,6 +6,7 @@
"buttonholePlacket": "Buttonhole placket",
"buttonPlacket": "Button placket",
"collar": "Collar",
+ "collarAndUndercollar": "Collar and Undercollar",
"collarStand": "Collar stand",
"cuff": "Cuff",
"front": "Front",
diff --git a/designs/simon/i18n/es.json b/designs/simon/i18n/es.json
deleted file mode 100644
index aa07ea568e8..00000000000
--- a/designs/simon/i18n/es.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Simon, camisa",
- "d": "Simon es un patrón de camisa altamente adaptable para personas sin pechos.",
- "p": {
- "back": "Atrás",
- "buttonholePlacket": "Tapeta de ojal",
- "buttonPlacket": "Tapeta de botones",
- "collar": "Cuello",
- "collarStand": "Soporte de collar",
- "cuff": "Cuffnl",
- "front": "Frente",
- "frontLeft": "Delantero izquierdo",
- "frontRight": "Frente derecho",
- "sleevePlacketOverlap": "Top de manga tapeta",
- "sleevePlacketUnderlap": "Parte inferior de la tapeta de la manga",
- "sleeve": "Manga",
- "yoke": "Yugo"
- },
- "s": {
- "buttonholePlacket": "Tapeta de ojal",
- "buttonPlacket": "Tapeta de botones",
- "collarAndUndercollar": "Collar y Undercollar",
- "collarStand": "Base del cuello",
- "cutUndercollarSlightlySmaller": "Corte undercollar ligeramente más pequeño",
- "frontLeft": "Delantero izquierdo",
- "frontRight": "Delantero derecha",
- "sideOfTheCollarStand": "Lado del soporte del collar",
- "sleevePlacketOverlap": "Vista de la manga superior",
- "sleevePlacketUnderlap": "Vista de la manga fondo",
- "yoke": "Canesú",
- "matchHere": "Coincidir tela a lo largo de esta línea"
- },
- "o": {
- "backDarts": {
- "t": "Pinzas traseras",
- "d": "Incluir o no pinzas traseras"
- },
- "backDartShaping": {
- "t": "Forma de las pinzas traseras",
- "d": "La cantidad de forma que añaden las pinzas traseras"
- },
- "barrelCuffNarrowButton": {
- "t": "Botón de ajuste del puño",
- "d": "Incluír o no un botón extra para ajustar más los puños. Esta opción sólo es relevante para puños de barril."
- },
- "boxPleat": {
- "t": "Pliegue en caja",
- "d": "Si incluir un pliegue en caja en la parte trasera o no"
- },
- "boxPleatWidth": {
- "t": "Anchura del pliegue en caja",
- "d": "El ancho total del pliegue en caja"
- },
- "boxPleatFold": {
- "t": "Doblado del pliegue en caja",
- "d": "La cantidad por la que el piegue en caja se dobla hacia adentro"
- },
- "buttonPlacketStyle": {
- "t": "Estilo de la vista de los botones",
- "d": "Estilo de la visto de los botones"
- },
- "buttonPlacketWidth": {
- "t": "Anchura de la vista de los botones",
- "d": "Anchura de la vista de los botones"
- },
- "buttonFreeLength": {
- "t": "Longitud sin botones",
- "d": "Qué longitud se deja entre el último botón y el bajo."
- },
- "buttonholePlacketFoldWidth": {
- "t": "Anchura del pliegue de la vista de los ojales",
- "d": "Anchura del pliegue de la vista de los ojales."
- },
- "buttonholePlacketStyle": {
- "t": "Estilo de la vista de los ojales",
- "d": "Estilo de la vista de los ojales."
- },
- "buttonholePlacketWidth": {
- "t": "Anchura de la vista de los ojales",
- "d": "Ancho de la placa del agujero del botón."
- },
- "buttons": {
- "t": "Número de botones",
- "d": "Número de botones delanteros"
- },
- "collarAngle": {
- "t": "Ángulo del pico del cuello",
- "d": "El ángulo de los picos del cuello"
- },
- "collarBend": {
- "t": "Inclinación del cuello",
- "d": "La inclinación del cuello hacia atrás."
- },
- "collarFlare": {
- "t": "Forma de los picos del cuello",
- "d": "Cuánto más ancho es el cuello en los picos con respecto al centro."
- },
- "collarGap": {
- "t": "Espaciado del cuello",
- "d": "La separación entre los dos extremos del cuello"
- },
- "collarRoll": {
- "t": "Vuelta del cuello",
- "d": "La cantidad en la que el cuello es más alto que la base del cuello en el centro por detrás."
- },
- "collarStandBend": {
- "t": "Doblado de la base del cuello",
- "d": "La cantidad en la que el cuello superior es mayor que el inferior."
- },
- "collarStandCurve": {
- "t": "Curvatura de la base del cuello",
- "d": "La curvatura de la base del cuello."
- },
- "collarStandWidth": {
- "t": "Anchura de la base del cuello",
- "d": "Ancho del soporte de cuello."
- },
- "cuffButtonRows": {
- "t": "Hileras de botones en los puños",
- "d": "Trazar una o dos hileras de botones en los puños. Esta opción es relevante sólo para puños de barril."
- },
- "cuffDrape": {
- "t": "Plisado del puño",
- "d": "La cantidad en la que la manga es más ancha que el puño en el lugar donde se unen."
- },
- "cuffLength": {
- "t": "Longitud del puño",
- "d": "La longitud de los puños."
- },
- "cuffStyle": {
- "t": "Estilo del puño",
- "d": "El estilo de los puños."
- },
- "extraTopButton": {
- "t": "Botón extra superior",
- "d": "Incluír o no un botón extra en el cierre frontal."
- },
- "ffsa": {
- "t": "Costura plana permitida",
- "d": "La cantidad de permisos de costura en costuras taladas con flete como una proporción de la franquicia regular de costura"
- },
- "hemCurve": {
- "t": "Curva del dobladillo",
- "d": "La altura de la curva en un dobladillo redondeado."
- },
- "hemStyle": {
- "t": "Estilo del dobladillo",
- "d": "El estilo del dobladillo."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "roundBack": {
- "t": "Retroceso",
- "d": "Para encajar un redondo(er) hacia atrás, esto añade longitud al centro de atrás (en el yo) que se atenúa hacia los lados."
- },
- "separateButtonholePlacket": {
- "t": "Tapeta de ojal separada",
- "d": "Construye una placa separada del botón."
- },
- "separateButtonPlacket": {
- "t": "Tapeta de botones separada",
- "d": "Borra una placket de botones separada"
- },
- "sleevePlacketLength": {
- "t": "Longitud de la vista de la manga",
- "d": "La longitud de la vista de la manga."
- },
- "sleevePlacketWidth": {
- "t": "Anchura de la vista de la manga",
- "d": "La anchura de la vista de la manga."
- },
- "splitYoke": {
- "t": "Canesú partido",
- "d": "Si se traza el canesú normal o partido."
- },
- "waistEase": {
- "t": "Holgura de cintura",
- "d": "La cantidad de holgura en la cintura."
- },
- "yokeHeight": {
- "t": "Altura del yugo",
- "d": "Controla la altura del yugo"
- }
- }
-}
diff --git a/designs/simon/i18n/fr.json b/designs/simon/i18n/fr.json
deleted file mode 100644
index 8e26194a547..00000000000
--- a/designs/simon/i18n/fr.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Chemise Simon",
- "d": "Simon est un modèle de chemise très adaptable pour les personnes sans sein.",
- "p": {
- "back": "Retour",
- "buttonholePlacket": "Patte de boutonnière",
- "buttonPlacket": "Patte de boutonnage",
- "collar": "Collier",
- "collarStand": "Support de collier",
- "cuff": "Manchette",
- "front": "Avant",
- "frontLeft": "Avant gauche",
- "frontRight": "Avant droit",
- "sleevePlacketOverlap": "Patte de manche haut",
- "sleevePlacketUnderlap": "Patte de manche bas",
- "sleeve": "Manche",
- "yoke": "Empiècement"
- },
- "s": {
- "buttonholePlacket": "Patte de boutonnage - boutonnières",
- "buttonPlacket": "Patte de boutonnage - boutons",
- "collarAndUndercollar": "Col et sous-col",
- "collarStand": "Pied de col",
- "cutUndercollarSlightlySmaller": "Couper le sous-col légèrement plus petit",
- "frontLeft": "Avant gauche",
- "frontRight": "Avant droit",
- "sideOfTheCollarStand": "Côté du pied de col",
- "sleevePlacketOverlap": "Patte de manche supérieure",
- "sleevePlacketUnderlap": "Patte de manche inférieure",
- "yoke": "Empiècement",
- "matchHere": "Aligner le tissu le long de cette ligne"
- },
- "o": {
- "backDarts": {
- "t": "Pinces dos",
- "d": "Inclure ou non des pinces au dos"
- },
- "backDartShaping": {
- "t": "Forme de la pince dos",
- "d": "L'ajustement résultant des pinces du dos"
- },
- "barrelCuffNarrowButton": {
- "t": "Bouton de resserrage de poignet",
- "d": "Détermine si on va inclure un bouton pour rendre les poignets de manche plus étroits. Cette option n'est pertinente que pour les poignets de manche classiques."
- },
- "boxPleat": {
- "t": "Pli plat",
- "d": "Inclure ou non un pli plat au dos"
- },
- "boxPleatWidth": {
- "t": "Largeur du pli plat",
- "d": "Largeur totale du pli plat"
- },
- "boxPleatFold": {
- "t": "Repli du pli plat",
- "d": "La largeur du pli plat repliée à l'intérieur"
- },
- "buttonPlacketStyle": {
- "t": "Style de patte de boutonnage",
- "d": "Style de la patte de boutonnage"
- },
- "buttonPlacketWidth": {
- "t": "Largeur de patte de boutonnage - côté boutons",
- "d": "Largeur de la patte de boutonnage sur le côté des boutons."
- },
- "buttonFreeLength": {
- "t": "Longueur sans bouton",
- "d": "Quelle distance laisser sans bouton à partir du bas devant de la chemise ."
- },
- "buttonholePlacketFoldWidth": {
- "t": "Largeur du pli de la patte de boutonnage (côté boutonnières)",
- "d": "Largeur du pli de la gorge (patte de boutonnage, du côté des boutonnières)."
- },
- "buttonholePlacketStyle": {
- "t": "Style de patte de boutonnage (côté boutonnières)",
- "d": "Style de la gorge (patte de boutonnage, côté boutonnières)."
- },
- "buttonholePlacketWidth": {
- "t": "Largeur de patte de boutonnage (côté boutonnières)",
- "d": "Largeur de la gorge (patte de boutonnage, côté des boutonnières)."
- },
- "buttons": {
- "t": "Nombre de boutons",
- "d": "Le nombre de boutons sur la fermeture avant."
- },
- "collarAngle": {
- "t": "Angle du col",
- "d": "L'angle des pointes de col."
- },
- "collarBend": {
- "t": "Courbure du col",
- "d": "La courbure du col."
- },
- "collarFlare": {
- "t": "Évasement du col",
- "d": "L'évasement des pointes du col."
- },
- "collarGap": {
- "t": "Écart du col",
- "d": "L'écart entre les deux extrémités du col."
- },
- "collarRoll": {
- "t": "Repli du col",
- "d": "La valeur rendant le tombant du col plus large que le pied de col."
- },
- "collarStandBend": {
- "t": "Courbure centrale du pied de col",
- "d": "La courbure centrale du pied de col."
- },
- "collarStandCurve": {
- "t": "Courbe des extrémités du pied de col",
- "d": "La courbe des extrémités du pied de col."
- },
- "collarStandWidth": {
- "t": "Largeur du pied de col",
- "d": "Largeur du porte-col."
- },
- "cuffButtonRows": {
- "t": "Rangée de boutons de manchette",
- "d": "Simple ou double rangée de boutons de poignet. Cette option n'est pertinente que pour les poignets classiques."
- },
- "cuffDrape": {
- "t": "Drapé du bas de manche",
- "d": "Il s'agit de la largeur supplémentaire de tissu de la manche par rapport au poignet, à l'endroit où ils sont joints."
- },
- "cuffLength": {
- "t": "Longueur de bracelet",
- "d": "La longueur des poignets."
- },
- "cuffStyle": {
- "t": "Style de bracelet",
- "d": "Style de poignets."
- },
- "extraTopButton": {
- "t": "Bouton supérieur supplémentaire",
- "d": "Inclure ou non un bouton supplémentaire en haut de fermeture avant."
- },
- "ffsa": {
- "t": "Couture abattu à plat autorisée",
- "d": "La quantité de la marge de couture sur les coutures abattues en proportion de la marge de couture normale"
- },
- "hemCurve": {
- "t": "Courbe de l'ourlet",
- "d": "La hauteur de l'arrondi sur un ourlet arrondi."
- },
- "hemStyle": {
- "t": "Style d'ourlet",
- "d": "Le style de l'ourlet de la chemise."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "roundBack": {
- "t": "Arrondi arrière",
- "d": "Pour installer un rond-point arrière, cela ajoute de la longueur au centre du dos (au yoke) que les foulards de vers les côtés."
- },
- "separateButtonholePlacket": {
- "t": "Gorge (Patte de boutonnières) séparée",
- "d": "Dessinez une gorge (patte de boutonnières) séparée."
- },
- "separateButtonPlacket": {
- "t": "Patte de boutonnage séparée",
- "d": "Dessinez une patte de boutonnage séparée"
- },
- "sleevePlacketLength": {
- "t": "Longueur de la patte de manche",
- "d": "La longueur de la patte de manche"
- },
- "sleevePlacketWidth": {
- "t": "Largeur de la patte de manche",
- "d": "La largeur de la patte de manche"
- },
- "splitYoke": {
- "t": "Empiècement dos à couture médiane (\"split yoke\")",
- "d": "Dessiner un empiècement divisé ou classique (une seule pièce)."
- },
- "waistEase": {
- "t": "Aisance à la taille",
- "d": "La quantité d'aisance à votre taille (naturelle)."
- },
- "yokeHeight": {
- "t": "Hauteur du yoke",
- "d": "Contrôle la hauteur du joug"
- }
- }
-}
diff --git a/designs/simon/i18n/index.mjs b/designs/simon/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/simon/i18n/index.mjs
+++ b/designs/simon/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/simon/i18n/nl.json b/designs/simon/i18n/nl.json
deleted file mode 100644
index f91ee52c9f1..00000000000
--- a/designs/simon/i18n/nl.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Simon hemd",
- "d": "Simon is een zeer flexibel hemdpatroon voor mensen zonder borsten.",
- "p": {
- "back": "Achterzijde",
- "buttonholePlacket": "Knoopsgatenpat",
- "buttonPlacket": "Knopenpat",
- "collar": "Kraag",
- "collarStand": "Kraagstaander",
- "cuff": "Manchet",
- "front": "Voorzijde",
- "frontLeft": "Voorzijde links",
- "frontRight": "Voorzijde rechts",
- "sleevePlacketOverlap": "Mouwsplit boven",
- "sleevePlacketUnderlap": "Mouwsplit onder",
- "sleeve": "Mouw",
- "yoke": "Schouderpas"
- },
- "s": {
- "buttonholePlacket": "Knoopsgatenpat",
- "buttonPlacket": "Knopenpad",
- "collarAndUndercollar": "Kraag en Onderkraag",
- "collarStand": "Kraagstaander",
- "cutUndercollarSlightlySmaller": "Knip de onderkraag een beetje kleiner",
- "frontLeft": "Voorzijde links",
- "frontRight": "Voorzijde rechts",
- "sideOfTheCollarStand": "Kant van de kraagstaander",
- "sleevePlacketOverlap": "Mouwsplit bovendeel",
- "sleevePlacketUnderlap": "Mouwsplit onder",
- "yoke": "Schouderpas",
- "matchHere": "Laat de stof langs deze lijn uitkomen"
- },
- "o": {
- "backDarts": {
- "t": "Nepen rug",
- "d": "Of je nepen wil toevoegen aan de rug of niet"
- },
- "backDartShaping": {
- "t": "Vorm nepen rug",
- "d": "Hoeveel invloed de nepen in de rug hebben op de pasvorm"
- },
- "barrelCuffNarrowButton": {
- "t": "Extra knoop manchet",
- "d": "Of je al dan niet een knoop wil om de manchetten smaller te maken. Deze optie is enkel relevant bij klassieke manchetten (zonder manchetknopen)."
- },
- "boxPleat": {
- "t": "Stolpplooi",
- "d": "Of je wel of niet een stolpplooi in de rug wil"
- },
- "boxPleatWidth": {
- "t": "Breedte stolpplooi",
- "d": "De totale breedte van de stolpplooi"
- },
- "boxPleatFold": {
- "t": "Vouw stolpplooi",
- "d": "Hoe ver de stolpplooi naar binnen vouwt"
- },
- "buttonPlacketStyle": {
- "t": "Stijl knopenpat",
- "d": "De stijl van het knopenpat."
- },
- "buttonPlacketWidth": {
- "t": "Breedte knopenpat",
- "d": "De breedte van het knopenpat."
- },
- "buttonFreeLength": {
- "t": "Lengte knooploos stuk",
- "d": "Hoe lang het stuk zonder knopen onderaan de sluiting moet zijn."
- },
- "buttonholePlacketFoldWidth": {
- "t": "Breedte vouw knoopsgatenpat",
- "d": "De breedte van de vouw in het knoopsgatenpat."
- },
- "buttonholePlacketStyle": {
- "t": "Stijl knoopsgatenpat",
- "d": "De stijl van het knoopsgatenpat."
- },
- "buttonholePlacketWidth": {
- "t": "Breedte knoopsgatenpat",
- "d": "De breedte van het knoopsgatenpat."
- },
- "buttons": {
- "t": "Aantal knopen",
- "d": "Het aantal knopen op de sluiting vooraan."
- },
- "collarAngle": {
- "t": "Hoek kraag",
- "d": "De hoek van de punten van de kraag."
- },
- "collarBend": {
- "t": "Kromming kraag",
- "d": "De kromming van de kraag."
- },
- "collarFlare": {
- "t": "Spreiding kraag",
- "d": "Hoe ver de punten van de kraag spreiden."
- },
- "collarGap": {
- "t": "Afstand kraag",
- "d": "De open ruimte tussen de uiteindes van de kraag."
- },
- "collarRoll": {
- "t": "Omval kraag",
- "d": "Hoeveel groter de bovenkraag is dan de onderkraag."
- },
- "collarStandBend": {
- "t": "Kromming staander",
- "d": "De kromming van de staander in het midden, achteraan de nek."
- },
- "collarStandCurve": {
- "t": "Curve staander",
- "d": "De curve van de uiteindes van de staander."
- },
- "collarStandWidth": {
- "t": "Breedte staander",
- "d": "Breedte van de staander."
- },
- "cuffButtonRows": {
- "t": "Rijen knopen op manchet",
- "d": "Of je een enkele of dubbele rij knopen op de manchet wil. Deze optie is enkel relevant voor klassieke manchetten."
- },
- "cuffDrape": {
- "t": "Verschil mouw/manchet",
- "d": "Hoeveel wijder de mouw is dan de manchet op het punt waar ze wordt aangezet."
- },
- "cuffLength": {
- "t": "Lengte manchet",
- "d": "De lengte van de manchetten."
- },
- "cuffStyle": {
- "t": "Stijl Manchet",
- "d": "De stijl van de manchetten."
- },
- "extraTopButton": {
- "t": "Extra knoop bovenaan",
- "d": "Of je al dan niet een extra knoop bovenaan de sluiting wil."
- },
- "ffsa": {
- "t": "Glanzende naadwaarde",
- "d": "De hoeveelheid naadwaarde aan geflanste naden in verhouding tot de normale naadwaarde"
- },
- "hemCurve": {
- "t": "Curve zoom",
- "d": "De hoogte van de curve op een afgeronde zoom."
- },
- "hemStyle": {
- "t": "Vorm zoom",
- "d": "De vorm van de zoom van het hemd."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "roundBack": {
- "t": "Rond terug af",
- "d": "Om een round(er) achteraan te passen voegt dit de lengte aan het midden (aan de schouderpas) toe die richting de zijkanten kort."
- },
- "separateButtonholePlacket": {
- "t": "Apart knoopsgatenpat",
- "d": "Teken een apart knoopsgatenpat."
- },
- "separateButtonPlacket": {
- "t": "Apart knopenpat",
- "d": "Teken een apart knopenpat"
- },
- "sleevePlacketLength": {
- "t": "Lengte mouwsplit",
- "d": "De lengte van het mouwsplit."
- },
- "sleevePlacketWidth": {
- "t": "Breedte mouwsplit",
- "d": "De breedte van het mouwsplit."
- },
- "splitYoke": {
- "t": "Tweedelige schouderpas",
- "d": "Wil je een tweedelige schouderpas?"
- },
- "waistEase": {
- "t": "Overwijdte taille",
- "d": "De hoeveelheid extra ruimte aan je (natuurlijke) taille."
- },
- "yokeHeight": {
- "t": "Hoogte schouderpas",
- "d": "Bepaalt de hoogte van de schouderpas"
- }
- }
-}
diff --git a/designs/simon/i18n/uk.json b/designs/simon/i18n/uk.json
deleted file mode 100644
index 4a4b43c2206..00000000000
--- a/designs/simon/i18n/uk.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "t": "Simon shirt",
- "d": "Simon is a highly adaptable shirt pattern for people without breasts.",
- "p": {
- "back": "Back",
- "buttonholePlacket": "Buttonhole placket",
- "buttonPlacket": "Button placket",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuff": "Cuff",
- "front": "Front",
- "frontLeft": "Front left",
- "frontRight": "Front right",
- "sleevePlacketOverlap": "Sleeve placket overlap",
- "sleevePlacketUnderlap": "Sleeve placket underlap",
- "sleeve": "Sleeve",
- "yoke": "Yoke"
- },
- "s": {
- "buttonholePlacket": "Buttonhole placket",
- "buttonPlacket": "Button placket",
- "collarAndUndercollar": "Collar and Undercollar",
- "collarStand": "Collar stand",
- "cutUndercollarSlightlySmaller": "Cut undercollar slightly smaller",
- "frontLeft": "Front left",
- "frontRight": "Front right",
- "sideOfTheCollarStand": "Side of the collar stand",
- "sleevePlacketOverlap": "Sleeve placket overlap",
- "sleevePlacketUnderlap": "Sleeve placket underlap",
- "yoke": "Yoke",
- "matchHere": "Match fabric along this line"
- },
- "o": {
- "backDarts": {
- "t": "Back darts",
- "d": "Whether or not to include back darts"
- },
- "backDartShaping": {
- "t": "Back dart shaping",
- "d": "The amount of shaping that is done by the back darts"
- },
- "barrelCuffNarrowButton": {
- "t": "Cuff narrow button",
- "d": "Whether to include a button to tie the cuffs more narrow. This option is only relevant for barrel cuffs."
- },
- "boxPleat": {
- "t": "Box pleat",
- "d": "Whether to include a box pleat at the back or not"
- },
- "boxPleatWidth": {
- "t": "Box pleat width",
- "d": "The total widh of the box pleat"
- },
- "boxPleatFold": {
- "t": "Box pleat fold",
- "d": "The amount by with the box pleat folds inwards"
- },
- "buttonPlacketStyle": {
- "t": "Button placket style",
- "d": "Style of the button placket."
- },
- "buttonPlacketWidth": {
- "t": "Button placket width",
- "d": "Width of the button placket."
- },
- "buttonFreeLength": {
- "t": "Button free length",
- "d": "How much of the bottom of the front closure to keep button-free."
- },
- "buttonholePlacketFoldWidth": {
- "t": "Buttonhole placket fold width",
- "d": "Width of the buttonhole placket fold."
- },
- "buttonholePlacketStyle": {
- "t": "Buttonhole placket style",
- "d": "Style of the buttonhole placket."
- },
- "buttonholePlacketWidth": {
- "t": "Buttonhole placket width",
- "d": "Width of the buttonhole placket."
- },
- "buttons": {
- "t": "Number of buttons",
- "d": "The number of buttons on the front closure."
- },
- "collarAngle": {
- "t": "Collar angle",
- "d": "The angle of the collar tips."
- },
- "collarBend": {
- "t": "Collar bend",
- "d": "The bend of the collar."
- },
- "collarFlare": {
- "t": "Collar flare",
- "d": "The flare of the collar tips."
- },
- "collarGap": {
- "t": "Collar gap",
- "d": "The gap between the the two collar ends."
- },
- "collarRoll": {
- "t": "Collar roll",
- "d": "The amount by which the top collar is larger than the undercollar."
- },
- "collarStandBend": {
- "t": "Collar stand bend",
- "d": "The bend of the collar stand."
- },
- "collarStandCurve": {
- "t": "Collar stand curve",
- "d": "The curve of the collar stand."
- },
- "collarStandWidth": {
- "t": "Collar stand width",
- "d": "Width of the collar stand."
- },
- "cuffButtonRows": {
- "t": "Cuff button rows",
- "d": "Whether to draft a single or double row of cuff buttons. This option is only relevant for barrel cuffs."
- },
- "cuffDrape": {
- "t": "Cuff drape",
- "d": "The amount by which the sleeve is wider than the cuff where the are joined."
- },
- "cuffLength": {
- "t": "Cuff length",
- "d": "The length of the cuffs."
- },
- "cuffStyle": {
- "t": "Cuff style",
- "d": "The style of the cuffs."
- },
- "extraTopButton": {
- "t": "Extra top button",
- "d": "Whether or not to include an extra top button on the front closure."
- },
- "ffsa": {
- "t": "Flat-felled seam allowace",
- "d": "The amount of seam allowance on flet-felled seams as a proportion of the regular seam allowance"
- },
- "hemCurve": {
- "t": "Hem curve",
- "d": "The height of the curve on a curved hem."
- },
- "hemStyle": {
- "t": "Hem style",
- "d": "The style of the shirt hem."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "roundBack": {
- "t": "Round back",
- "d": "To fit a round(er) back, this adds length to the center back (at the yoke) that tapers of towards the sides."
- },
- "separateButtonholePlacket": {
- "t": "Separate buttonhole placket",
- "d": "Draft a separate buttonhole placket."
- },
- "separateButtonPlacket": {
- "t": "Separate button placket",
- "d": "Draft a separate button placket"
- },
- "sleevePlacketLength": {
- "t": "Sleeve placket length",
- "d": "The length of the sleeve placket."
- },
- "sleevePlacketWidth": {
- "t": "Sleeve placket width",
- "d": "The width of the sleeve placket."
- },
- "splitYoke": {
- "t": "Split yoke",
- "d": "Whether to draft a split or regular yoke."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "The amount of ease at your (natural) waist."
- },
- "yokeHeight": {
- "t": "Yoke height",
- "d": "Controls the height of the yoke"
- }
- }
-}
diff --git a/designs/simon/package.json b/designs/simon/package.json
index 65cf9c9e64c..4dbb48bd53e 100644
--- a/designs/simon/package.json
+++ b/designs/simon/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/simon",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a button down shirt",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,51 +25,42 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1",
- "@freesewing/plugin-flip": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0",
+ "@freesewing/plugin-flip": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/simon/src/index.mjs b/designs/simon/src/index.mjs
index f9fb36cdc37..58c4b7dbc99 100644
--- a/designs/simon/src/index.mjs
+++ b/designs/simon/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as simonI18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
@@ -19,7 +19,7 @@ import { front } from './front.mjs'
// Setup our new design
const Simon = new Design({
- data,
+ data: about,
parts: [
back,
buttonholePlacket,
@@ -57,4 +57,5 @@ export {
yoke,
Simon,
i18n,
+ about,
}
diff --git a/designs/simon/tests/shared.test.mjs b/designs/simon/tests/shared.test.mjs
index 2cd189fc185..b2f23f473d8 100644
--- a/designs/simon/tests/shared.test.mjs
+++ b/designs/simon/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Simon, i18n } from '../src/index.mjs'
+import { Simon, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Simon)
+testPatternConfig(Simon, about)
// Test translation
testPatternI18n(Simon, i18n)
diff --git a/designs/simone/CHANGELOG.md b/designs/simone/CHANGELOG.md
index 2d5c172619d..d43637943c7 100644
--- a/designs/simone/CHANGELOG.md
+++ b/designs/simone/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/simone
+## 4.0.0 (2024-04-01)
+
+### Fixed
+
+ - Added missing translation for various options
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/simone/README.md b/designs/simone/README.md
index 818a83d638d..8e98922be9f 100644
--- a/designs/simone/README.md
+++ b/designs/simone/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/simone
@@ -59,7 +44,7 @@ A FreeSewing pattern for a button down shirt (Simone = Simon for people wit
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/simone/data.mjs b/designs/simone/data.mjs
deleted file mode 100644
index 341d1e3e40a..00000000000
--- a/designs/simone/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/simone'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/simone/i18n/de.json b/designs/simone/i18n/de.json
deleted file mode 100644
index 10de3d1dd43..00000000000
--- a/designs/simone/i18n/de.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "t": "Simone, das Hemd",
- "d": "Simone ist Simon, angepasst für Menschen mit Brüsten.",
- "p": {
- "back": "Rückseite",
- "buttonholePlacket": "Knopflochleiste",
- "buttonPlacket": "Knopfleiste",
- "collar": "Kragen",
- "collarStand": "Kragensteg",
- "cuff": "Manschette",
- "fbaFont": "FBA Vorderseite",
- "front": "Vorderseite",
- "frontLeft": "Vorderseite links",
- "frontRight": "Vorderseite rechts",
- "sleevePlacketOverlap": "Übertritt der Ärmelleiste",
- "sleevePlacketUnderlap": "Untertritt der Ärmelleiste",
- "sleeve": "Ärmel",
- "yoke": "Passe"
- },
- "s": {},
- "o": {
- "bustAlignedButtons": {
- "t": "Auf Brusthöhe ausgerichtete Knöpfe",
- "d": "Optionale Positionierung der Knöpfe, um sicherzugehen, einen Knopf auf Brusthöhe zu platzieren"
- },
- "bustDartAngle": {
- "t": "Winkel des Brustabnähers",
- "d": "Kontrolliert den Winkel, in welchem der (seitliche) Brustabnäher sich nach unten neigt"
- },
- "bustDartLength": {
- "t": "Länge des Brustabnähers",
- "d": "Regelt, wie nahe der Brustabnäher an den Brustpunkt kommt"
- },
- "contour": {
- "t": "Kontur",
- "d": "Legt fest, wie eng anliegend der Schnitt unterhalb der Brust gestaltet wird"
- },
- "frontDarts": {
- "t": "Vordere Abnäher",
- "d": "Legt fest, ob vordere Abnäher im Schnitt eingearbeitet werden sollen"
- },
- "frontDartLength": {
- "t": "Länge der vorderen Abnäher",
- "d": "Legt fest, wie nahe die vorderen Abnäher an den Brustpunkt heranreichen"
- }
- }
-}
diff --git a/designs/simone/i18n/es.json b/designs/simone/i18n/es.json
deleted file mode 100644
index 7678479e547..00000000000
--- a/designs/simone/i18n/es.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "t": "Simone, camisa",
- "d": "Simone es Simón, una patrón de camisa, adaptado para gente con pechos.",
- "p": {
- "back": "Atrás",
- "buttonholePlacket": "Tapeta de ojal",
- "buttonPlacket": "Tapeta de botones",
- "collar": "Cuello",
- "collarStand": "Soporte de collar",
- "cuff": "Cuffnl",
- "fbaFront": "FBA Frente",
- "front": "Frente",
- "frontLeft": "Delantero izquierdo",
- "frontRight": "Frente derecho",
- "sleevePlacketOverlap": "Top de manga tapeta",
- "sleevePlacketUnderlap": "Parte inferior de la tapeta de la manga",
- "sleeve": "Manga",
- "yoke": "Yugo"
- },
- "s": {},
- "o": {
- "bustAlignedButtons": {
- "t": "Bust-aligned buttons",
- "d": "Optional button spacing strategies to ensure a button at the bustline"
- },
- "bustDartAngle": {
- "t": "Ángulo de dardos de polvo",
- "d": "Controla el ángulo por el cual el (lado) dardos de polvo tiene pendiente descendente"
- },
- "bustDartLength": {
- "t": "Longitud del dart del polvo",
- "d": "Controla cómo se acerca el polvo al punto de busto"
- },
- "contour": {
- "t": "Contorno",
- "d": "Controla cómo se elimina de nuevo el espacio extra para los senos debajo del cofre"
- },
- "frontDarts": {
- "t": "Dardos delanteros",
- "d": "Incluya o no las artes frontales"
- },
- "frontDartLength": {
- "t": "Longitud del dart frontal",
- "d": "Controla cómo se acerca el dardo frontal al punto de polvo"
- }
- }
-}
diff --git a/designs/simone/i18n/fr.json b/designs/simone/i18n/fr.json
deleted file mode 100644
index f655474eace..00000000000
--- a/designs/simone/i18n/fr.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "t": "Chemise Simone",
- "d": "Simone est Simon, adapté pour les poitrines avec seins.",
- "p": {
- "back": "Retour",
- "buttonholePlacket": "Patte de boutonnière",
- "buttonPlacket": "Patte de boutonnage",
- "collar": "Collier",
- "collarStand": "Support de collier",
- "cuff": "Manchette",
- "fbaFront": "FBA Avant",
- "front": "Avant",
- "frontLeft": "Avant gauche",
- "frontRight": "Avant droit",
- "sleevePlacketOverlap": "Patte de manche haut",
- "sleevePlacketUnderlap": "Patte de manche bas",
- "yoke": "Empiècement"
- },
- "s": {},
- "o": {
- "bustAlignedButtons": {
- "t": "Boutons alignés sur le buste",
- "d": "Stratégies optionnelles d'espacement des boutons pour assurer un bouton au niveau de la ligne de buste"
- },
- "bustDartAngle": {
- "t": "Angle des pinces poitrine",
- "d": "Contrôle l'angle par lequel la pince poitrine (sur le côté) s'incline vers le bas"
- },
- "bustDartLength": {
- "t": "Longueur des pinces poitrine",
- "d": "Contrôle à quel point la pince poitrine sera proche de l'apex du buste (la pointe des seins)"
- },
- "contour": {
- "t": "Angle des découpes princesses",
- "d": "Contrôle à quel point le volume sera réduit sous les seins"
- },
- "frontDarts": {
- "t": "Pinces de taille",
- "d": "Inclure ou non des pinces de taille"
- },
- "frontDartLength": {
- "t": "Longueur des pinces de taille",
- "d": "Contrôle à quel point la pince de taille sera proche de l'apex du buste (la pointe des seins)"
- }
- }
-}
diff --git a/designs/simone/i18n/index.mjs b/designs/simone/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/simone/i18n/index.mjs
+++ b/designs/simone/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/simone/i18n/nl.json b/designs/simone/i18n/nl.json
deleted file mode 100644
index bb3e4ae509f..00000000000
--- a/designs/simone/i18n/nl.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "t": "Simone hemd",
- "d": "Simone is simon, aangepast aan borsten.",
- "p": {
- "back": "Achterzijde",
- "buttonholePlacket": "Knoopsgatenpat",
- "buttonPlacket": "Knopenpat",
- "collar": "Kraag",
- "collarStand": "Kraagstaander",
- "cuff": "Manchet",
- "front": "FBA Voorzijde",
- "frontLeft": "Voorzijde links",
- "frontRight": "Voorzijde rechts",
- "sleevePlacketOverlap": "Mouwsplit boven",
- "sleevePlacketUnderlap": "Mouwsplit onder",
- "sleeve": "Mouw",
- "yoke": "Schouderpas"
- },
- "s": {},
- "o": {
- "bustAlignedButtons": {
- "t": "Bust-aligned buttons",
- "d": "Optional button spacing strategies to ensure a button at the bustline"
- },
- "bustDartAngle": {
- "t": "Hoek busteneep",
- "d": "Bepaalt de hoek waarin de busteneep vanuit de zijnaad naar beneden wijst"
- },
- "bustDartLength": {
- "t": "Lengte busteneep",
- "d": "Bepaalt hoe dicht de punt van de busteneep bij het bustepunt komt"
- },
- "contour": {
- "t": "Contour",
- "d": "Bepaalt in hoeverre de extra ruimte voor borsten onder de buste verwijderd wordt"
- },
- "frontDarts": {
- "t": "Nepen voor",
- "d": "Of je vooraan nepen wil of niet"
- },
- "frontDartLength": {
- "t": "Lengte nepen voor",
- "d": "Bepaalt hoe dicht de punt van de voorste neep bij het bustepunt komt"
- }
- }
-}
diff --git a/designs/simone/i18n/uk.json b/designs/simone/i18n/uk.json
deleted file mode 100644
index 3ce043f279b..00000000000
--- a/designs/simone/i18n/uk.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "t": "Simone shirt",
- "d": "Simone is simon, adapted for breasts.",
- "p": {
- "back": "Back",
- "buttonholePlacket": "Buttonhole placket",
- "buttonPlacket": "Button placket",
- "collar": "Collar",
- "collarStand": "Collar stand",
- "cuff": "Cuff",
- "fbaFront": "FBA Front",
- "front": "Front",
- "frontLeft": "Front left",
- "frontRight": "Front right",
- "sleevePlacketOverlap": "Sleeve placket overlap",
- "sleevePlacketUnderlap": "Sleeve placket underlap",
- "sleeve": "Sleeve",
- "yoke": "Yoke"
- },
- "s": {},
- "o": {
- "bustAlignedButtons": {
- "t": "Bust-aligned buttons",
- "d": "Optional button spacing strategies to ensure a button at the bustline"
- },
- "bustDartAngle": {
- "t": "Bust dart angle",
- "d": "Controls the angle by which the (side) bust dart slopes downward"
- },
- "bustDartLength": {
- "t": "Bust dart length",
- "d": "Controls how close the bust dart approaches the bust point"
- },
- "contour": {
- "t": "Contour",
- "d": "Controls how sharply the extra room for breasts is removed again below the chest"
- },
- "frontDarts": {
- "t": "Front darts",
- "d": "Whether to include front darts or not"
- },
- "frontDartLength": {
- "t": "Front dart length",
- "d": "Controls how close the front dart approaches the bust point"
- }
- }
-}
diff --git a/designs/simone/package.json b/designs/simone/package.json
index 54dd6c46821..82de3c1589e 100644
--- a/designs/simone/package.json
+++ b/designs/simone/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/simone",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,52 +25,43 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/simon": "3.3.0-rc.1",
- "@freesewing/plugin-flip": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/simon": "4.0.0",
+ "@freesewing/plugin-flip": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/simone/src/index.mjs b/designs/simone/src/index.mjs
index 9596e72f465..f92bf692909 100644
--- a/designs/simone/src/index.mjs
+++ b/designs/simone/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as simonI18n } from '@freesewing/simon'
import { i18n as simoneI18n } from '../i18n/index.mjs'
import {
@@ -41,7 +41,7 @@ const frontLeft = {
// Setup our new design
const Simone = new Design({
- data,
+ data: about,
parts: [
fbaFront,
back,
@@ -79,4 +79,5 @@ export {
frontLeft,
Simone,
i18n,
+ about,
}
diff --git a/designs/simone/tests/shared.test.mjs b/designs/simone/tests/shared.test.mjs
index 78ea338763c..3adf74487c2 100644
--- a/designs/simone/tests/shared.test.mjs
+++ b/designs/simone/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Simone, i18n } from '../src/index.mjs'
+import { Simone, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Simone)
+testPatternConfig(Simone, about)
// Test translation
testPatternI18n(Simone, i18n)
diff --git a/designs/skully/README.md b/designs/skully/README.md
index b9589be02af..40723513a83 100644
--- a/designs/skully/README.md
+++ b/designs/skully/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/skully
@@ -59,7 +44,7 @@ A FreeSewing pattern for skully, our logo, a plushy toy
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/skully/data.mjs b/designs/skully/data.mjs
deleted file mode 100644
index 2943d2f35f2..00000000000
--- a/designs/skully/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/skully'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/skully/i18n/de.json b/designs/skully/i18n/de.json
deleted file mode 100644
index cf2665157a0..00000000000
--- a/designs/skully/i18n/de.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Skully logo plush toy",
- "d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
- "p": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "s": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size (value shown is the size of the head)"
- }
- }
-}
diff --git a/designs/skully/i18n/es.json b/designs/skully/i18n/es.json
deleted file mode 100644
index cf2665157a0..00000000000
--- a/designs/skully/i18n/es.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Skully logo plush toy",
- "d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
- "p": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "s": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size (value shown is the size of the head)"
- }
- }
-}
diff --git a/designs/skully/i18n/fr.json b/designs/skully/i18n/fr.json
deleted file mode 100644
index cf2665157a0..00000000000
--- a/designs/skully/i18n/fr.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Skully logo plush toy",
- "d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
- "p": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "s": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size (value shown is the size of the head)"
- }
- }
-}
diff --git a/designs/skully/i18n/index.mjs b/designs/skully/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/skully/i18n/index.mjs
+++ b/designs/skully/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/skully/i18n/nl.json b/designs/skully/i18n/nl.json
deleted file mode 100644
index cf2665157a0..00000000000
--- a/designs/skully/i18n/nl.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Skully logo plush toy",
- "d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
- "p": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "s": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head1",
- "head2": "Head2",
- "head3": "Head3",
- "jawfloor": "Jawfloor",
- "lowerjaw": "Lowerjaw",
- "lowermouth": "Lowermouth",
- "nose": "Nose",
- "uppermouth": "Uppermouth"
- },
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size (value shown is the size of the head)"
- }
- }
-}
diff --git a/designs/skully/i18n/uk.json b/designs/skully/i18n/uk.json
deleted file mode 100644
index 4fdd6b0ccc3..00000000000
--- a/designs/skully/i18n/uk.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "t": "Skully logo plush toy",
- "d": "A FreeSewing pattern for skully, our logo, a plushy toy.",
- "p": {
- "cheek": "Cheek",
- "cheekbone": "Cheekbone",
- "eye": "Eye",
- "forehead": "Forehead",
- "head1": "Head part 1",
- "head2": "Head part 2",
- "head3": "Head part 3",
- "jawfloor": "Jaw floor",
- "lowerjaw": "Lower Jaw",
- "lowermouth": "Lower Mouth",
- "nose": "Nose",
- "uppermouth": "Upper Mouth"
- },
- "s": {},
- "o": {
- "size": {
- "t": "Size",
- "d": "Controls the overall size (value shown is the resulting height of Skully)"
- }
- }
-}
diff --git a/designs/skully/package.json b/designs/skully/package.json
index f773a8e1842..6ebd1e07e61 100644
--- a/designs/skully/package.json
+++ b/designs/skully/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/skully",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for skully, our logo, a plushy toy",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/skully/src/index.mjs b/designs/skully/src/index.mjs
index 9eb42512ed7..ea05e9dbe91 100644
--- a/designs/skully/src/index.mjs
+++ b/designs/skully/src/index.mjs
@@ -1,6 +1,6 @@
// Skully
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { cheek } from './cheek.mjs'
import { cheekbone } from './cheekbone.mjs'
@@ -19,7 +19,7 @@ import { i18n } from '../i18n/index.mjs'
// Create new design
const Skully = new Design({
- data,
+ data: about,
parts: [
cheek,
cheekbone,
@@ -52,4 +52,5 @@ export {
uppermouth,
Skully,
i18n,
+ about,
}
diff --git a/designs/skully/tests/shared.test.mjs b/designs/skully/tests/shared.test.mjs
index 1d350371b46..8e39fd60452 100644
--- a/designs/skully/tests/shared.test.mjs
+++ b/designs/skully/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Skully, i18n } from '../src/index.mjs'
+import { Skully, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Skully)
+testPatternConfig(Skully, about)
// Test translation
testPatternI18n(Skully, i18n)
diff --git a/designs/sven/README.md b/designs/sven/README.md
index 66959f052b9..8dd8a44690d 100644
--- a/designs/sven/README.md
+++ b/designs/sven/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/sven
@@ -59,7 +44,7 @@ A FreeSewing pattern for a straightforward sweater
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/sven/data.mjs b/designs/sven/data.mjs
deleted file mode 100644
index 7eb1775ae6c..00000000000
--- a/designs/sven/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/sven'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/sven/i18n/de.json b/designs/sven/i18n/de.json
deleted file mode 100644
index c0e6c8c8f12..00000000000
--- a/designs/sven/i18n/de.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sven, der Pullover",
- "d": "Sven ist ein einfacher Pullover.",
- "p": {
- "back": "Rückseite",
- "cuff": "Manschette",
- "front": "Vorderseite",
- "sleeve": "Ärmel",
- "waistband": "Bund"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Zugabe Hüfte",
- "d": "Steuert die Menge an Zugabe an deinen Hüften (am unteren Ende des Pullovers)"
- },
- "ribbing": {
- "t": "Bündchen",
- "d": "Ob Saum und Manschetten mit Bündchen abschließen oder nicht."
- },
- "ribbingHeight": {
- "t": "Bündchen-Höhe",
- "d": "Die Höhe der Bündchen"
- },
- "ribbingStretch": {
- "t": "Bündchen-Elastizität",
- "d": "Die Menge an negativer Zugabe für die an Manschetten und Saum verwendeten Bündchen."
- }
- }
-}
diff --git a/designs/sven/i18n/es.json b/designs/sven/i18n/es.json
deleted file mode 100644
index 73112b70b0e..00000000000
--- a/designs/sven/i18n/es.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sven, sudadera",
- "d": "Sven es una sudadera de líneas sencillas.",
- "p": {
- "back": "Atrás",
- "cuff": "Cuffnl",
- "front": "Frente",
- "sleeve": "Manga",
- "waistband": "Pretina"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Holgura de cadera",
- "d": "Controla la cantidad de holgura en las caderas (en la parte de abajo de la sudadera)"
- },
- "ribbing": {
- "t": "Tejido acanalado",
- "d": "Ya sea para terminar el dobladillo y los puños con tejido acanalado."
- },
- "ribbingHeight": {
- "t": "Altura de tejido acanalado",
- "d": "La altura del tejido acanalado en los puños y el dobladillo."
- },
- "ribbingStretch": {
- "t": "Extensión de tejido acanalado",
- "d": "La cantidad de holgura negativa de tejido acanalado."
- }
- }
-}
diff --git a/designs/sven/i18n/fr.json b/designs/sven/i18n/fr.json
deleted file mode 100644
index c95e865853d..00000000000
--- a/designs/sven/i18n/fr.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sweat Sven",
- "d": "Sven est un sweat simple.",
- "p": {
- "back": "Retour",
- "cuff": "Manchette",
- "front": "Avant",
- "sleeve": "Manche",
- "waistband": "Ceinture"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Aisance des hanches",
- "d": "Contrôle la quantité d'aisance à vos hanches (au bas du sweat)"
- },
- "ribbing": {
- "t": "Bord côte",
- "d": "Faut-il finir l'ourlet et les poignets avec un tissu pour bordures"
- },
- "ribbingHeight": {
- "t": "Hauteur de bord côte",
- "d": "La hauteur du tissu pour le bord côte sur les poignets et le bas du sweat."
- },
- "ribbingStretch": {
- "t": "Élasticité du bord côte",
- "d": "L'élasticité du bord côte sur les poignets et le bas."
- }
- }
-}
diff --git a/designs/sven/i18n/index.mjs b/designs/sven/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/sven/i18n/index.mjs
+++ b/designs/sven/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/sven/i18n/nl.json b/designs/sven/i18n/nl.json
deleted file mode 100644
index 634007665dd..00000000000
--- a/designs/sven/i18n/nl.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sven sweater",
- "d": "Sven is een no-nonsense basic trui.",
- "p": {
- "back": "Achterzijde",
- "cuff": "Manchet",
- "front": "Voorzijde",
- "sleeve": "Mouw",
- "waistband": "Tailleband"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Overwijdte heup",
- "d": "Controls the amount of ease at your hips (the bottom of the sweater)"
- },
- "ribbing": {
- "t": "Boordstof",
- "d": "Of we boordstof plaatsen aan de zoom en manchetten of niet."
- },
- "ribbingHeight": {
- "t": "Hoogte boord",
- "d": "De hoogte van de boordstof aan zoom en manchetten."
- },
- "ribbingStretch": {
- "t": "Stretch boordstof",
- "d": "De hoeveelheid stretch in de boordstof voor zoom en manchetten."
- }
- }
-}
diff --git a/designs/sven/i18n/uk.json b/designs/sven/i18n/uk.json
deleted file mode 100644
index 1d9a7a40edf..00000000000
--- a/designs/sven/i18n/uk.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "t": "Sven sweatshirt",
- "d": "Sven is a straightforward sweater.",
- "p": {
- "back": "Back",
- "cuff": "Cuff",
- "front": "Front",
- "sleeve": "Sleeve",
- "waistband": "Waistband"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at your hips (the bottom of the sweater)"
- },
- "ribbing": {
- "t": "Ribbing",
- "d": "Whether to finish the hem and cuffs with ribbing or not."
- },
- "ribbingHeight": {
- "t": "Ribbing height",
- "d": "The height of the ribbing on cuffs and hem."
- },
- "ribbingStretch": {
- "t": "Ribbing stretch",
- "d": "The amount of negative ease to apply to the ribbing used for cuffs and hem."
- }
- }
-}
diff --git a/designs/sven/package.json b/designs/sven/package.json
index c9d3c114cab..dcbe43f1d49 100644
--- a/designs/sven/package.json
+++ b/designs/sven/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/sven",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a straightforward sweater",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/sven/src/frontback.mjs b/designs/sven/src/frontback.mjs
index 3d24f65f6e3..477f6051143 100644
--- a/designs/sven/src/frontback.mjs
+++ b/designs/sven/src/frontback.mjs
@@ -1,5 +1,5 @@
import { front as brianFront, back as brianBack } from '@freesewing/brian'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function svenFrontBack({
store,
@@ -156,11 +156,11 @@ function svenFrontBack({
}
const measurements = ['hips', 'waist']
-export const hipsEase = { pct: 8, min: -4, max: 20, menu: 'fit' }
+export const hipsEase = { pct: 8, min: -4, max: 20, ...pctBasedOn('hips'), menu: 'fit' }
export const ribbing = { bool: true, menu: 'style' }
const options = {
waistEase: 0.08,
- collarEase: { pct: 10, min: 5, max: 30, menu: 'fit' },
+ collarEase: { pct: 10, min: 5, max: 30, ...pctBasedOn('neck'), menu: 'fit' },
lengthBonus: { pct: 15, min: 0, max: 30, menu: 'style' },
sleeveLengthBonus: { pct: 3, min: 0, max: 10, menu: 'style' },
ribbingHeight: { pct: 8, min: 3, max: 15, menu: 'style' },
diff --git a/designs/sven/src/index.mjs b/designs/sven/src/index.mjs
index ed8981b9a0c..5c88d71915e 100644
--- a/designs/sven/src/index.mjs
+++ b/designs/sven/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as svenI18n } from '../i18n/index.mjs'
import { front, back } from './frontback.mjs'
@@ -9,7 +9,7 @@ import { waistband } from './waistband.mjs'
// Setup our new design
const Sven = new Design({
- data,
+ data: about,
parts: [front, back, sleeve, cuff, waistband],
})
@@ -17,4 +17,4 @@ const Sven = new Design({
const i18n = mergeI18n([brianI18n, svenI18n])
// Named exports
-export { front, back, sleeve, cuff, waistband, Sven, i18n }
+export { front, back, sleeve, cuff, waistband, Sven, i18n, about }
diff --git a/designs/sven/src/sleeve.mjs b/designs/sven/src/sleeve.mjs
index 0effd378c76..685c7c5eb78 100644
--- a/designs/sven/src/sleeve.mjs
+++ b/designs/sven/src/sleeve.mjs
@@ -1,6 +1,6 @@
import { sleeve as brianSleeve } from '@freesewing/brian'
import { ribbing, front, back } from './frontback.mjs'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function svenSleeve({ store, sa, points, paths, Path, macro, options, part }) {
if (options.ribbing) {
@@ -83,7 +83,7 @@ export const sleeve = {
after: [front, back],
options: {
ribbing,
- cuffEase: { pct: 20, min: 0, max: 200, menu: 'fit' },
+ cuffEase: { pct: 20, min: 0, max: 200, ...pctBasedOn('wrist'), menu: 'fit' },
},
draft: svenSleeve,
}
diff --git a/designs/sven/tests/shared.test.mjs b/designs/sven/tests/shared.test.mjs
index ca6d885d50b..fb2dde4eba5 100644
--- a/designs/sven/tests/shared.test.mjs
+++ b/designs/sven/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Sven, i18n } from '../src/index.mjs'
+import { Sven, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Sven)
+testPatternConfig(Sven, about)
// Test translation
testPatternI18n(Sven, i18n)
diff --git a/designs/tamiko/CHANGELOG.md b/designs/tamiko/CHANGELOG.md
index d104bb5948b..524b386ab2e 100644
--- a/designs/tamiko/CHANGELOG.md
+++ b/designs/tamiko/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/tamiko
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Always load plugin-bust due to its changes in how it handle conditionality.
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/tamiko/README.md b/designs/tamiko/README.md
index ad7cd8f7379..a348e1a847c 100644
--- a/designs/tamiko/README.md
+++ b/designs/tamiko/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/tamiko
@@ -59,7 +44,7 @@ A FreeSewing pattern for a zero-waste top
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/tamiko/data.mjs b/designs/tamiko/data.mjs
deleted file mode 100644
index ee14a52ac3c..00000000000
--- a/designs/tamiko/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/tamiko'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/tamiko/i18n/de.json b/designs/tamiko/i18n/de.json
deleted file mode 100644
index 75fb3bd3c3e..00000000000
--- a/designs/tamiko/i18n/de.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Tamiko, das Top",
- "d": "Tamiko ist ein Zero-Waste Top.",
- "p": {
- "top": "Oberteil"
- },
- "s": {},
- "o": {
- "flare": {
- "t": "Ausstellen",
- "d": "Die Menge, um die sich das Kleidungsstück von der Brust nach unten ausgestellt wird"
- },
- "shoulderseamLength": {
- "t": "Schulternahtlänge",
- "d": "Die Länge der Schulternaht als Faktor deines Schulter-zu-Schulter-Maßes"
- },
- "shoulderSlope": {
- "t": "Schulterneigung",
- "d": "Steuert den Winkel der Schulternähte"
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of your armhole, as a factor of your shoulder to shoulder measurement."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make your top."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- }
- }
-}
diff --git a/designs/tamiko/i18n/es.json b/designs/tamiko/i18n/es.json
deleted file mode 100644
index ba12b0bb47b..00000000000
--- a/designs/tamiko/i18n/es.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Tamiko top",
- "d": "Tamiko es un top cero residuos (zero-waste).",
- "p": {
- "top": "Arriba"
- },
- "s": {},
- "o": {
- "flare": {
- "t": "Ensanchamiento",
- "d": "La cantidad por la cual la prenda se ensancha desde tu pecho hacia abajo."
- },
- "shoulderseamLength": {
- "t": "Longitud de la costura de hombro",
- "d": "La longitud de la costura del hombro, como un factor de la medida de su hombro a hombro."
- },
- "shoulderSlope": {
- "t": "Inclinación de hombro",
- "d": "Controla el ángulo de las costuras del hombro"
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of your armhole, as a factor of your shoulder to shoulder measurement."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make your top."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- }
- }
-}
diff --git a/designs/tamiko/i18n/fr.json b/designs/tamiko/i18n/fr.json
deleted file mode 100644
index 489200567e0..00000000000
--- a/designs/tamiko/i18n/fr.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Top Tamiko",
- "d": "Tamiko est un top zéro déchet.",
- "p": {
- "top": "Haut"
- },
- "s": {},
- "o": {
- "flare": {
- "t": "Évasement",
- "d": "La quantité par laquelle le vêtement s'évase de votre poitrine vers le bas"
- },
- "shoulderseamLength": {
- "t": "Longueur de couture d'épaule",
- "d": "La longueur de la couture d'épaule, en tant que facteur de la mesure d'épaule à épaule"
- },
- "shoulderSlope": {
- "t": "Pente d'épaule",
- "d": "Contrôle l'angle des coutures d'épaule"
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of your armhole, as a factor of your shoulder to shoulder measurement."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make your top."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- }
- }
-}
diff --git a/designs/tamiko/i18n/index.mjs b/designs/tamiko/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/tamiko/i18n/index.mjs
+++ b/designs/tamiko/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/tamiko/i18n/nl.json b/designs/tamiko/i18n/nl.json
deleted file mode 100644
index d1703cef0ec..00000000000
--- a/designs/tamiko/i18n/nl.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "t": "Tamiko top",
- "d": "Tamiko is een top die geen stof verspilt.",
- "p": {
- "top": "Top"
- },
- "s": {},
- "o": {
- "flare": {
- "t": "Waaier",
- "d": "De mate waarin het kledingstuk van je borst naar beneden uitwaaierd"
- },
- "shoulderseamLength": {
- "t": "Lengte schoudernaad",
- "d": "De lengte van de schoudernaad, als een factor van je schouder tot schouder maat"
- },
- "shoulderSlope": {
- "t": "Schouderhelling",
- "d": "Bepaalt de hoek van de schoudernaden"
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of your armhole, as a factor of your shoulder to shoulder measurement."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make your top."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- }
- }
-}
diff --git a/designs/tamiko/i18n/uk.json b/designs/tamiko/i18n/uk.json
deleted file mode 100644
index c83bc48c2ef..00000000000
--- a/designs/tamiko/i18n/uk.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "t": "Tamiko top",
- "d": "Tamiko is a zero-waste top.",
- "p": {
- "top": "Top"
- },
- "s": {},
- "o": {
- "flare": {
- "t": "Flare",
- "d": "The amount by which the garment flares from your chest downwards"
- },
- "shoulderseamLength": {
- "t": "Shoulder seam length",
- "d": "The length of the shoulder seam, as a factor of your shoulder to shoulder measurement"
- },
- "armholeDepthFactor": {
- "t": "Armhole depth factor",
- "d": "Controls the depth of your armhole, as a factor of your shoulder to shoulder measurement."
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "The amount of ease at your chest."
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make your top."
- },
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- }
- }
-}
diff --git a/designs/tamiko/package.json b/designs/tamiko/package.json
index 7d07b55ece2..26b11ef3075 100644
--- a/designs/tamiko/package.json
+++ b/designs/tamiko/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/tamiko",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a zero-waste top",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/tamiko/src/index.mjs b/designs/tamiko/src/index.mjs
index 1169ff39bc2..9c4747e09fa 100644
--- a/designs/tamiko/src/index.mjs
+++ b/designs/tamiko/src/index.mjs
@@ -1,13 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { top } from './top.mjs'
// Setup our new design
const Tamiko = new Design({
- data,
+ data: about,
parts: [top],
})
// Named exports
-export { top, Tamiko, i18n }
+export { top, Tamiko, i18n, about }
diff --git a/designs/tamiko/src/top.mjs b/designs/tamiko/src/top.mjs
index 6371ad2c1d8..6dfd9d5f855 100644
--- a/designs/tamiko/src/top.mjs
+++ b/designs/tamiko/src/top.mjs
@@ -1,4 +1,5 @@
import { bustPlugin } from '@freesewing/plugin-bust'
+import { pctBasedOn } from '@freesewing/core'
function tamikoTop({
sa,
@@ -214,7 +215,7 @@ export const top = {
optionalMeasurements: ['highBust'],
options: {
armholeDepthFactor: { pct: 50, min: 40, max: 60, menu: 'fit' },
- chestEase: { pct: 2, min: 1, max: 20, menu: 'fit' },
+ chestEase: { pct: 2, min: 1, max: 20, ...pctBasedOn('chest'), menu: 'fit' },
flare: { deg: 15, min: -10, max: 30, menu: 'style' },
lengthBonus: { pct: 13, min: 0, max: 60, menu: 'style' },
shoulderseamLength: { pct: 10, min: 5, max: 25, menu: 'style' },
diff --git a/designs/tamiko/tests/shared.test.mjs b/designs/tamiko/tests/shared.test.mjs
index 82ed6070656..fbfc6157f8f 100644
--- a/designs/tamiko/tests/shared.test.mjs
+++ b/designs/tamiko/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Tamiko, i18n } from '../src/index.mjs'
+import { Tamiko, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Tamiko)
+testPatternConfig(Tamiko, about)
// Test translation
testPatternI18n(Tamiko, i18n)
diff --git a/designs/teagan/CHANGELOG.md b/designs/teagan/CHANGELOG.md
index 6e214b604b7..f7fb77ddbc8 100644
--- a/designs/teagan/CHANGELOG.md
+++ b/designs/teagan/CHANGELOG.md
@@ -1,6 +1,16 @@
# Change log for: @freesewing/teagan
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Increased default lengthBonus from 5% to 15%. Fixes
+
+### Fixed
+
+ - Fix side seam when length is cropped. Fixes
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/teagan/README.md b/designs/teagan/README.md
index 7a7213f6080..8c9f60c5d23 100644
--- a/designs/teagan/README.md
+++ b/designs/teagan/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/teagan
@@ -59,7 +44,7 @@ A FreeSewing pattern for a T-shirt
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/teagan/data.mjs b/designs/teagan/data.mjs
deleted file mode 100644
index 14d159bfdd6..00000000000
--- a/designs/teagan/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/teagan'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/teagan/i18n/de.json b/designs/teagan/i18n/de.json
deleted file mode 100644
index 6aa01adedfc..00000000000
--- a/designs/teagan/i18n/de.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan, das T-Shirt",
- "d": "Teagan ist ein Schnittmuster für ein passgenaues T-Shirt.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "sleeve": "Ärmel"
- },
- "s": {
- "fullLengthFromHps": "Volle Länge (vom höchsten Schulterpunkt)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Entwurf für hohe Büste",
- "d": "Zeichnen Sie das Muster für die hohe Büstenmessung (falls vorhanden) statt der (vollen) Truhe. Dies wird zu einem besser angepassten Kleidungsstück für Brustkleidung führen."
- },
- "sleeveEase": {
- "t": "Bequemlichkeitszugabe Ärmel",
- "d": "Größe der Bequemlichkeitszugabe an den Ärmeln"
- },
- "sleeveLength": {
- "t": "Ärmellänge",
- "d": "Steuert die Länge deiner Ärmel"
- },
- "necklineBend": {
- "t": "Krümmung Halsausschnitt",
- "d": "Steuert die Krümmung des Halsausschnitts."
- },
- "necklineDepth": {
- "t": "Ausschnitttiefe",
- "d": "Steuert, wie tief der Halsausschnitt fällt."
- },
- "necklineWidth": {
- "t": "Ausschnittbreite",
- "d": "Steuert die Breite des Halsausschnitts."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/teagan/i18n/es.json b/designs/teagan/i18n/es.json
deleted file mode 100644
index 381ab9391b8..00000000000
--- a/designs/teagan/i18n/es.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan, camiseta",
- "d": "Teagan es un patrón de camiseta entallada.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "sleeve": "Manga"
- },
- "s": {
- "fullLengthFromHps": "Longitud completa (de HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Borrador para alta caída",
- "d": "Borra el patrón para la medición alta del polvo (si está disponible) en lugar del cofre (completo). Esto dará lugar a una prenda más ajustada para las personas con senos."
- },
- "sleeveEase": {
- "t": "Manga fácil",
- "d": "Cantidad de facilidad de sus mangas"
- },
- "sleeveLength": {
- "t": "Longitud de la manga",
- "d": "Controla la longitud de las mangas"
- },
- "necklineBend": {
- "t": "Curvatura neckline",
- "d": "Controla la curvatura del cuello."
- },
- "necklineDepth": {
- "t": "Profundidad del cuello",
- "d": "Controla la profundidad de la abertura del cuello."
- },
- "necklineWidth": {
- "t": "Neckline width",
- "d": "Controla el ancho de la abertura del cuello."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/teagan/i18n/fr.json b/designs/teagan/i18n/fr.json
deleted file mode 100644
index 15507133df6..00000000000
--- a/designs/teagan/i18n/fr.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "T-shirt Teagan",
- "d": "Teagan est un T-shirt ajusté.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "sleeve": "Manche"
- },
- "s": {
- "fullLengthFromHps": "Longueur complète (à partir du haut de l'épaule)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Tracé pour le buste supérieur",
- "d": "Tracer le patron pour la mesure de tour de poitrine supérieure (si disponible) plutôt que la poitrine (pleine). Il en résultera un vêtement plus ajusté pour les personnes qui ont des seins."
- },
- "sleeveEase": {
- "t": "Aisance des manches",
- "d": "Quantité d'aisance de vos manches"
- },
- "sleeveLength": {
- "t": "Longueur des manches",
- "d": "Contrôle la longueur de vos manches"
- },
- "necklineBend": {
- "t": "Courbure de l'encolure",
- "d": "Contrôle la courbure de l'encolure."
- },
- "necklineDepth": {
- "t": "Profondeur de l'encolure",
- "d": "Contrôle la profondeur de l'encolure."
- },
- "necklineWidth": {
- "t": "Largeur d'encolure",
- "d": "Contrôle la largeur de l'encolure."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/teagan/i18n/index.mjs b/designs/teagan/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/teagan/i18n/index.mjs
+++ b/designs/teagan/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/teagan/i18n/nl.json b/designs/teagan/i18n/nl.json
deleted file mode 100644
index 6ae4ae5ba5e..00000000000
--- a/designs/teagan/i18n/nl.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan T-shirt",
- "d": "Teagan is een patroon voor een aansluitend t-shirt.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "sleeve": "Mouw"
- },
- "s": {
- "fullLengthFromHps": "Afgewerkte lengte (vanaf HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Teken voor hoge buste",
- "d": "Teken het patroon voor de hoge bustemaat (indien beschikbaar) in plaats van de volle borstomtrek. Dit heeft een aansluitender kledingstuk als resultaat voor mensen met borsten."
- },
- "sleeveEase": {
- "t": "Overwijdte mouw",
- "d": "De hoeveelheid extra ruimte in je mouwen"
- },
- "sleeveLength": {
- "t": "Mouwlengte",
- "d": "Bepaalt de lengte van je mouwen"
- },
- "necklineBend": {
- "t": "Curve halslijn",
- "d": "Bepaalt de curve van de halsuitsnijding."
- },
- "necklineDepth": {
- "t": "Diepte halsuitsnijding",
- "d": "Bepaalt hoe diep de halsopening is."
- },
- "necklineWidth": {
- "t": "Breedte halsuitsnijding",
- "d": "Bepaalt hoe breed de halsopening is."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/teagan/i18n/uk.json b/designs/teagan/i18n/uk.json
deleted file mode 100644
index 689205eff60..00000000000
--- a/designs/teagan/i18n/uk.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Teagan T-shirt",
- "d": "Teagan is a fitted T-shirt pattern.",
- "p": {
- "back": "Back",
- "front": "Front",
- "sleeve": "Sleeve"
- },
- "s": {
- "fullLengthFromHps": "Full length (from HPS)"
- },
- "o": {
- "draftForHighBust": {
- "t": "Draft for high bust",
- "d": "Draft the pattern for the high bust measurement (if available) rather than the (full) chest. This will result in a more fitted garment for people with breasts."
- },
- "sleeveEase": {
- "t": "Sleeve ease",
- "d": "Amount of ease of your sleeves"
- },
- "sleeveLength": {
- "t": "Sleeve length",
- "d": "Controls the length of your sleeves"
- },
- "necklineBend": {
- "t": "Neckline curvature",
- "d": "Controls the curvature of the neckline."
- },
- "necklineDepth": {
- "t": "Neckline depth",
- "d": "Controls how deep the neck opening plunges down."
- },
- "necklineWidth": {
- "t": "Neckline width",
- "d": "Controls the width of the neck opening."
- },
- "curveToWaist": {
- "t": "Fit the waist",
- "d": "Whether or not to fit the waist or rahter only fit chest and hips."
- },
- "curvedWaistEase": {
- "t": "Waist ease",
- "d": "Ease at the waist (only applies when the waist is fitted)."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Ease at the hips."
- }
- }
-}
diff --git a/designs/teagan/package.json b/designs/teagan/package.json
index 1607edfc184..da073575678 100644
--- a/designs/teagan/package.json
+++ b/designs/teagan/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/teagan",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a T-shirt",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/teagan/src/front.mjs b/designs/teagan/src/front.mjs
index 61b79246714..5ee444940f7 100644
--- a/designs/teagan/src/front.mjs
+++ b/designs/teagan/src/front.mjs
@@ -1,5 +1,5 @@
import { base } from '@freesewing/brian'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function teaganFront({
utils,
@@ -261,7 +261,7 @@ export const front = {
sleeveWidthGuarantee: 0.85,
frontArmholeDeeper: 0.005,
// Brian overrides
- chestEase: { pct: 12, min: 5, max: 25, menu: 'fit' },
+ chestEase: { pct: 12, min: 5, max: 25, ...pctBasedOn('chest'), menu: 'fit' },
sleeveLength: { pct: 30, min: 20, max: 100, menu: 'fit' },
lengthBonus: { pct: 15, min: -20, max: 60, menu: 'style' },
backNeckCutout: { pct: 8, min: 4, max: 12, menu: 'fit' },
@@ -272,9 +272,10 @@ export const front = {
pct: 25,
min: 8,
max: 40,
+ ...pctBasedOn('waist'),
menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false),
},
- hipsEase: { pct: 18, min: 8, max: 30, menu: 'fit' },
+ hipsEase: { pct: 18, min: 8, max: 30, ...pctBasedOn('hips'), menu: 'fit' },
necklineDepth: { pct: 25, min: 20, max: 40, menu: 'style' },
necklineWidth: { pct: 30, min: 10, max: 50, menu: 'style' },
necklineBend: { pct: 30, min: 0, max: 70, menu: 'style' },
diff --git a/designs/teagan/src/index.mjs b/designs/teagan/src/index.mjs
index e0ab9c3212f..914adaae486 100644
--- a/designs/teagan/src/index.mjs
+++ b/designs/teagan/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as teaganI18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
@@ -8,7 +8,7 @@ import { sleeve } from './sleeve.mjs'
// Setup our new design
const Teagan = new Design({
- data,
+ data: about,
parts: [back, front, sleeve],
})
@@ -18,4 +18,4 @@ const i18n = mergeI18n([brianI18n, teaganI18n], {
})
// Named exports
-export { back, front, sleeve, Teagan, i18n }
+export { back, front, sleeve, Teagan, i18n, about }
diff --git a/designs/teagan/tests/shared.test.mjs b/designs/teagan/tests/shared.test.mjs
index 483740861e7..524ff738656 100644
--- a/designs/teagan/tests/shared.test.mjs
+++ b/designs/teagan/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Teagan, i18n } from '../src/index.mjs'
+import { Teagan, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Teagan)
+testPatternConfig(Teagan, about)
// Test translation
testPatternI18n(Teagan, i18n)
diff --git a/designs/tiberius/README.md b/designs/tiberius/README.md
index 5b458723136..37c6de2e847 100644
--- a/designs/tiberius/README.md
+++ b/designs/tiberius/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/tiberius
@@ -59,7 +44,7 @@ A FreeSewing pattern for a tunica, a historical Roman tunic
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/tiberius/data.mjs b/designs/tiberius/data.mjs
deleted file mode 100644
index 941f2c42ccf..00000000000
--- a/designs/tiberius/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/tiberius'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/tiberius/i18n/de.json b/designs/tiberius/i18n/de.json
deleted file mode 100644
index 22ea8fc052d..00000000000
--- a/designs/tiberius/i18n/de.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Tiberius, die Tunica",
- "d": "Tiberius ist eine historische römische Tunika",
- "p": {
- "tunica": "Tunica"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Kopfgrößenverhältnis",
- "d": "Steuert die Größe der Kopföffnung"
- },
- "armholeDrop": {
- "t": "Armlochabsenkung",
- "d": "Steuert die Tiefe des Armloches"
- },
- "lengthBonus": {
- "t": "Längenzugabe",
- "d": "Erlaubt Variation der Länge des Kleidungsstücks"
- },
- "widthBonus": {
- "t": "Breitenzugabe",
- "d": "Erlaubt Variation der Breite des Kleidungsstücks"
- },
- "clavi": {
- "t": "Clavi",
- "d": "Legt fest, ob Hilfslinien für Clavi enthalten sind oder nicht"
- },
- "clavusLocation": {
- "t": "Positionierung der Clavi",
- "d": "Steuert die Position der Clavi"
- },
- "clavusWidth": {
- "t": "Breite der Clavi",
- "d": "Steuert die Breite der Clavi"
- },
- "length": {
- "t": "Länge",
- "d": "Steuert die Länge des Kleidungsstückes"
- },
- "width": {
- "t": "Breite",
- "d": "Steuert die Breite des Kleidungsstückes"
- },
- "forceWidth": {
- "t": "Breite erzwingen",
- "d": "Breiteneinstellungen unabhängig von Einschränkungen anwenden"
- }
- }
-}
diff --git a/designs/tiberius/i18n/es.json b/designs/tiberius/i18n/es.json
deleted file mode 100644
index de6178f3553..00000000000
--- a/designs/tiberius/i18n/es.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Tiberius, túnica",
- "d": "Tiberius es una túnica romana histórica.",
- "p": {
- "tunica": "Tunica"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "armholeDrop": {
- "t": "Caída de la sisa",
- "d": "Controla la profundidad del orificio"
- },
- "lengthBonus": {
- "t": "Bonus de longitud",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "clavi": {
- "t": "Clavi",
- "d": "Whether or not to include guides for clavi"
- },
- "clavusLocation": {
- "t": "Clavus location",
- "d": "Controls the location of the clavi"
- },
- "clavusWidth": {
- "t": "Clavus width",
- "d": "Controls the width of the clavi"
- },
- "length": {
- "t": "Longitud",
- "d": "Controls the length of the garment"
- },
- "width": {
- "t": "Anchura",
- "d": "Controls the width of the garment"
- },
- "forceWidth": {
- "t": "Force width",
- "d": "Apply width settings regardless of constraints"
- }
- }
-}
diff --git a/designs/tiberius/i18n/fr.json b/designs/tiberius/i18n/fr.json
deleted file mode 100644
index c0e8f7d69ac..00000000000
--- a/designs/tiberius/i18n/fr.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Tunique Tiberius",
- "d": "Tiberius est une tunique romaine historique",
- "p": {
- "tunica": "Tunica"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Ratio tête",
- "d": "Contrôle la taille de l'ouverture de la tête"
- },
- "armholeDrop": {
- "t": "Abaissement d'emmanchure",
- "d": "Contrôle la profondeur de l'emmanchure"
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "Permet de varier la longueur du vêtement"
- },
- "widthBonus": {
- "t": "Bonus de largeur",
- "d": "Permet de varier la largeur du vêtement"
- },
- "clavi": {
- "t": "Bande de pourpre",
- "d": "Inclure ou non des guides pour la bande de pourpre"
- },
- "clavusLocation": {
- "t": "Emplacement de la bande de pourpre",
- "d": "Contrôle la localisation de la bande de pourpre"
- },
- "clavusWidth": {
- "t": "Largeur de la bande de pourpre",
- "d": "Contrôle la largeur de la bande de pourpre"
- },
- "length": {
- "t": "Longueur",
- "d": "Contrôle la longueur du vêtement"
- },
- "width": {
- "t": "Largeur",
- "d": "Contrôle la largeur du vêtement"
- },
- "forceWidth": {
- "t": "Forcer la largeur",
- "d": "Appliquer les paramètres de largeur indépendamment des contraintes"
- }
- }
-}
diff --git a/designs/tiberius/i18n/index.mjs b/designs/tiberius/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/tiberius/i18n/index.mjs
+++ b/designs/tiberius/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/tiberius/i18n/nl.json b/designs/tiberius/i18n/nl.json
deleted file mode 100644
index eb70a14dc01..00000000000
--- a/designs/tiberius/i18n/nl.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Tiberius Tunica",
- "d": "Tiberius is a historical Roman tunic",
- "p": {
- "tunica": "Tunica"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "armholeDrop": {
- "t": "Armsgat verlagen/verhogen",
- "d": "Bepaalt de diepte van het armsgat"
- },
- "lengthBonus": {
- "t": "Lengtebonus",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "clavi": {
- "t": "Clavi",
- "d": "Whether or not to include guides for clavi"
- },
- "clavusLocation": {
- "t": "Clavus location",
- "d": "Controls the location of the clavi"
- },
- "clavusWidth": {
- "t": "Clavus width",
- "d": "Controls the width of the clavi"
- },
- "length": {
- "t": "Lengte",
- "d": "Controls the length of the garment"
- },
- "width": {
- "t": "Breedte",
- "d": "Controls the width of the garment"
- },
- "forceWidth": {
- "t": "Force width",
- "d": "Apply width settings regardless of constraints"
- }
- }
-}
diff --git a/designs/tiberius/i18n/uk.json b/designs/tiberius/i18n/uk.json
deleted file mode 100644
index 1ef727fa197..00000000000
--- a/designs/tiberius/i18n/uk.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "t": "Tiberius Tunica",
- "d": "Tiberius is a historical Roman tunic",
- "p": {
- "tunica": "Tunica"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "armholeDrop": {
- "t": "Armhole drop",
- "d": "Controls the depth of the armhole"
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "clavi": {
- "t": "Clavi",
- "d": "Whether or not to include guides for clavi"
- },
- "clavusLocation": {
- "t": "Clavus location",
- "d": "Controls the location of the clavi"
- },
- "clavusWidth": {
- "t": "Clavus width",
- "d": "Controls the width of the clavi"
- },
- "length": {
- "t": "Length",
- "d": "Controls the length of the garment"
- },
- "width": {
- "t": "Width",
- "d": "Controls the width of the garment"
- },
- "forceWidth": {
- "t": "Force width",
- "d": "Apply width settings regardless of constraints"
- }
- }
-}
diff --git a/designs/tiberius/package.json b/designs/tiberius/package.json
index 25372b26885..dd6cb8d4d21 100644
--- a/designs/tiberius/package.json
+++ b/designs/tiberius/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/tiberius",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a tunica, a historical Roman tunic",
"author": "Starfetch (https://github.com/starfetch)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/tiberius/src/index.mjs b/designs/tiberius/src/index.mjs
index 656e947ddf0..78cd9d59aa4 100644
--- a/designs/tiberius/src/index.mjs
+++ b/designs/tiberius/src/index.mjs
@@ -1,13 +1,13 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { tunica } from './tunica.mjs'
// Setup our new design
const Tiberius = new Design({
- data,
+ data: about,
parts: [tunica],
})
// Named exports
-export { tunica, Tiberius, i18n }
+export { tunica, Tiberius, i18n, about }
diff --git a/designs/tiberius/tests/shared.test.mjs b/designs/tiberius/tests/shared.test.mjs
index 2c3d884f18b..94b494be549 100644
--- a/designs/tiberius/tests/shared.test.mjs
+++ b/designs/tiberius/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Tiberius, i18n } from '../src/index.mjs'
+import { Tiberius, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Tiberius)
+testPatternConfig(Tiberius, about)
// Test translation
testPatternI18n(Tiberius, i18n)
diff --git a/designs/titan/CHANGELOG.md b/designs/titan/CHANGELOG.md
index 410a9c114a6..06e43d3f8cb 100644
--- a/designs/titan/CHANGELOG.md
+++ b/designs/titan/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/titan
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Adjust cross seam curves after fitting the waist. Fixes
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/titan/README.md b/designs/titan/README.md
index 6bc6ccecfaf..567dd9de3bd 100644
--- a/designs/titan/README.md
+++ b/designs/titan/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/titan
@@ -59,7 +44,7 @@ A FreeSewing pattern for a unisex trouser block
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/titan/data.mjs b/designs/titan/data.mjs
deleted file mode 100644
index 4413f983d76..00000000000
--- a/designs/titan/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/titan'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/titan/i18n/de.json b/designs/titan/i18n/de.json
deleted file mode 100644
index 249c5cef3cb..00000000000
--- a/designs/titan/i18n/de.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "t": "Titan, ein Hosen-Grundschnitt",
- "d": "Titan ist ein Grundschnitt für Hosen ohne Abnäher.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite"
- },
- "s": {},
- "o": {
- "kneeEase": {
- "t": "Knie-Zugabe",
- "d": "Kontrolliert die Zugabe am Knie"
- },
- "waistHeight": {
- "t": "Taillenhöhe",
- "d": "Steuert die Höhe des Taillenbundes, 100% = Taillenhöhe, 0% = Hüfthöhe"
- },
- "lengthBonus": {
- "t": "Längenzugabe",
- "d": "Steuert die Länge der Hose"
- },
- "crotchDrop": {
- "t": "Schritt-Tiefe",
- "d": "Senkt die Schrittiefe für mehr Tragekomfort"
- },
- "fitKnee": {
- "t": "Am Knie anliegend",
- "d": "Legt die Bein-Passform auf Grundlage des Knieumfangst statt des Gesäßumfangs fest"
- },
- "legBalance": {
- "t": "Bein-Balance",
- "d": "Steuert das Verhältnis zwischen Vorder- und Hinterteil des Beins"
- },
- "crossSeamCurveStart": {
- "t": "Start der Quernahtkurve",
- "d": "Bestimmt, wie weit wir in die Quernaht hineinspringen und kurven"
- },
- "crossSeamCurveBend": {
- "t": "Quernaht Kurve",
- "d": "Steuert die Krümmung der Kreuznaht"
- },
- "crossSeamCurveAngle": {
- "t": "Quernaht Winkel",
- "d": "Steuert den Winkel der Quernaht"
- },
- "crotchSeamCurveStart": {
- "t": "Beginn der Schrittnahtkurve",
- "d": "Legt fest, wie weit wir in die Schrittnaht hineinfahren"
- },
- "crotchSeamCurveBend": {
- "t": "Crotch Naht Biegen",
- "d": "Steuert die Krümmung der Schrittnaht"
- },
- "crotchSeamCurveAngle": {
- "t": "Schneckennaht Winkel",
- "d": "Steuert den Winkel der Schrittnaht"
- },
- "waistBalance": {
- "t": "Taillenbilanz",
- "d": "Steuert die horizontale Position der Taille relativ zum Sitz"
- },
- "waistbandWidth": {
- "t": "Taillenbundweite",
- "d": "Die Breite des Taillenbundes"
- },
- "grainlinePosition": {
- "t": "Position Fadenlauf",
- "d": "Steuert die horizontale Position des Beins relativ zum Sitz"
- }
- }
-}
diff --git a/designs/titan/i18n/es.json b/designs/titan/i18n/es.json
deleted file mode 100644
index e60b2d7fa15..00000000000
--- a/designs/titan/i18n/es.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "t": "Titan, patrón base de pantalón",
- "d": "Titán es un patrón base de pantalón sin pinzas.",
- "p": {
- "back": "Atrás",
- "front": "Frente"
- },
- "s": {},
- "o": {
- "kneeEase": {
- "t": "Facilidad de rodilla",
- "d": "Controla el amout de la facilidad en la rodilla"
- },
- "waistHeight": {
- "t": "Altura de la muñeca",
- "d": "Controla la altura de la cintura, 100% = altura de la cintura, 0% = altura de la cadera"
- },
- "lengthBonus": {
- "t": "Bonus de longitud",
- "d": "Controla la longitud de los pantalones"
- },
- "crotchDrop": {
- "t": "Gota de cromo",
- "d": "Reduce el cromo para un ajuste más relajado"
- },
- "fitKnee": {
- "t": "Ajustar la rodilla",
- "d": "Se ajusta a las piernas en base a la circunstancia de la rodilla, en lugar de la circunstancia del asiento"
- },
- "legBalance": {
- "t": "Saldo de pierna",
- "d": "Controla la relación entre el panel frontal y trasero de la pierna"
- },
- "crossSeamCurveStart": {
- "t": "Inicio de la curva de costura cruzada",
- "d": "Controla hasta qué punto en la costura cruzada empezamos a curvar"
- },
- "crossSeamCurveBend": {
- "t": "curva de costura cruzada",
- "d": "Controla la curvatura de la costura cruzada"
- },
- "crossSeamCurveAngle": {
- "t": "Ángulo de costura cruzada",
- "d": "Controla el ángulo de la costura cruzada"
- },
- "crotchSeamCurveStart": {
- "t": "Inicio de la curva de costura de cromo",
- "d": "Controla hasta qué punto en la costura del cromo empezamos a curva"
- },
- "crotchSeamCurveBend": {
- "t": "curva de costura cruda",
- "d": "Controla la curvatura de la costura del cromo"
- },
- "crotchSeamCurveAngle": {
- "t": "Ángulo de costura cruda",
- "d": "Controla el ángulo de la costura del cromo"
- },
- "waistBalance": {
- "t": "Balance de Waist",
- "d": "Controla la posición horizontal de la cintura relativa al asiento"
- },
- "waistbandWidth": {
- "t": "Anchura de la cinturilla",
- "d": "El ancho de la cintura"
- },
- "grainlinePosition": {
- "t": "Posición en línea",
- "d": "Controla la posición horizontal de la pierna relativa al asiento"
- }
- }
-}
diff --git a/designs/titan/i18n/fr.json b/designs/titan/i18n/fr.json
deleted file mode 100644
index 454825141d9..00000000000
--- a/designs/titan/i18n/fr.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "t": "Bloc de pantalon Titan",
- "d": "Titan est un patron de base de pantalon sans pinces.",
- "p": {
- "back": "Retour",
- "front": "Avant"
- },
- "s": {},
- "o": {
- "kneeEase": {
- "t": "Aisance du genou",
- "d": "Contrôle la quantité d'aisance au genou"
- },
- "waistHeight": {
- "t": "Hauteur de la taille",
- "d": "Contrôle la hauteur de la taille, 100% = hauteur de la taille, 0% = hauteur de la hanche"
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "Contrôle la longueur du pantalon"
- },
- "crotchDrop": {
- "t": "Hauteur d'enfourchure",
- "d": "Abaisse la fourche pour un tombé plus décontracté"
- },
- "fitKnee": {
- "t": "Ajuster au genou",
- "d": "Ajuste les jambes à partir de la circonférence du genou plutôt que de la circonférence du bassin"
- },
- "legBalance": {
- "t": "Équilibre des jambes",
- "d": "Contrôle le ratio entre le panneau avant et arrière de la jambe"
- },
- "crossSeamCurveStart": {
- "t": "Début de la courbe de l'enfourchure dos",
- "d": "Contrôle la distance à partir de laquelle la courbe démarre pour l'enfourchure dos"
- },
- "crossSeamCurveBend": {
- "t": "Courbure de l'enfourchure dos",
- "d": "Contrôle la courbure de la couture de fourche dos"
- },
- "crossSeamCurveAngle": {
- "t": "Angle de couture croisée",
- "d": "Contrôle l'angle de la couture de croix"
- },
- "crotchSeamCurveStart": {
- "t": "Début de la courbe de l'enfourchure avant",
- "d": "Contrôle la distance à partir de laquelle la courbe démarre pour l'enfourchure avant"
- },
- "crotchSeamCurveBend": {
- "t": "Courbure de la fourche avant",
- "d": "Contrôle la courbure de la couture de fourche avant"
- },
- "crotchSeamCurveAngle": {
- "t": "Angle de couture",
- "d": "Contrôle l'angle de la couture de crotch"
- },
- "waistBalance": {
- "t": "Équilibre de la taille",
- "d": "Contrôle la position horizontale de la taille par rapport au bassin"
- },
- "waistbandWidth": {
- "t": "Largeur de ceinture",
- "d": "La largeur de la ceinture"
- },
- "grainlinePosition": {
- "t": "Position de la ligne de droit fil",
- "d": "Contrôle la position horizontale de la jambe par rapport au bassin"
- }
- }
-}
diff --git a/designs/titan/i18n/index.mjs b/designs/titan/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/titan/i18n/index.mjs
+++ b/designs/titan/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/titan/i18n/nl.json b/designs/titan/i18n/nl.json
deleted file mode 100644
index 09e120b4c23..00000000000
--- a/designs/titan/i18n/nl.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "t": "Titan basispatroon broek",
- "d": "Titan is a dartless trouser block.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde"
- },
- "s": {},
- "o": {
- "kneeEase": {
- "t": "Overwijdte knie",
- "d": "Bepaalt de hoeveelheid overwijdte aan de knie"
- },
- "waistHeight": {
- "t": "Taillehoogte",
- "d": "Bepaalt de hoogte van de taille, 100% = natuurlijke taille, 0% = heuphoogte"
- },
- "lengthBonus": {
- "t": "Bonus lengte",
- "d": "Bepaalt de lengte van de broek"
- },
- "crotchDrop": {
- "t": "Diepte kruis",
- "d": "Verlaagt het kruis voor een lossere pasvorm"
- },
- "fitKnee": {
- "t": "Pas de knie aan",
- "d": "Past de broekspijpen aan gebaseerd op de omtrek van de knie in plaats van de omtrek van het zitvlak"
- },
- "legBalance": {
- "t": "Balans been",
- "d": "Bepaalt de verhouding tussen de voor-en achterkant van de broekspijp"
- },
- "crossSeamCurveStart": {
- "t": "Begin van de curve van de binnenbeennaad",
- "d": "Bepaalt hoe ver in de binnenbeennaad de curve start"
- },
- "crossSeamCurveBend": {
- "t": "Buiging binnenbeennaad",
- "d": "Bepaalt de curve van de binnenbeennaad"
- },
- "crossSeamCurveAngle": {
- "t": "Grensoverschrijdende hoek",
- "d": "Bepaalt de hoek van de kruisnaad"
- },
- "crotchSeamCurveStart": {
- "t": "Begin van de curve van de kruisnaad",
- "d": "Bepaalt hoe ver in de kruisnaad de curve start"
- },
- "crotchSeamCurveBend": {
- "t": "Buiging kruisnaad",
- "d": "Bepaalt de curve van de kruisnaad"
- },
- "crotchSeamCurveAngle": {
- "t": "Kruisnaad hoek",
- "d": "Bepaalt de hoek van de kruisnaad"
- },
- "waistBalance": {
- "t": "Balans taille",
- "d": "Bepaalt de horizontale positie van de taille in relatie tot het zitvlak"
- },
- "waistbandWidth": {
- "t": "Breedte tailleband",
- "d": "De breedte van de tailleband"
- },
- "grainlinePosition": {
- "t": "Positie draadrichting",
- "d": "Bepaalt de horizontale positie van het been in relatie tot het zitvlak"
- }
- }
-}
diff --git a/designs/titan/i18n/uk.json b/designs/titan/i18n/uk.json
deleted file mode 100644
index ba4e62ec749..00000000000
--- a/designs/titan/i18n/uk.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "t": "Titan trouser block",
- "d": "Titan is a dartless trouser block.",
- "p": {
- "back": "Back",
- "front": "Front"
- },
- "s": {},
- "o": {
- "kneeEase": {
- "t": "Knee ease",
- "d": "Controls the amout of ease at the knee"
- },
- "waistHeight": {
- "t": "Waist height",
- "d": "Controls the height of the waist, 100% = waist height, 0% = hip height"
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Controls the length of the trousers"
- },
- "crotchDrop": {
- "t": "Crotch drop",
- "d": "Lowers the crotch for a more relaxed fit"
- },
- "fitKnee": {
- "t": "Fit the knee",
- "d": "Fits the legs from based on the knee circumference, rather than seat circumference"
- },
- "legBalance": {
- "t": "Leg balance",
- "d": "Controls the ratio between front and back panel of the leg"
- },
- "crossSeamCurveStart": {
- "t": "Start of the cross seam curve",
- "d": "Controls how far into the cross seam we start to curve"
- },
- "crossSeamCurveBend": {
- "t": "Cross seam bend",
- "d": "Controls the curvature of the cross seam"
- },
- "crossSeamCurveAngle": {
- "t": "Cross seam angle",
- "d": "Controls the angle of the cross seam"
- },
- "crotchSeamCurveStart": {
- "t": "Start of the crotch seam curve",
- "d": "Controls how far into the crotch seam we start to curve"
- },
- "crotchSeamCurveBend": {
- "t": "Crotch seam bend",
- "d": "Controls the curvature of the crotch seam"
- },
- "crotchSeamCurveAngle": {
- "t": "Crotch seam angle",
- "d": "Controls the angle of the crotch seam"
- },
- "seatEase": {
- "t": "Seat ease",
- "d": "Controls the amount of ease at your seat"
- },
- "waistBalance": {
- "t": "Waist balance",
- "d": "Controls the horizontal position of the waist relative to the seat"
- },
- "waistbandWidth": {
- "t": "Waistband width",
- "d": "The width of the waistband"
- },
- "waistEase": {
- "t": "Wait ease",
- "d": "Controls the amount of ease at your waist"
- },
- "grainlinePosition": {
- "t": "Grainline position",
- "d": "Controls the horizontal position of the leg relative to the seat"
- }
- }
-}
diff --git a/designs/titan/package.json b/designs/titan/package.json
index fbea9a234f4..7f908407a78 100644
--- a/designs/titan/package.json
+++ b/designs/titan/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/titan",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a unisex trouser block",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/titan/src/back.mjs b/designs/titan/src/back.mjs
index 2802b3b0bff..6c500087c01 100644
--- a/designs/titan/src/back.mjs
+++ b/designs/titan/src/back.mjs
@@ -444,9 +444,9 @@ export const back = {
fitCrossSeamBack: true,
fitGuides: true,
// Fit
- waistEase: { pct: 2, min: 0, max: 10, menu: 'fit' },
- seatEase: { pct: 2, min: 0, max: 10, menu: 'fit' },
- kneeEase: { pct: 6, min: 1, max: 25, menu: 'fit' },
+ waistEase: { pct: 2, min: 0, max: 10, ...pctBasedOn('waist'), menu: 'fit' },
+ seatEase: { pct: 2, min: 0, max: 10, ...pctBasedOn('seat'), menu: 'fit' },
+ kneeEase: { pct: 6, min: 1, max: 25, ...pctBasedOn('knee'), menu: 'fit' },
// Style
waistHeight: { pct: 100, min: 0, max: 100, menu: 'style' },
lengthBonus: { pct: 2, min: -20, max: 10, menu: 'style' },
diff --git a/designs/titan/src/index.mjs b/designs/titan/src/index.mjs
index 8ccbbcf8dd5..145855b9a8c 100644
--- a/designs/titan/src/index.mjs
+++ b/designs/titan/src/index.mjs
@@ -1,14 +1,14 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
import { front } from './front.mjs'
// Setup our new design
const Titan = new Design({
- data,
+ data: about,
parts: [back, front],
})
// Named exports
-export { back, front, Titan, i18n }
+export { back, front, Titan, i18n, about }
diff --git a/designs/titan/tests/shared.test.mjs b/designs/titan/tests/shared.test.mjs
index 777dc95e32f..d95a9cbde30 100644
--- a/designs/titan/tests/shared.test.mjs
+++ b/designs/titan/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Titan, i18n } from '../src/index.mjs'
+import { Titan, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Titan)
+testPatternConfig(Titan, about)
// Test translation
testPatternI18n(Titan, i18n)
diff --git a/designs/trayvon/README.md b/designs/trayvon/README.md
index 5d8e08ee15f..0fbec4dd0aa 100644
--- a/designs/trayvon/README.md
+++ b/designs/trayvon/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/trayvon
@@ -59,7 +44,7 @@ A FreeSewing pattern for a tie
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/trayvon/data.mjs b/designs/trayvon/data.mjs
deleted file mode 100644
index 260e34eedaa..00000000000
--- a/designs/trayvon/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/trayvon'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/trayvon/i18n/de.json b/designs/trayvon/i18n/de.json
deleted file mode 100644
index bc39f4fa693..00000000000
--- a/designs/trayvon/i18n/de.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "t": "Trayvon, die Krawatte",
- "d": "Trayvon ist eine Krawatte, die für ein professionelles Ergebnis an keiner Ecke spart.",
- "p": {
- "fabricLoop": "Fabric loop",
- "fabricTail": "Stoffschwanz",
- "fabricTip": "Stoffspitze",
- "interfacingTail": "Einlageschwanz",
- "interfacingTip": "Einlagespitze",
- "liningTail": "Futterschwanz",
- "liningTip": "Futterspitze"
- },
- "s": {},
- "o": {
- "tipWidth": {
- "t": "Spitzenbreite",
- "d": "Die Breite deiner Krawatte an der Spitze"
- },
- "knotWidth": {
- "t": "Knotenbreite",
- "d": "Die Breite deiner Krawatte am Knoten"
- }
- }
-}
diff --git a/designs/trayvon/i18n/es.json b/designs/trayvon/i18n/es.json
deleted file mode 100644
index 86a68a859b4..00000000000
--- a/designs/trayvon/i18n/es.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "t": "Trayvon, corbata",
- "d": "Trayvon es una corbata que no repara en gastos para un resultado profesional.",
- "p": {
- "fabricLoop": "Fabric loop",
- "fabricTail": "Cola de tela",
- "fabricTip": "Punta de tela",
- "interfacingTail": "Cola de entretela",
- "interfacingTip": "Punta de entretela",
- "liningTail": "Cola de revestimiento",
- "liningTip": "Punta de revestimiento"
- },
- "s": {},
- "o": {
- "tipWidth": {
- "t": "Ancho de la punta",
- "d": "El ancho de tu corbata en la punta"
- },
- "knotWidth": {
- "t": "Ancho de nudo",
- "d": "El ancho de tu corbata en el nudo"
- }
- }
-}
diff --git a/designs/trayvon/i18n/fr.json b/designs/trayvon/i18n/fr.json
deleted file mode 100644
index 25fb3a14973..00000000000
--- a/designs/trayvon/i18n/fr.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "t": "Cravate Trayvon",
- "d": "Trayvon est une cravate qui ne fait pas d'économies pour un résultat professionnel.",
- "p": {
- "fabricLoop": "Fabric loop",
- "fabricTail": "Queue en tissu",
- "fabricTip": "Pointe en tissu",
- "interfacingTail": "Entoilage de queue",
- "interfacingTip": "Entoilage de pointe",
- "liningTail": "Doublure de queue",
- "liningTip": "Doublure de pointe"
- },
- "s": {},
- "o": {
- "tipWidth": {
- "t": "Largeur de la pointe",
- "d": "La largeur de votre cravate au niveau de la pointe"
- },
- "knotWidth": {
- "t": "Largeur du nœud",
- "d": "La largeur de votre cravate au niveau du noeud"
- }
- }
-}
diff --git a/designs/trayvon/i18n/index.mjs b/designs/trayvon/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/trayvon/i18n/index.mjs
+++ b/designs/trayvon/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/trayvon/i18n/nl.json b/designs/trayvon/i18n/nl.json
deleted file mode 100644
index d9330c25f6c..00000000000
--- a/designs/trayvon/i18n/nl.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "t": "Trayvon das",
- "d": "Trayvon is een das zoals het hoort, voor een professioneel resultaat.",
- "p": {
- "fabricLoop": "Fabric loop",
- "fabricTail": "Stof staart",
- "fabricTip": "Stof tip",
- "interfacingTail": "Interfacing staart",
- "interfacingTip": "Interfacing tip",
- "liningTail": "Voering staart",
- "liningTip": "Voering tip"
- },
- "s": {},
- "o": {
- "tipWidth": {
- "t": "Breedte punten",
- "d": "De breedte van je stropdas aan het uiteinde"
- },
- "knotWidth": {
- "t": "Breedte knoop",
- "d": "De breedte van je stropdas aan de knoop"
- }
- }
-}
diff --git a/designs/trayvon/i18n/uk.json b/designs/trayvon/i18n/uk.json
deleted file mode 100644
index 916341a7f00..00000000000
--- a/designs/trayvon/i18n/uk.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "t": "Trayvon tie",
- "d": "Trayvon is a tie that cuts no corners for a professional result.",
- "p": {
- "fabricLoop": "Fabric loop",
- "fabricTail": "Fabric tail",
- "fabricTip": "Fabric tip",
- "interfacingTail": "Interfacing tail",
- "interfacingTip": "Interfacing tip",
- "liningTail": "Lining tail",
- "liningTip": "Lining tip"
- },
- "s": {},
- "o": {
- "tipWidth": {
- "t": "Tip width",
- "d": "The width of your tie at the tip"
- },
- "knotWidth": {
- "t": "Knot width",
- "d": "The width of your tie at the knot"
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "How much longer than the default length to make the tie."
- }
- }
-}
diff --git a/designs/trayvon/package.json b/designs/trayvon/package.json
index 837aac6b233..cd0230e0dc0 100644
--- a/designs/trayvon/package.json
+++ b/designs/trayvon/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/trayvon",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a tie",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,49 +25,40 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/snapseries": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/trayvon/src/index.mjs b/designs/trayvon/src/index.mjs
index 9376d51a03c..247b34b1aba 100644
--- a/designs/trayvon/src/index.mjs
+++ b/designs/trayvon/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { interfacingTail, interfacingTip } from './interfacing.mjs'
import { liningTail, liningTip } from './lining.mjs'
@@ -8,7 +8,7 @@ import { fabricLoop } from './loop.mjs'
// Setup our new design
const Trayvon = new Design({
- data,
+ data: about,
parts: [
interfacingTail,
interfacingTip,
@@ -31,4 +31,5 @@ export {
fabricLoop,
Trayvon,
i18n,
+ about,
}
diff --git a/designs/trayvon/tests/shared.test.mjs b/designs/trayvon/tests/shared.test.mjs
index f59e6301dad..2b0d82da398 100644
--- a/designs/trayvon/tests/shared.test.mjs
+++ b/designs/trayvon/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Trayvon, i18n } from '../src/index.mjs'
+import { Trayvon, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Trayvon)
+testPatternConfig(Trayvon, about)
// Test translation
testPatternI18n(Trayvon, i18n)
diff --git a/designs/tristan/README.md b/designs/tristan/README.md
index 44fdc8b528a..bbb7818bbea 100644
--- a/designs/tristan/README.md
+++ b/designs/tristan/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/tristan
@@ -59,7 +44,7 @@ A FreeSewing pattern for a fitted top with prince(ss) seams
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/tristan/data.mjs b/designs/tristan/data.mjs
deleted file mode 100644
index ed0d450af18..00000000000
--- a/designs/tristan/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/tristan'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/tristan/i18n/de.json b/designs/tristan/i18n/de.json
deleted file mode 100644
index 9951cd33621..00000000000
--- a/designs/tristan/i18n/de.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "t": "Tristan",
- "d": "Tristan is a fitted tank top with prince(ss) seams.",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base",
- "peplumFront": "Peplum front",
- "peplumBack": "Peplum back"
- },
- "s": {
- "strapWidthAdjusted.t": "The strap width has been adjusted",
- "strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
- "peplumWidth.t": "Peplum size",
- "peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
- "frontOutside": "Outside front",
- "frontInside": "Inside front",
- "backOutside": "Outside back",
- "backInside": "Inside back",
- "frontPeplum": "Peplum front",
- "backPeplum": "Peplum back",
- "hem": "Hem"
- },
- "o": {
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "waistdartposition": {
- "t": "Waist dart position",
- "d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "armholeDepth": {
- "t": "Depth of the Armhole",
- "d": "Controls how deep the armhole is"
- },
- "cutDepthBack": {
- "t": "Depth of the cut in the back",
- "d": "Controls the depth of the cut in the back"
- },
- "cutDepthFront": {
- "t": "Depth of the cut in the front",
- "d": "Controls the depth of the cut in the front"
- },
- "cutRoundnessBack": {
- "t": "Roundness of the cut in the back",
- "d": "Controls how 'round' the cut in the back is, from V to round to square"
- },
- "cutRoundnessFront": {
- "t": "Roundness of the cut in the front",
- "d": "Controls how 'round' the cut in the front is, from V to round to square"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "strapWidth": {
- "t": "Width of the straps",
- "d": "Controls the width of the straps"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper: side, back, or front"
- },
- "zipperLocation.front": {
- "t": "Front zipper location",
- "d": "The location of the zipper will be in the front"
- },
- "zipperLocation.side": {
- "t": "Side zipper location",
- "d": "The location of the zipper will be on the side"
- },
- "zipperLocation.back": {
- "t": "Back zipper location",
- "d": "The location of the zipper will be in the back"
- },
- "hem": {
- "t": "Hem option",
- "d": "Add a hem."
- },
- "hemYes": {
- "t": "Add a hem",
- "d": "Add a hem at the waist"
- },
- "hemNo": {
- "t": "Do not add a hem",
- "d": "Do not add a hem at the waist"
- },
- "hemSize": {
- "t": "Size of the hem",
- "d": "Size of the hem, a percentage of the distance between the neckline and the waist"
- },
- "lacing": {
- "t": "Lacing option",
- "d": "This removes part of the seam to create an opening for lacing"
- },
- "lacingYes": {
- "t": "Add Lacing",
- "d": "Remove part of the seam to create an opening for lacing"
- },
- "lacingNo": {
- "t": "No lacing",
- "d": "Close the seams normally"
- },
- "lacingLocation": {
- "t": "Location of the lacing",
- "d": "Lacing in the front, or the back"
- },
- "lacingLocation.back": {
- "t": "Lacing in the back",
- "d": "The lacing will be in the back"
- },
- "lacingLocation.front": {
- "t": "Lacing in the front",
- "d": "The lacing will be in the front"
- },
- "lacingWidth": {
- "t": "Lacing width",
- "d": "Width of the lacing opening"
- },
- "peplum": {
- "t": "Peplum",
- "d": "Add a peplum"
- },
- "peplumYes": {
- "t": "Add a peplum",
- "d": "This will generate the peplum part."
- },
- "peplumNo": {
- "t": "No peplum",
- "d": "Pattern will be generated without a peplum"
- },
- "peplumSize": {
- "t": "Peplum size",
- "d": "Controls the size of the peplum"
- },
- "peplumFullness": {
- "t": "Peplum fullness",
- "d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
- }
-
- }
-}
diff --git a/designs/tristan/i18n/es.json b/designs/tristan/i18n/es.json
deleted file mode 100644
index 9951cd33621..00000000000
--- a/designs/tristan/i18n/es.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "t": "Tristan",
- "d": "Tristan is a fitted tank top with prince(ss) seams.",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base",
- "peplumFront": "Peplum front",
- "peplumBack": "Peplum back"
- },
- "s": {
- "strapWidthAdjusted.t": "The strap width has been adjusted",
- "strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
- "peplumWidth.t": "Peplum size",
- "peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
- "frontOutside": "Outside front",
- "frontInside": "Inside front",
- "backOutside": "Outside back",
- "backInside": "Inside back",
- "frontPeplum": "Peplum front",
- "backPeplum": "Peplum back",
- "hem": "Hem"
- },
- "o": {
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "waistdartposition": {
- "t": "Waist dart position",
- "d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "armholeDepth": {
- "t": "Depth of the Armhole",
- "d": "Controls how deep the armhole is"
- },
- "cutDepthBack": {
- "t": "Depth of the cut in the back",
- "d": "Controls the depth of the cut in the back"
- },
- "cutDepthFront": {
- "t": "Depth of the cut in the front",
- "d": "Controls the depth of the cut in the front"
- },
- "cutRoundnessBack": {
- "t": "Roundness of the cut in the back",
- "d": "Controls how 'round' the cut in the back is, from V to round to square"
- },
- "cutRoundnessFront": {
- "t": "Roundness of the cut in the front",
- "d": "Controls how 'round' the cut in the front is, from V to round to square"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "strapWidth": {
- "t": "Width of the straps",
- "d": "Controls the width of the straps"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper: side, back, or front"
- },
- "zipperLocation.front": {
- "t": "Front zipper location",
- "d": "The location of the zipper will be in the front"
- },
- "zipperLocation.side": {
- "t": "Side zipper location",
- "d": "The location of the zipper will be on the side"
- },
- "zipperLocation.back": {
- "t": "Back zipper location",
- "d": "The location of the zipper will be in the back"
- },
- "hem": {
- "t": "Hem option",
- "d": "Add a hem."
- },
- "hemYes": {
- "t": "Add a hem",
- "d": "Add a hem at the waist"
- },
- "hemNo": {
- "t": "Do not add a hem",
- "d": "Do not add a hem at the waist"
- },
- "hemSize": {
- "t": "Size of the hem",
- "d": "Size of the hem, a percentage of the distance between the neckline and the waist"
- },
- "lacing": {
- "t": "Lacing option",
- "d": "This removes part of the seam to create an opening for lacing"
- },
- "lacingYes": {
- "t": "Add Lacing",
- "d": "Remove part of the seam to create an opening for lacing"
- },
- "lacingNo": {
- "t": "No lacing",
- "d": "Close the seams normally"
- },
- "lacingLocation": {
- "t": "Location of the lacing",
- "d": "Lacing in the front, or the back"
- },
- "lacingLocation.back": {
- "t": "Lacing in the back",
- "d": "The lacing will be in the back"
- },
- "lacingLocation.front": {
- "t": "Lacing in the front",
- "d": "The lacing will be in the front"
- },
- "lacingWidth": {
- "t": "Lacing width",
- "d": "Width of the lacing opening"
- },
- "peplum": {
- "t": "Peplum",
- "d": "Add a peplum"
- },
- "peplumYes": {
- "t": "Add a peplum",
- "d": "This will generate the peplum part."
- },
- "peplumNo": {
- "t": "No peplum",
- "d": "Pattern will be generated without a peplum"
- },
- "peplumSize": {
- "t": "Peplum size",
- "d": "Controls the size of the peplum"
- },
- "peplumFullness": {
- "t": "Peplum fullness",
- "d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
- }
-
- }
-}
diff --git a/designs/tristan/i18n/fr.json b/designs/tristan/i18n/fr.json
deleted file mode 100644
index 9951cd33621..00000000000
--- a/designs/tristan/i18n/fr.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "t": "Tristan",
- "d": "Tristan is a fitted tank top with prince(ss) seams.",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base",
- "peplumFront": "Peplum front",
- "peplumBack": "Peplum back"
- },
- "s": {
- "strapWidthAdjusted.t": "The strap width has been adjusted",
- "strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
- "peplumWidth.t": "Peplum size",
- "peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
- "frontOutside": "Outside front",
- "frontInside": "Inside front",
- "backOutside": "Outside back",
- "backInside": "Inside back",
- "frontPeplum": "Peplum front",
- "backPeplum": "Peplum back",
- "hem": "Hem"
- },
- "o": {
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "waistdartposition": {
- "t": "Waist dart position",
- "d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "armholeDepth": {
- "t": "Depth of the Armhole",
- "d": "Controls how deep the armhole is"
- },
- "cutDepthBack": {
- "t": "Depth of the cut in the back",
- "d": "Controls the depth of the cut in the back"
- },
- "cutDepthFront": {
- "t": "Depth of the cut in the front",
- "d": "Controls the depth of the cut in the front"
- },
- "cutRoundnessBack": {
- "t": "Roundness of the cut in the back",
- "d": "Controls how 'round' the cut in the back is, from V to round to square"
- },
- "cutRoundnessFront": {
- "t": "Roundness of the cut in the front",
- "d": "Controls how 'round' the cut in the front is, from V to round to square"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "strapWidth": {
- "t": "Width of the straps",
- "d": "Controls the width of the straps"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper: side, back, or front"
- },
- "zipperLocation.front": {
- "t": "Front zipper location",
- "d": "The location of the zipper will be in the front"
- },
- "zipperLocation.side": {
- "t": "Side zipper location",
- "d": "The location of the zipper will be on the side"
- },
- "zipperLocation.back": {
- "t": "Back zipper location",
- "d": "The location of the zipper will be in the back"
- },
- "hem": {
- "t": "Hem option",
- "d": "Add a hem."
- },
- "hemYes": {
- "t": "Add a hem",
- "d": "Add a hem at the waist"
- },
- "hemNo": {
- "t": "Do not add a hem",
- "d": "Do not add a hem at the waist"
- },
- "hemSize": {
- "t": "Size of the hem",
- "d": "Size of the hem, a percentage of the distance between the neckline and the waist"
- },
- "lacing": {
- "t": "Lacing option",
- "d": "This removes part of the seam to create an opening for lacing"
- },
- "lacingYes": {
- "t": "Add Lacing",
- "d": "Remove part of the seam to create an opening for lacing"
- },
- "lacingNo": {
- "t": "No lacing",
- "d": "Close the seams normally"
- },
- "lacingLocation": {
- "t": "Location of the lacing",
- "d": "Lacing in the front, or the back"
- },
- "lacingLocation.back": {
- "t": "Lacing in the back",
- "d": "The lacing will be in the back"
- },
- "lacingLocation.front": {
- "t": "Lacing in the front",
- "d": "The lacing will be in the front"
- },
- "lacingWidth": {
- "t": "Lacing width",
- "d": "Width of the lacing opening"
- },
- "peplum": {
- "t": "Peplum",
- "d": "Add a peplum"
- },
- "peplumYes": {
- "t": "Add a peplum",
- "d": "This will generate the peplum part."
- },
- "peplumNo": {
- "t": "No peplum",
- "d": "Pattern will be generated without a peplum"
- },
- "peplumSize": {
- "t": "Peplum size",
- "d": "Controls the size of the peplum"
- },
- "peplumFullness": {
- "t": "Peplum fullness",
- "d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
- }
-
- }
-}
diff --git a/designs/tristan/i18n/index.mjs b/designs/tristan/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/tristan/i18n/index.mjs
+++ b/designs/tristan/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/tristan/i18n/nl.json b/designs/tristan/i18n/nl.json
deleted file mode 100644
index 9951cd33621..00000000000
--- a/designs/tristan/i18n/nl.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "t": "Tristan",
- "d": "Tristan is a fitted tank top with prince(ss) seams.",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base",
- "peplumFront": "Peplum front",
- "peplumBack": "Peplum back"
- },
- "s": {
- "strapWidthAdjusted.t": "The strap width has been adjusted",
- "strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
- "peplumWidth.t": "Peplum size",
- "peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
- "frontOutside": "Outside front",
- "frontInside": "Inside front",
- "backOutside": "Outside back",
- "backInside": "Inside back",
- "frontPeplum": "Peplum front",
- "backPeplum": "Peplum back",
- "hem": "Hem"
- },
- "o": {
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "waistdartposition": {
- "t": "Waist dart position",
- "d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "armholeDepth": {
- "t": "Depth of the Armhole",
- "d": "Controls how deep the armhole is"
- },
- "cutDepthBack": {
- "t": "Depth of the cut in the back",
- "d": "Controls the depth of the cut in the back"
- },
- "cutDepthFront": {
- "t": "Depth of the cut in the front",
- "d": "Controls the depth of the cut in the front"
- },
- "cutRoundnessBack": {
- "t": "Roundness of the cut in the back",
- "d": "Controls how 'round' the cut in the back is, from V to round to square"
- },
- "cutRoundnessFront": {
- "t": "Roundness of the cut in the front",
- "d": "Controls how 'round' the cut in the front is, from V to round to square"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "strapWidth": {
- "t": "Width of the straps",
- "d": "Controls the width of the straps"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper: side, back, or front"
- },
- "zipperLocation.front": {
- "t": "Front zipper location",
- "d": "The location of the zipper will be in the front"
- },
- "zipperLocation.side": {
- "t": "Side zipper location",
- "d": "The location of the zipper will be on the side"
- },
- "zipperLocation.back": {
- "t": "Back zipper location",
- "d": "The location of the zipper will be in the back"
- },
- "hem": {
- "t": "Hem option",
- "d": "Add a hem."
- },
- "hemYes": {
- "t": "Add a hem",
- "d": "Add a hem at the waist"
- },
- "hemNo": {
- "t": "Do not add a hem",
- "d": "Do not add a hem at the waist"
- },
- "hemSize": {
- "t": "Size of the hem",
- "d": "Size of the hem, a percentage of the distance between the neckline and the waist"
- },
- "lacing": {
- "t": "Lacing option",
- "d": "This removes part of the seam to create an opening for lacing"
- },
- "lacingYes": {
- "t": "Add Lacing",
- "d": "Remove part of the seam to create an opening for lacing"
- },
- "lacingNo": {
- "t": "No lacing",
- "d": "Close the seams normally"
- },
- "lacingLocation": {
- "t": "Location of the lacing",
- "d": "Lacing in the front, or the back"
- },
- "lacingLocation.back": {
- "t": "Lacing in the back",
- "d": "The lacing will be in the back"
- },
- "lacingLocation.front": {
- "t": "Lacing in the front",
- "d": "The lacing will be in the front"
- },
- "lacingWidth": {
- "t": "Lacing width",
- "d": "Width of the lacing opening"
- },
- "peplum": {
- "t": "Peplum",
- "d": "Add a peplum"
- },
- "peplumYes": {
- "t": "Add a peplum",
- "d": "This will generate the peplum part."
- },
- "peplumNo": {
- "t": "No peplum",
- "d": "Pattern will be generated without a peplum"
- },
- "peplumSize": {
- "t": "Peplum size",
- "d": "Controls the size of the peplum"
- },
- "peplumFullness": {
- "t": "Peplum fullness",
- "d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
- }
-
- }
-}
diff --git a/designs/tristan/i18n/uk.json b/designs/tristan/i18n/uk.json
deleted file mode 100644
index 9951cd33621..00000000000
--- a/designs/tristan/i18n/uk.json
+++ /dev/null
@@ -1,182 +0,0 @@
-{
- "t": "Tristan",
- "d": "Tristan is a fitted tank top with prince(ss) seams.",
- "p": {
- "backInside": "Back inside",
- "backOutside": "Back outside",
- "backPoints": "Back base",
- "frontInside": "Front inside",
- "frontOutside": "Front outside",
- "frontPoints": "Front base",
- "peplumFront": "Peplum front",
- "peplumBack": "Peplum back"
- },
- "s": {
- "strapWidthAdjusted.t": "The strap width has been adjusted",
- "strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
- "peplumWidth.t": "Peplum size",
- "peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
- "frontOutside": "Outside front",
- "frontInside": "Inside front",
- "backOutside": "Outside back",
- "backInside": "Inside back",
- "frontPeplum": "Peplum front",
- "backPeplum": "Peplum back",
- "hem": "Hem"
- },
- "o": {
- "bustSpanEase": {
- "t": "Bust span ease",
- "d": "Controls the amount of ease along the bust span"
- },
- "chestEase": {
- "t": "Chest ease",
- "d": "Controls the amount of ease at the chest"
- },
- "shoulderToShoulderEase": {
- "t": "Shoulder to shoulder ease",
- "d": "Controls the amount of ease along the shoulder to shoulder measurement"
- },
- "fullChestEaseReduction": {
- "t": "Full chest ease reduction",
- "d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist"
- },
- "waistdartposition": {
- "t": "Waist dart position",
- "d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
- },
- "frontShoulderWidth": {
- "t": "Front shoulder width",
- "d": "Controls how much width is added to the shoulder in the front"
- },
- "highBustWidth": {
- "t": "High bust width",
- "d": "Controls the width of the high bust"
- },
- "armholeDepth": {
- "t": "Depth of the Armhole",
- "d": "Controls how deep the armhole is"
- },
- "cutDepthBack": {
- "t": "Depth of the cut in the back",
- "d": "Controls the depth of the cut in the back"
- },
- "cutDepthFront": {
- "t": "Depth of the cut in the front",
- "d": "Controls the depth of the cut in the front"
- },
- "cutRoundnessBack": {
- "t": "Roundness of the cut in the back",
- "d": "Controls how 'round' the cut in the back is, from V to round to square"
- },
- "cutRoundnessFront": {
- "t": "Roundness of the cut in the front",
- "d": "Controls how 'round' the cut in the front is, from V to round to square"
- },
- "shoulderDartCurvature": {
- "t": "Shoulder dart curvature",
- "d": "Controls the curvature of the upper part of the shoulder dart"
- },
- "shoulderDartPosition": {
- "t": "Shoulder dart position",
- "d": "Controls the position of the shoulder dart"
- },
- "strapWidth": {
- "t": "Width of the straps",
- "d": "Controls the width of the straps"
- },
- "upperDartLength": {
- "t": "Upper dart length",
- "d": "Controls the length of the upper dart"
- },
- "waistDartLength": {
- "t": "Waist dart length",
- "d": "Controls the length of the waist dart"
- },
- "zipperLocation": {
- "t": "Zipper location",
- "d": "The location of the zipper: side, back, or front"
- },
- "zipperLocation.front": {
- "t": "Front zipper location",
- "d": "The location of the zipper will be in the front"
- },
- "zipperLocation.side": {
- "t": "Side zipper location",
- "d": "The location of the zipper will be on the side"
- },
- "zipperLocation.back": {
- "t": "Back zipper location",
- "d": "The location of the zipper will be in the back"
- },
- "hem": {
- "t": "Hem option",
- "d": "Add a hem."
- },
- "hemYes": {
- "t": "Add a hem",
- "d": "Add a hem at the waist"
- },
- "hemNo": {
- "t": "Do not add a hem",
- "d": "Do not add a hem at the waist"
- },
- "hemSize": {
- "t": "Size of the hem",
- "d": "Size of the hem, a percentage of the distance between the neckline and the waist"
- },
- "lacing": {
- "t": "Lacing option",
- "d": "This removes part of the seam to create an opening for lacing"
- },
- "lacingYes": {
- "t": "Add Lacing",
- "d": "Remove part of the seam to create an opening for lacing"
- },
- "lacingNo": {
- "t": "No lacing",
- "d": "Close the seams normally"
- },
- "lacingLocation": {
- "t": "Location of the lacing",
- "d": "Lacing in the front, or the back"
- },
- "lacingLocation.back": {
- "t": "Lacing in the back",
- "d": "The lacing will be in the back"
- },
- "lacingLocation.front": {
- "t": "Lacing in the front",
- "d": "The lacing will be in the front"
- },
- "lacingWidth": {
- "t": "Lacing width",
- "d": "Width of the lacing opening"
- },
- "peplum": {
- "t": "Peplum",
- "d": "Add a peplum"
- },
- "peplumYes": {
- "t": "Add a peplum",
- "d": "This will generate the peplum part."
- },
- "peplumNo": {
- "t": "No peplum",
- "d": "Pattern will be generated without a peplum"
- },
- "peplumSize": {
- "t": "Peplum size",
- "d": "Controls the size of the peplum"
- },
- "peplumFullness": {
- "t": "Peplum fullness",
- "d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
- }
-
- }
-}
diff --git a/designs/tristan/package.json b/designs/tristan/package.json
index be689f9ab14..4f15749fee0 100644
--- a/designs/tristan/package.json
+++ b/designs/tristan/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/tristan",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a fitted top with prince(ss) seams",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/tristan/src/index.mjs b/designs/tristan/src/index.mjs
index bf3a9aab97d..7b6199d8953 100644
--- a/designs/tristan/src/index.mjs
+++ b/designs/tristan/src/index.mjs
@@ -1,8 +1,6 @@
-//
-
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
// Parts
import { frontPoints } from './frontpoints.mjs'
import { frontInside } from './frontinside.mjs'
@@ -15,7 +13,7 @@ import { peplumBack } from './peplumBack.mjs'
// Create new design
const Tristan = new Design({
- data,
+ data: about,
parts: [
frontPoints,
frontInside,
@@ -40,4 +38,5 @@ export {
peplumBack,
i18n,
Tristan,
+ about,
}
diff --git a/designs/tristan/tests/shared.test.mjs b/designs/tristan/tests/shared.test.mjs
index 87be117e2ed..eafe0dbf0e1 100644
--- a/designs/tristan/tests/shared.test.mjs
+++ b/designs/tristan/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Tristan, i18n } from '../src/index.mjs'
+import { Tristan, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Tristan)
+testPatternConfig(Tristan, about)
// Test translation
testPatternI18n(Tristan, i18n)
diff --git a/designs/uma/CHANGELOG.md b/designs/uma/CHANGELOG.md
index 68a2999d7af..92b3fad7b76 100644
--- a/designs/uma/CHANGELOG.md
+++ b/designs/uma/CHANGELOG.md
@@ -1,6 +1,16 @@
# Change log for: @freesewing/uma
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Fix absolute gusset width displayed below slider.
+
+### Fixed
+
+ - Fix back exposure when expand is off. Fixes
+
## 3.1.0 (2023-12-26)
### Fixed
diff --git a/designs/uma/README.md b/designs/uma/README.md
index 50f16f8e966..1ac37dbd1f5 100644
--- a/designs/uma/README.md
+++ b/designs/uma/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/uma
@@ -59,7 +44,7 @@ A FreeSewing pattern for a basic, highly-customizable underwear pattern
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/uma/data.mjs b/designs/uma/data.mjs
deleted file mode 100644
index fb6a6f9034c..00000000000
--- a/designs/uma/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/uma'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/uma/i18n/de.json b/designs/uma/i18n/de.json
deleted file mode 100644
index eb2bb14c88b..00000000000
--- a/designs/uma/i18n/de.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Ursula, die Unterwäsche",
- "d": "Ursula ist ein elementares, stark anpassbares Schnittmuster für Unterwäsche.",
- "p": {
- "back": "Rückseite",
- "elastic": "Elastic",
- "front": "Vorderseite",
- "gusset": "Zwickel"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Schneide zwei Stücke Gummiband um die Beinöffnungen zu versäubern",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Schneide ein Stück Gummiband um das Taillenband zu versäubern"
- },
- "o": {
- "fabricStretch": {
- "t": "Stoffdehnbarkeit",
- "d": "Passe dies für mehr oder weniger dehnbaren Stoff an"
- },
- "gussetWidth": {
- "t": "Zwickelbreite",
- "d": "Steuert die Breite des Zwickels"
- },
- "gussetLength": {
- "t": "Zwickellänge",
- "d": "Steuert die Länge des Zwickels"
- },
- "elasticStretch": {
- "t": "Dehnbarkeit des Gummis",
- "d": "Passe dies für mehr oder weniger dehnbaren Gummi an"
- },
- "rise": {
- "t": "Sitz",
- "d": "Steuert die Höhe der Taille"
- },
- "legOpening": {
- "t": "Beinöffnung",
- "d": "Legt fest, wie hoch das Bein ausgeschnitten wird"
- },
- "frontDip": {
- "t": "Absenkung der vorderen Taille",
- "d": "Steuert, wie stark die vordere Taille gekümmt ist (legt dadurch mehr oder weniger Haut frei)"
- },
- "backDip": {
- "t": "Absenkung hintere Taille",
- "d": "Steuert, wie stark die hintere Taille gekümmt ist (legt dadurch mehr oder weniger Haut frei)"
- },
- "taperToGusset": {
- "t": "Vordere Freilegung",
- "d": "Steuert die Menge an freigelegter Haut auf der vorderen Seite"
- },
- "backExposure": {
- "t": "Hintere Freilegung",
- "d": "Steuert die Menge an freigelegter Haut auf der hinteren Seite"
- }
- }
-}
diff --git a/designs/uma/i18n/es.json b/designs/uma/i18n/es.json
deleted file mode 100644
index 8987d550f9e..00000000000
--- a/designs/uma/i18n/es.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Ursula, braguitas",
- "d": "Ursula es un patrón básico de braguitas altamente personalizable.",
- "p": {
- "back": "Atrás",
- "elastic": "Elastic",
- "front": "Frente",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Corta dos trozos de elástico para acabar la abertura de las perneras",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Corta un trozo de elástico para acabar la cintura"
- },
- "o": {
- "fabricStretch": {
- "t": "estiramiento de tela",
- "d": "Ajustar esto para más o menos tela estirada"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Controla el ancho del set de ráfaga"
- },
- "gussetLength": {
- "t": "Longitud del Gusset",
- "d": "Controla la longitud del set de ráfaga"
- },
- "elasticStretch": {
- "t": "Estiramiento elástico",
- "d": "Ajustar esto para elástico más o menos estirado"
- },
- "rise": {
- "t": "Elevación de la cintura",
- "d": "Controla la altura de la cintura"
- },
- "legOpening": {
- "t": "Apertura de la pierna",
- "d": "Controla hasta qué punto se corta la pierna"
- },
- "frontDip": {
- "t": "Buceo de cintura frontal",
- "d": "Controla cuánto son las curvas de la cintura frontal (revelando más o menos la piel)"
- },
- "backDip": {
- "t": "Buceo de cintura trasera",
- "d": "Controla cuánto son las curvas de la cintura trasera (revelando más o menos la piel)"
- },
- "taperToGusset": {
- "t": "Exposición frontal",
- "d": "Controla la cantidad de piel expuesta en la parte frontal"
- },
- "backExposure": {
- "t": "Exposición trasera",
- "d": "Controla la cantidad de piel expuesta en la espalda"
- }
- }
-}
diff --git a/designs/uma/i18n/fr.json b/designs/uma/i18n/fr.json
deleted file mode 100644
index e143fcd5011..00000000000
--- a/designs/uma/i18n/fr.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Unités d'Ursula",
- "d": "Ursula est un motif basique et hautement personnalisable.",
- "p": {
- "back": "Retour",
- "elastic": "Elastic",
- "front": "Avant",
- "gusset": "Soufflet"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Couper deux élastiques pour finir les ouvertures des jambes",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Couper une pièce d'élastique pour finir la bande de taille"
- },
- "o": {
- "fabricStretch": {
- "t": "Étendue en tissu",
- "d": "Ajuster ceci pour des tissus plus ou moins extensifs"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Contrôle la largeur du gusset"
- },
- "gussetLength": {
- "t": "Longueur du Gusset",
- "d": "Contrôle la longueur du gusset"
- },
- "elasticStretch": {
- "t": "Etendue élastique",
- "d": "Ajuster ceci pour un élastique plus ou moins extensif"
- },
- "rise": {
- "t": "Élévation de ceinture",
- "d": "Contrôle la hauteur de la taille"
- },
- "legOpening": {
- "t": "Ouverture des jambes",
- "d": "Contrôle la hauteur de la jambe découpée"
- },
- "frontDip": {
- "t": "tremper la taille de la taille avant",
- "d": "Contrôle la quantité de courbes de la taille avant (révélant plus ou moins la peau)"
- },
- "backDip": {
- "t": "trempette à taille arrière",
- "d": "Contrôle la quantité de courbes de la taille arrière (révélant plus ou moins la peau)"
- },
- "taperToGusset": {
- "t": "Exposition frontale",
- "d": "Contrôle la quantité de peau exposée à l'avant"
- },
- "backExposure": {
- "t": "Exposition au dos",
- "d": "Contrôle la quantité de peau exposée au dos"
- }
- }
-}
diff --git a/designs/uma/i18n/index.mjs b/designs/uma/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/uma/i18n/index.mjs
+++ b/designs/uma/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/uma/i18n/nl.json b/designs/uma/i18n/nl.json
deleted file mode 100644
index 6dcd96e099f..00000000000
--- a/designs/uma/i18n/nl.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Ursula undies",
- "d": "Ursula is een fundamenteel, zeer aanpasbaar ondergoed patroon.",
- "p": {
- "back": "Achterzijde",
- "elastic": "Elastic",
- "front": "Voorzijde",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Cut two pieces of elastic to finish the leg openings",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Cut one piece of elastic to finish the waist band"
- },
- "o": {
- "fabricStretch": {
- "t": "Stof stretch",
- "d": "Pas dit aan voor meer of minder elastische stoffen"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Bepaalt de breedte van de gusset"
- },
- "gussetLength": {
- "t": "Gusset lengte",
- "d": "Bepaalt de lengte van de gusset"
- },
- "elasticStretch": {
- "t": "Elastische stretch",
- "d": "Pas dit aan voor meer of minder elastische elastiek"
- },
- "rise": {
- "t": "Hoogte",
- "d": "Bepaalt de hoogte van de taille"
- },
- "legOpening": {
- "t": "Been opening",
- "d": "Bepaalt hoe hoog de broekspijp wordt uitgeknipt"
- },
- "frontDip": {
- "t": "Voorste taille dip",
- "d": "Bepaalt hoeveel de taillecurven vooraan tonen (min of meer skin)"
- },
- "backDip": {
- "t": "Achterste dip taille",
- "d": "Bepaalt hoeveel de omgekeerde golfcurves (min of meer skin onthullen)"
- },
- "taperToGusset": {
- "t": "Blootstelling voorzijde",
- "d": "Bepaalt de hoeveelheid blootgestelde huid aan de voorkant"
- },
- "backExposure": {
- "t": "Blootstelling rug",
- "d": "Bepaalt de hoeveelheid gelekte huid aan de achterkant"
- }
- }
-}
diff --git a/designs/uma/i18n/uk.json b/designs/uma/i18n/uk.json
deleted file mode 100644
index 920dd69b8a8..00000000000
--- a/designs/uma/i18n/uk.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Ursula undies",
- "d": "Ursula is a basic, highly-customizable underwear pattern.",
- "p": {
- "back": "Back",
- "elastic": "Elastic",
- "front": "Front",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Cut two pieces of elastic to finish the leg openings",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Cut one piece of elastic to finish the waist band"
- },
- "o": {
- "fabricStretch": {
- "t": "Fabric stretch",
- "d": "Adjust this for more or less stretchy fabrics"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Controls the width of the gusset"
- },
- "gussetLength": {
- "t": "Gusset length",
- "d": "Controls the length of the gusset"
- },
- "elasticStretch": {
- "t": "Elastic stretch",
- "d": "Adjust this for more or less stretchy elastic"
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist"
- },
- "legOpening": {
- "t": "Leg opening",
- "d": "Controls how high the leg is cut out"
- },
- "frontDip": {
- "t": "Front waist dip",
- "d": "Controls how much the front waist curves (revealing more or less skin)"
- },
- "backDip": {
- "t": "Back waist dip",
- "d": "Controls how much the back waist curves (revealing more or less skin)"
- },
- "taperToGusset": {
- "t": "Front exposure",
- "d": "Controls the amount of exposed skin on the front"
- },
- "backExposure": {
- "t": "Back exposure",
- "d": "Controls the amount of exposed skin on the back"
- }
- }
-}
diff --git a/designs/uma/package.json b/designs/uma/package.json
index 7dc4ee5b607..116707d5ce9 100644
--- a/designs/uma/package.json
+++ b/designs/uma/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/uma",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/uma/src/index.mjs b/designs/uma/src/index.mjs
index 94246187022..1405672c94e 100644
--- a/designs/uma/src/index.mjs
+++ b/designs/uma/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { base } from './base.mjs'
import { back } from './back.mjs'
@@ -9,19 +9,12 @@ import { gusset } from './gusset.mjs'
/*
* Let core bake a new design for us
*/
-const Uma = new Design({ data, parts: [base, back, front, gusset] })
+const Uma = new Design({
+ data: about,
+ parts: [base, back, front, gusset],
+})
/*
* Named exports
*/
-export {
- // Individual parts
- base,
- back,
- front,
- gusset,
- // The Uma design itself
- Uma,
- // Translations
- i18n,
-}
+export { base, back, front, gusset, Uma, i18n, about }
diff --git a/designs/uma/tests/shared.test.mjs b/designs/uma/tests/shared.test.mjs
index 389a026100a..a4e2ab61826 100644
--- a/designs/uma/tests/shared.test.mjs
+++ b/designs/uma/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Uma, i18n } from '../src/index.mjs'
+import { Uma, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Uma)
+testPatternConfig(Uma, about)
// Test translation
testPatternI18n(Uma, i18n)
diff --git a/designs/umbra/README.md b/designs/umbra/README.md
index 906fad49aa0..8645014490b 100644
--- a/designs/umbra/README.md
+++ b/designs/umbra/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/umbra
@@ -59,7 +44,7 @@ A FreeSewing pattern for a basic, highly-customizable underwear pattern
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/umbra/data.mjs b/designs/umbra/data.mjs
deleted file mode 100644
index 948a2c0b21f..00000000000
--- a/designs/umbra/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/umbra'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/umbra/i18n/de.json b/designs/umbra/i18n/de.json
deleted file mode 100644
index 264e56d9460..00000000000
--- a/designs/umbra/i18n/de.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Umbra, die Unterwäsche",
- "d": "Umbra ist ein elementares, stark anpassbares Schnittmuster für Unterwäsche.",
- "p": {
- "back": "Rückseite",
- "elastic": "Elastic",
- "front": "Vorderseite",
- "gusset": "Zwickel"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Schneide zwei Stücke Gummiband um die Beinöffnungen zu versäubern",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Schneide ein Stück Gummiband um das Taillenband zu versäubern"
- },
- "o": {
- "fabricStretch": {
- "t": "Stoffdehnbarkeit",
- "d": "Passe dies für mehr oder weniger dehnbaren Stoff an"
- },
- "gussetWidth": {
- "t": "Zwickelbreite",
- "d": "Steuert die Breite des Zwickels"
- },
- "gussetLength": {
- "t": "Zwickellänge",
- "d": "Steuert die Länge des Zwickels"
- },
- "elasticStretch": {
- "t": "Dehnbarkeit des Gummis",
- "d": "Passe dies für mehr oder weniger dehnbaren Gummi an"
- },
- "rise": {
- "t": "Sitz",
- "d": "Steuert die Höhe der Taille"
- },
- "legOpening": {
- "t": "Beinöffnung",
- "d": "Legt fest, wie hoch das Bein ausgeschnitten wird"
- },
- "frontDip": {
- "t": "Absenkung der vorderen Taille",
- "d": "Steuert, wie stark die vordere Taille gekümmt ist (legt dadurch mehr oder weniger Haut frei)"
- },
- "backDip": {
- "t": "Absenkung hintere Taille",
- "d": "Steuert, wie stark die hintere Taille gekümmt ist (legt dadurch mehr oder weniger Haut frei)"
- },
- "taperToGusset": {
- "t": "Vordere Freilegung",
- "d": "Steuert die Menge an freigelegter Haut auf der vorderen Seite"
- },
- "backExposure": {
- "t": "Hintere Freilegung",
- "d": "Steuert die Menge an freigelegter Haut auf der hinteren Seite"
- }
- }
-}
diff --git a/designs/umbra/i18n/es.json b/designs/umbra/i18n/es.json
deleted file mode 100644
index 16b35cda164..00000000000
--- a/designs/umbra/i18n/es.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Umbra, braguitas",
- "d": "Umbra es un patrón básico de braguitas altamente personalizable.",
- "p": {
- "back": "Atrás",
- "elastic": "Elastic",
- "front": "Frente",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Corta dos trozos de elástico para acabar la abertura de las perneras",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Corta un trozo de elástico para acabar la cintura"
- },
- "o": {
- "fabricStretch": {
- "t": "estiramiento de tela",
- "d": "Ajustar esto para más o menos tela estirada"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Controla el ancho del set de ráfaga"
- },
- "gussetLength": {
- "t": "Longitud del Gusset",
- "d": "Controla la longitud del set de ráfaga"
- },
- "elasticStretch": {
- "t": "Estiramiento elástico",
- "d": "Ajustar esto para elástico más o menos estirado"
- },
- "rise": {
- "t": "Elevación de la cintura",
- "d": "Controla la altura de la cintura"
- },
- "legOpening": {
- "t": "Apertura de la pierna",
- "d": "Controla hasta qué punto se corta la pierna"
- },
- "frontDip": {
- "t": "Buceo de cintura frontal",
- "d": "Controla cuánto son las curvas de la cintura frontal (revelando más o menos la piel)"
- },
- "backDip": {
- "t": "Buceo de cintura trasera",
- "d": "Controla cuánto son las curvas de la cintura trasera (revelando más o menos la piel)"
- },
- "taperToGusset": {
- "t": "Exposición frontal",
- "d": "Controla la cantidad de piel expuesta en la parte frontal"
- },
- "backExposure": {
- "t": "Exposición trasera",
- "d": "Controla la cantidad de piel expuesta en la espalda"
- }
- }
-}
diff --git a/designs/umbra/i18n/fr.json b/designs/umbra/i18n/fr.json
deleted file mode 100644
index dc5a3b5eb35..00000000000
--- a/designs/umbra/i18n/fr.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Unités d'Umbra",
- "d": "Umbra est un motif basique et hautement personnalisable.",
- "p": {
- "back": "Retour",
- "elastic": "Elastic",
- "front": "Avant",
- "gusset": "Soufflet"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Couper deux élastiques pour finir les ouvertures des jambes",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Couper une pièce d'élastique pour finir la bande de taille"
- },
- "o": {
- "fabricStretch": {
- "t": "Étendue en tissu",
- "d": "Ajuster ceci pour des tissus plus ou moins extensifs"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Contrôle la largeur du gusset"
- },
- "gussetLength": {
- "t": "Longueur du Gusset",
- "d": "Contrôle la longueur du gusset"
- },
- "elasticStretch": {
- "t": "Etendue élastique",
- "d": "Ajuster ceci pour un élastique plus ou moins extensif"
- },
- "rise": {
- "t": "Élévation de ceinture",
- "d": "Contrôle la hauteur de la taille"
- },
- "legOpening": {
- "t": "Ouverture des jambes",
- "d": "Contrôle la hauteur de la jambe découpée"
- },
- "frontDip": {
- "t": "tremper la taille de la taille avant",
- "d": "Contrôle la quantité de courbes de la taille avant (révélant plus ou moins la peau)"
- },
- "backDip": {
- "t": "trempette à taille arrière",
- "d": "Contrôle la quantité de courbes de la taille arrière (révélant plus ou moins la peau)"
- },
- "taperToGusset": {
- "t": "Exposition frontale",
- "d": "Contrôle la quantité de peau exposée à l'avant"
- },
- "backExposure": {
- "t": "Exposition au dos",
- "d": "Contrôle la quantité de peau exposée au dos"
- }
- }
-}
diff --git a/designs/umbra/i18n/index.mjs b/designs/umbra/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/umbra/i18n/index.mjs
+++ b/designs/umbra/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/umbra/i18n/nl.json b/designs/umbra/i18n/nl.json
deleted file mode 100644
index bf706ea3331..00000000000
--- a/designs/umbra/i18n/nl.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Umbra undies",
- "d": "Umbra is een fundamenteel, zeer aanpasbaar ondergoed patroon.",
- "p": {
- "back": "Achterzijde",
- "elastic": "Elastic",
- "front": "Voorzijde",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Cut two pieces of elastic to finish the leg openings",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Cut one piece of elastic to finish the waist band"
- },
- "o": {
- "fabricStretch": {
- "t": "Stof stretch",
- "d": "Pas dit aan voor meer of minder elastische stoffen"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Bepaalt de breedte van de gusset"
- },
- "gussetLength": {
- "t": "Gusset lengte",
- "d": "Bepaalt de lengte van de gusset"
- },
- "elasticStretch": {
- "t": "Elastische stretch",
- "d": "Pas dit aan voor meer of minder elastische elastiek"
- },
- "rise": {
- "t": "Hoogte",
- "d": "Bepaalt de hoogte van de taille"
- },
- "legOpening": {
- "t": "Been opening",
- "d": "Bepaalt hoe hoog de broekspijp wordt uitgeknipt"
- },
- "frontDip": {
- "t": "Voorste taille dip",
- "d": "Bepaalt hoeveel de taillecurven vooraan tonen (min of meer skin)"
- },
- "backDip": {
- "t": "Achterste dip taille",
- "d": "Bepaalt hoeveel de omgekeerde golfcurves (min of meer skin onthullen)"
- },
- "taperToGusset": {
- "t": "Blootstelling voorzijde",
- "d": "Bepaalt de hoeveelheid blootgestelde huid aan de voorkant"
- },
- "backExposure": {
- "t": "Blootstelling rug",
- "d": "Bepaalt de hoeveelheid gelekte huid aan de achterkant"
- }
- }
-}
diff --git a/designs/umbra/i18n/uk.json b/designs/umbra/i18n/uk.json
deleted file mode 100644
index db8921f3faf..00000000000
--- a/designs/umbra/i18n/uk.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "t": "Umbra undies",
- "d": "Umbra is a basic, highly-customizable underwear pattern.",
- "p": {
- "back": "Back",
- "elastic": "Elastic",
- "front": "Front",
- "gusset": "Gusset"
- },
- "s": {
- "cutTwoPiecesOfElasticToFinishTheLegOpenings": "Cut two pieces of elastic to finish the leg openings",
- "cutOnePieceOfElasticToFinishTheWaistBand": "Cut one piece of elastic to finish the waist band"
- },
- "o": {
- "fabricStretch": {
- "t": "Fabric stretch",
- "d": "Adjust this for more or less stretchy fabrics"
- },
- "gussetWidth": {
- "t": "Gusset width",
- "d": "Controls the width of the gusset"
- },
- "gussetLength": {
- "t": "Gusset length",
- "d": "Controls the length of the gusset"
- },
- "elasticStretch": {
- "t": "Elastic stretch",
- "d": "Adjust this for more or less stretchy elastic"
- },
- "rise": {
- "t": "Rise",
- "d": "Controls the height of the waist"
- },
- "legOpening": {
- "t": "Leg opening",
- "d": "Controls how high the leg is cut out"
- },
- "frontDip": {
- "t": "Front waist dip",
- "d": "Controls how much the front waist curves (revealing more or less skin)"
- },
- "backDip": {
- "t": "Back waist dip",
- "d": "Controls how much the back waist curves (revealing more or less skin)"
- },
- "taperToGusset": {
- "t": "Front exposure",
- "d": "Controls the amount of exposed skin on the front"
- },
- "backExposure": {
- "t": "Back exposure",
- "d": "Controls the amount of exposed skin on the back"
- }
- }
-}
diff --git a/designs/umbra/package.json b/designs/umbra/package.json
index e21d0456d3e..9447c50bdde 100644
--- a/designs/umbra/package.json
+++ b/designs/umbra/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/umbra",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/umbra/src/index.mjs b/designs/umbra/src/index.mjs
index faf32fbca8f..ab7e9db3a01 100644
--- a/designs/umbra/src/index.mjs
+++ b/designs/umbra/src/index.mjs
@@ -3,26 +3,17 @@ import { i18n } from '../i18n/index.mjs'
import { base } from './base.mjs'
import { back } from './back.mjs'
import { front } from './front.mjs'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
/*
* Let core bake a new design for us
*/
const Umbra = new Design({
- data,
+ data: about,
parts: [base, back, front],
})
/*
* Named exports
*/
-export {
- // Individual parts
- base,
- back,
- front,
- // The Umbra design itself
- Umbra,
- // Translations
- i18n,
-}
+export { base, back, front, Umbra, i18n, about }
diff --git a/designs/umbra/tests/shared.test.mjs b/designs/umbra/tests/shared.test.mjs
index 77dd2467aa0..2305161ff52 100644
--- a/designs/umbra/tests/shared.test.mjs
+++ b/designs/umbra/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Umbra, i18n } from '../src/index.mjs'
+import { Umbra, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Umbra)
+testPatternConfig(Umbra, about)
// Test translation
testPatternI18n(Umbra, i18n)
diff --git a/designs/wahid/CHANGELOG.md b/designs/wahid/CHANGELOG.md
index 9972ff5ee4e..b15d9c8f4f9 100644
--- a/designs/wahid/CHANGELOG.md
+++ b/designs/wahid/CHANGELOG.md
@@ -1,6 +1,12 @@
# Change log for: @freesewing/wahid
+## 4.0.0 (2024-04-01)
+
+### Changed
+
+ - Add a warning when waist and hip reduction are both zero, so no back dart is required.
+
## 3.0.0 (2023-09-30)
### Changed
diff --git a/designs/wahid/README.md b/designs/wahid/README.md
index d62ab251bfe..700f5d105b7 100644
--- a/designs/wahid/README.md
+++ b/designs/wahid/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/wahid
@@ -59,7 +44,7 @@ A FreeSewing pattern for a classic fitted waistcoat
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/wahid/data.mjs b/designs/wahid/data.mjs
deleted file mode 100644
index 7b03a1e0d00..00000000000
--- a/designs/wahid/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/wahid'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/wahid/i18n/de.json b/designs/wahid/i18n/de.json
deleted file mode 100644
index 72588dd405b..00000000000
--- a/designs/wahid/i18n/de.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "t": "Wahid, die Weste",
- "d": "Wahid ist eine klassische taillierte Weste.",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite",
- "frontFacing": "Besatz Vorderseite",
- "frontLining": "Futter Vorderseite",
- "pocketBag": "Taschenbeutel",
- "pocketFacing": "Taschenbesatz",
- "pocketInterfacing": "Tascheneinlage",
- "pocketWelt": "Taschenpaspel"
- },
- "s": {},
- "o": {
- "backScyeDart": {
- "t": "Rückwärtige Armlochabnäher",
- "d": "Die Menge, die in einem Abnäher hinten am Armloch entnommen werden muss."
- },
- "frontScyeDart": {
- "t": "Vorderer Armlochabnäher",
- "d": "Die Menge, die in einem Abnäher an der Vorderseite des Armlochs entnommen werden muss."
- },
- "pocketLocation": {
- "t": "Taschenplatzierung",
- "d": "Bestimmt die Platzierung der Tasche"
- },
- "pocketWidth": {
- "t": "Taschenbreite",
- "d": "Bestimmt die Breite der Tasche"
- },
- "weltHeight": {
- "t": "Paspelhöhe",
- "d": "Bestimmt die Höhe der Paspel"
- },
- "necklineDrop": {
- "t": "Ausschnitt Tiefe",
- "d": "Legt fest, wie tief der Ausschnitt vorne ausgeschnitten ist"
- },
- "frontStyle": {
- "t": "Ausschnittstil",
- "d": "Stil des Ausschnitts"
- },
- "hemStyle": {
- "t": "Saumstil",
- "d": "Art des vorderen Saums"
- },
- "hemRadius": {
- "t": "Saumradius",
- "d": "Der Betrag, um den der Saum gerundet ist"
- },
- "backInset": {
- "t": "Rückseite Ausschnitt",
- "d": "Wie viel die Rückseite des Armlochs nach innen verschoben ist"
- },
- "frontInset": {
- "t": "Vorderseite Ausschnitt",
- "d": "Wieviel das Armloch an der Vorderseite nach innen verschoben wird"
- },
- "shoulderInset": {
- "t": "Schulterversatz nach innen",
- "d": "Wieviel die Schulternaht nach innen Richtung Schulter versetzt wird"
- },
- "neckInset": {
- "t": "Nackenauschnitt",
- "d": "Wieviel die Schulternaht am Nacken nach innen versetzt wird"
- },
- "pocketAngle": {
- "t": "Winkel der Tasche",
- "d": "Winkel der Taschenneigung"
- }
- }
-}
diff --git a/designs/wahid/i18n/es.json b/designs/wahid/i18n/es.json
deleted file mode 100644
index 11eaffac993..00000000000
--- a/designs/wahid/i18n/es.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "t": "Wahid, chaleco",
- "d": "Wahid es el clásico chaleco entallado.",
- "p": {
- "back": "Atrás",
- "front": "Frente",
- "frontFacing": "Delantero mirando hacia",
- "frontLining": "Delantero revestimiento",
- "pocketBag": "Bolsa de bolsillo",
- "pocketFacing": "Cara de bolsillo",
- "pocketInterfacing": "Entretela de bolsillo",
- "pocketWelt": "Ribete de bolsillo"
- },
- "s": {},
- "o": {
- "backScyeDart": {
- "t": "Pinza posterior de la sisa",
- "d": "La cantidad a reducir en una pinza en la parte posterior de la sisa."
- },
- "frontScyeDart": {
- "t": "Pinza frontal de la sisa",
- "d": "La cantidad a reducir en una pinza en el frente de la sisa."
- },
- "pocketLocation": {
- "t": "Ubicación de bolsillo",
- "d": "Determina la colocación del bolsillo"
- },
- "pocketWidth": {
- "t": "Anchura de bolsillo",
- "d": "La anchura del bolsillo"
- },
- "weltHeight": {
- "t": "Altura de verdugón del bolsillo",
- "d": "La altura de verdugón del bolsillo."
- },
- "necklineDrop": {
- "t": "Caída del cuello",
- "d": "Determina lo bajo que cae la línea de cuello en la parte delantera"
- },
- "frontStyle": {
- "t": "Estilo de la apertura del cuello",
- "d": "Estilo de apertura del cuello"
- },
- "hemStyle": {
- "t": "Estilo del dobladillo",
- "d": "Estilo del dobladillo delantero"
- },
- "hemRadius": {
- "t": "Radio del dobladillo",
- "d": "Radio por el que el dobladillo es redondeado"
- },
- "backInset": {
- "t": "Inserción trasera",
- "d": "Cuánto de la parte de atrás de la sisa se corta hacia el interior"
- },
- "frontInset": {
- "t": "Inserción delantera",
- "d": "Cuánto de la parte de delante de la sisa se corta hacia el interior"
- },
- "shoulderInset": {
- "t": "Inserción de hombro",
- "d": "Cuánto la costura del hombro se recorta hacia el interior en el hombro"
- },
- "neckInset": {
- "t": "Inserción de cuello",
- "d": "Cuánto de la costura del hombro se corta hacia el interior en el cuello"
- },
- "pocketAngle": {
- "t": "Ángulo del bolsillo",
- "d": "Ángulo del forro del bolsillo"
- }
- }
-}
diff --git a/designs/wahid/i18n/fr.json b/designs/wahid/i18n/fr.json
deleted file mode 100644
index 0cad9b6e61f..00000000000
--- a/designs/wahid/i18n/fr.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "t": "Gilet Wahid",
- "d": "Wahid est un gilet classique ajusté.",
- "p": {
- "back": "Retour",
- "front": "Avant",
- "frontFacing": "Doublure avant",
- "frontLining": "Doublure avant",
- "pocketBag": "Sac de poche",
- "pocketFacing": "Parement de poche",
- "pocketInterfacing": "Entoilage de poche",
- "pocketWelt": "Rabat de poche"
- },
- "s": {},
- "o": {
- "backScyeDart": {
- "t": "Pince de carrure",
- "d": "La valeur à retirer dans une pince de carrure (à l'emmanchure arrière)."
- },
- "frontScyeDart": {
- "t": "Pince d'emmanchure",
- "d": "La quantité à retirer de la pince à l'avant de l'emmanchure."
- },
- "pocketLocation": {
- "t": "Emplacement de poche",
- "d": "Détermine l'emplacement de la poche"
- },
- "pocketWidth": {
- "t": "Largeur de poche",
- "d": "Détermine la largeur de la poche"
- },
- "weltHeight": {
- "t": "Hauteur du revers de poche",
- "d": "Détermine la hauteur du revers de poche"
- },
- "necklineDrop": {
- "t": "Décolleté",
- "d": "Détermine la profondeur d'encolure sur le devant"
- },
- "frontStyle": {
- "t": "Style d'encolure",
- "d": "Style de l'encolure"
- },
- "hemStyle": {
- "t": "Type d'ourlet",
- "d": "Style de l'ourlet avant"
- },
- "hemRadius": {
- "t": "Arrondi d'ourlet",
- "d": "Rayon avec lequel l'ourlet est arrondi"
- },
- "backInset": {
- "t": "Échancrure emmanchure arrière",
- "d": "A quel point l'arrière de l'emmanchure est coupée vers l'intérieur"
- },
- "frontInset": {
- "t": "Échancrure emmanchure avant",
- "d": "A quel point l'avant de l'emmanchure est coupée vers l'intérieur"
- },
- "shoulderInset": {
- "t": "Réduction d'épaule",
- "d": "A quel point la couture d'épaule est éloignée des épaules"
- },
- "neckInset": {
- "t": "Échancrure cou",
- "d": "A quel point la couture d'épaule est éloignée du cou"
- },
- "pocketAngle": {
- "t": "Angle de poche",
- "d": "Angle de l'ouverture de poche"
- }
- }
-}
diff --git a/designs/wahid/i18n/index.mjs b/designs/wahid/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/wahid/i18n/index.mjs
+++ b/designs/wahid/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/wahid/i18n/nl.json b/designs/wahid/i18n/nl.json
deleted file mode 100644
index fcb1854f61a..00000000000
--- a/designs/wahid/i18n/nl.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "t": "Wahid gilet",
- "d": "Wahid is een klassiek aansluitend gilet.",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde",
- "frontFacing": "Beleg vooraan",
- "frontLining": "Voering vooraan",
- "pocketBag": "Binnenzak",
- "pocketFacing": "Zak beleg",
- "pocketInterfacing": "Tussenvoering zak",
- "pocketWelt": "Paspel zak"
- },
- "s": {},
- "o": {
- "backScyeDart": {
- "t": "Achterste armsgat neep",
- "d": "De hoeveelheid die verwijderd wordt met een neep aan de achterkant van het armsgat."
- },
- "frontScyeDart": {
- "t": "Neep armsgat voor",
- "d": "De hoeveelheid die verwijderd wordt met een neep aan de voorkant van het armsgat."
- },
- "pocketLocation": {
- "t": "Locatie van de zak",
- "d": "Bepaalt de locatie van de zak"
- },
- "pocketWidth": {
- "t": "Breedte van de zak",
- "d": "Bepaalt de breedte van de zak"
- },
- "weltHeight": {
- "t": "Hoogte paspel zak",
- "d": "De hoogte van de paspel van de zak"
- },
- "necklineDrop": {
- "t": "Hoogte halslijn",
- "d": "Bepaalt hoe laag de halslijn vooraan wordt"
- },
- "frontStyle": {
- "t": "Stijl halsopening",
- "d": "Stijl van de halsopening"
- },
- "hemStyle": {
- "t": "Vorm zoom",
- "d": "De vorm van de zoom vooraan"
- },
- "hemRadius": {
- "t": "Ronding zoom",
- "d": "De straal van de ronding van de zoom"
- },
- "backInset": {
- "t": "Insnede rug",
- "d": "Hoeveel het armsgat achteraan naar binnen gaat"
- },
- "frontInset": {
- "t": "Insnede voorpand",
- "d": "Hoeveel het armsgat vooraan naar binnen gaat"
- },
- "shoulderInset": {
- "t": "Insnede schouder",
- "d": "Hoeveel de schoudernaad aan de schouder naar binnen gaat"
- },
- "neckInset": {
- "t": "Insnede nek",
- "d": "Hoeveel de schoudernaad aan de hals naar binnen gaat"
- },
- "pocketAngle": {
- "t": "Hoek zak",
- "d": "De hoek van de zakopening"
- }
- }
-}
diff --git a/designs/wahid/i18n/uk.json b/designs/wahid/i18n/uk.json
deleted file mode 100644
index c5b040f4722..00000000000
--- a/designs/wahid/i18n/uk.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
- "t": "Wahid waistcoat",
- "d": "Wahid is a classic fitted waistcoat.",
- "p": {
- "back": "Back",
- "front": "Front",
- "frontFacing": "Front facing",
- "frontLining": "Front lining",
- "pocketBag": "Pocket bag",
- "pocketFacing": "Pocket facing",
- "pocketInterfacing": "Pocket interfacing",
- "pocketWelt": "Pocket welt"
- },
- "s": {},
- "o": {
- "backScyeDart": {
- "t": "Back scye dart",
- "d": "The amount to take out in a dart at the back of the armhole."
- },
- "frontScyeDart": {
- "t": "Front scye dart",
- "d": "The amount to take out in a dart at the front of the armhole."
- },
- "pocketLocation": {
- "t": "Pocket location",
- "d": "Determines the placement of the pocket"
- },
- "pocketWidth": {
- "t": "Pocket width",
- "d": "Determines the width of the pocket"
- },
- "weltHeight": {
- "t": "Welt height",
- "d": "Determines the height of the welt"
- },
- "necklineDrop": {
- "t": "Neckline drop",
- "d": "Determines how low the neckline drops at the front"
- },
- "frontStyle": {
- "t": "Neck opening style",
- "d": "Style of the neck opening"
- },
- "hemStyle": {
- "t": "Hem style",
- "d": "Style of the front hem"
- },
- "hemRadius": {
- "t": "Hem radius",
- "d": "Radius by which the hem is rounded"
- },
- "backInset": {
- "t": "Back inset",
- "d": "How much the back of the armhole is cut inwards"
- },
- "frontInset": {
- "t": "Front inset",
- "d": "How much the front of the armhole is cut inwards"
- },
- "shoulderInset": {
- "t": "Shoulder inset",
- "d": "How much the shoulder seam is cut inwards at the shoulder"
- },
- "neckInset": {
- "t": "Neck inset",
- "d": "How much the shoulder seam is cut inwards at the neck"
- },
- "pocketAngle": {
- "t": "Pocket angle",
- "d": "Angle of the pocket slant"
- },
- "buttons": {
- "t": "Buttons",
- "d": "The amount of buttons to use."
- },
- "waistEase": {
- "t": "Waist ease",
- "d": "Controls the amount of ease at the waist."
- },
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips."
- },
- "centerBackDart": {
- "t": "Center back dart",
- "d": "Whether or not to include a center back dart to fit a rounded back."
- }
- }
-}
diff --git a/designs/wahid/package.json b/designs/wahid/package.json
index a9bfef58b88..f5cdfff10a6 100644
--- a/designs/wahid/package.json
+++ b/designs/wahid/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/wahid",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a classic fitted waistcoat",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/wahid/src/index.mjs b/designs/wahid/src/index.mjs
index c81bb514a36..4e5b0302722 100644
--- a/designs/wahid/src/index.mjs
+++ b/designs/wahid/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as wahidI18n } from '../i18n/index.mjs'
import { front } from './front.mjs'
@@ -13,7 +13,7 @@ import { pocketInterfacing } from './pocketinterfacing.mjs'
// Setup our new design
const Wahid = new Design({
- data,
+ data: about,
parts: [
front,
back,
@@ -43,4 +43,5 @@ export {
pocketInterfacing,
Wahid,
i18n,
+ about,
}
diff --git a/designs/wahid/tests/shared.test.mjs b/designs/wahid/tests/shared.test.mjs
index 7762191ccae..11a542a315a 100644
--- a/designs/wahid/tests/shared.test.mjs
+++ b/designs/wahid/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Wahid, i18n } from '../src/index.mjs'
+import { Wahid, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Wahid)
+testPatternConfig(Wahid, about)
// Test translation
testPatternI18n(Wahid, i18n)
diff --git a/designs/walburga/README.md b/designs/walburga/README.md
index 16b3ebcc3ec..d2f6c975ae1 100644
--- a/designs/walburga/README.md
+++ b/designs/walburga/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/walburga
@@ -59,7 +44,7 @@ A FreeSewing pattern for a wappenrock (tabard/surcoat), a historical Europe
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/walburga/data.mjs b/designs/walburga/data.mjs
deleted file mode 100644
index 7cbda9351db..00000000000
--- a/designs/walburga/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/walburga'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/walburga/i18n/de.json b/designs/walburga/i18n/de.json
deleted file mode 100644
index 6ebc8f17eb9..00000000000
--- a/designs/walburga/i18n/de.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "t": "Walburga, der Wappenrock",
- "d": "Walburga ist ein Wappenrock, ein historisches Gewand aus dem mittelalterlichen Europa",
- "p": {
- "back": "Rückseite",
- "front": "Vorderseite"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Kopfgrößenverhältnis",
- "d": "Steuert die Größe der Kopföffnung"
- },
- "lengthBonus": {
- "t": "Längenzugabe",
- "d": "Erlaubt Variation der Länge des Kleidungsstücks"
- },
- "widthBonus": {
- "t": "Breitenzugabe",
- "d": "Erlaubt Variation der Breite des Kleidungsstücks"
- },
- "length": {
- "t": "Länge",
- "d": "Steuert die Länge des Kleidungsstückes"
- },
- "neckoRatio": {
- "t": "Form des Halsausschnittes",
- "d": "Steuert die Form des Halsausschnittes"
- },
- "neckline": {
- "t": "Halsausschnitt",
- "d": "Bestimmt, ob ein Halsausschnit erstellt werden soll oder nicht"
- }
- }
-}
diff --git a/designs/walburga/i18n/es.json b/designs/walburga/i18n/es.json
deleted file mode 100644
index bddb08bff8a..00000000000
--- a/designs/walburga/i18n/es.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "t": "Walburga, tabardo",
- "d": "Walburga es un tabardo o sobreveste, una prenda histórica de la Europa medieval",
- "p": {
- "back": "Atrás",
- "front": "Frente"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "lengthBonus": {
- "t": "Bonus de longitud",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "length": {
- "t": "Longitud",
- "d": "Controls the length of the garment"
- },
- "neckoRatio": {
- "t": "Neck opening shape",
- "d": "controls the shape of the neck opening"
- },
- "neckline": {
- "t": "Neckline",
- "d": "Controls whether or not to draft a neck opening"
- }
- }
-}
diff --git a/designs/walburga/i18n/fr.json b/designs/walburga/i18n/fr.json
deleted file mode 100644
index 7d98496ca6d..00000000000
--- a/designs/walburga/i18n/fr.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "t": "Tabard Walburga",
- "d": "Walburga est un tabard/surcot, un vêtement historique de l'Europe médiévale",
- "p": {
- "back": "Retour",
- "front": "Avant"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Ratio de tête",
- "d": "Contrôle la taille de l'ouverture de la tête"
- },
- "lengthBonus": {
- "t": "Supplément de longueur",
- "d": "Permet de varier la longueur du vêtement"
- },
- "widthBonus": {
- "t": "Bonus de largeur",
- "d": "Permet de varier la largeur du vêtement"
- },
- "length": {
- "t": "Longueur",
- "d": "Contrôle la longueur du vêtement"
- },
- "neckoRatio": {
- "t": "Forme de l'encolure",
- "d": "contrôle la forme de l'encolure"
- },
- "neckline": {
- "t": "Ligne d'encolure",
- "d": "Contrôle si oui ou non il faut tracer un encolure"
- }
- }
-}
diff --git a/designs/walburga/i18n/index.mjs b/designs/walburga/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/walburga/i18n/index.mjs
+++ b/designs/walburga/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/walburga/i18n/nl.json b/designs/walburga/i18n/nl.json
deleted file mode 100644
index 56872f0534e..00000000000
--- a/designs/walburga/i18n/nl.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "t": "Walburga Wappenrock",
- "d": "Walburga is a tabard/surcoat, a historical garment from medieval Europe",
- "p": {
- "back": "Achterzijde",
- "front": "Voorzijde"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "lengthBonus": {
- "t": "Lengtebonus",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "length": {
- "t": "Lengte",
- "d": "Controls the length of the garment"
- },
- "neckoRatio": {
- "t": "Neck opening shape",
- "d": "controls the shape of the neck opening"
- },
- "neckline": {
- "t": "Neckline",
- "d": "Controls whether or not to draft a neck opening"
- }
- }
-}
diff --git a/designs/walburga/i18n/uk.json b/designs/walburga/i18n/uk.json
deleted file mode 100644
index 70fb4aea91e..00000000000
--- a/designs/walburga/i18n/uk.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "t": "Walburga Wappenrock",
- "d": "Walburga is a tabard/surcoat, a historical garment from medieval Europe",
- "p": {
- "base": "Base",
- "back": "Back",
- "front": "Front"
- },
- "s": {},
- "o": {
- "headRatio": {
- "t": "Head ratio",
- "d": "Controls the size of the head opening"
- },
- "lengthBonus": {
- "t": "Length bonus",
- "d": "Allows variation of the length of the garment"
- },
- "widthBonus": {
- "t": "Width bonus",
- "d": "Allows variation of the width of the garment"
- },
- "length": {
- "t": "Length",
- "d": "Controls the length of the garment"
- },
- "neckoRatio": {
- "t": "Neck opening shape",
- "d": "controls the shape of the neck opening"
- },
- "neckline": {
- "t": "Neckline",
- "d": "Controls whether or not to draft a neck opening"
- }
- }
-}
diff --git a/designs/walburga/package.json b/designs/walburga/package.json
index bed4258f085..338caaff9d5 100644
--- a/designs/walburga/package.json
+++ b/designs/walburga/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/walburga",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a wappenrock (tabard/surcoat), a historical European/medieval (ish) garment",
"author": "Starfetch (https://github.com/starfetch)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/walburga/src/index.mjs b/designs/walburga/src/index.mjs
index 010102dd6fa..516946715ba 100644
--- a/designs/walburga/src/index.mjs
+++ b/designs/walburga/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { front } from './front.mjs'
import { back } from './back.mjs'
@@ -8,9 +8,9 @@ import { base } from './base.mjs'
// Setup our new design
const Walburga = new Design({
- data,
+ data: about,
parts: [back, front],
})
// Named exports
-export { back, front, base, Walburga, i18n }
+export { back, front, base, Walburga, i18n, about }
diff --git a/designs/walburga/tests/shared.test.mjs b/designs/walburga/tests/shared.test.mjs
index 4473937c867..a820f6394bf 100644
--- a/designs/walburga/tests/shared.test.mjs
+++ b/designs/walburga/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Walburga, i18n } from '../src/index.mjs'
+import { Walburga, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Walburga)
+testPatternConfig(Walburga, about)
// Test translation
testPatternI18n(Walburga, i18n)
diff --git a/designs/waralee/README.md b/designs/waralee/README.md
index 6b641b91c3e..6335a691de1 100644
--- a/designs/waralee/README.md
+++ b/designs/waralee/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/waralee
@@ -59,7 +44,7 @@ A FreeSewing pattern for wrap pants
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/waralee/data.mjs b/designs/waralee/data.mjs
deleted file mode 100644
index 89b323079f6..00000000000
--- a/designs/waralee/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/waralee'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/waralee/i18n/de.json b/designs/waralee/i18n/de.json
deleted file mode 100644
index c92c9ba9686..00000000000
--- a/designs/waralee/i18n/de.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "t": "Waralee, die Wickelhose",
- "d": "Waralee ist eine Wickelhose.",
- "p": {
- "backPocket": "Back pocket",
- "cutout": "Cutout",
- "facingBack": "Back Pocket Facing",
- "facingFront": "Front Pocket Facing",
- "mini": "Mini",
- "pants": "Pants",
- "pantsProto": "Pants prototype",
- "pocket": "Pocket",
- "strapBack": "Strap back",
- "strapFront": "Strap front",
- "waistbandBack": "Waistband back",
- "waistbandFront": "Waistband front"
- },
- "s": {
- "thisIsNotAPart": "This is not a real part",
- "doNotCutFromFabric": "Do not cut this from the fabric",
- "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric",
- "cutBackPocket.t": "The back pocket is not shown",
- "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingback.t": "The back pocket facing is not shown",
- "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingfront.t": "The front pocket facing is not shown",
- "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandBack.t": "The back waist band is not shown",
- "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandFront.t": "The front waist band is not shown",
- "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapBack.t": "The back strap is not shown",
- "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapFront.t": "The front strap is not shown",
- "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "showPants.t": "The full pants are shown",
- "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.",
- "hidePants.t": "The full pants are not shown",
- "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern."
- },
- "o": {
- "backPocket": {
- "t": "Rückwärtige Tasche",
- "d": "Definiert ob rückwärtige Taschen integriert werden"
- },
- "backPocketYes": {
- "t": "Back pocket",
- "d": "The back pocket is included"
- },
- "backPocketNo": {
- "t": "No Back pocket",
- "d": "The pattern is drawn without a back pocket"
- },
- "frontPocket": {
- "t": "Vordere Taschen",
- "d": "Ob eine Fronttasche hinzugefügt werden soll oder nicht"
- },
- "frontPocketYes": {
- "t": "Front pocket",
- "d": "The front pocket is included"
- },
- "frontPocketNo": {
- "t": "No Front pocket",
- "d": "The pattern is drawn without a front pocket"
- },
- "hemWidth": {
- "t": "Saumgröße",
- "d": "Größe des Saums am unteren Rand der Hose"
- },
- "waistbandWidth": {
- "t": "Taillenbund",
- "d": "Größe des Taillenbundes"
- },
- "waistRaise": {
- "t": "Taillenhöhe",
- "d": "Wie hoch soll die Taille über dem Gesäßumfang angelegt werden? Dies beeinflusst die Tiefe des Schrittauschnittes."
- },
- "crotchBack": {
- "t": "Hinterer Schritt",
- "d": "Prozentsatz des Gesäßumfangs, den der hintere Teil des Schrittes benötigt. Dies ergibt mehr oder weniger Abstand zwischen der Seitennaht und der hinteren Mitte."
- },
- "crotchFront": {
- "t": "Vorderer Schritt",
- "d": "Prozentsatz des Gesäßumfangs, den der vordere Teil des Schrittes benötigt. Dies beeinflusst den Abstand zwischen Seitennaht und vorderer Mittelnaht."
- },
- "crotchFactorBackHor": {
- "t": "Horizontaler hinterer Schritt Faktor",
- "d": "Wird benutzt um die Kurze des hinteren Schritts horizontal zu verschieben"
- },
- "crotchFactorBackVer": {
- "t": "Vertikaler hinterer Schritt Faktor",
- "d": "Wird benutzt um die Kurve des hinteren Schritts vertikal zu verschieben"
- },
- "crotchFactorFrontHor": {
- "t": "Horizontaler vorderer Schritt Faktor",
- "d": "Wird verwendet um die Kurve des vorderen Schritts horizontal zu verschieben"
- },
- "crotchFactorFrontVer": {
- "t": "Vertikaler vorderer Schritt Faktor",
- "d": "Wird benutzt um die Kurve des vorderen Schritts vertikal zu verschieben"
- },
- "waistOverlap": {
- "t": "Übertritt an der Taille",
- "d": "Dieser Wert legt fest, wie starken Übertritt Sie auf Taillenhöhe an der Seite haben möchten. Beim Wert 0 treffen sich die Teile auf der Linie der Seitennaht. Beim Wert 100 überlappen die Teile soweit, dass sie jeweils zur vorderen und hinteren Mitte reichen."
- },
- "legSize": {
- "t": "Leg Size",
- "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants."
- },
- "backRaise": {
- "t": "Hintere Anstieg",
- "d": "Diese Einstellung erhöht den Taillenlinie im Rücken. Unsere Taille sitzt nicht horizontal, sondern ist auf der Rückseite angehoben. Diese Einstellung erlaubt es Ihnen, dies im Rücken zu erhöhen, wenn Sie es für eine gute Passform benötigen."
- },
- "fitWaist": {
- "t": "Fit the garment to the waist",
- "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust."
- },
- "fitWaistNo": {
- "t": "Do not fit the garment to the waist",
- "d": "The traditional wrap pants."
- },
- "fitWaistYes": {
- "t": "Fit the garment to the waist",
- "d": "Adjust the crotch cutout to make the waist fit better."
- },
- "frontPocketStyle": {
- "t": "Front pocket style",
- "d": "A welt pocket, or a pocket hidden in the waistband."
- },
- "frontPocketStyle.welt": {
- "t": "Welt style Front pocket",
- "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap."
- },
- "frontPocketStyle.waistband": {
- "t": "Waistband Front pocket",
- "d": "The front pocket will be hidden in the seam of the waistband."
- },
- "knotPlacement": {
- "t": "Placement of the knot(s)",
- "d": "The knot of the wrap straps can be placed in the front, back, or both front and back (traditional)."
- },
- "knotPlacement.front": {
- "t": "Knot in the front",
- "d": "The knot of the wrap straps will be in the front."
- },
- "knotPlacement.back": {
- "t": "Knot in the back",
- "d": "The knot of the wrap straps will be in the back."
- },
- "knotPlacement.traditional": {
- "t": "Knot in the front and back",
- "d": "The knot of the wrap straps will be in the front and the back."
- },
- "separateWaistband": {
- "t": "Create a separate waistband",
- "d": "Create a separate waistband, or have a hem the size of the waistband."
- },
- "separateWaistbandNo": {
- "t": "No separate waistband",
- "d": "The waistband is created by a folded hem."
- },
- "separateWaistbandYes": {
- "t": "Separate waistband",
- "d": "The waistband is a separate piece, and sewn onto the pants."
- }
- }
-}
diff --git a/designs/waralee/i18n/es.json b/designs/waralee/i18n/es.json
deleted file mode 100644
index 48f1c953ae6..00000000000
--- a/designs/waralee/i18n/es.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "t": "Pantalones de Waralee",
- "d": "Waralee son pantalones envolventes.",
- "p": {
- "backPocket": "Back pocket",
- "cutout": "Cutout",
- "facingBack": "Back Pocket Facing",
- "facingFront": "Front Pocket Facing",
- "mini": "Mini",
- "pants": "Pants",
- "pantsProto": "Pants prototype",
- "pocket": "Pocket",
- "strapBack": "Strap back",
- "strapFront": "Strap front",
- "waistbandBack": "Waistband back",
- "waistbandFront": "Waistband front"
- },
- "s": {
- "thisIsNotAPart": "This is not a real part",
- "doNotCutFromFabric": "Do not cut this from the fabric",
- "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric",
- "cutBackPocket.t": "The back pocket is not shown",
- "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingback.t": "The back pocket facing is not shown",
- "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingfront.t": "The front pocket facing is not shown",
- "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandBack.t": "The back waist band is not shown",
- "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandFront.t": "The front waist band is not shown",
- "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapBack.t": "The back strap is not shown",
- "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapFront.t": "The front strap is not shown",
- "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "showPants.t": "The full pants are shown",
- "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.",
- "hidePants.t": "The full pants are not shown",
- "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern."
- },
- "o": {
- "backPocket": {
- "t": "Bolsillo trasero",
- "d": "Si se añade un bolsillo trasero o no"
- },
- "backPocketYes": {
- "t": "Back pocket",
- "d": "The back pocket is included"
- },
- "backPocketNo": {
- "t": "No Back pocket",
- "d": "The pattern is drawn without a back pocket"
- },
- "frontPocket": {
- "t": "Bolsillo delantero",
- "d": "Si se añado un bolsillo frontal o no"
- },
- "frontPocketYes": {
- "t": "Front pocket",
- "d": "The front pocket is included"
- },
- "frontPocketNo": {
- "t": "No Front pocket",
- "d": "The pattern is drawn without a front pocket"
- },
- "hemWidth": {
- "t": "Hem size",
- "d": "Tamaño de la temperatura en la parte inferior de los pantalones"
- },
- "waistbandWidth": {
- "t": "Banda de Waist",
- "d": "Tamaño de la banda de cintura"
- },
- "waistRaise": {
- "t": "Aumento de Waist",
- "d": "Cuánto elevar la cintura a partir de la medición de profundidad del asiento, lo que influye en la profundidad del corte de los cojines."
- },
- "crotchBack": {
- "t": "Retroceso",
- "d": "El porcentaje de la circunstancia del asiento que el cráneo de la espalda tiene que ocupar. Esto crea más o menos espacio entre la costura lateral y la espalda."
- },
- "crotchFront": {
- "t": "Frente de cruz",
- "d": "El porcentaje de la circunstancia del asiento que el cráneo delantero debe ocupar. Esto crea más o menos espacio entre la costura lateral y la parte delantera."
- },
- "crotchFactorBackHor": {
- "t": "Factor Horizontal de espalda",
- "d": "Utilizado para mover la curva del cromo en la parte trasera horizontalmente"
- },
- "crotchFactorBackVer": {
- "t": "Factor horizontal trasero",
- "d": "Utilizado para mover verticalmente la curva de la parte trasera"
- },
- "crotchFactorFrontHor": {
- "t": "Factor horizontal frontal de cromo",
- "d": "Utilizado para mover la curva del cromo en la parte frontal horizontalmente"
- },
- "crotchFactorFrontVer": {
- "t": "Factor vertical delantero de cromo",
- "d": "Utilizado para mover la curva del cromo en el frente verticalmente"
- },
- "waistOverlap": {
- "t": "Superposición de Waist",
- "d": "Esto dicta cuánto quieres que las aletas de las piernas se superpongan a la cintura. Un ajuste de 0 los haría reunirse en la costura lateral y un ajuste de 100 los hace reunirse en la parte delantera/trasera."
- },
- "legSize": {
- "t": "Leg Size",
- "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants."
- },
- "backRaise": {
- "t": "Ataque trasero",
- "d": "Este ajuste levanta la cintura en la espalda. Nuestra cintura no se sienta horizontalmente, sino que está enmarcada en la espalda. Este ajuste le permite levantar esto en la espalda si lo necesita para un buen ajuste."
- },
- "fitWaist": {
- "t": "Fit the garment to the waist",
- "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust."
- },
- "fitWaistNo": {
- "t": "Do not fit the garment to the waist",
- "d": "The traditional wrap pants."
- },
- "fitWaistYes": {
- "t": "Fit the garment to the waist",
- "d": "Adjust the crotch cutout to make the waist fit better."
- },
- "frontPocketStyle": {
- "t": "Front pocket style",
- "d": "A welt pocket, or a pocket hidden in the waistband."
- },
- "frontPocketStyle.welt": {
- "t": "Welt style Front pocket",
- "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap."
- },
- "frontPocketStyle.waistband": {
- "t": "Waistband Front pocket",
- "d": "The front pocket will be hidden in the seam of the waistband."
- },
- "knotPlacement": {
- "t": "Placement of the knot(s)",
- "d": "The knot of the wrap straps can be placed in the front, back, or both front asnd back (traditional)."
- },
- "knotPlacement.front": {
- "t": "Knot in the front",
- "d": "The knot of the wrap straps will be in the front."
- },
- "knotPlacement.back": {
- "t": "Knot in the back",
- "d": "The knot of the wrap straps will be in the back."
- },
- "knotPlacement.traditional": {
- "t": "Knot in the front and back",
- "d": "The knot of the wrap straps will be in the front and the back."
- },
- "separateWaistband": {
- "t": "Create a separate waistband",
- "d": "Create a separate waistband, or have a hem the size of the waistband."
- },
- "separateWaistbandNo": {
- "t": "No separate waistband",
- "d": "The waistband is created by a folded hem."
- },
- "separateWaistbandYes": {
- "t": "Separate waistband",
- "d": "The waistband is a separate piece, and sewn onto the pants."
- }
- }
-}
diff --git a/designs/waralee/i18n/fr.json b/designs/waralee/i18n/fr.json
deleted file mode 100644
index 625906f6132..00000000000
--- a/designs/waralee/i18n/fr.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "t": "Pantalon portefeuille Waralee",
- "d": "Waralee sont des pantalons enveloppés.",
- "p": {
- "backPocket": "Back pocket",
- "cutout": "Cutout",
- "facingBack": "Back Pocket Facing",
- "facingFront": "Front Pocket Facing",
- "mini": "Mini",
- "pants": "Pants",
- "pantsProto": "Pants prototype",
- "pocket": "Pocket",
- "strapBack": "Strap back",
- "strapFront": "Strap front",
- "waistbandBack": "Waistband back",
- "waistbandFront": "Waistband front"
- },
- "s": {
- "thisIsNotAPart": "This is not a real part",
- "doNotCutFromFabric": "Do not cut this from the fabric",
- "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric",
- "cutBackPocket.t": "The back pocket is not shown",
- "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingback.t": "The back pocket facing is not shown",
- "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingfront.t": "The front pocket facing is not shown",
- "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandBack.t": "The back waist band is not shown",
- "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandFront.t": "The front waist band is not shown",
- "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapBack.t": "The back strap is not shown",
- "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapFront.t": "The front strap is not shown",
- "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "showPants.t": "The full pants are shown",
- "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.",
- "hidePants.t": "The full pants are not shown",
- "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern."
- },
- "o": {
- "backPocket": {
- "t": "Poche arrière",
- "d": "S'il faut inclure une poche arrière ou non"
- },
- "backPocketYes": {
- "t": "Back pocket",
- "d": "The back pocket is included"
- },
- "backPocketNo": {
- "t": "No Back pocket",
- "d": "The pattern is drawn without a back pocket"
- },
- "frontPocket": {
- "t": "Poche avant",
- "d": "Inclure ou non des poches avant"
- },
- "frontPocketYes": {
- "t": "Front pocket",
- "d": "The front pocket is included"
- },
- "frontPocketNo": {
- "t": "No Front pocket",
- "d": "The pattern is drawn without a front pocket"
- },
- "hemWidth": {
- "t": "Taille des ourlets",
- "d": "Taille de l'ourlet au bas du pantalon"
- },
- "waistbandWidth": {
- "t": "Ceinture",
- "d": "Taille de la ceinture"
- },
- "waistRaise": {
- "t": "Hauteur de taille",
- "d": "Combien il faut élever la taille de la mesure de hauteur d'assise, ce qui influence la profondeur de la coupe de l'entre-jambe."
- },
- "crotchBack": {
- "t": "Fourche arrière",
- "d": "Le pourcentage de la circonférence d'assise à l'arrière. Cela crée plus ou moins d'espace entre la couture latérale et le dos."
- },
- "crotchFront": {
- "t": "Fourche avant",
- "d": "Le pourcentage de la circonférence d'assise à l'avant. Cela crée plus ou moins d'espace entre la couture latérale et le devant."
- },
- "crotchFactorBackHor": {
- "t": "Reculer la fourche arrière",
- "d": "Utilisé pour déplacer la courbe de la fourche arrière horizontalement"
- },
- "crotchFactorBackVer": {
- "t": "Remonter la fourche arrière",
- "d": "Utilisé pour déplacer la courbe de la fourche arrière verticalement"
- },
- "crotchFactorFrontHor": {
- "t": "Avancer la fourche avant",
- "d": "Utilisé pour déplacer la courbe de la fourche avant horizontalement"
- },
- "crotchFactorFrontVer": {
- "t": "Remonter la fourche avant",
- "d": "Utilisé pour déplacer la courbe de la fourche avant verticalement"
- },
- "waistOverlap": {
- "t": "Chevauchement de la ceinture",
- "d": "Cela indique combien vous voulez que les pans de la jambe se chevauchent à la taille. Un réglage de 0 les ferait rencontrer à la couture latérale, et un cadre de 100 les fait se rencontrer à l'avant/arrière."
- },
- "legSize": {
- "t": "Leg Size",
- "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants."
- },
- "backRaise": {
- "t": "Élévation arrière",
- "d": "Ce réglage lève la taille dans le dos, la taille ne se pose pas horizontalement, mais est inclinée à l'arrière. Ce réglage vous permet de la relever dans le dos si vous en avez besoin pour un bon ajustement."
- },
- "fitWaist": {
- "t": "Fit the garment to the waist",
- "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust."
- },
- "fitWaistNo": {
- "t": "Do not fit the garment to the waist",
- "d": "The traditional wrap pants."
- },
- "fitWaistYes": {
- "t": "Fit the garment to the waist",
- "d": "Adjust the crotch cutout to make the waist fit better."
- },
- "frontPocketStyle": {
- "t": "Front pocket style",
- "d": "A welt pocket, or a pocket hidden in the waistband."
- },
- "frontPocketStyle.welt": {
- "t": "Welt style Front pocket",
- "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap."
- },
- "frontPocketStyle.waistband": {
- "t": "Waistband Front pocket",
- "d": "The front pocket will be hidden in the seam of the waistband."
- },
- "knotPlacement": {
- "t": "Placement of the knot(s)",
- "d": "The knot of the wrap straps can be placed in the front, back, or both front and back (traditional)."
- },
- "knotPlacement.front": {
- "t": "Knot in the front",
- "d": "The knot of the wrap straps will be in the front."
- },
- "knotPlacement.back": {
- "t": "Knot in the back",
- "d": "The knot of the wrap straps will be in the back."
- },
- "knotPlacement.traditional": {
- "t": "Knot in the front and back",
- "d": "The knot of the wrap straps will be in the front and the back."
- },
- "separateWaistband": {
- "t": "Create a separate waistband",
- "d": "Create a separate waistband, or have a hem the size of the waistband."
- },
- "separateWaistbandNo": {
- "t": "No separate waistband",
- "d": "The waistband is created by a folded hem."
- },
- "separateWaistbandYes": {
- "t": "Separate waistband",
- "d": "The waistband is a separate piece, and sewn onto the pants."
- }
- }
-}
diff --git a/designs/waralee/i18n/index.mjs b/designs/waralee/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/waralee/i18n/index.mjs
+++ b/designs/waralee/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/waralee/i18n/nl.json b/designs/waralee/i18n/nl.json
deleted file mode 100644
index e427572ab7d..00000000000
--- a/designs/waralee/i18n/nl.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "t": "Waralee wikkelbroek",
- "d": "Waralee is een wikkelbroek.",
- "p": {
- "backPocket": "Back pocket",
- "cutout": "Cutout",
- "facingBack": "Back Pocket Facing",
- "facingFront": "Front Pocket Facing",
- "mini": "Mini",
- "pants": "Pants",
- "pantsProto": "Pants prototype",
- "pocket": "Pocket",
- "strapBack": "Strap back",
- "strapFront": "Strap front",
- "waistbandBack": "Waistband back",
- "waistbandFront": "Waistband front"
- },
- "s": {
- "thisIsNotAPart": "This is not a real part",
- "doNotCutFromFabric": "Do not cut this from the fabric",
- "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric",
- "cutBackPocket.t": "The back pocket is not shown",
- "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingback.t": "The back pocket facing is not shown",
- "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingfront.t": "The front pocket facing is not shown",
- "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandBack.t": "The back waist band is not shown",
- "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandFront.t": "The front waist band is not shown",
- "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapBack.t": "The back strap is not shown",
- "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapFront.t": "The front strap is not shown",
- "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "showPants.t": "The full pants are shown",
- "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.",
- "hidePants.t": "The full pants are not shown",
- "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern."
- },
- "o": {
- "backPocket": {
- "t": "Achterzak",
- "d": "Of een achterzak moet worden toegevoegd of niet"
- },
- "backPocketYes": {
- "t": "Back pocket",
- "d": "The back pocket is included"
- },
- "backPocketNo": {
- "t": "No Back pocket",
- "d": "The pattern is drawn without a back pocket"
- },
- "frontPocket": {
- "t": "Voorzak",
- "d": "Of een voorzak moet worden toegevoegd of niet"
- },
- "frontPocketYes": {
- "t": "Front pocket",
- "d": "The front pocket is included"
- },
- "frontPocketNo": {
- "t": "No Front pocket",
- "d": "The pattern is drawn without a front pocket"
- },
- "hemWidth": {
- "t": "Afmeting zoom",
- "d": "De afmeting van de zoom onderaan de broek"
- },
- "waistbandWidth": {
- "t": "Tailleband",
- "d": "Grootte van de tailleband"
- },
- "waistRaise": {
- "t": "Hoogte Taille",
- "d": "Hoeveel hoger de taille zit dan de hoogte zitvlak-maat. Dit beïnvloedt de diepte van het kruis."
- },
- "crotchBack": {
- "t": "Kruis achter",
- "d": "Het percentage van de omtrek zitvlak dat je het kruis achteraan nodig heeft. Dit creëert meer of minder ruimte tussen de zijnaad en de middenachternaad."
- },
- "crotchFront": {
- "t": "Kruis Voor",
- "d": "Het percentage van de omtrek zitvlak dat je het kruis vooraan nodig heeft. Dit creëert meer of minder ruimte tussen de zijnaad en de middenvoornaad."
- },
- "crotchFactorBackHor": {
- "t": "Kruis Achter Factor Horizontaal",
- "d": "Wordt gebruikt om de curve van het kruis achteraan horizontaal te verplaatsen"
- },
- "crotchFactorBackVer": {
- "t": "Kruis Achter Factor Verticaal",
- "d": "Wordt gebruikt om de curve van het kruis achteraan verticaal te verplaatsen"
- },
- "crotchFactorFrontHor": {
- "t": "Kruis Voor Factor Horizontaal",
- "d": "Wordt gebruikt om de curve van het kruis vooraan horizontaal te verplaatsen"
- },
- "crotchFactorFrontVer": {
- "t": "Kruis Voor Factor Verticaal",
- "d": "Wordt gebruikt om de curve van het kruis vooraan verticaal te verplaatsen"
- },
- "waistOverlap": {
- "t": "Overlap Taille",
- "d": "Dit bepaalt in hoeverre dat je de beenflappen wil laten overlappen aan de taille. Als je 0 instelt komen ze elkaar tegen ze aan de zijnaad, een instelling van 100 zorgt dat ze aan middenvoor/achter tegen elkaar komen."
- },
- "legSize": {
- "t": "Leg Size",
- "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants."
- },
- "backRaise": {
- "t": "Hoogte Rug",
- "d": "Deze instelling verhoogt de taille in de rug. Onze taille zit niet horizontaal, maar ligt wat hoger in de rug. Deze instelling staat je toe de rug te verhogen als dit nodig is voor een goede pasvorm."
- },
- "fitWaist": {
- "t": "Fit the garment to the waist",
- "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust."
- },
- "fitWaistNo": {
- "t": "Do not fit the garment to the waist",
- "d": "The traditional wrap pants."
- },
- "fitWaistYes": {
- "t": "Fit the garment to the waist",
- "d": "Adjust the crotch cutout to make the waist fit better."
- },
- "frontPocketStyle": {
- "t": "Front pocket style",
- "d": "A welt pocket, or a pocket hidden in the waistband."
- },
- "frontPocketStyle.welt": {
- "t": "Welt style Front pocket",
- "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap."
- },
- "frontPocketStyle.waistband": {
- "t": "Waistband Front pocket",
- "d": "The front pocket will be hidden in the seam of the waistband."
- },
- "knotPlacement": {
- "t": "Placement of the knot(s)",
- "d": "The knot of the wrap straps can be placed in the front, back, or both front and back (traditional)."
- },
- "knotPlacement.front": {
- "t": "Knot in the front",
- "d": "The knot of the wrap straps will be in the front."
- },
- "knotPlacement.back": {
- "t": "Knot in the back",
- "d": "The knot of the wrap straps will be in the back."
- },
- "knotPlacement.traditional": {
- "t": "Knot in the front and back",
- "d": "The knot of the wrap straps will be in the front and the back."
- },
- "separateWaistband": {
- "t": "Create a separate waistband",
- "d": "Create a separate waistband, or have a hem the size of the waistband."
- },
- "separateWaistbandNo": {
- "t": "No separate waistband",
- "d": "The waistband is created by a folded hem."
- },
- "separateWaistbandYes": {
- "t": "Separate waistband",
- "d": "The waistband is a separate piece, and sewn onto the pants."
- }
- }
-}
diff --git a/designs/waralee/i18n/uk.json b/designs/waralee/i18n/uk.json
deleted file mode 100644
index d49578cd86a..00000000000
--- a/designs/waralee/i18n/uk.json
+++ /dev/null
@@ -1,167 +0,0 @@
-{
- "t": "Waralee wrap pants",
- "d": "Waralee are wrap pants.",
- "p": {
- "backPocket": "Back pocket",
- "cutout": "Cutout",
- "facingBack": "Back Pocket Facing",
- "facingFront": "Front Pocket Facing",
- "mini": "Mini",
- "pants": "Pants",
- "pantsProto": "Pants prototype",
- "pocket": "Pocket",
- "strapBack": "Strap back",
- "strapFront": "Strap front",
- "waistbandBack": "Waistband back",
- "waistbandFront": "Waistband front"
- },
- "s": {
- "thisIsNotAPart": "This is not a real part",
- "doNotCutFromFabric": "Do not cut this from the fabric",
- "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric",
- "cutBackPocket.t": "The back pocket is not shown",
- "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingback.t": "The back pocket facing is not shown",
- "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutFacingfront.t": "The front pocket facing is not shown",
- "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandBack.t": "The back waist band is not shown",
- "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutwaistbandFront.t": "The front waist band is not shown",
- "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapBack.t": "The back strap is not shown",
- "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "cutstrapFront.t": "The front strap is not shown",
- "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.",
- "showPants.t": "The full pants are shown",
- "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.",
- "hidePants.t": "The full pants are not shown",
- "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern."
- },
- "o": {
- "backPocket": {
- "t": "Back pocket",
- "d": "Whether to include a back pocket or not"
- },
- "backPocketYes": {
- "t": "Back pocket",
- "d": "The back pocket is included"
- },
- "backPocketNo": {
- "t": "No Back pocket",
- "d": "The pattern is drawn without a back pocket"
- },
- "frontPocket": {
- "t": "Front pocket",
- "d": "Whether to include a front pocket or not"
- },
- "frontPocketYes": {
- "t": "Front pocket",
- "d": "The front pocket is included"
- },
- "frontPocketNo": {
- "t": "No Front pocket",
- "d": "The pattern is drawn without a front pocket"
- },
- "hemWidth": {
- "t": "Hem size",
- "d": "Size of the hem at the bottom of the pants"
- },
- "waistbandWidth": {
- "t": "Waist Band",
- "d": "Size of the waist band"
- },
- "waistRaise": {
- "t": "Waist Raise",
- "d": "How much to raise the waist from the seat depth measurement. This influences the depth of the crotch cut-out."
- },
- "crotchBack": {
- "t": "Crotch Back",
- "d": "The percentage of the seat circumference that the back crotch needs to occupy. This creates more or less space between the side seam and the back."
- },
- "crotchFront": {
- "t": "Crotch Front",
- "d": "The percentage of the seat circumference that the front crotch needs to occupy. This creates more or less space between the side seam and the front."
- },
- "crotchFactorBackHor": {
- "t": "Back Crotch Factor Horizontal",
- "d": "Used to move the curve of the crotch in the back horizontally"
- },
- "crotchFactorBackVer": {
- "t": "Back Crotch Factor Vertical",
- "d": "Used to move the curve of the crotch in the back vertically"
- },
- "crotchFactorFrontHor": {
- "t": "Front Crotch Factor Horizontal",
- "d": "Used to move the curve of the crotch in the front horizontally"
- },
- "crotchFactorFrontVer": {
- "t": "Front Crotch Factor Vertical",
- "d": "Used to move the curve of the crotch in the front vertically"
- },
- "waistOverlap": {
- "t": "Waist Overlap",
- "d": "This dicates how much you want the leg flaps to overlap at the waist. A setting of 0 would have them meet at the side seam, and a setting of 100 makes them meet at the front/back."
- },
- "legSize": {
- "t": "Leg Size",
- "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants."
- },
- "backRaise": {
- "t": "Back Raise",
- "d": "This setting raises the waist in the back. Our waist does not sit horizontally, but is angled up at the back. This setting allows you to raise this in the back if you need it for a good fit."
- },
- "fitWaist": {
- "t": "Fit the garment to the waist",
- "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust."
- },
- "fitWaistNo": {
- "t": "Do not fit the garment to the waist",
- "d": "The traditional wrap pants."
- },
- "fitWaistYes": {
- "t": "Fit the garment to the waist",
- "d": "Adjust the crotch cutout to make the waist fit better."
- },
- "frontPocketStyle": {
- "t": "Front pocket style",
- "d": "A welt pocket, or a pocket hidden in the waistband."
- },
- "frontPocketStyle.welt": {
- "t": "Welt style Front pocket",
- "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap."
- },
- "frontPocketStyle.waistband": {
- "t": "Waistband Front pocket",
- "d": "The front pocket will be hidden in the seam of the waistband."
- },
- "knotPlacement": {
- "t": "Placement of the knot(s)",
- "d": "The knot of the wrap straps can be placed in the front, back, or both front and back (traditional)."
- },
- "knotPlacement.front": {
- "t": "Knot in the front",
- "d": "The knot of the wrap straps will be in the front."
- },
- "knotPlacement.back": {
- "t": "Knot in the back",
- "d": "The knot of the wrap straps will be in the back."
- },
- "knotPlacement.traditional": {
- "t": "Knot in the front and back",
- "d": "The knot of the wrap straps will be in the front and the back."
- },
- "separateWaistband": {
- "t": "Create a separate waistband",
- "d": "Create a separate waistband, or have a hem the size of the waistband."
- },
- "separateWaistbandNo": {
- "t": "No separate waistband",
- "d": "The waistband is created by a folded hem."
- },
- "separateWaistbandYes": {
- "t": "Separate waistband",
- "d": "The waistband is a separate piece, and sewn onto the pants."
- }
- }
-}
diff --git a/designs/waralee/package.json b/designs/waralee/package.json
index 25385295da8..22dd8e01cff 100644
--- a/designs/waralee/package.json
+++ b/designs/waralee/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/waralee",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for wrap pants",
"author": "woutervdub (https://github.com/woutervdub)",
"homepage": "https://freesewing.org/",
@@ -25,48 +25,39 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/waralee/src/index.mjs b/designs/waralee/src/index.mjs
index f0254229a8c..3fe87c3c2eb 100644
--- a/designs/waralee/src/index.mjs
+++ b/designs/waralee/src/index.mjs
@@ -1,5 +1,5 @@
import { Design } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n } from '../i18n/index.mjs'
import { pants } from './pants.mjs'
import { cutout } from './cutout.mjs'
@@ -13,7 +13,7 @@ import { pantsProto } from './pantsproto.mjs'
// Setup our new design
const Waralee = new Design({
- data,
+ data: about,
parts: [
pants,
cutout,
@@ -45,4 +45,5 @@ export {
pantsProto,
Waralee,
i18n,
+ about,
}
diff --git a/designs/waralee/tests/shared.test.mjs b/designs/waralee/tests/shared.test.mjs
index 85ec2d1534b..ed5f4dbb881 100644
--- a/designs/waralee/tests/shared.test.mjs
+++ b/designs/waralee/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Waralee, i18n } from '../src/index.mjs'
+import { Waralee, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Waralee)
+testPatternConfig(Waralee, about)
// Test translation
testPatternI18n(Waralee, i18n)
diff --git a/designs/yuri/README.md b/designs/yuri/README.md
index edf77f757ac..b45fcebcf7a 100644
--- a/designs/yuri/README.md
+++ b/designs/yuri/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/yuri
@@ -59,7 +44,7 @@ A FreeSewing pattern for a fancy zipless sweater based on the Huey hoodie
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/designs/yuri/data.mjs b/designs/yuri/data.mjs
deleted file mode 100644
index 5739249081b..00000000000
--- a/designs/yuri/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/yuri'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/designs/yuri/i18n/de.json b/designs/yuri/i18n/de.json
deleted file mode 100644
index 8ef0e62daa8..00000000000
--- a/designs/yuri/i18n/de.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "t": "Yuri, der Hoodie",
- "d": "Yuri ist ein schicker Cardigan ohne Reißverschluss, basierend auf den Huey & Hugo Hoodies",
- "p": {
- "back": "Back",
- "front": "Front",
- "gusset": "Gusset",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {}
-}
diff --git a/designs/yuri/i18n/es.json b/designs/yuri/i18n/es.json
deleted file mode 100644
index 6616f710610..00000000000
--- a/designs/yuri/i18n/es.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "t": "Yuri, sudadera",
- "d": "Yuri es una elegante sudadera tipo cárdigan sin cremallera, basado en las sudaderas Huey y Hugo",
- "p": {
- "back": "Back",
- "front": "Front",
- "gusset": "Gusset",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {}
-}
diff --git a/designs/yuri/i18n/fr.json b/designs/yuri/i18n/fr.json
deleted file mode 100644
index abe372baf28..00000000000
--- a/designs/yuri/i18n/fr.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "t": "Sweat à capuche Yuri",
- "d": "Yuri est un cardigan chic basé sur les sweats Huey & Hugo",
- "p": {
- "back": "Back",
- "front": "Front",
- "gusset": "Gusset",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {}
-}
diff --git a/designs/yuri/i18n/index.mjs b/designs/yuri/i18n/index.mjs
index 3cb4ad5492b..11028ae01ae 100644
--- a/designs/yuri/i18n/index.mjs
+++ b/designs/yuri/i18n/index.mjs
@@ -1,8 +1,3 @@
import en from './en.json' with { type: 'json' }
-import de from './de.json' with { type: 'json' }
-import es from './es.json' with { type: 'json' }
-import fr from './fr.json' with { type: 'json' }
-import nl from './nl.json' with { type: 'json' }
-import uk from './uk.json' with { type: 'json' }
-export const i18n = { en, de, es, fr, nl, uk }
+export const i18n = { en }
diff --git a/designs/yuri/i18n/nl.json b/designs/yuri/i18n/nl.json
deleted file mode 100644
index eba83b0ce18..00000000000
--- a/designs/yuri/i18n/nl.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "t": "Yuri hoodie",
- "d": "Yuri is een mooie ritsvrije cardigan gebaseerd op de Huey & Hugo hoodies",
- "p": {
- "back": "Back",
- "front": "Front",
- "gusset": "Gusset",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {}
-}
diff --git a/designs/yuri/i18n/uk.json b/designs/yuri/i18n/uk.json
deleted file mode 100644
index d1a56b7fbde..00000000000
--- a/designs/yuri/i18n/uk.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "t": "Yuri hoodie",
- "d": "Yuri is a fancy zipless cardigan based on the Huey & Hugo hoodies",
- "p": {
- "back": "Back",
- "front": "Front",
- "gusset": "Gusset",
- "hoodCenter": "Hood center",
- "hoodSide": "Hood side",
- "sleeve": "Sleeve"
- },
- "s": {},
- "o": {
- "hipsEase": {
- "t": "Hips ease",
- "d": "Controls the amount of ease at the hips"
- }
- }
-}
diff --git a/designs/yuri/package.json b/designs/yuri/package.json
index b82af9de343..c76ea2eecf2 100644
--- a/designs/yuri/package.json
+++ b/designs/yuri/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/yuri",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A FreeSewing pattern for a fancy zipless sweater based on the Huey hoodie",
"author": "biou (https://github.com/biou)",
"homepage": "https://freesewing.org/",
@@ -25,50 +25,41 @@
"sewing pattern"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/**' 'tests/*.mjs'",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "testci": "NODE_OPTIONS=\"--conditions=internal\" npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js"
},
"peerDependencies": {
- "@freesewing/core": "3.3.0-rc.1",
- "@freesewing/brian": "3.3.0-rc.1",
- "@freesewing/plugin-bust": "3.3.0-rc.1"
+ "@freesewing/core": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.4.0",
"chai": "5.1.1",
- "@freesewing/models": "3.3.0-rc.1",
- "@freesewing/plugin-timing": "3.3.0-rc.1"
+ "@freesewing/models": "4.0.0",
+ "@freesewing/plugin-timing": "4.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/designs/yuri/src/back.mjs b/designs/yuri/src/back.mjs
index 3770acf2bb1..e1efdd7fbab 100644
--- a/designs/yuri/src/back.mjs
+++ b/designs/yuri/src/back.mjs
@@ -1,6 +1,6 @@
import { back as brianBack } from '@freesewing/brian'
import { sharedDimensions } from './shared.mjs'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function yuriBack({ store, macro, Path, Point, points, paths, sa, options, measurements, part }) {
// Clear paths from Brian
@@ -106,8 +106,8 @@ export const back = {
options: {
...brianBack.options,
// Overrides
- collarEase: { pct: 20, min: 10, max: 30, menu: 'fit' },
- cuffEase: { pct: 30, min: 20, max: 60, menu: 'fit' },
+ collarEase: { pct: 20, min: 10, max: 30, ...pctBasedOn('neck'), menu: 'fit' },
+ cuffEase: { pct: 30, min: 20, max: 60, ...pctBasedOn('wrist'), menu: 'fit' },
lengthBonus: { pct: 10, min: 5, max: 15, menu: 'fit' },
sleeveLengthBonus: { pct: 1, min: 0, max: 10, menu: 'fit' },
},
diff --git a/designs/yuri/src/front.mjs b/designs/yuri/src/front.mjs
index 3639614eb99..48947caf1d9 100644
--- a/designs/yuri/src/front.mjs
+++ b/designs/yuri/src/front.mjs
@@ -1,6 +1,6 @@
import { front as brianFront } from '@freesewing/brian'
import { sharedDimensions } from './shared.mjs'
-import { hidePresets } from '@freesewing/core'
+import { hidePresets, pctBasedOn } from '@freesewing/core'
function yuriFront({
store,
@@ -117,8 +117,8 @@ export const front = {
options: {
...brianFront.options,
// Overrides
- collarEase: { pct: 20, min: 10, max: 30, menu: 'fit' },
- cuffEase: { pct: 30, min: 20, max: 60, menu: 'fit' },
+ collarEase: { pct: 20, min: 10, max: 30, ...pctBasedOn('neck'), menu: 'fit' },
+ cuffEase: { pct: 30, min: 20, max: 60, ...pctBasedOn('wrist'), menu: 'fit' },
lengthBonus: { pct: 10, min: 5, max: 15, menu: 'fit' },
sleeveLengthBonus: { pct: 1, min: 0, max: 10, menu: 'fit' },
},
diff --git a/designs/yuri/src/index.mjs b/designs/yuri/src/index.mjs
index fd2fb5debc6..5945a37dfea 100644
--- a/designs/yuri/src/index.mjs
+++ b/designs/yuri/src/index.mjs
@@ -1,5 +1,5 @@
import { Design, mergeI18n } from '@freesewing/core'
-import { data } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as yuriI18n } from '../i18n/index.mjs'
import { back } from './back.mjs'
@@ -11,7 +11,7 @@ import { hoodCenter } from './hoodcenter.mjs'
// Setup our new design
const Yuri = new Design({
- data,
+ data: about,
parts: [back, front, sleeve, gusset, hoodSide, hoodCenter],
})
@@ -20,4 +20,4 @@ const i18n = mergeI18n([brianI18n, yuriI18n])
// Named exports
// Named exports
-export { back, front, sleeve, gusset, hoodSide, hoodCenter, Yuri, i18n }
+export { back, front, sleeve, gusset, hoodSide, hoodCenter, Yuri, i18n, about }
diff --git a/designs/yuri/tests/shared.test.mjs b/designs/yuri/tests/shared.test.mjs
index 4edf8bf2ef1..a5c66296162 100644
--- a/designs/yuri/tests/shared.test.mjs
+++ b/designs/yuri/tests/shared.test.mjs
@@ -1,5 +1,5 @@
// This file is auto-generated | Any changes you make will be overwritten.
-import { Yuri, i18n } from '../src/index.mjs'
+import { Yuri, about, i18n } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
@@ -8,7 +8,7 @@ import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
-testPatternConfig(Yuri)
+testPatternConfig(Yuri, about)
// Test translation
testPatternI18n(Yuri, i18n)
diff --git a/i18n/designs.mjs b/i18n/designs.mjs
index 29b5c9ca341..cc709b3067a 100644
--- a/i18n/designs.mjs
+++ b/i18n/designs.mjs
@@ -10,6 +10,7 @@ import { i18n as benjamin } from '@freesewing/benjamin'
import { i18n as bent } from '@freesewing/bent'
import { i18n as bibi } from '@freesewing/bibi'
import { i18n as bob } from '@freesewing/bob'
+import { i18n as bonny } from '@freesewing/bonny'
import { i18n as breanna } from '@freesewing/breanna'
import { i18n as brian } from '@freesewing/brian'
import { i18n as bruce } from '@freesewing/bruce'
@@ -75,6 +76,7 @@ export const designs = {
bent: bent.en,
bibi: bibi.en,
bob: bob.en,
+ bonny: bonny.en,
breanna: breanna.en,
brian: brian.en,
bruce: bruce.en,
diff --git a/lerna.json b/lerna.json
index cf58d6a99c9..2cd63d4d04f 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"npmClient": "yarn",
"command": {
"publish": {
@@ -21,4 +21,4 @@
"plugins/*",
"sites/*"
]
-}
+}
\ No newline at end of file
diff --git a/nx.json b/nx.json
index 3c0327da12c..23ad350bccd 100644
--- a/nx.json
+++ b/nx.json
@@ -1,22 +1,66 @@
{
- "tasksRunnerOptions": {
- "default": {
- "runner": "nx/tasks-runners/default",
- "options": {
- "cacheableOperations": ["build", "wbuild", "build:all"],
- "parallel": 5
- }
- }
- },
+ "$schema": "./node_modules/nx/schemas/nx-schema.json",
"targetDefaults": {
"build": {
- "dependsOn": ["^build", "prebuild"]
+ "outputs": [
+ "{projectRoot}/dist"
+ ],
+ "cache": true
+ },
+ "build:all": {
+ "cache": true
+ },
+ "mbuild": {
+ "cache": true
+ },
+ "symlink": {
+ "cache": true
+ },
+ "test": {
+ "cache": true
+ },
+ "vbuild": {
+ "cache": true
+ },
+ "lint": {
+ "cache": true
+ },
+ "prettier": {
+ "cache": true
+ },
+ "testci": {
+ "cache": true
},
"wbuild": {
- "dependsOn": ["^wbuild", "prewbuild"]
+ "cache": true
},
- "e2e": {
- "dependsOn": ["prebuild"]
+ "wbuild:all": {
+ "cache": true
+ },
+ "report": {
+ "cache": true
+ },
+ "prebuild": {
+ "cache": true
+ },
+ "prewbuild": {
+ "cache": true
+ },
+ "prebuild:all": {
+ "cache": true
+ },
+ "prewbuild:all": {
+ "cache": true
}
- }
-}
+ },
+ "defaultBase": "main",
+ "plugins": [
+ {
+ "plugin": "@nx/eslint/plugin",
+ "options": {
+ "targetName": "eslint:lint"
+ }
+ }
+ ],
+ "nxCloudId": "67582b7f0d03c7a23d467388"
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000000..84db5f9652e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,70333 @@
+{
+ "name": "root",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "root",
+ "version": "0.0.0",
+ "license": "MIT",
+ "workspaces": [
+ "designs/*",
+ "packages/*",
+ "plugins/*",
+ "sites/*"
+ ],
+ "dependencies": {
+ "@babel/eslint-parser": "^7.22.15",
+ "@babel/plugin-syntax-import-assertions": "^7.22.5",
+ "@babel/preset-react": "^7.22.15",
+ "c8": "^10.1.2",
+ "eslint-config-next": "^14.0.1",
+ "glob": "^10.3.10",
+ "rehype-format": "^5.0.0",
+ "rehype-stringify": "^10.0.1",
+ "tlds": "^1.255.0"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^19.0.3",
+ "@commitlint/config-conventional": "^19.0.3",
+ "@nx/eslint": "20.2.1",
+ "all-contributors-cli": "^6.26.1",
+ "axios": "^1.5.1",
+ "chalk": "^4.1.0",
+ "cross-env": "^7.0.2",
+ "eslint": "^8.23.1",
+ "eslint-plugin-jsonc": "^2.4.0",
+ "eslint-plugin-markdown": "^5.0.0",
+ "eslint-plugin-mongo": "^1.0.5",
+ "eslint-plugin-yaml": "^0.5.0",
+ "execa": "^9.3.1",
+ "husky": "^9.0.10",
+ "js-yaml": "^4.0.0",
+ "lerna": "^8.0.0",
+ "lint-staged": "^15.0.1",
+ "mocha": "^10.0.0",
+ "mustache": "^4.0.1",
+ "nx": "20.2.1",
+ "nyc": "^15.1.0",
+ "prettier": "^3.0.0",
+ "pretty-quick": "^4.0.0",
+ "rimraf": "^5.0.0",
+ "standard": "^17.0.0"
+ },
+ "engines": {
+ "node": ">=20.0"
+ }
+ },
+ "designs/aaron": {
+ "name": "@freesewing/aaron",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/aaron/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/aaron/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/aaron/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/aaron/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/aaron/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/aaron/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/aaron/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/aaron/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/aaron/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/aaron/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/aaron/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/aaron/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/aaron/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/aaron/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/aaron/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/aaron/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/aaron/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/aaron/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/aaron/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/aaron/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/aaron/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/aaron/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/aaron/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/aaron/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/albert": {
+ "name": "@freesewing/albert",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/albert/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/albert/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/albert/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/albert/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/albert/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/albert/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/albert/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/albert/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/albert/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/albert/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/albert/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/albert/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/albert/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/albert/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/albert/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/albert/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/albert/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/albert/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/albert/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/albert/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/albert/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/albert/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/albert/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/albert/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bee": {
+ "name": "@freesewing/bee",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/bella": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bee/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bee/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bee/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bee/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bee/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bee/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bee/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bee/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bee/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bee/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bee/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bee/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bee/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bee/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bee/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bee/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bee/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bee/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bee/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bee/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bee/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bee/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bee/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bee/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bella": {
+ "name": "@freesewing/bella",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bella/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bella/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bella/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bella/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bella/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bella/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bella/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bella/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bella/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bella/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bella/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bella/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bella/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bella/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bella/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bella/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bella/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bella/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bella/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bella/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bella/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bella/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bella/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bella/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/benjamin": {
+ "name": "@freesewing/benjamin",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/benjamin/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/benjamin/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/benjamin/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/benjamin/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/benjamin/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/benjamin/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/benjamin/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/benjamin/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/benjamin/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/benjamin/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/benjamin/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/benjamin/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/benjamin/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/benjamin/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/benjamin/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/benjamin/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/benjamin/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/benjamin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/benjamin/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/benjamin/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/benjamin/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/benjamin/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/benjamin/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/benjamin/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bent": {
+ "name": "@freesewing/bent",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/bent/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bent/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bent/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bent/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bent/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bent/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bent/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bent/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bent/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bent/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bent/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bent/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bent/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bent/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bent/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bent/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bent/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bent/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bent/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bent/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bent/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bent/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bent/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bent/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bibi": {
+ "name": "@freesewing/bibi",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bibi/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bibi/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bibi/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bibi/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bibi/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bibi/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bibi/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bibi/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bibi/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bibi/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bibi/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bibi/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bibi/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bibi/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bibi/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bibi/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bibi/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bibi/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bibi/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bibi/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bibi/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bibi/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bibi/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bibi/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bob": {
+ "name": "@freesewing/bob",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bob/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bob/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bob/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bob/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bob/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bob/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bob/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bob/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bob/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bob/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bob/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bob/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bob/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bob/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bob/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bob/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bob/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bob/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bob/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bob/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bob/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bob/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bob/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bonny": {
+ "name": "@freesewing/bonny",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bonny/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bonny/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bonny/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bonny/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bonny/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bonny/node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bonny/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bonny/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bonny/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bonny/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bonny/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bonny/node_modules/mocha": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz",
+ "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bonny/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bonny/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bonny/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bonny/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bonny/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bonny/node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bonny/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bonny/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bonny/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bonny/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/breanna": {
+ "name": "@freesewing/breanna",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/breanna/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/breanna/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/breanna/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/breanna/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/breanna/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/breanna/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/breanna/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/breanna/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/breanna/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/breanna/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/breanna/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/breanna/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/breanna/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/breanna/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/breanna/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/breanna/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/breanna/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/breanna/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/breanna/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/breanna/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/breanna/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/breanna/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/breanna/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/breanna/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/brian": {
+ "name": "@freesewing/brian",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/brian/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/brian/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/brian/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/brian/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/brian/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/brian/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/brian/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/brian/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/brian/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/brian/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/brian/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/brian/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/brian/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/brian/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/brian/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/brian/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/brian/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/brian/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/brian/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/brian/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/brian/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/brian/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/brian/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/brian/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bruce": {
+ "name": "@freesewing/bruce",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/bruce/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/bruce/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/bruce/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/bruce/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/bruce/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/bruce/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/bruce/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bruce/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/bruce/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/bruce/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bruce/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bruce/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bruce/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/bruce/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bruce/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/bruce/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/bruce/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/bruce/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/bruce/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/bruce/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/bruce/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bruce/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bruce/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/bruce/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlita": {
+ "name": "@freesewing/carlita",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/bent": "4.0.0-rc.16",
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/carlton": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/carlita/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/carlita/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/carlita/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/carlita/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/carlita/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/carlita/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/carlita/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlita/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/carlita/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/carlita/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlita/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlita/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlita/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/carlita/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlita/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlita/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/carlita/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/carlita/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/carlita/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/carlita/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/carlita/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlita/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlita/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlita/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlton": {
+ "name": "@freesewing/carlton",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/bent": "4.0.0-rc.16",
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/carlton/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/carlton/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/carlton/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/carlton/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/carlton/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/carlton/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/carlton/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlton/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/carlton/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/carlton/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlton/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlton/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlton/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/carlton/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlton/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/carlton/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/carlton/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/carlton/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/carlton/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/carlton/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/carlton/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlton/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlton/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/carlton/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cathrin": {
+ "name": "@freesewing/cathrin",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/cathrin/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/cathrin/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/cathrin/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/cathrin/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/cathrin/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/cathrin/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/cathrin/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cathrin/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/cathrin/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/cathrin/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cathrin/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cathrin/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cathrin/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/cathrin/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cathrin/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cathrin/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/cathrin/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/cathrin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/cathrin/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/cathrin/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/cathrin/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cathrin/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cathrin/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cathrin/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/charlie": {
+ "name": "@freesewing/charlie",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16",
+ "@freesewing/titan": "4.0.0-rc.16"
+ }
+ },
+ "designs/charlie/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/charlie/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/charlie/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/charlie/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/charlie/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/charlie/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/charlie/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/charlie/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/charlie/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/charlie/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/charlie/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/charlie/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/charlie/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/charlie/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/charlie/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/charlie/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/charlie/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/charlie/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/charlie/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/charlie/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/charlie/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/charlie/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/charlie/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/charlie/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cornelius": {
+ "name": "@freesewing/cornelius",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/cornelius/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/cornelius/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/cornelius/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/cornelius/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/cornelius/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/cornelius/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/cornelius/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cornelius/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/cornelius/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/cornelius/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cornelius/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cornelius/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cornelius/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/cornelius/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cornelius/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/cornelius/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/cornelius/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/cornelius/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/cornelius/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/cornelius/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/cornelius/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cornelius/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cornelius/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/cornelius/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/diana": {
+ "name": "@freesewing/diana",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/diana/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/diana/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/diana/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/diana/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/diana/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/diana/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/diana/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/diana/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/diana/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/diana/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/diana/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/diana/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/diana/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/diana/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/diana/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/diana/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/diana/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/diana/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/diana/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/diana/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/diana/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/diana/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/diana/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/diana/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/examples": {
+ "name": "@freesewing/examples",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-gore": "4.0.0-rc.16"
+ }
+ },
+ "designs/examples/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/examples/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/examples/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/examples/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/examples/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/examples/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/examples/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/examples/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/examples/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/examples/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/examples/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/examples/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/examples/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/examples/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/examples/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/examples/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/examples/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/examples/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/examples/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/examples/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/examples/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/examples/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/examples/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/examples/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florence": {
+ "name": "@freesewing/florence",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/florence/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/florence/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/florence/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/florence/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/florence/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/florence/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/florence/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florence/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/florence/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/florence/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florence/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florence/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florence/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/florence/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florence/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florence/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/florence/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/florence/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/florence/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/florence/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/florence/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florence/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florence/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florence/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florent": {
+ "name": "@freesewing/florent",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/florent/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/florent/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/florent/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/florent/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/florent/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/florent/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/florent/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florent/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/florent/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/florent/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florent/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florent/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florent/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/florent/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florent/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/florent/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/florent/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/florent/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/florent/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/florent/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/florent/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florent/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florent/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/florent/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/gozer": {
+ "name": "@freesewing/gozer",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/gozer/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/gozer/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/gozer/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/gozer/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/gozer/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/gozer/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/gozer/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/gozer/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/gozer/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/gozer/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/gozer/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/gozer/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/gozer/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/gozer/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/gozer/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/gozer/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/gozer/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/gozer/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/gozer/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/gozer/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/gozer/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/gozer/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/gozer/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/gozer/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hi": {
+ "name": "@freesewing/hi",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/hi/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/hi/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/hi/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/hi/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/hi/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/hi/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/hi/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hi/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/hi/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/hi/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hi/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hi/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hi/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/hi/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hi/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hi/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/hi/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/hi/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/hi/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/hi/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/hi/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hi/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hi/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hi/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/holmes": {
+ "name": "@freesewing/holmes",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@freesewing/plugin-gore": "4.0.0-rc.16"
+ },
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/holmes/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/holmes/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/holmes/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/holmes/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/holmes/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/holmes/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/holmes/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/holmes/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/holmes/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/holmes/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/holmes/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/holmes/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/holmes/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/holmes/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/holmes/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/holmes/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/holmes/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/holmes/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/holmes/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/holmes/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/holmes/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/holmes/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/holmes/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/holmes/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hortensia": {
+ "name": "@freesewing/hortensia",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/hortensia/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/hortensia/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/hortensia/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/hortensia/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/hortensia/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/hortensia/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/hortensia/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hortensia/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/hortensia/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/hortensia/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hortensia/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hortensia/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hortensia/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/hortensia/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hortensia/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hortensia/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/hortensia/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/hortensia/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/hortensia/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/hortensia/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/hortensia/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hortensia/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hortensia/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hortensia/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/huey": {
+ "name": "@freesewing/huey",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/huey/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/huey/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/huey/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/huey/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/huey/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/huey/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/huey/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/huey/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/huey/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/huey/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/huey/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/huey/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/huey/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/huey/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/huey/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/huey/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/huey/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/huey/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/huey/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/huey/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/huey/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/huey/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/huey/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/huey/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hugo": {
+ "name": "@freesewing/hugo",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/hugo/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/hugo/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/hugo/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/hugo/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/hugo/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/hugo/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/hugo/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hugo/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/hugo/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/hugo/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hugo/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hugo/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hugo/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/hugo/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hugo/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/hugo/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/hugo/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/hugo/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/hugo/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/hugo/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/hugo/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hugo/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hugo/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/hugo/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jaeger": {
+ "name": "@freesewing/jaeger",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/bent": "4.0.0-rc.16",
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/jaeger/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/jaeger/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/jaeger/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/jaeger/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/jaeger/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/jaeger/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/jaeger/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jaeger/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/jaeger/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/jaeger/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jaeger/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jaeger/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jaeger/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/jaeger/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jaeger/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jaeger/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/jaeger/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/jaeger/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/jaeger/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/jaeger/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/jaeger/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jaeger/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jaeger/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jaeger/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jane": {
+ "name": "@freesewing/jane",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/jane/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/jane/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/jane/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/jane/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/jane/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/jane/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/jane/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jane/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/jane/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/jane/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jane/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jane/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jane/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/jane/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jane/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/jane/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/jane/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/jane/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/jane/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/jane/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/jane/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jane/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jane/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/jane/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/legend": {
+ "name": "@freesewing/legend",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/legend/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/legend/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/legend/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/legend/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/legend/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/legend/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/legend/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/legend/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/legend/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/legend/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/legend/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/legend/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/legend/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/legend/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/legend/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/legend/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/legend/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/legend/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/legend/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/legend/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/legend/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/legend/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/legend/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/legend/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lily": {
+ "name": "@freesewing/lily",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/paco": "4.0.0-rc.16",
+ "@freesewing/titan": "4.0.0-rc.16"
+ }
+ },
+ "designs/lily/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/lily/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/lily/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/lily/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/lily/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/lily/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/lily/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lily/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/lily/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/lily/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lily/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lily/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lily/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/lily/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lily/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lily/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/lily/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/lily/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/lily/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/lily/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/lily/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lily/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lily/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lily/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lucy": {
+ "name": "@freesewing/lucy",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/lucy/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/lucy/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/lucy/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/lucy/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/lucy/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/lucy/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/lucy/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lucy/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/lucy/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/lucy/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lucy/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lucy/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lucy/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/lucy/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lucy/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lucy/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/lucy/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/lucy/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/lucy/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/lucy/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/lucy/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lucy/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lucy/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lucy/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumina": {
+ "name": "@freesewing/lumina",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/lumina/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/lumina/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/lumina/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/lumina/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/lumina/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/lumina/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/lumina/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumina/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/lumina/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/lumina/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumina/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumina/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumina/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/lumina/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumina/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumina/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/lumina/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/lumina/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/lumina/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/lumina/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/lumina/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumina/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumina/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumina/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumira": {
+ "name": "@freesewing/lumira",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/lumira/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/lumira/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/lumira/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/lumira/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/lumira/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/lumira/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/lumira/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumira/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/lumira/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/lumira/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumira/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumira/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumira/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/lumira/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumira/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lumira/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/lumira/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/lumira/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/lumira/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/lumira/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/lumira/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumira/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumira/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lumira/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lunetius": {
+ "name": "@freesewing/lunetius",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/lunetius/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/lunetius/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/lunetius/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/lunetius/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/lunetius/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/lunetius/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/lunetius/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lunetius/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/lunetius/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/lunetius/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lunetius/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lunetius/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lunetius/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/lunetius/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lunetius/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/lunetius/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/lunetius/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/lunetius/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/lunetius/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/lunetius/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/lunetius/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lunetius/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lunetius/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/lunetius/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/magde": {
+ "name": "@freesewing/magde",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/magde/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/magde/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/magde/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/magde/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/magde/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/magde/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/magde/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/magde/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/magde/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/magde/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/magde/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/magde/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/magde/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/magde/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/magde/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/magde/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/magde/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/magde/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/magde/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/magde/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/magde/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/magde/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/magde/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/magde/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/noble": {
+ "name": "@freesewing/noble",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/bella": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/noble/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/noble/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/noble/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/noble/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/noble/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/noble/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/noble/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/noble/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/noble/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/noble/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/noble/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/noble/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/noble/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/noble/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/noble/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/noble/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/noble/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/noble/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/noble/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/noble/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/noble/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/noble/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/noble/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/noble/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/octoplushy": {
+ "name": "@freesewing/octoplushy",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/octoplushy/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/octoplushy/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/octoplushy/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/octoplushy/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/octoplushy/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/octoplushy/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/octoplushy/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/octoplushy/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/octoplushy/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/octoplushy/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/octoplushy/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/octoplushy/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/octoplushy/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/octoplushy/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/octoplushy/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/octoplushy/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/octoplushy/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/octoplushy/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/octoplushy/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/octoplushy/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/octoplushy/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/octoplushy/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/octoplushy/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/octoplushy/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/onyx": {
+ "name": "@freesewing/onyx",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/onyx/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/onyx/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/onyx/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/onyx/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/onyx/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/onyx/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/onyx/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/onyx/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/onyx/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/onyx/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/onyx/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/onyx/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/onyx/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/onyx/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/onyx/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/onyx/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/onyx/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/onyx/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/onyx/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/onyx/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/onyx/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/onyx/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/onyx/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/onyx/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/opal": {
+ "name": "@freesewing/opal",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/opal/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/opal/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/opal/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/opal/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/opal/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/opal/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/opal/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/opal/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/opal/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/opal/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/opal/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/opal/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/opal/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/opal/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/opal/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/opal/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/opal/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/opal/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/opal/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/opal/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/opal/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/opal/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/opal/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/opal/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/otis": {
+ "name": "@freesewing/otis",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/otis/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/otis/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/otis/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/otis/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/otis/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/otis/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/otis/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/otis/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/otis/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/otis/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/otis/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/otis/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/otis/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/otis/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/otis/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/otis/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/otis/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/otis/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/otis/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/otis/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/otis/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/otis/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/otis/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/otis/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/paco": {
+ "name": "@freesewing/paco",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16",
+ "@freesewing/titan": "4.0.0-rc.16"
+ }
+ },
+ "designs/paco/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/paco/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/paco/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/paco/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/paco/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/paco/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/paco/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/paco/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/paco/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/paco/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/paco/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/paco/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/paco/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/paco/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/paco/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/paco/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/paco/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/paco/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/paco/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/paco/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/paco/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/paco/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/paco/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/paco/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/penelope": {
+ "name": "@freesewing/penelope",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/penelope/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/penelope/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/penelope/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/penelope/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/penelope/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/penelope/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/penelope/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/penelope/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/penelope/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/penelope/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/penelope/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/penelope/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/penelope/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/penelope/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/penelope/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/penelope/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/penelope/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/penelope/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/penelope/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/penelope/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/penelope/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/penelope/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/penelope/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/penelope/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/plugintest": {
+ "name": "@freesewing/plugintest",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-annotations": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16",
+ "@freesewing/plugin-flip": "4.0.0-rc.16",
+ "@freesewing/plugin-gore": "4.0.0-rc.16",
+ "@freesewing/plugin-i18n": "4.0.0-rc.16",
+ "@freesewing/plugin-measurements": "4.0.0-rc.16",
+ "@freesewing/plugin-mirror": "4.0.0-rc.16",
+ "@freesewing/plugin-round": "4.0.0-rc.16",
+ "@freesewing/plugin-sprinkle": "4.0.0-rc.16",
+ "@freesewing/plugin-svgattr": "4.0.0-rc.16",
+ "@freesewing/plugin-theme": "4.0.0-rc.16"
+ }
+ },
+ "designs/plugintest/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/plugintest/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/plugintest/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/plugintest/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/plugintest/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/plugintest/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/plugintest/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/plugintest/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/plugintest/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/plugintest/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/plugintest/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/plugintest/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/plugintest/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/plugintest/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/plugintest/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/plugintest/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/plugintest/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/plugintest/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/plugintest/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/plugintest/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/plugintest/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/plugintest/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/plugintest/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/plugintest/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/rendertest": {
+ "name": "@freesewing/rendertest",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/rendertest/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/rendertest/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/rendertest/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/rendertest/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/rendertest/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/rendertest/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/rendertest/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/rendertest/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/rendertest/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/rendertest/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/rendertest/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/rendertest/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/rendertest/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/rendertest/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/rendertest/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/rendertest/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/rendertest/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/rendertest/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/rendertest/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/rendertest/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/rendertest/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/rendertest/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/rendertest/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/rendertest/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sandy": {
+ "name": "@freesewing/sandy",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@freesewing/plugin-ringsector": "4.0.0-rc.16"
+ },
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16"
+ }
+ },
+ "designs/sandy/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/sandy/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/sandy/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/sandy/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/sandy/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/sandy/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/sandy/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sandy/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/sandy/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/sandy/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sandy/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sandy/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sandy/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/sandy/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sandy/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sandy/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/sandy/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/sandy/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/sandy/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/sandy/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/sandy/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sandy/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sandy/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sandy/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shelly": {
+ "name": "@freesewing/shelly",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/shelly/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/shelly/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/shelly/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/shelly/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/shelly/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/shelly/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/shelly/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shelly/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/shelly/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/shelly/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shelly/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shelly/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shelly/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/shelly/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shelly/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shelly/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/shelly/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/shelly/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/shelly/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/shelly/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/shelly/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shelly/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shelly/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shelly/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shin": {
+ "name": "@freesewing/shin",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16"
+ }
+ },
+ "designs/shin/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/shin/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/shin/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/shin/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/shin/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/shin/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/shin/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shin/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/shin/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/shin/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shin/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shin/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shin/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/shin/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shin/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/shin/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/shin/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/shin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/shin/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/shin/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/shin/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shin/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shin/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/shin/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simon": {
+ "name": "@freesewing/simon",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16",
+ "@freesewing/plugin-flip": "4.0.0-rc.16"
+ }
+ },
+ "designs/simon/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/simon/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/simon/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/simon/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/simon/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/simon/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/simon/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simon/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/simon/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/simon/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simon/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simon/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simon/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/simon/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simon/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simon/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/simon/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/simon/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/simon/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/simon/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/simon/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simon/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simon/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simon/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simone": {
+ "name": "@freesewing/simone",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16",
+ "@freesewing/plugin-flip": "4.0.0-rc.16",
+ "@freesewing/simon": "4.0.0-rc.16"
+ }
+ },
+ "designs/simone/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/simone/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/simone/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/simone/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/simone/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/simone/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/simone/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simone/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/simone/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/simone/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simone/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simone/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simone/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/simone/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simone/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/simone/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/simone/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/simone/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/simone/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/simone/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/simone/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simone/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simone/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/simone/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/skully": {
+ "name": "@freesewing/skully",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/skully/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/skully/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/skully/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/skully/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/skully/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/skully/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/skully/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/skully/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/skully/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/skully/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/skully/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/skully/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/skully/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/skully/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/skully/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/skully/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/skully/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/skully/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/skully/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/skully/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/skully/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/skully/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/skully/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/skully/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sven": {
+ "name": "@freesewing/sven",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/sven/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/sven/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/sven/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/sven/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/sven/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/sven/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/sven/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sven/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/sven/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/sven/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sven/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sven/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sven/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/sven/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sven/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/sven/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/sven/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/sven/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/sven/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/sven/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/sven/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sven/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sven/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/sven/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tamiko": {
+ "name": "@freesewing/tamiko",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/tamiko/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/tamiko/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/tamiko/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/tamiko/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/tamiko/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/tamiko/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/tamiko/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tamiko/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/tamiko/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/tamiko/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tamiko/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tamiko/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tamiko/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/tamiko/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tamiko/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tamiko/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/tamiko/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/tamiko/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/tamiko/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/tamiko/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/tamiko/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tamiko/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tamiko/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tamiko/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/teagan": {
+ "name": "@freesewing/teagan",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/teagan/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/teagan/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/teagan/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/teagan/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/teagan/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/teagan/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/teagan/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/teagan/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/teagan/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/teagan/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/teagan/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/teagan/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/teagan/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/teagan/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/teagan/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/teagan/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/teagan/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/teagan/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/teagan/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/teagan/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/teagan/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/teagan/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/teagan/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/teagan/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tiberius": {
+ "name": "@freesewing/tiberius",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/tiberius/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/tiberius/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/tiberius/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/tiberius/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/tiberius/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/tiberius/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/tiberius/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tiberius/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/tiberius/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/tiberius/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tiberius/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tiberius/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tiberius/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/tiberius/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tiberius/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tiberius/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/tiberius/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/tiberius/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/tiberius/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/tiberius/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/tiberius/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tiberius/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tiberius/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tiberius/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/titan": {
+ "name": "@freesewing/titan",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16"
+ }
+ },
+ "designs/titan/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/titan/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/titan/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/titan/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/titan/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/titan/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/titan/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/titan/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/titan/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/titan/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/titan/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/titan/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/titan/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/titan/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/titan/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/titan/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/titan/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/titan/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/titan/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/titan/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/titan/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/titan/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/titan/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/titan/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/trayvon": {
+ "name": "@freesewing/trayvon",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16"
+ }
+ },
+ "designs/trayvon/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/trayvon/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/trayvon/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/trayvon/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/trayvon/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/trayvon/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/trayvon/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/trayvon/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/trayvon/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/trayvon/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/trayvon/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/trayvon/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/trayvon/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/trayvon/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/trayvon/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/trayvon/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/trayvon/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/trayvon/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/trayvon/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/trayvon/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/trayvon/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/trayvon/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/trayvon/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/trayvon/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tristan": {
+ "name": "@freesewing/tristan",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/tristan/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/tristan/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/tristan/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/tristan/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/tristan/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/tristan/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/tristan/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tristan/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/tristan/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/tristan/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tristan/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tristan/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tristan/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/tristan/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tristan/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/tristan/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/tristan/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/tristan/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/tristan/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/tristan/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/tristan/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tristan/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tristan/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/tristan/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/uma": {
+ "name": "@freesewing/uma",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/uma/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/uma/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/uma/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/uma/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/uma/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/uma/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/uma/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/uma/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/uma/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/uma/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/uma/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/uma/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/uma/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/uma/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/uma/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/uma/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/uma/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/uma/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/uma/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/uma/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/uma/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/uma/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/uma/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/uma/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/umbra": {
+ "name": "@freesewing/umbra",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/umbra/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/umbra/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/umbra/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/umbra/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/umbra/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/umbra/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/umbra/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/umbra/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/umbra/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/umbra/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/umbra/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/umbra/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/umbra/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/umbra/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/umbra/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/umbra/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/umbra/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/umbra/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/umbra/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/umbra/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/umbra/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/umbra/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/umbra/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/umbra/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/wahid": {
+ "name": "@freesewing/wahid",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/wahid/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/wahid/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/wahid/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/wahid/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/wahid/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/wahid/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/wahid/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/wahid/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/wahid/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/wahid/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/wahid/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/wahid/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/wahid/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/wahid/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/wahid/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/wahid/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/wahid/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/wahid/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/wahid/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/wahid/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/wahid/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/wahid/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/wahid/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/wahid/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/walburga": {
+ "name": "@freesewing/walburga",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/walburga/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/walburga/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/walburga/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/walburga/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/walburga/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/walburga/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/walburga/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/walburga/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/walburga/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/walburga/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/walburga/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/walburga/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/walburga/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/walburga/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/walburga/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/walburga/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/walburga/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/walburga/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/walburga/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/walburga/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/walburga/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/walburga/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/walburga/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/walburga/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/waralee": {
+ "name": "@freesewing/waralee",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "designs/waralee/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/waralee/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/waralee/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/waralee/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/waralee/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/waralee/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/waralee/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/waralee/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/waralee/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/waralee/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/waralee/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/waralee/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/waralee/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/waralee/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/waralee/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/waralee/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/waralee/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/waralee/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/waralee/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/waralee/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/waralee/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/waralee/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/waralee/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/waralee/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/yuri": {
+ "name": "@freesewing/yuri",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "@freesewing/models": "4.0.0-rc.16",
+ "@freesewing/plugin-timing": "4.0.0-rc.16",
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16"
+ }
+ },
+ "designs/yuri/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "designs/yuri/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "designs/yuri/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "designs/yuri/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "designs/yuri/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "designs/yuri/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "designs/yuri/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/yuri/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "designs/yuri/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "designs/yuri/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/yuri/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/yuri/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/yuri/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "designs/yuri/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/yuri/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "designs/yuri/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "designs/yuri/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "designs/yuri/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "designs/yuri/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "designs/yuri/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "designs/yuri/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/yuri/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/yuri/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "designs/yuri/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz",
+ "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.17.9",
+ "@algolia/autocomplete-shared": "1.17.9"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz",
+ "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.9"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz",
+ "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.9"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.17.9",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz",
+ "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.3.tgz",
+ "integrity": "sha512-wPOzHYSsW+H97JkBLmnlOdJSpbb9mIiuNPycUCV5DgzSkJFaI/OFxXfZXAh1gqxK+hf0miKue1C9bltjWljrNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.3.tgz",
+ "integrity": "sha512-XE3iduH9lA7iTQacDGofBQyIyIgaX8qbTRRdj1bOCmfzc9b98CoiMwhNwdTifmmMewmN0EhVF3hP8KjKWwX7Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.3.tgz",
+ "integrity": "sha512-IYRd/A/R3BXeaQVT2805lZEdWo54v39Lqa7ABOxIYnUvX2vvOMW1AyzCuT0U7Q+uPdD4UW48zksUKRixShcWxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-insights": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.3.tgz",
+ "integrity": "sha512-QGc/bmDUBgzB71rDL6kihI2e1Mx6G6PxYO5Ks84iL3tDcIel1aFuxtRF14P8saGgdIe1B6I6QkpkeIddZ6vWQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.3.tgz",
+ "integrity": "sha512-zuM31VNPDJ1LBIwKbYGz/7+CSm+M8EhlljDamTg8AnDilnCpKjBebWZR5Tftv/FdWSro4tnYGOIz1AURQgZ+tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.3.tgz",
+ "integrity": "sha512-Nn872PuOI8qzi1bxMMhJ0t2AzVBqN01jbymBQOkypvZHrrjZPso3iTpuuLLo9gi3yc/08vaaWTAwJfPhxPwJUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.3.tgz",
+ "integrity": "sha512-9+Fm1ahV8/2goSIPIqZnVitV5yHW5E5xTdKy33xnqGd45A9yVv5tTkudWzEXsbfBB47j9Xb3uYPZjAvV5RHbKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/events": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz",
+ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==",
+ "license": "MIT"
+ },
+ "node_modules/@algolia/ingestion": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.3.tgz",
+ "integrity": "sha512-5GHNTiZ3saLjTNyr6WkP5hzDg2eFFAYWomvPcm9eHWskjzXt8R0IOiW9kkTS6I6hXBwN5H9Zna5mZDSqqJdg+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/monitoring": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.3.tgz",
+ "integrity": "sha512-KUWQbTPoRjP37ivXSQ1+lWMfaifCCMzTnEcEnXwAmherS5Tp7us6BAqQDMGOD4E7xyaS2I8pto6WlOzxH+CxmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.3.tgz",
+ "integrity": "sha512-oo/gG77xTTTclkrdFem0Kmx5+iSRFiwuRRdxZETDjwzCI7svutdbwBgV/Vy4D4QpYaX4nhY/P43k84uEowCE4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.3.tgz",
+ "integrity": "sha512-BkkW7otbiI/Er1AiEPZs1h7lxbtSO9p09jFhv3/iT8/0Yz0CY79VJ9iq+Wv1+dq/l0OxnMpBy8mozrieGA3mXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.3.tgz",
+ "integrity": "sha512-eAVlXz7UNzTsA1EDr+p0nlIH7WFxo7k3NMxYe8p38DH8YVWLgm2MgOVFUMNg9HCi6ZNOi/A2w/id2ZZ4sKgUOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.3.tgz",
+ "integrity": "sha512-FqR3pQPfHfQyX1wgcdK6iyqu86yP76MZd4Pzj1y/YLMj9rRmRCY0E0AffKr//nrOFEwv6uY8BQY4fd9/6b0ZCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+ "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+ "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^3.0.0",
+ "@aws-crypto/sha256-js": "^3.0.0",
+ "@aws-crypto/supports-web-crypto": "^3.0.0",
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+ "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+ "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+ "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-sdk/client-sesv2": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.592.0.tgz",
+ "integrity": "sha512-EisiJXX3oojiZeSUeEAcTF2/7VX6qY8+r3PGzEaodvvZkhCRpduKLToZvtrvDZU1IG5mqzins6QXGkJRmqEG/A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sso-oidc": "3.592.0",
+ "@aws-sdk/client-sts": "3.592.0",
+ "@aws-sdk/core": "3.592.0",
+ "@aws-sdk/credential-provider-node": "3.592.0",
+ "@aws-sdk/middleware-host-header": "3.577.0",
+ "@aws-sdk/middleware-logger": "3.577.0",
+ "@aws-sdk/middleware-recursion-detection": "3.577.0",
+ "@aws-sdk/middleware-user-agent": "3.587.0",
+ "@aws-sdk/region-config-resolver": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@aws-sdk/util-endpoints": "3.587.0",
+ "@aws-sdk/util-user-agent-browser": "3.577.0",
+ "@aws-sdk/util-user-agent-node": "3.587.0",
+ "@smithy/config-resolver": "^3.0.1",
+ "@smithy/core": "^2.2.0",
+ "@smithy/fetch-http-handler": "^3.0.1",
+ "@smithy/hash-node": "^3.0.0",
+ "@smithy/invalid-dependency": "^3.0.0",
+ "@smithy/middleware-content-length": "^3.0.0",
+ "@smithy/middleware-endpoint": "^3.0.1",
+ "@smithy/middleware-retry": "^3.0.3",
+ "@smithy/middleware-serde": "^3.0.0",
+ "@smithy/middleware-stack": "^3.0.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/node-http-handler": "^3.0.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "@smithy/url-parser": "^3.0.0",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.3",
+ "@smithy/util-defaults-mode-node": "^3.0.3",
+ "@smithy/util-endpoints": "^2.0.1",
+ "@smithy/util-middleware": "^3.0.0",
+ "@smithy/util-retry": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.592.0.tgz",
+ "integrity": "sha512-w+SuW47jQqvOC7fonyjFjsOh3yjqJ+VpWdVrmrl0E/KryBE7ho/Wn991Buf/EiHHeJikoWgHsAIPkBH29+ntdA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.592.0",
+ "@aws-sdk/middleware-host-header": "3.577.0",
+ "@aws-sdk/middleware-logger": "3.577.0",
+ "@aws-sdk/middleware-recursion-detection": "3.577.0",
+ "@aws-sdk/middleware-user-agent": "3.587.0",
+ "@aws-sdk/region-config-resolver": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@aws-sdk/util-endpoints": "3.587.0",
+ "@aws-sdk/util-user-agent-browser": "3.577.0",
+ "@aws-sdk/util-user-agent-node": "3.587.0",
+ "@smithy/config-resolver": "^3.0.1",
+ "@smithy/core": "^2.2.0",
+ "@smithy/fetch-http-handler": "^3.0.1",
+ "@smithy/hash-node": "^3.0.0",
+ "@smithy/invalid-dependency": "^3.0.0",
+ "@smithy/middleware-content-length": "^3.0.0",
+ "@smithy/middleware-endpoint": "^3.0.1",
+ "@smithy/middleware-retry": "^3.0.3",
+ "@smithy/middleware-serde": "^3.0.0",
+ "@smithy/middleware-stack": "^3.0.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/node-http-handler": "^3.0.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "@smithy/url-parser": "^3.0.0",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.3",
+ "@smithy/util-defaults-mode-node": "^3.0.3",
+ "@smithy/util-endpoints": "^2.0.1",
+ "@smithy/util-middleware": "^3.0.0",
+ "@smithy/util-retry": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.592.0.tgz",
+ "integrity": "sha512-11Zvm8nm0s/UF3XCjzFRpQU+8FFVW5rcr3BHfnH6xAe5JEoN6bJN/n+wOfnElnjek+90hh+Qc7s141AMrCjiiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.592.0",
+ "@aws-sdk/core": "3.592.0",
+ "@aws-sdk/credential-provider-node": "3.592.0",
+ "@aws-sdk/middleware-host-header": "3.577.0",
+ "@aws-sdk/middleware-logger": "3.577.0",
+ "@aws-sdk/middleware-recursion-detection": "3.577.0",
+ "@aws-sdk/middleware-user-agent": "3.587.0",
+ "@aws-sdk/region-config-resolver": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@aws-sdk/util-endpoints": "3.587.0",
+ "@aws-sdk/util-user-agent-browser": "3.577.0",
+ "@aws-sdk/util-user-agent-node": "3.587.0",
+ "@smithy/config-resolver": "^3.0.1",
+ "@smithy/core": "^2.2.0",
+ "@smithy/fetch-http-handler": "^3.0.1",
+ "@smithy/hash-node": "^3.0.0",
+ "@smithy/invalid-dependency": "^3.0.0",
+ "@smithy/middleware-content-length": "^3.0.0",
+ "@smithy/middleware-endpoint": "^3.0.1",
+ "@smithy/middleware-retry": "^3.0.3",
+ "@smithy/middleware-serde": "^3.0.0",
+ "@smithy/middleware-stack": "^3.0.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/node-http-handler": "^3.0.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "@smithy/url-parser": "^3.0.0",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.3",
+ "@smithy/util-defaults-mode-node": "^3.0.3",
+ "@smithy/util-endpoints": "^2.0.1",
+ "@smithy/util-middleware": "^3.0.0",
+ "@smithy/util-retry": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.592.0.tgz",
+ "integrity": "sha512-KUrOdszZfcrlpKr4dpdkGibZ/qq3Lnfu1rjv1U+V1QJQ9OuMo9J3sDWpWV9tigNqY0aGllarWH5cJbz9868W/w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sso-oidc": "3.592.0",
+ "@aws-sdk/core": "3.592.0",
+ "@aws-sdk/credential-provider-node": "3.592.0",
+ "@aws-sdk/middleware-host-header": "3.577.0",
+ "@aws-sdk/middleware-logger": "3.577.0",
+ "@aws-sdk/middleware-recursion-detection": "3.577.0",
+ "@aws-sdk/middleware-user-agent": "3.587.0",
+ "@aws-sdk/region-config-resolver": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@aws-sdk/util-endpoints": "3.587.0",
+ "@aws-sdk/util-user-agent-browser": "3.577.0",
+ "@aws-sdk/util-user-agent-node": "3.587.0",
+ "@smithy/config-resolver": "^3.0.1",
+ "@smithy/core": "^2.2.0",
+ "@smithy/fetch-http-handler": "^3.0.1",
+ "@smithy/hash-node": "^3.0.0",
+ "@smithy/invalid-dependency": "^3.0.0",
+ "@smithy/middleware-content-length": "^3.0.0",
+ "@smithy/middleware-endpoint": "^3.0.1",
+ "@smithy/middleware-retry": "^3.0.3",
+ "@smithy/middleware-serde": "^3.0.0",
+ "@smithy/middleware-stack": "^3.0.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/node-http-handler": "^3.0.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "@smithy/url-parser": "^3.0.0",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-body-length-node": "^3.0.0",
+ "@smithy/util-defaults-mode-browser": "^3.0.3",
+ "@smithy/util-defaults-mode-node": "^3.0.3",
+ "@smithy/util-endpoints": "^2.0.1",
+ "@smithy/util-middleware": "^3.0.0",
+ "@smithy/util-retry": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/core": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.592.0.tgz",
+ "integrity": "sha512-gLPMXR/HXDP+9gXAt58t7gaMTvRts9i6Q7NMISpkGF54wehskl5WGrbdtHJFylrlJ5BQo3XVY6i661o+EuR1wg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^2.2.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/signature-v4": "^3.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.587.0.tgz",
+ "integrity": "sha512-Hyg/5KFECIk2k5o8wnVEiniV86yVkhn5kzITUydmNGCkXdBFHMHRx6hleQ1bqwJHbBskyu8nbYamzcwymmGwmw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.587.0.tgz",
+ "integrity": "sha512-Su1SRWVRCuR1e32oxX3C1V4c5hpPN20WYcRfdcr2wXwHqSvys5DrnmuCC+JoEnS/zt3adUJhPliTqpfKgSdMrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/fetch-http-handler": "^3.0.1",
+ "@smithy/node-http-handler": "^3.0.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/smithy-client": "^3.1.1",
+ "@smithy/types": "^3.0.0",
+ "@smithy/util-stream": "^3.0.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.592.0.tgz",
+ "integrity": "sha512-3kG6ngCIOPbLJZZ3RV+NsU7HVK6vX1+1DrPJKj9fVlPYn7IXsk8NAaUT5885yC7+jKizjv0cWLrLKvAJV5gfUA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.587.0",
+ "@aws-sdk/credential-provider-http": "3.587.0",
+ "@aws-sdk/credential-provider-process": "3.587.0",
+ "@aws-sdk/credential-provider-sso": "3.592.0",
+ "@aws-sdk/credential-provider-web-identity": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/credential-provider-imds": "^3.1.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/shared-ini-file-loader": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sts": "^3.592.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.592.0.tgz",
+ "integrity": "sha512-BguihBGTrEjVBQ07hm+ZsO29eNJaxwBwUZMftgGAm2XcMIEClNPfm5hydxu2BmA4ouIJQJ6nG8pNYghEumM+Aw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.587.0",
+ "@aws-sdk/credential-provider-http": "3.587.0",
+ "@aws-sdk/credential-provider-ini": "3.592.0",
+ "@aws-sdk/credential-provider-process": "3.587.0",
+ "@aws-sdk/credential-provider-sso": "3.592.0",
+ "@aws-sdk/credential-provider-web-identity": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/credential-provider-imds": "^3.1.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/shared-ini-file-loader": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.587.0.tgz",
+ "integrity": "sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/shared-ini-file-loader": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.592.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.592.0.tgz",
+ "integrity": "sha512-fYFzAdDHKHvhtufPPtrLdSv8lO6GuW3em6n3erM5uFdpGytNpjXvr3XGokIsuXcNkETAY/Xihg+G9ksNE8WJxQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.592.0",
+ "@aws-sdk/token-providers": "3.587.0",
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/shared-ini-file-loader": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.587.0.tgz",
+ "integrity": "sha512-XqIx/I2PG7kyuw3WjAP9wKlxy8IvFJwB8asOFT1xPFoVfZYKIogjG9oLP5YiRtfvDkWIztHmg5MlVv3HdJDGRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sts": "^3.587.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.577.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.577.0.tgz",
+ "integrity": "sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.577.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.577.0.tgz",
+ "integrity": "sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.577.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.577.0.tgz",
+ "integrity": "sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.587.0.tgz",
+ "integrity": "sha512-SyDomN+IOrygLucziG7/nOHkjUXES5oH5T7p8AboO8oakMQJdnudNXiYWTicQWO52R51U6CR27rcMPTGeMedYA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@aws-sdk/util-endpoints": "3.587.0",
+ "@smithy/protocol-http": "^4.0.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/region-config-resolver": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.587.0.tgz",
+ "integrity": "sha512-93I7IPZtulZQoRK+O20IJ4a1syWwYPzoO2gc3v+/GNZflZPV3QJXuVbIm0pxBsu0n/mzKGUKqSOLPIaN098HcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "@smithy/util-config-provider": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.587.0.tgz",
+ "integrity": "sha512-ULqhbnLy1hmJNRcukANBWJmum3BbjXnurLPSFXoGdV0llXYlG55SzIla2VYqdveQEEjmsBuTZdFvXAtNpmS5Zg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/property-provider": "^3.1.0",
+ "@smithy/shared-ini-file-loader": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-sso-oidc": "^3.587.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.577.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.577.0.tgz",
+ "integrity": "sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.587.0.tgz",
+ "integrity": "sha512-8I1HG6Em8wQWqKcRW6m358mqebRVNpL8XrrEoT4In7xqkKkmYtHRNVYP6lcmiQh5pZ/c/FXu8dSchuFIWyEtqQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/types": "^3.0.0",
+ "@smithy/util-endpoints": "^2.0.1",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.723.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz",
+ "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.577.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.577.0.tgz",
+ "integrity": "sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/types": "^3.0.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.587.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.587.0.tgz",
+ "integrity": "sha512-Pnl+DUe/bvnbEEDHP3iVJrOtE3HbFJBPgsD6vJ+ml/+IYk1Eq49jEG+EHZdNTPz3SDG0kbp2+7u41MKYJHR/iQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.577.0",
+ "@smithy/node-config-provider": "^3.1.0",
+ "@smithy/types": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+ "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+ "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.9",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.9",
+ "@babel/parser": "^7.26.9",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.8.tgz",
+ "integrity": "sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
+ "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz",
+ "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.26.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+ "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+ "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
+ "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+ "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.9"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+ "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-decorators": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+ "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
+ "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.26.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz",
+ "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.26.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz",
+ "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz",
+ "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
+ "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz",
+ "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz",
+ "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz",
+ "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.8",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.26.8",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.26.5",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.26.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.26.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.26.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.26.8",
+ "@babel/plugin-transform-typeof-symbol": "^7.26.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.11.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.40.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz",
+ "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "core-js-compat": "^3.40.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+ "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
+ "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.9.tgz",
+ "integrity": "sha512-5EVjbTegqN7RSJle6hMWYxO4voo4rI+9krITk+DWR+diJgGrjZjrIBnJhjrHYYQsFgI7j1w1QnrvV7YSKBfYGg==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js-pure": "^3.30.2",
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
+ "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.9",
+ "@babel/parser": "^7.26.9",
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
+ "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@codemirror/autocomplete": {
+ "version": "6.18.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz",
+ "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.17.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/commands": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.0.tgz",
+ "integrity": "sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.4.0",
+ "@codemirror/view": "^6.27.0",
+ "@lezer/common": "^1.1.0"
+ }
+ },
+ "node_modules/@codemirror/lang-yaml": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz",
+ "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@lezer/common": "^1.2.0",
+ "@lezer/highlight": "^1.2.0",
+ "@lezer/lr": "^1.0.0",
+ "@lezer/yaml": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/language": {
+ "version": "6.10.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.8.tgz",
+ "integrity": "sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.23.0",
+ "@lezer/common": "^1.1.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/lint": {
+ "version": "6.8.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.4.tgz",
+ "integrity": "sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.35.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/search": {
+ "version": "6.5.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.9.tgz",
+ "integrity": "sha512-7DdQ9aaZMMxuWB1u6IIFWWuK9NocVZwvo4nG8QjJTS6oZGvteoLSiXw3EbVZVlO08Ri2ltO89JVInMpfcJxhtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/state": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz",
+ "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==",
+ "license": "MIT",
+ "dependencies": {
+ "@marijn/find-cluster-break": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/theme-one-dark": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz",
+ "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/highlight": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/view": {
+ "version": "6.36.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.3.tgz",
+ "integrity": "sha512-N2bilM47QWC8Hnx0rMdDxO2x2ImJ1FvZWXubwKgjeoOrWwEiFrtpA7SFHcuZ+o2Ze2VzbkgbzWVj4+V18LVkeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.5.0",
+ "style-mod": "^4.1.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@commitlint/cli": {
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz",
+ "integrity": "sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/format": "^19.5.0",
+ "@commitlint/lint": "^19.7.1",
+ "@commitlint/load": "^19.6.1",
+ "@commitlint/read": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "tinyexec": "^0.3.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-conventional": {
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.7.1.tgz",
+ "integrity": "sha512-fsEIF8zgiI/FIWSnykdQNj/0JE4av08MudLTyYHm4FlLWemKoQvPNUYU2M/3tktWcCEyq7aOkDDgtjrmgWFbvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz",
+ "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "ajv": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz",
+ "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/execute-rule": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz",
+ "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz",
+ "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@commitlint/is-ignored": {
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.7.1.tgz",
+ "integrity": "sha512-3IaOc6HVg2hAoGleRK3r9vL9zZ3XY0rf1RsUf6jdQLuaD46ZHnXBiOPTyQ004C4IvYjSWqJwlh0/u2P73aIE3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "semver": "^7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/is-ignored/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "19.7.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.7.1.tgz",
+ "integrity": "sha512-LhcPfVjcOcOZA7LEuBBeO00o3MeZa+tWrX9Xyl1r9PMd5FWsEoZI9IgnGqTKZ0lZt5pO3ZlstgnRyY1CJJc9Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/is-ignored": "^19.7.1",
+ "@commitlint/parse": "^19.5.0",
+ "@commitlint/rules": "^19.6.0",
+ "@commitlint/types": "^19.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load": {
+ "version": "19.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.6.1.tgz",
+ "integrity": "sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/execute-rule": "^19.5.0",
+ "@commitlint/resolve-extends": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz",
+ "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/parse": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz",
+ "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz",
+ "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/top-level": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz",
+ "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/rules": {
+ "version": "19.6.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz",
+ "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/ensure": "^19.5.0",
+ "@commitlint/message": "^19.5.0",
+ "@commitlint/to-lines": "^19.5.0",
+ "@commitlint/types": "^19.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/to-lines": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz",
+ "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz",
+ "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz",
+ "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@csstools/cascade-layer-name-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz",
+ "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/color-helpers": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz",
+ "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/css-calc": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz",
+ "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/css-color-parser": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz",
+ "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.0.1",
+ "@csstools/css-calc": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
+ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
+ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
+ "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz",
+ "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.7.tgz",
+ "integrity": "sha512-aDHYmhNIHR6iLw4ElWhf+tRqqaXwKnMl0YsQ/X105Zc4dQwe6yJpMrTN6BwOoESrkDjOYMOfORviSSLeDTJkdQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-color-mix-function": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.7.tgz",
+ "integrity": "sha512-e68Nev4CxZYCLcrfWhHH4u/N1YocOfTmw67/kVX5Rb7rnguqqLyxPjhHWjSBX8o4bmyuukmNf3wrUSU3//kT7g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-content-alt-text": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz",
+ "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-exponential-functions": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.6.tgz",
+ "integrity": "sha512-IgJA5DQsQLu/upA3HcdvC6xEMR051ufebBTIXZ5E9/9iiaA7juXWz1ceYj814lnDYP/7eWjZnw0grRJlX4eI6g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz",
+ "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-gamut-mapping": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.7.tgz",
+ "integrity": "sha512-gzFEZPoOkY0HqGdyeBXR3JP218Owr683u7KOZazTK7tQZBE8s2yhg06W1tshOqk7R7SWvw9gkw2TQogKpIW8Xw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-gradients-interpolation-method": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.7.tgz",
+ "integrity": "sha512-WgEyBeg6glUeTdS2XT7qeTFBthTJuXlS9GFro/DVomj7W7WMTamAwpoP4oQCq/0Ki2gvfRYFi/uZtmRE14/DFA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.7.tgz",
+ "integrity": "sha512-LKYqjO+wGwDCfNIEllessCBWfR4MS/sS1WXO+j00KKyOjm7jDW2L6jzUmqASEiv/kkJO39GcoIOvTTfB3yeBUA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz",
+ "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-initial": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz",
+ "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz",
+ "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-light-dark-function": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz",
+ "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-float-and-clear": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz",
+ "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-overflow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz",
+ "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-overscroll-behavior": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz",
+ "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-resize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz",
+ "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-logical-viewport-units": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz",
+ "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-media-minmax": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.6.tgz",
+ "integrity": "sha512-J1+4Fr2W3pLZsfxkFazK+9kr96LhEYqoeBszLmFjb6AjYs+g9oDAw3J5oQignLKk3rC9XHW+ebPTZ9FaW5u5pg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz",
+ "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz",
+ "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz",
+ "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.7.tgz",
+ "integrity": "sha512-I6WFQIbEKG2IO3vhaMGZDkucbCaUSXMxvHNzDdnfsTCF5tc0UlV3Oe2AhamatQoKFjBi75dSEMrgWq3+RegsOQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz",
+ "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-random-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.2.tgz",
+ "integrity": "sha512-vBCT6JvgdEkvRc91NFoNrLjgGtkLWt47GKT6E2UDn3nd8ZkMBiziQ1Md1OiKoSsgzxsSnGKG3RVdhlbdZEkHjA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-relative-color-syntax": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.7.tgz",
+ "integrity": "sha512-apbT31vsJVd18MabfPOnE977xgct5B1I+Jpf+Munw3n6kKb1MMuUmGGH+PT9Hm/fFs6fe61Q/EWnkrb4bNoNQw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-scope-pseudo-class": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz",
+ "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@csstools/postcss-sign-functions": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.1.tgz",
+ "integrity": "sha512-MslYkZCeMQDxetNkfmmQYgKCy4c+w9pPDfgOBCJOo/RI1RveEUdZQYtOfrC6cIZB7sD7/PHr2VGOcMXlZawrnA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.6.tgz",
+ "integrity": "sha512-/dwlO9w8vfKgiADxpxUbZOWlL5zKoRIsCymYoh1IPuBsXODKanKnfuZRr32DEqT0//3Av1VjfNZU9yhxtEfIeA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz",
+ "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/color-helpers": "^5.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.6.tgz",
+ "integrity": "sha512-c4Y1D2Why/PeccaSouXnTt6WcNHJkoJRidV2VW9s5gJ97cNxnLgQ4Qj8qOqkIR9VmTQKJyNcbF4hy79ZQnWD7A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-calc": "^2.1.1",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz",
+ "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/utilities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz",
+ "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz",
+ "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz",
+ "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.17.9",
+ "@algolia/autocomplete-preset-algolia": "1.17.9",
+ "@docsearch/css": "3.9.0",
+ "algoliasearch": "^5.14.2"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 20.0.0",
+ "react": ">= 16.8.0 < 20.0.0",
+ "react-dom": ">= 16.8.0 < 20.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docusaurus/babel": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.7.0.tgz",
+ "integrity": "sha512-0H5uoJLm14S/oKV3Keihxvh8RV+vrid+6Gv+2qhuzbqHanawga8tYnsdpjEyt36ucJjqlby2/Md2ObWjA02UXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-transform-runtime": "^7.25.9",
+ "@babel/preset-env": "^7.25.9",
+ "@babel/preset-react": "^7.25.9",
+ "@babel/preset-typescript": "^7.25.9",
+ "@babel/runtime": "^7.25.9",
+ "@babel/runtime-corejs3": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/bundler": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.7.0.tgz",
+ "integrity": "sha512-CUUT9VlSGukrCU5ctZucykvgCISivct+cby28wJwCC/fkQFgAHRp/GKv2tx38ZmXb7nacrKzFTcp++f9txUYGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.9",
+ "@docusaurus/babel": "3.7.0",
+ "@docusaurus/cssnano-preset": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "babel-loader": "^9.2.1",
+ "clean-css": "^5.3.2",
+ "copy-webpack-plugin": "^11.0.0",
+ "css-loader": "^6.8.1",
+ "css-minimizer-webpack-plugin": "^5.0.1",
+ "cssnano": "^6.1.2",
+ "file-loader": "^6.2.0",
+ "html-minifier-terser": "^7.2.0",
+ "mini-css-extract-plugin": "^2.9.1",
+ "null-loader": "^4.0.1",
+ "postcss": "^8.4.26",
+ "postcss-loader": "^7.3.3",
+ "postcss-preset-env": "^10.1.0",
+ "react-dev-utils": "^12.0.1",
+ "terser-webpack-plugin": "^5.3.9",
+ "tslib": "^2.6.0",
+ "url-loader": "^4.1.1",
+ "webpack": "^5.95.0",
+ "webpackbar": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/faster": "*"
+ },
+ "peerDependenciesMeta": {
+ "@docusaurus/faster": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@docusaurus/core": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.7.0.tgz",
+ "integrity": "sha512-b0fUmaL+JbzDIQaamzpAFpTviiaU4cX3Qz8cuo14+HGBCwa0evEK0UYCBFY3n4cLzL8Op1BueeroUD2LYAIHbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/babel": "3.7.0",
+ "@docusaurus/bundler": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "boxen": "^6.2.1",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "cli-table3": "^0.6.3",
+ "combine-promises": "^1.1.0",
+ "commander": "^5.1.0",
+ "core-js": "^3.31.1",
+ "del": "^6.1.1",
+ "detect-port": "^1.5.1",
+ "escape-html": "^1.0.3",
+ "eta": "^2.2.0",
+ "eval": "^0.1.8",
+ "fs-extra": "^11.1.1",
+ "html-tags": "^3.3.1",
+ "html-webpack-plugin": "^5.6.0",
+ "leven": "^3.1.0",
+ "lodash": "^4.17.21",
+ "p-map": "^4.0.0",
+ "prompts": "^2.4.2",
+ "react-dev-utils": "^12.0.1",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0",
+ "react-loadable": "npm:@docusaurus/react-loadable@6.0.0",
+ "react-loadable-ssr-addon-v5-slorber": "^1.0.1",
+ "react-router": "^5.3.4",
+ "react-router-config": "^5.1.1",
+ "react-router-dom": "^5.3.4",
+ "semver": "^7.5.4",
+ "serve-handler": "^6.1.6",
+ "shelljs": "^0.8.5",
+ "tslib": "^2.6.0",
+ "update-notifier": "^6.0.2",
+ "webpack": "^5.95.0",
+ "webpack-bundle-analyzer": "^4.10.2",
+ "webpack-dev-server": "^4.15.2",
+ "webpack-merge": "^6.0.1"
+ },
+ "bin": {
+ "docusaurus": "bin/docusaurus.mjs"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "@mdx-js/react": "^3.0.0",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/core/node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@docusaurus/core/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@docusaurus/core/node_modules/webpack-merge": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
+ "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
+ "license": "MIT",
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@docusaurus/cssnano-preset": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.7.0.tgz",
+ "integrity": "sha512-X9GYgruZBSOozg4w4dzv9uOz8oK/EpPVQXkp0MM6Tsgp/nRIU9hJzJ0Pxg1aRa3xCeEQTOimZHcocQFlLwYajQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-advanced": "^6.1.2",
+ "postcss": "^8.4.38",
+ "postcss-sort-media-queries": "^5.2.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/faster": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.7.0.tgz",
+ "integrity": "sha512-d+7uyOEs3SBk38i2TL79N6mFaP7J4knc5lPX/W9od+jplXZhnDdl5ZMh2u2Lg7JxGV/l33Bd7h/xwv4mr21zag==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/types": "3.7.0",
+ "@rspack/core": "1.2.0-alpha.0",
+ "@swc/core": "^1.7.39",
+ "@swc/html": "^1.7.39",
+ "browserslist": "^4.24.2",
+ "lightningcss": "^1.27.0",
+ "swc-loader": "^0.2.6",
+ "tslib": "^2.6.0",
+ "webpack": "^5.95.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/types": "*"
+ }
+ },
+ "node_modules/@docusaurus/logger": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.7.0.tgz",
+ "integrity": "sha512-z7g62X7bYxCYmeNNuO9jmzxLQG95q9QxINCwpboVcNff3SJiHJbGrarxxOVMVmAh1MsrSfxWkVGv4P41ktnFsA==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/mdx-loader": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.7.0.tgz",
+ "integrity": "sha512-OFBG6oMjZzc78/U3WNPSHs2W9ZJ723ewAcvVJaqS0VgyeUfmzUV8f1sv+iUHA0DtwiR5T5FjOxj6nzEE8LY6VA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "@mdx-js/mdx": "^3.0.0",
+ "@slorber/remark-comment": "^1.0.0",
+ "escape-html": "^1.0.3",
+ "estree-util-value-to-estree": "^3.0.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^11.1.1",
+ "image-size": "^1.0.2",
+ "mdast-util-mdx": "^3.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "rehype-raw": "^7.0.0",
+ "remark-directive": "^3.0.0",
+ "remark-emoji": "^4.0.0",
+ "remark-frontmatter": "^5.0.0",
+ "remark-gfm": "^4.0.0",
+ "stringify-object": "^3.3.0",
+ "tslib": "^2.6.0",
+ "unified": "^11.0.3",
+ "unist-util-visit": "^5.0.0",
+ "url-loader": "^4.1.1",
+ "vfile": "^6.0.1",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/mdx-loader/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@docusaurus/mdx-loader/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@docusaurus/module-type-aliases": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.7.0.tgz",
+ "integrity": "sha512-g7WdPqDNaqA60CmBrr0cORTrsOit77hbsTj7xE2l71YhBn79sxdm7WMK7wfhcaafkbpIh7jv5ef5TOpf1Xv9Lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/types": "3.7.0",
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router-config": "*",
+ "@types/react-router-dom": "*",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@*",
+ "react-loadable": "npm:@docusaurus/react-loadable@6.0.0"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-blog": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz",
+ "integrity": "sha512-EFLgEz6tGHYWdPU0rK8tSscZwx+AsyuBW/r+tNig2kbccHYGUJmZtYN38GjAa3Fda4NU+6wqUO5kTXQSRBQD3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/theme-common": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "cheerio": "1.0.0-rc.12",
+ "feed": "^4.2.2",
+ "fs-extra": "^11.1.1",
+ "lodash": "^4.17.21",
+ "reading-time": "^1.5.0",
+ "srcset": "^4.0.0",
+ "tslib": "^2.6.0",
+ "unist-util-visit": "^5.0.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/plugin-content-docs": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-docs": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.7.0.tgz",
+ "integrity": "sha512-GXg5V7kC9FZE4FkUZA8oo/NrlRb06UwuICzI6tcbzj0+TVgjq/mpUXXzSgKzMS82YByi4dY2Q808njcBCyy6tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/module-type-aliases": "3.7.0",
+ "@docusaurus/theme-common": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "@types/react-router-config": "^5.0.7",
+ "combine-promises": "^1.1.0",
+ "fs-extra": "^11.1.1",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-content-pages": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.7.0.tgz",
+ "integrity": "sha512-YJSU3tjIJf032/Aeao8SZjFOrXJbz/FACMveSMjLyMH4itQyZ2XgUIzt4y+1ISvvk5zrW4DABVT2awTCqBkx0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-debug": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.7.0.tgz",
+ "integrity": "sha512-Qgg+IjG/z4svtbCNyTocjIwvNTNEwgRjSXXSJkKVG0oWoH0eX/HAPiu+TS1HBwRPQV+tTYPWLrUypYFepfujZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "fs-extra": "^11.1.1",
+ "react-json-view-lite": "^1.2.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-debug/node_modules/react-json-view-lite": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz",
+ "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-analytics": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.7.0.tgz",
+ "integrity": "sha512-otIqiRV/jka6Snjf+AqB360XCeSv7lQC+DKYW+EUZf6XbuE8utz5PeUQ8VuOcD8Bk5zvT1MC4JKcd5zPfDuMWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-gtag": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.7.0.tgz",
+ "integrity": "sha512-M3vrMct1tY65ModbyeDaMoA+fNJTSPe5qmchhAbtqhDD/iALri0g9LrEpIOwNaoLmm6lO88sfBUADQrSRSGSWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "@types/gtag.js": "^0.0.12",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-google-tag-manager": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.7.0.tgz",
+ "integrity": "sha512-X8U78nb8eiMiPNg3jb9zDIVuuo/rE1LjGDGu+5m5CX4UBZzjMy+klOY2fNya6x8ACyE/L3K2erO1ErheP55W/w==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-sitemap": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.7.0.tgz",
+ "integrity": "sha512-bTRT9YLZ/8I/wYWKMQke18+PF9MV8Qub34Sku6aw/vlZ/U+kuEuRpQ8bTcNOjaTSfYsWkK4tTwDMHK2p5S86cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "fs-extra": "^11.1.1",
+ "sitemap": "^7.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/plugin-svgr": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.7.0.tgz",
+ "integrity": "sha512-HByXIZTbc4GV5VAUkZ2DXtXv1Qdlnpk3IpuImwSnEzCDBkUMYcec5282hPjn6skZqB25M1TYCmWS91UbhBGxQg==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/webpack": "^8.1.0",
+ "tslib": "^2.6.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/preset-classic": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.7.0.tgz",
+ "integrity": "sha512-nPHj8AxDLAaQXs+O6+BwILFuhiWbjfQWrdw2tifOClQoNfuXDjfjogee6zfx6NGHWqshR23LrcN115DmkHC91Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/plugin-content-blog": "3.7.0",
+ "@docusaurus/plugin-content-docs": "3.7.0",
+ "@docusaurus/plugin-content-pages": "3.7.0",
+ "@docusaurus/plugin-debug": "3.7.0",
+ "@docusaurus/plugin-google-analytics": "3.7.0",
+ "@docusaurus/plugin-google-gtag": "3.7.0",
+ "@docusaurus/plugin-google-tag-manager": "3.7.0",
+ "@docusaurus/plugin-sitemap": "3.7.0",
+ "@docusaurus/plugin-svgr": "3.7.0",
+ "@docusaurus/theme-classic": "3.7.0",
+ "@docusaurus/theme-common": "3.7.0",
+ "@docusaurus/theme-search-algolia": "3.7.0",
+ "@docusaurus/types": "3.7.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-classic": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.7.0.tgz",
+ "integrity": "sha512-MnLxG39WcvLCl4eUzHr0gNcpHQfWoGqzADCly54aqCofQX6UozOS9Th4RK3ARbM9m7zIRv3qbhggI53dQtx/hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/module-type-aliases": "3.7.0",
+ "@docusaurus/plugin-content-blog": "3.7.0",
+ "@docusaurus/plugin-content-docs": "3.7.0",
+ "@docusaurus/plugin-content-pages": "3.7.0",
+ "@docusaurus/theme-common": "3.7.0",
+ "@docusaurus/theme-translations": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "@mdx-js/react": "^3.0.0",
+ "clsx": "^2.0.0",
+ "copy-text-to-clipboard": "^3.2.0",
+ "infima": "0.2.0-alpha.45",
+ "lodash": "^4.17.21",
+ "nprogress": "^0.2.0",
+ "postcss": "^8.4.26",
+ "prism-react-renderer": "^2.3.0",
+ "prismjs": "^1.29.0",
+ "react-router-dom": "^5.3.4",
+ "rtlcss": "^4.1.0",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-common": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.7.0.tgz",
+ "integrity": "sha512-8eJ5X0y+gWDsURZnBfH0WabdNm8XMCXHv8ENy/3Z/oQKwaB/EHt5lP9VsTDTf36lKEp0V6DjzjFyFIB+CetL0A==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/mdx-loader": "3.7.0",
+ "@docusaurus/module-type-aliases": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router-config": "*",
+ "clsx": "^2.0.0",
+ "parse-numeric-range": "^1.3.0",
+ "prism-react-renderer": "^2.3.0",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "@docusaurus/plugin-content-docs": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-search-algolia": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.7.0.tgz",
+ "integrity": "sha512-Al/j5OdzwRU1m3falm+sYy9AaB93S1XF1Lgk9Yc6amp80dNxJVplQdQTR4cYdzkGtuQqbzUA8+kaoYYO0RbK6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/react": "^3.8.1",
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/plugin-content-docs": "3.7.0",
+ "@docusaurus/theme-common": "3.7.0",
+ "@docusaurus/theme-translations": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-validation": "3.7.0",
+ "algoliasearch": "^5.17.1",
+ "algoliasearch-helper": "^3.22.6",
+ "clsx": "^2.0.0",
+ "eta": "^2.2.0",
+ "fs-extra": "^11.1.1",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0",
+ "utility-types": "^3.10.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/theme-translations": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.7.0.tgz",
+ "integrity": "sha512-Ewq3bEraWDmienM6eaNK7fx+/lHMtGDHQyd1O+4+3EsDxxUmrzPkV7Ct3nBWTuE0MsoZr3yNwQVKjllzCMuU3g==",
+ "license": "MIT",
+ "dependencies": {
+ "fs-extra": "^11.1.1",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/types": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.7.0.tgz",
+ "integrity": "sha512-kOmZg5RRqJfH31m+6ZpnwVbkqMJrPOG5t0IOl4i/+3ruXyNfWzZ0lVtVrD0u4ONc/0NOsS9sWYaxxWNkH1LdLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/mdx": "^3.0.0",
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "commander": "^5.1.0",
+ "joi": "^17.9.2",
+ "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.95.0",
+ "webpack-merge": "^5.9.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@docusaurus/types/node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@docusaurus/utils": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.7.0.tgz",
+ "integrity": "sha512-e7zcB6TPnVzyUaHMJyLSArKa2AG3h9+4CfvKXKKWNx6hRs+p0a+u7HHTJBgo6KW2m+vqDnuIHK4X+bhmoghAFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/types": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "escape-string-regexp": "^4.0.0",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^11.1.1",
+ "github-slugger": "^1.5.0",
+ "globby": "^11.1.0",
+ "gray-matter": "^4.0.3",
+ "jiti": "^1.20.0",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "micromatch": "^4.0.5",
+ "prompts": "^2.4.2",
+ "resolve-pathname": "^3.0.0",
+ "shelljs": "^0.8.5",
+ "tslib": "^2.6.0",
+ "url-loader": "^4.1.1",
+ "utility-types": "^3.10.0",
+ "webpack": "^5.88.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/utils-common": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.7.0.tgz",
+ "integrity": "sha512-IZeyIfCfXy0Mevj6bWNg7DG7B8G+S6o6JVpddikZtWyxJguiQ7JYr0SIZ0qWd8pGNuMyVwriWmbWqMnK7Y5PwA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/types": "3.7.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/utils-validation": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.7.0.tgz",
+ "integrity": "sha512-w8eiKk8mRdN+bNfeZqC4nyFoxNyI1/VExMKAzD9tqpJfLLbsa46Wfn5wcKH761g9WkKh36RtFV49iL9lh1DYBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/logger": "3.7.0",
+ "@docusaurus/utils": "3.7.0",
+ "@docusaurus/utils-common": "3.7.0",
+ "fs-extra": "^11.2.0",
+ "joi": "^17.9.2",
+ "js-yaml": "^4.1.0",
+ "lodash": "^4.17.21",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/@docusaurus/utils/node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz",
+ "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.0.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
+ "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz",
+ "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.3.3",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/css": {
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.5.tgz",
+ "integrity": "sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/cache": "^11.13.5",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.2"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/cache": "^11.14.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.2",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@freesewing/aaron": {
+ "resolved": "designs/aaron",
+ "link": true
+ },
+ "node_modules/@freesewing/albert": {
+ "resolved": "designs/albert",
+ "link": true
+ },
+ "node_modules/@freesewing/bee": {
+ "resolved": "designs/bee",
+ "link": true
+ },
+ "node_modules/@freesewing/bella": {
+ "resolved": "designs/bella",
+ "link": true
+ },
+ "node_modules/@freesewing/benjamin": {
+ "resolved": "designs/benjamin",
+ "link": true
+ },
+ "node_modules/@freesewing/bent": {
+ "resolved": "designs/bent",
+ "link": true
+ },
+ "node_modules/@freesewing/bibi": {
+ "resolved": "designs/bibi",
+ "link": true
+ },
+ "node_modules/@freesewing/bob": {
+ "resolved": "designs/bob",
+ "link": true
+ },
+ "node_modules/@freesewing/bonny": {
+ "resolved": "designs/bonny",
+ "link": true
+ },
+ "node_modules/@freesewing/breanna": {
+ "resolved": "designs/breanna",
+ "link": true
+ },
+ "node_modules/@freesewing/brian": {
+ "resolved": "designs/brian",
+ "link": true
+ },
+ "node_modules/@freesewing/bruce": {
+ "resolved": "designs/bruce",
+ "link": true
+ },
+ "node_modules/@freesewing/carlita": {
+ "resolved": "designs/carlita",
+ "link": true
+ },
+ "node_modules/@freesewing/carlton": {
+ "resolved": "designs/carlton",
+ "link": true
+ },
+ "node_modules/@freesewing/cathrin": {
+ "resolved": "designs/cathrin",
+ "link": true
+ },
+ "node_modules/@freesewing/charlie": {
+ "resolved": "designs/charlie",
+ "link": true
+ },
+ "node_modules/@freesewing/collection": {
+ "resolved": "packages/collection",
+ "link": true
+ },
+ "node_modules/@freesewing/config": {
+ "resolved": "packages/config",
+ "link": true
+ },
+ "node_modules/@freesewing/core": {
+ "resolved": "packages/core",
+ "link": true
+ },
+ "node_modules/@freesewing/core-plugins": {
+ "resolved": "plugins/core-plugins",
+ "link": true
+ },
+ "node_modules/@freesewing/cornelius": {
+ "resolved": "designs/cornelius",
+ "link": true
+ },
+ "node_modules/@freesewing/diana": {
+ "resolved": "designs/diana",
+ "link": true
+ },
+ "node_modules/@freesewing/examples": {
+ "resolved": "designs/examples",
+ "link": true
+ },
+ "node_modules/@freesewing/florence": {
+ "resolved": "designs/florence",
+ "link": true
+ },
+ "node_modules/@freesewing/florent": {
+ "resolved": "designs/florent",
+ "link": true
+ },
+ "node_modules/@freesewing/gozer": {
+ "resolved": "designs/gozer",
+ "link": true
+ },
+ "node_modules/@freesewing/hi": {
+ "resolved": "designs/hi",
+ "link": true
+ },
+ "node_modules/@freesewing/holmes": {
+ "resolved": "designs/holmes",
+ "link": true
+ },
+ "node_modules/@freesewing/hortensia": {
+ "resolved": "designs/hortensia",
+ "link": true
+ },
+ "node_modules/@freesewing/huey": {
+ "resolved": "designs/huey",
+ "link": true
+ },
+ "node_modules/@freesewing/hugo": {
+ "resolved": "designs/hugo",
+ "link": true
+ },
+ "node_modules/@freesewing/i18n": {
+ "resolved": "packages/i18n",
+ "link": true
+ },
+ "node_modules/@freesewing/jaeger": {
+ "resolved": "designs/jaeger",
+ "link": true
+ },
+ "node_modules/@freesewing/jane": {
+ "resolved": "designs/jane",
+ "link": true
+ },
+ "node_modules/@freesewing/legend": {
+ "resolved": "designs/legend",
+ "link": true
+ },
+ "node_modules/@freesewing/lily": {
+ "resolved": "designs/lily",
+ "link": true
+ },
+ "node_modules/@freesewing/lucy": {
+ "resolved": "designs/lucy",
+ "link": true
+ },
+ "node_modules/@freesewing/lumina": {
+ "resolved": "designs/lumina",
+ "link": true
+ },
+ "node_modules/@freesewing/lumira": {
+ "resolved": "designs/lumira",
+ "link": true
+ },
+ "node_modules/@freesewing/lunetius": {
+ "resolved": "designs/lunetius",
+ "link": true
+ },
+ "node_modules/@freesewing/magde": {
+ "resolved": "designs/magde",
+ "link": true
+ },
+ "node_modules/@freesewing/models": {
+ "resolved": "packages/models",
+ "link": true
+ },
+ "node_modules/@freesewing/noble": {
+ "resolved": "designs/noble",
+ "link": true
+ },
+ "node_modules/@freesewing/octoplushy": {
+ "resolved": "designs/octoplushy",
+ "link": true
+ },
+ "node_modules/@freesewing/onyx": {
+ "resolved": "designs/onyx",
+ "link": true
+ },
+ "node_modules/@freesewing/opal": {
+ "resolved": "designs/opal",
+ "link": true
+ },
+ "node_modules/@freesewing/otis": {
+ "resolved": "designs/otis",
+ "link": true
+ },
+ "node_modules/@freesewing/paco": {
+ "resolved": "designs/paco",
+ "link": true
+ },
+ "node_modules/@freesewing/penelope": {
+ "resolved": "designs/penelope",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-annotations": {
+ "resolved": "plugins/plugin-annotations",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-bin-pack": {
+ "resolved": "plugins/plugin-bin-pack",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-bust": {
+ "resolved": "plugins/plugin-bust",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-flip": {
+ "resolved": "plugins/plugin-flip",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-gore": {
+ "resolved": "plugins/plugin-gore",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-i18n": {
+ "resolved": "plugins/plugin-i18n",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-measurements": {
+ "resolved": "plugins/plugin-measurements",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-mirror": {
+ "resolved": "plugins/plugin-mirror",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-ringsector": {
+ "resolved": "plugins/plugin-ringsector",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-round": {
+ "resolved": "plugins/plugin-round",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-sprinkle": {
+ "resolved": "plugins/plugin-sprinkle",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-svgattr": {
+ "resolved": "plugins/plugin-svgattr",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-theme": {
+ "resolved": "plugins/plugin-theme",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-timing": {
+ "resolved": "plugins/plugin-timing",
+ "link": true
+ },
+ "node_modules/@freesewing/plugin-versionfree-svg": {
+ "resolved": "plugins/plugin-versionfree-svg",
+ "link": true
+ },
+ "node_modules/@freesewing/plugintest": {
+ "resolved": "designs/plugintest",
+ "link": true
+ },
+ "node_modules/@freesewing/prettier-config": {
+ "resolved": "packages/prettier-config",
+ "link": true
+ },
+ "node_modules/@freesewing/react": {
+ "resolved": "packages/react",
+ "link": true
+ },
+ "node_modules/@freesewing/rendertest": {
+ "resolved": "designs/rendertest",
+ "link": true
+ },
+ "node_modules/@freesewing/sandy": {
+ "resolved": "designs/sandy",
+ "link": true
+ },
+ "node_modules/@freesewing/shelly": {
+ "resolved": "designs/shelly",
+ "link": true
+ },
+ "node_modules/@freesewing/shin": {
+ "resolved": "designs/shin",
+ "link": true
+ },
+ "node_modules/@freesewing/simon": {
+ "resolved": "designs/simon",
+ "link": true
+ },
+ "node_modules/@freesewing/simone": {
+ "resolved": "designs/simone",
+ "link": true
+ },
+ "node_modules/@freesewing/skully": {
+ "resolved": "designs/skully",
+ "link": true
+ },
+ "node_modules/@freesewing/snapseries": {
+ "resolved": "packages/snapseries",
+ "link": true
+ },
+ "node_modules/@freesewing/studio": {
+ "resolved": "packages/studio",
+ "link": true
+ },
+ "node_modules/@freesewing/sven": {
+ "resolved": "designs/sven",
+ "link": true
+ },
+ "node_modules/@freesewing/tamiko": {
+ "resolved": "designs/tamiko",
+ "link": true
+ },
+ "node_modules/@freesewing/teagan": {
+ "resolved": "designs/teagan",
+ "link": true
+ },
+ "node_modules/@freesewing/tiberius": {
+ "resolved": "designs/tiberius",
+ "link": true
+ },
+ "node_modules/@freesewing/titan": {
+ "resolved": "designs/titan",
+ "link": true
+ },
+ "node_modules/@freesewing/trayvon": {
+ "resolved": "designs/trayvon",
+ "link": true
+ },
+ "node_modules/@freesewing/tristan": {
+ "resolved": "designs/tristan",
+ "link": true
+ },
+ "node_modules/@freesewing/uma": {
+ "resolved": "designs/uma",
+ "link": true
+ },
+ "node_modules/@freesewing/umbra": {
+ "resolved": "designs/umbra",
+ "link": true
+ },
+ "node_modules/@freesewing/utils": {
+ "resolved": "packages/utils",
+ "link": true
+ },
+ "node_modules/@freesewing/wahid": {
+ "resolved": "designs/wahid",
+ "link": true
+ },
+ "node_modules/@freesewing/walburga": {
+ "resolved": "designs/walburga",
+ "link": true
+ },
+ "node_modules/@freesewing/waralee": {
+ "resolved": "designs/waralee",
+ "link": true
+ },
+ "node_modules/@freesewing/yuri": {
+ "resolved": "designs/yuri",
+ "link": true
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hutson/parse-repository-url": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz",
+ "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
+ "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
+ "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
+ "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
+ "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
+ "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
+ "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
+ "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
+ "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
+ "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
+ "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
+ "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.0.5"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
+ "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
+ "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
+ "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
+ "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
+ "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
+ "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.2.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
+ "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
+ "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
+ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@koa/cors": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz",
+ "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==",
+ "license": "MIT",
+ "dependencies": {
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@koa/router": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz",
+ "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==",
+ "license": "MIT",
+ "dependencies": {
+ "http-errors": "^2.0.0",
+ "koa-compose": "^4.1.0",
+ "path-to-regexp": "^6.3.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@koa/router/node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "license": "MIT"
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "license": "MIT"
+ },
+ "node_modules/@lerna/create": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.0.tgz",
+ "integrity": "sha512-kyrAc709xhf79Ci2qM+neMfe3IuT89kJyqdMe+YK16kkTNlXedmmQOSs2ARdlEqVVGCWu7M75Dt2VoCBZPnZ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@npmcli/arborist": "7.5.4",
+ "@npmcli/package-json": "5.2.0",
+ "@npmcli/run-script": "8.1.0",
+ "@nx/devkit": ">=17.1.2 < 21",
+ "@octokit/plugin-enterprise-rest": "6.0.1",
+ "@octokit/rest": "19.0.11",
+ "aproba": "2.0.0",
+ "byte-size": "8.1.1",
+ "chalk": "4.1.0",
+ "clone-deep": "4.0.1",
+ "cmd-shim": "6.0.3",
+ "color-support": "1.1.3",
+ "columnify": "1.6.0",
+ "console-control-strings": "^1.1.0",
+ "conventional-changelog-core": "5.0.1",
+ "conventional-recommended-bump": "7.0.1",
+ "cosmiconfig": "9.0.0",
+ "dedent": "1.5.3",
+ "execa": "5.0.0",
+ "fs-extra": "^11.2.0",
+ "get-stream": "6.0.0",
+ "git-url-parse": "14.0.0",
+ "glob-parent": "6.0.2",
+ "globby": "11.1.0",
+ "graceful-fs": "4.2.11",
+ "has-unicode": "2.0.1",
+ "ini": "^1.3.8",
+ "init-package-json": "6.0.3",
+ "inquirer": "^8.2.4",
+ "is-ci": "3.0.1",
+ "is-stream": "2.0.0",
+ "js-yaml": "4.1.0",
+ "libnpmpublish": "9.0.9",
+ "load-json-file": "6.2.0",
+ "lodash": "^4.17.21",
+ "make-dir": "4.0.0",
+ "minimatch": "3.0.5",
+ "multimatch": "5.0.0",
+ "node-fetch": "2.6.7",
+ "npm-package-arg": "11.0.2",
+ "npm-packlist": "8.0.2",
+ "npm-registry-fetch": "^17.1.0",
+ "nx": ">=17.1.2 < 21",
+ "p-map": "4.0.0",
+ "p-map-series": "2.1.0",
+ "p-queue": "6.6.2",
+ "p-reduce": "^2.1.0",
+ "pacote": "^18.0.6",
+ "pify": "5.0.0",
+ "read-cmd-shim": "4.0.0",
+ "resolve-from": "5.0.0",
+ "rimraf": "^4.4.1",
+ "semver": "^7.3.4",
+ "set-blocking": "^2.0.0",
+ "signal-exit": "3.0.7",
+ "slash": "^3.0.0",
+ "ssri": "^10.0.6",
+ "string-width": "^4.2.3",
+ "strong-log-transformer": "2.1.0",
+ "tar": "6.2.1",
+ "temp-dir": "1.0.0",
+ "upath": "2.0.1",
+ "uuid": "^10.0.0",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "5.0.1",
+ "wide-align": "1.1.5",
+ "write-file-atomic": "5.0.1",
+ "write-pkg": "4.0.0",
+ "yargs": "17.7.2",
+ "yargs-parser": "21.1.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@lerna/create/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/execa": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+ "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/get-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/glob": {
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+ "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "minimatch": "^8.0.2",
+ "minipass": "^4.2.4",
+ "path-scurry": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+ "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@lerna/create/node_modules/inquirer": {
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz",
+ "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/inquirer/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/minipass": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@lerna/create/node_modules/npm-package-arg": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz",
+ "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/rimraf": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
+ "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^9.2.0"
+ },
+ "bin": {
+ "rimraf": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@lerna/create/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@lerna/create/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@lezer/common": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz",
+ "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==",
+ "license": "MIT"
+ },
+ "node_modules/@lezer/highlight": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz",
+ "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/lr": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
+ "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/yaml": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz",
+ "integrity": "sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.2.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.4.0"
+ }
+ },
+ "node_modules/@marijn/find-cluster-break": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz",
+ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz",
+ "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/mdx/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@mdx-js/mdx/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@mdx-js/mdx/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz",
+ "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/@module-federation/error-codes": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz",
+ "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==",
+ "license": "MIT"
+ },
+ "node_modules/@module-federation/runtime": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz",
+ "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/error-codes": "0.8.4",
+ "@module-federation/sdk": "0.8.4"
+ }
+ },
+ "node_modules/@module-federation/runtime-tools": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz",
+ "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/runtime": "0.8.4",
+ "@module-federation/webpack-bundler-runtime": "0.8.4"
+ }
+ },
+ "node_modules/@module-federation/sdk": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz",
+ "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==",
+ "license": "MIT",
+ "dependencies": {
+ "isomorphic-rslog": "0.0.6"
+ }
+ },
+ "node_modules/@module-federation/webpack-bundler-runtime": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz",
+ "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/runtime": "0.8.4",
+ "@module-federation/sdk": "0.8.4"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz",
+ "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emnapi/core": "^1.1.0",
+ "@emnapi/runtime": "^1.1.0",
+ "@tybys/wasm-util": "^0.9.0"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "14.2.24",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.24.tgz",
+ "integrity": "sha512-FDL3qs+5DML0AJz56DCVr+KnFYivxeAX73En8QbPw9GjJZ6zbfvqDy+HrarHFzbsIASn7y8y5ySJ/lllSruNVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "glob": "10.3.10"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next/node_modules/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next/node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz",
+ "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/agent/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@npmcli/arborist": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz",
+ "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/fs": "^3.1.1",
+ "@npmcli/installed-package-contents": "^2.1.0",
+ "@npmcli/map-workspaces": "^3.0.2",
+ "@npmcli/metavuln-calculator": "^7.1.1",
+ "@npmcli/name-from-folder": "^2.0.0",
+ "@npmcli/node-gyp": "^3.0.0",
+ "@npmcli/package-json": "^5.1.0",
+ "@npmcli/query": "^3.1.0",
+ "@npmcli/redact": "^2.0.0",
+ "@npmcli/run-script": "^8.1.0",
+ "bin-links": "^4.0.4",
+ "cacache": "^18.0.3",
+ "common-ancestor-path": "^1.0.1",
+ "hosted-git-info": "^7.0.2",
+ "json-parse-even-better-errors": "^3.0.2",
+ "json-stringify-nice": "^1.1.4",
+ "lru-cache": "^10.2.2",
+ "minimatch": "^9.0.4",
+ "nopt": "^7.2.1",
+ "npm-install-checks": "^6.2.0",
+ "npm-package-arg": "^11.0.2",
+ "npm-pick-manifest": "^9.0.1",
+ "npm-registry-fetch": "^17.0.1",
+ "pacote": "^18.0.6",
+ "parse-conflict-json": "^3.0.0",
+ "proc-log": "^4.2.0",
+ "proggy": "^2.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^3.0.1",
+ "read-package-json-fast": "^3.0.2",
+ "semver": "^7.3.7",
+ "ssri": "^10.0.6",
+ "treeverse": "^3.0.0",
+ "walk-up-path": "^3.0.1"
+ },
+ "bin": {
+ "arborist": "bin/index.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/arborist/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@npmcli/arborist/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/arborist/node_modules/npm-package-arg": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/arborist/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
+ "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/fs/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@npmcli/git": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz",
+ "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^7.0.0",
+ "ini": "^4.1.3",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^9.0.0",
+ "proc-log": "^4.0.0",
+ "promise-inflight": "^1.0.1",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/ini": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+ "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@npmcli/git/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/installed-package-contents": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz",
+ "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-bundled": "^3.0.0",
+ "npm-normalize-package-bin": "^3.0.0"
+ },
+ "bin": {
+ "installed-package-contents": "bin/index.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz",
+ "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/name-from-folder": "^2.0.0",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0",
+ "read-package-json-fast": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/metavuln-calculator": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz",
+ "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cacache": "^18.0.0",
+ "json-parse-even-better-errors": "^3.0.0",
+ "pacote": "^18.0.0",
+ "proc-log": "^4.1.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/metavuln-calculator/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@npmcli/name-from-folder": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz",
+ "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/node-gyp": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
+ "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/package-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz",
+ "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^5.0.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^7.0.0",
+ "json-parse-even-better-errors": "^3.0.0",
+ "normalize-package-data": "^6.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/package-json/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz",
+ "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn/node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/query": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz",
+ "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/redact": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz",
+ "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/run-script": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz",
+ "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/node-gyp": "^3.0.0",
+ "@npmcli/package-json": "^5.0.0",
+ "@npmcli/promise-spawn": "^7.0.0",
+ "node-gyp": "^10.0.0",
+ "proc-log": "^4.0.0",
+ "which": "^4.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/run-script/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/run-script/node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@nx/devkit": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.2.1.tgz",
+ "integrity": "sha512-boNTu7Z7oHkYjrYg5Wzg+cQfbEJ2nntRj1eI99w8mp4qz2B4PEEjJOB0BZafR54ZcKpGEbyp/QBB945GsjTUbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ejs": "^3.1.7",
+ "enquirer": "~2.3.6",
+ "ignore": "^5.0.4",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.3",
+ "tmp": "~0.2.1",
+ "tslib": "^2.3.0",
+ "yargs-parser": "21.1.1"
+ },
+ "peerDependencies": {
+ "nx": ">= 19 <= 21"
+ }
+ },
+ "node_modules/@nx/devkit/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@nx/eslint": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.2.1.tgz",
+ "integrity": "sha512-HY3Sy7AOZR9Z5NZ0kv/aagma/7DviYg+dCH4mHBja5nJmzX0XtAwxcTIzJuo2DBNMw/4aDfGtGgwhXyRhnmXsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nx/devkit": "20.2.1",
+ "@nx/js": "20.2.1",
+ "semver": "^7.5.3",
+ "tslib": "^2.3.0",
+ "typescript": "~5.6.2"
+ },
+ "peerDependencies": {
+ "@zkochan/js-yaml": "0.0.7",
+ "eslint": "^8.0.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@zkochan/js-yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nx/eslint/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@nx/eslint/node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/@nx/js": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.2.1.tgz",
+ "integrity": "sha512-2Ecsk7VRODXys6IgjVVhq+8zzajJzfes5SOdc82DApuNEb/cqj7gTKZlIFvqjup7t3z5yyXFd2Vi9js/JfCcZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.2",
+ "@babel/plugin-proposal-decorators": "^7.22.7",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-runtime": "^7.23.2",
+ "@babel/preset-env": "^7.23.2",
+ "@babel/preset-typescript": "^7.22.5",
+ "@babel/runtime": "^7.22.6",
+ "@nx/devkit": "20.2.1",
+ "@nx/workspace": "20.2.1",
+ "@zkochan/js-yaml": "0.0.7",
+ "babel-plugin-const-enum": "^1.0.1",
+ "babel-plugin-macros": "^2.8.0",
+ "babel-plugin-transform-typescript-metadata": "^0.3.1",
+ "chalk": "^4.1.0",
+ "columnify": "^1.6.0",
+ "detect-port": "^1.5.1",
+ "enquirer": "~2.3.6",
+ "fast-glob": "3.2.7",
+ "ignore": "^5.0.4",
+ "js-tokens": "^4.0.0",
+ "jsonc-parser": "3.2.0",
+ "minimatch": "9.0.3",
+ "npm-package-arg": "11.0.1",
+ "npm-run-path": "^4.0.1",
+ "ora": "5.3.0",
+ "semver": "^7.5.3",
+ "source-map-support": "0.5.19",
+ "ts-node": "10.9.1",
+ "tsconfig-paths": "^4.1.2",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "verdaccio": "^5.0.4"
+ },
+ "peerDependenciesMeta": {
+ "verdaccio": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nx/js/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@nx/nx-darwin-arm64": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.2.1.tgz",
+ "integrity": "sha512-nJcyPZfH6Vq4cG6gRnQ8PcnVOLePeT3exzLnQu0I4I2EtCTPyCSRA3gxoGzZ3qZFMQTsCbwv4HYfdx42AXOTAQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-darwin-x64": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.2.1.tgz",
+ "integrity": "sha512-SEiN8fjEs010ME4PRP8O9f8qG8AMZBGz8hOkF6ZrdlC+iEi4iyAGpgWFq8PKBlpVW4G5gxR91Y7eVaTKAsgH5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-freebsd-x64": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.2.1.tgz",
+ "integrity": "sha512-/yEKS9q17EG2Ci130McvpZM5YUghH1ql9UXWbVmitufn+RQD90hoblkG/B+cxJeZonrdKAjdpLQ+hfVz+FBd/g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-linux-arm-gnueabihf": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.2.1.tgz",
+ "integrity": "sha512-DPtRjTCJ5++stTGtjqYftCb2c0CNed2s2EZZLQuDP+tikTsLm0d3S3ZaU5eHhqZW35tQuMOVweOfC1nJ3/DTSA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-linux-arm64-gnu": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.2.1.tgz",
+ "integrity": "sha512-ggGwHOEP6UjXeqv6DtRxizeBnX/zRZi8BRJbEJBwAt1cAUnLlklk8d+Hmjs+j/FlFXBV9f+ylpAqoYkplFR8jg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-linux-arm64-musl": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.2.1.tgz",
+ "integrity": "sha512-HZBGxsBJUFbWVTiyJxqt0tS8tlvp+Tp0D533mGKW75cU0rv9dnmbtTwkkkx+LXqerjSRvNS3Qtj0Uh2w92Vtig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-linux-x64-gnu": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.2.1.tgz",
+ "integrity": "sha512-pTytPwGiPRakqz2PKiWTSRNm9taE1U9n0+kRAAFzbOtzeW+eIoebe5xY5QMoZ+XtIZ6pJM2BUOyMD+/TX57r8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-linux-x64-musl": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.2.1.tgz",
+ "integrity": "sha512-p3egqe5zmwiDl6xSwHi2K9UZWiKbZ/s/j4qV+pZttzMyNPfhohTeP+VwQqjTeQ1hPBl2YhwmmktEPsIPYJG7YA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-win32-arm64-msvc": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.2.1.tgz",
+ "integrity": "sha512-Wujist6k08pjgWWQ1pjXrCArmMgnyIXNVmDP14cWo1KHecBuxNWa9i62PrxQ0K8MLYMcAzLHJxN9t54GzBbd+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/nx-win32-x64-msvc": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.2.1.tgz",
+ "integrity": "sha512-tsEYfNV2+CWSQmbh9TM8cX5wk6F2QAH0tfvt4topyOOaR40eszW8qc/eDM/kkJ5nj87BbNEqPBQAYFE0AP1OMA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nx/workspace": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.2.1.tgz",
+ "integrity": "sha512-YJnOyqJDzuTHOWQ/eFCfBwGg0x3ByxBYk4PPF48tUN21TLoXbq39GP+/I3tsRNm9rvhcOTRoGybWu06t21ty4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nx/devkit": "20.2.1",
+ "chalk": "^4.1.0",
+ "enquirer": "~2.3.6",
+ "nx": "20.2.1",
+ "tslib": "^2.3.0",
+ "yargs-parser": "21.1.1"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
+ "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
+ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/auth-token": "^3.0.0",
+ "@octokit/graphql": "^5.0.0",
+ "@octokit/request": "^6.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+ "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz",
+ "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/request": "^6.0.0",
+ "@octokit/types": "^9.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "18.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
+ "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-enterprise-rest": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz",
+ "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz",
+ "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/tsconfig": "^1.0.2",
+ "@octokit/types": "^9.2.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=4"
+ }
+ },
+ "node_modules/@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz",
+ "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^10.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz",
+ "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "6.2.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+ "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^7.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+ "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/rest": {
+ "version": "19.0.11",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz",
+ "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/core": "^4.2.1",
+ "@octokit/plugin-paginate-rest": "^6.1.2",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/tsconfig": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz",
+ "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/@otplib/core": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz",
+ "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==",
+ "license": "MIT"
+ },
+ "node_modules/@otplib/plugin-crypto": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz",
+ "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@otplib/core": "^12.0.1"
+ }
+ },
+ "node_modules/@otplib/plugin-thirty-two": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz",
+ "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@otplib/core": "^12.0.1",
+ "thirty-two": "^1.0.2"
+ }
+ },
+ "node_modules/@otplib/preset-default": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz",
+ "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/plugin-crypto": "^12.0.1",
+ "@otplib/plugin-thirty-two": "^12.0.1"
+ }
+ },
+ "node_modules/@otplib/preset-v11": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz",
+ "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==",
+ "license": "MIT",
+ "dependencies": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/plugin-crypto": "^12.0.1",
+ "@otplib/plugin-thirty-two": "^12.0.1"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pnpm/config.env-replace": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+ "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+ "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "4.2.10"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "license": "ISC"
+ },
+ "node_modules/@pnpm/npm-conf": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
+ "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/config.env-replace": "^1.1.0",
+ "@pnpm/network.ca-file": "^1.0.1",
+ "config-chain": "^1.1.11"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+ "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+ "license": "MIT"
+ },
+ "node_modules/@prisma/client": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.15.0.tgz",
+ "integrity": "sha512-wPTeTjbd2Q0abOeffN7zCDCbkp9C9cF+e9HPiI64lmpehyq2TepgXE+sY7FXr7Rhbb21prLMnhXX27/E11V09w==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.13"
+ },
+ "peerDependencies": {
+ "prisma": "*"
+ },
+ "peerDependenciesMeta": {
+ "prisma": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@prisma/debug": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.15.0.tgz",
+ "integrity": "sha512-QpEAOjieLPc/4sMny/WrWqtpIAmBYsgqwWlWwIctqZO0AbhQ9QcT6x2Ut3ojbDo/pFRCCA1Z1+xm2MUy7fAkZA==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@prisma/engines": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.15.0.tgz",
+ "integrity": "sha512-hXL5Sn9hh/ZpRKWiyPA5GbvF3laqBHKt6Vo70hYqqOhh5e0ZXDzHcdmxNvOefEFeqxra2DMz2hNbFoPvqrVe1w==",
+ "devOptional": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "5.15.0",
+ "@prisma/engines-version": "5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022",
+ "@prisma/fetch-engine": "5.15.0",
+ "@prisma/get-platform": "5.15.0"
+ }
+ },
+ "node_modules/@prisma/engines-version": {
+ "version": "5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022",
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022.tgz",
+ "integrity": "sha512-3BEgZ41Qb4oWHz9kZNofToRvNeS4LZYaT9pienR1gWkjhky6t6K1NyeWNBkqSj2llgraUNbgMOCQPY4f7Qp5wA==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@prisma/fetch-engine": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.15.0.tgz",
+ "integrity": "sha512-z6AY5yyXxc20Klj7wwnfGP0iIUkVKzybqapT02zLYR/nf9ynaeN8bq73WRmi1TkLYn+DJ5Qy+JGu7hBf1pE78A==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "5.15.0",
+ "@prisma/engines-version": "5.15.0-29.12e25d8d06f6ea5a0252864dd9a03b1bb51f3022",
+ "@prisma/get-platform": "5.15.0"
+ }
+ },
+ "node_modules/@prisma/get-platform": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.15.0.tgz",
+ "integrity": "sha512-1GULDkW4+/VQb73vihxCBSc4Chc2x88MA+O40tcZFjmBzG4/fF44PaXFxUqKSFltxU9L9GIMLhh0Gfkk/pUbtg==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "5.15.0"
+ }
+ },
+ "node_modules/@rspack/binding": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-rtmDScjtGUxv1zA1m3jXecuX2LsgNp4aWaAjOowHasoO1YqfHK0fMyprCiPowTjoHtpZ7Xt/tnMhii0GlGIITQ==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "@rspack/binding-darwin-arm64": "1.2.0-alpha.0",
+ "@rspack/binding-darwin-x64": "1.2.0-alpha.0",
+ "@rspack/binding-linux-arm64-gnu": "1.2.0-alpha.0",
+ "@rspack/binding-linux-arm64-musl": "1.2.0-alpha.0",
+ "@rspack/binding-linux-x64-gnu": "1.2.0-alpha.0",
+ "@rspack/binding-linux-x64-musl": "1.2.0-alpha.0",
+ "@rspack/binding-win32-arm64-msvc": "1.2.0-alpha.0",
+ "@rspack/binding-win32-ia32-msvc": "1.2.0-alpha.0",
+ "@rspack/binding-win32-x64-msvc": "1.2.0-alpha.0"
+ }
+ },
+ "node_modules/@rspack/binding-darwin-arm64": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-EPprIe6BrkJ9XuWL5HBXJFaH4vvt5C2kBTvyu+t5E3wacyH9A0gIDaMOEmH30Kt3zl4B07OCBC1nCiJ1sTtimw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rspack/binding-darwin-x64": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-ACwdgWg0V9j0o3gs1wvhqRJ4xui82L+Fii9Fa74az7P974iWO0ZHw4QIUaO5r434+v9OWMqpyBRN1M7cBrx3GA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rspack/binding-linux-arm64-gnu": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-Ex9SviDikz9E36R4I5si/626FsYOJ35l1Lb+DCRUijjjsvoq4k8Shi8csyBfubR+JZ1M0uOXjJftu1Gm5z8Q0Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rspack/binding-linux-arm64-musl": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-U320xZmTcTwQ0BR8yIzE1L4olMCqzYkT3VFjXPR6iok/Mj0xjfk/SiKhLoZml473qQrHSGaFJ321cp02zgTFJg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rspack/binding-linux-x64-gnu": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-GNur7VXJ29NtJhY8PYgv3Fv1Zxbx0XZhDUj/+7Wp40CAXRFsLgXScZIRh2U30TECYaihboZ7BD+xugv8MQPDoA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rspack/binding-linux-x64-musl": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-0IdswzpG9+sgxvGu7KTwSeqfV0hvciaHMoZvGklfZa2txpcUqAg4ASp7uxrNaUo+G2a1fTUMOtP9351Cnl8DBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rspack/binding-win32-arm64-msvc": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-FcFgoWGjSrCfJwDZY5bDA2aO02l5BP7qdyW6ehjwBiMxNZyeSbGvKz3jXl5TtTHR1IgdLzi9kEJkTPYLLMiE1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rspack/binding-win32-ia32-msvc": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-cZYFJw6DKCaPPz9VDJPndZ9KSp+/eedgt11Mv8OTpq+MJTUjB2HjtcjqJh8xxVcp3IuwvSMndTkC69WWt/4feA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rspack/binding-win32-x64-msvc": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-gfOqb/rq5716NV+Vbk5MteBhV4VhJeSoh2+dRQjdy4EN1wPZ+Uebs9ORVrT9uRjY3JrPn/5PkAHJXtgaOA9Uyg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rspack/core": {
+ "version": "1.2.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.0-alpha.0.tgz",
+ "integrity": "sha512-YiD0vFDj+PfHs3ZqJwPNhTYyVTb4xR6FpOI5WJ4jJHV4lgdErS+RChTCPhf1xeqxfuTSSnFA7UeqosLhBuNSqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@module-federation/runtime-tools": "0.8.4",
+ "@rspack/binding": "1.2.0-alpha.0",
+ "@rspack/lite-tapable": "1.0.1",
+ "caniuse-lite": "^1.0.30001616"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@swc/helpers": ">=0.5.1"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rspack/lite-tapable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz",
+ "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
+ "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
+ "license": "MIT"
+ },
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+ "license": "MIT"
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@sigstore/bundle": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz",
+ "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.3.2"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@sigstore/core": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz",
+ "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@sigstore/protobuf-specs": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz",
+ "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/sign": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz",
+ "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "make-fetch-happen": "^13.0.1",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@sigstore/tuf": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz",
+ "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "tuf-js": "^2.2.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@sigstore/verify": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz",
+ "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.3.2"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "license": "MIT"
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+ "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
+ "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz",
+ "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.1.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam/node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz",
+ "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==",
+ "dev": true,
+ "license": "(Unlicense OR Apache-2.0)"
+ },
+ "node_modules/@slorber/remark-comment": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz",
+ "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^1.0.0",
+ "micromark-util-character": "^1.1.0",
+ "micromark-util-symbol": "^1.0.1"
+ }
+ },
+ "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
+ "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
+ "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^1.0.0",
+ "micromark-util-types": "^1.0.0"
+ }
+ },
+ "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
+ "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
+ "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@smithy/abort-controller": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz",
+ "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/config-resolver": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz",
+ "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-config-provider": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.11",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/core": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.7.tgz",
+ "integrity": "sha512-8olpW6mKCa0v+ibCjoCzgZHQx1SQmZuW/WkrdZo73wiTprTH6qhmskT60QLFdT9DRa5mXxjz89kQPZ7ZSsoqqg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/middleware-serde": "^3.0.11",
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-body-length-browser": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.11",
+ "@smithy/util-stream": "^3.3.4",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz",
+ "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/property-provider": "^3.1.11",
+ "@smithy/types": "^3.7.2",
+ "@smithy/url-parser": "^3.0.11",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz",
+ "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.4",
+ "@smithy/querystring-builder": "^3.0.7",
+ "@smithy/types": "^3.5.0",
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/hash-node": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz",
+ "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/invalid-dependency": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz",
+ "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/is-array-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
+ "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-content-length": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz",
+ "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-endpoint": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.8.tgz",
+ "integrity": "sha512-OEJZKVUEhMOqMs3ktrTWp7UvvluMJEvD5XgQwRePSbDg1VvBaL8pX8mwPltFn6wk1GySbcVwwyldL8S+iqnrEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^2.5.7",
+ "@smithy/middleware-serde": "^3.0.11",
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/shared-ini-file-loader": "^3.1.12",
+ "@smithy/types": "^3.7.2",
+ "@smithy/url-parser": "^3.0.11",
+ "@smithy/util-middleware": "^3.0.11",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry": {
+ "version": "3.0.34",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.34.tgz",
+ "integrity": "sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/service-error-classification": "^3.0.11",
+ "@smithy/smithy-client": "^3.7.0",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-middleware": "^3.0.11",
+ "@smithy/util-retry": "^3.0.11",
+ "tslib": "^2.6.2",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@smithy/middleware-serde": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz",
+ "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-stack": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz",
+ "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/node-config-provider": {
+ "version": "3.1.12",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz",
+ "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^3.1.11",
+ "@smithy/shared-ini-file-loader": "^3.1.12",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz",
+ "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/abort-controller": "^3.1.9",
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/querystring-builder": "^3.0.11",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/property-provider": {
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz",
+ "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/protocol-http": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz",
+ "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-builder": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz",
+ "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-uri-escape": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-parser": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz",
+ "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/service-error-classification": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz",
+ "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/shared-ini-file-loader": {
+ "version": "3.1.12",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz",
+ "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.2.tgz",
+ "integrity": "sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^3.0.0",
+ "@smithy/types": "^3.3.0",
+ "@smithy/util-hex-encoding": "^3.0.0",
+ "@smithy/util-middleware": "^3.0.3",
+ "@smithy/util-uri-escape": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/smithy-client": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.7.0.tgz",
+ "integrity": "sha512-9wYrjAZFlqWhgVo3C4y/9kpc68jgiSsKUnsFPzr/MSiRL93+QRDafGTfhhKAb2wsr69Ru87WTiqSfQusSmWipA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/core": "^2.5.7",
+ "@smithy/middleware-endpoint": "^3.2.8",
+ "@smithy/middleware-stack": "^3.0.11",
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-stream": "^3.3.4",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz",
+ "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/url-parser": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz",
+ "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/querystring-parser": "^3.0.11",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/util-base64": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz",
+ "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz",
+ "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/util-body-length-node": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz",
+ "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-buffer-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz",
+ "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-config-provider": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz",
+ "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-browser": {
+ "version": "3.0.34",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.34.tgz",
+ "integrity": "sha512-FumjjF631lR521cX+svMLBj3SwSDh9VdtyynTYDAiBDEf8YPP5xORNXKQ9j0105o5+ARAGnOOP/RqSl40uXddA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/property-provider": "^3.1.11",
+ "@smithy/smithy-client": "^3.7.0",
+ "@smithy/types": "^3.7.2",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-node": {
+ "version": "3.0.34",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.34.tgz",
+ "integrity": "sha512-vN6aHfzW9dVVzkI0wcZoUXvfjkl4CSbM9nE//08lmUMyf00S75uuCpTrqF9uD4bD9eldIXlt53colrlwKAT8Gw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/config-resolver": "^3.0.13",
+ "@smithy/credential-provider-imds": "^3.2.8",
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/property-provider": "^3.1.11",
+ "@smithy/smithy-client": "^3.7.0",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@smithy/util-endpoints": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz",
+ "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.12",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-hex-encoding": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz",
+ "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-middleware": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz",
+ "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-retry": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz",
+ "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/service-error-classification": "^3.0.11",
+ "@smithy/types": "^3.7.2",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.4.tgz",
+ "integrity": "sha512-SGhGBG/KupieJvJSZp/rfHHka8BFgj56eek9px4pp7lZbOF+fRiVr4U7A3y3zJD8uGhxq32C5D96HxsTC9BckQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/fetch-http-handler": "^4.1.3",
+ "@smithy/node-http-handler": "^3.3.3",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-base64": "^3.0.0",
+ "@smithy/util-buffer-from": "^3.0.0",
+ "@smithy/util-hex-encoding": "^3.0.0",
+ "@smithy/util-utf8": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz",
+ "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/querystring-builder": "^3.0.11",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "node_modules/@smithy/util-uri-escape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz",
+ "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/util-utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz",
+ "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^3.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@svgr/core/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.18.tgz",
+ "integrity": "sha512-IUWKD6uQYGRy8w2X9EZrtYg1O3SCijlHbCXzMaHQYc1X7yjijQh4H3IVL9ssZZyVp2ZDfQZu4bD5DWxxvpyjvg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.17"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.10.18",
+ "@swc/core-darwin-x64": "1.10.18",
+ "@swc/core-linux-arm-gnueabihf": "1.10.18",
+ "@swc/core-linux-arm64-gnu": "1.10.18",
+ "@swc/core-linux-arm64-musl": "1.10.18",
+ "@swc/core-linux-x64-gnu": "1.10.18",
+ "@swc/core-linux-x64-musl": "1.10.18",
+ "@swc/core-win32-arm64-msvc": "1.10.18",
+ "@swc/core-win32-ia32-msvc": "1.10.18",
+ "@swc/core-win32-x64-msvc": "1.10.18"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "*"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.18.tgz",
+ "integrity": "sha512-FdGqzAIKVQJu8ROlnHElP59XAUsUzCFSNsou+tY/9ba+lhu8R9v0OI5wXiPErrKGZpQFMmx/BPqqhx3X4SuGNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.18.tgz",
+ "integrity": "sha512-RZ73gZRituL/ZVLgrW6BYnQ5g8tuStG4cLUiPGJsUZpUm0ullSH6lHFvZTCBNFTfpQChG6eEhi2IdG6DwFp1lw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.18.tgz",
+ "integrity": "sha512-8iJqI3EkxJuuq21UHoen1VS+QlS23RvynRuk95K+Q2HBjygetztCGGEc+Xelx9a0uPkDaaAtFvds4JMDqb9SAA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.18.tgz",
+ "integrity": "sha512-8f1kSktWzMB6PG+r8lOlCfXz5E8Qhsmfwonn77T/OfjvGwQaWrcoASh2cdjpk3dydbf8jsKGPQE1lSc7GyjXRQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.18.tgz",
+ "integrity": "sha512-4rv+E4VLdgQw6zjbTAauCAEExxChvxMpBUMCiZweTNPKbJJ2dY6BX2WGJ1ea8+RcgqR/Xysj3AFbOz1LBz6dGA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.18.tgz",
+ "integrity": "sha512-vTNmyRBVP+sZca+vtwygYPGTNudTU6Gl6XhaZZ7cEUTBr8xvSTgEmYXoK/2uzyXpaTUI4Bmtp1x81cGN0mMoLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.18.tgz",
+ "integrity": "sha512-1TZPReKhFCeX776XaT6wegknfg+g3zODve+r4oslFHI+g7cInfWlxoGNDS3niPKyuafgCdOjme2g3OF+zzxfsQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.18.tgz",
+ "integrity": "sha512-o/2CsaWSN3bkzVQ6DA+BiFKSVEYvhWGA1h+wnL2zWmIDs2Knag54sOEXZkCaf8YQyZesGeXJtPEy9hh/vjJgkA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.18.tgz",
+ "integrity": "sha512-eTPASeJtk4mJDfWiYEiOC6OYUi/N7meHbNHcU8e+aKABonhXrIo/FmnTE8vsUtC6+jakT1TQBdiQ8fzJ1kJVwA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.18.tgz",
+ "integrity": "sha512-1Dud8CDBnc34wkBOboFBQud9YlV1bcIQtKSg7zC8LtwR3h+XAaCayZPkpGmmAlCv1DLQPvkF+s0JcaVC9mfffQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@swc/html": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html/-/html-1.10.18.tgz",
+ "integrity": "sha512-wGSDnY1yXOrSLyLPfl/SJqw785fa9djJCAFE/4/aaB1x1R78jDBNM9yL592IkKOXtGFZsshR9ecy26RT2PySIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "optionalDependencies": {
+ "@swc/html-darwin-arm64": "1.10.18",
+ "@swc/html-darwin-x64": "1.10.18",
+ "@swc/html-linux-arm-gnueabihf": "1.10.18",
+ "@swc/html-linux-arm64-gnu": "1.10.18",
+ "@swc/html-linux-arm64-musl": "1.10.18",
+ "@swc/html-linux-x64-gnu": "1.10.18",
+ "@swc/html-linux-x64-musl": "1.10.18",
+ "@swc/html-win32-arm64-msvc": "1.10.18",
+ "@swc/html-win32-ia32-msvc": "1.10.18",
+ "@swc/html-win32-x64-msvc": "1.10.18"
+ }
+ },
+ "node_modules/@swc/html-darwin-arm64": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-darwin-arm64/-/html-darwin-arm64-1.10.18.tgz",
+ "integrity": "sha512-D21RHFWy17nQePsHsqOgwXMl+fdnGSc5pV/R7/edFtZM71JOlnkO1NLX+W54cF18LtfNJ7aFrZ5Rr0YlPZd/Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-darwin-x64": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-darwin-x64/-/html-darwin-x64-1.10.18.tgz",
+ "integrity": "sha512-hLSM/jWz8msPXwH2siyhNfqG1LXB+24W67BHjFh0bS7eAuIvbj7wWiMBjf2KLLKlq5WlIEliiGB9qHB1Dyal3w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-linux-arm-gnueabihf": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.10.18.tgz",
+ "integrity": "sha512-h4vdQk/AN2LfyinE6vqjeSwIP9uOj0uG3RB8Zj4F9qxIsKjk9WcZmCuyZKslLJM+a1DICtKJPu4poMtMXZJiLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-linux-arm64-gnu": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.10.18.tgz",
+ "integrity": "sha512-hkqbeApRyldLLrrkU6tnXe06UrB97yFEDsJ4pyPIP5luWtoMAo0vz1UrOyBTN96rTF6Mocfk6huhVe2tnZQf8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-linux-arm64-musl": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.10.18.tgz",
+ "integrity": "sha512-4Xpl7WVDqOWWkTgkH5f0j3v3jLwYDKyhEwPLdGtKPwK0Oi2989Y+E09i093a4jSfpqeEN2IRgJJLOKC2jMZi1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-linux-x64-gnu": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.10.18.tgz",
+ "integrity": "sha512-Cf64i7gEMEzP/7SOpaqD41AMLpdSL+fbSIukVEFDJryttILahLWrHrVjpgXaQQfWqOsAYhFwVpn57Xd2WgD/Cg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-linux-x64-musl": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.10.18.tgz",
+ "integrity": "sha512-ThhW9E5zQkaAggNurHdCeEbZVj3fda5XBzxpO8h4kMW5qR5lChsB5tG3TDYLsNsaLDkGDaVFUd9lCpF5KEG6pQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-win32-arm64-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.10.18.tgz",
+ "integrity": "sha512-ON4RZD7gjVJOGBriNeU7q4xRS4OyRmn8hesU8GS5QZafy9jFPA/jUYDOfWC2ValfI6OkbXW6w3wECPUr3izm6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-win32-ia32-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.10.18.tgz",
+ "integrity": "sha512-bfHqrSNk/dySpQp+AtCn4bz7CWoz6fBLAxzWlTihmBh5Fw/8k3mOWMEMGZgpAIDXbkaRW3SYpwtPEew/OH6uXw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/html-win32-x64-msvc": {
+ "version": "1.10.18",
+ "resolved": "https://registry.npmjs.org/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.10.18.tgz",
+ "integrity": "sha512-+cMUoUJTge8qh+2Ulx80YOdpf2dK04zvhv6q87DCNFuwMcCDnoSxop6S+fXV6n5pKNtBqHwpQAEH/LoMw5OyEg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz",
+ "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+ "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "license": "MIT",
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
+ "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@tufjs/models": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz",
+ "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.4"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@tufjs/models/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
+ "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/acorn": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
+ "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/conventional-commits-parser": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz",
+ "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
+ "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/gtag.js": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz",
+ "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.16",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
+ "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/nlcst": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz",
+ "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.13.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz",
+ "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prismjs": {
+ "version": "1.26.5",
+ "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz",
+ "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.18",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
+ "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz",
+ "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-config": {
+ "version": "5.0.11",
+ "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz",
+ "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "^5.1.0"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
+ "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
+ "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.24.1",
+ "@typescript-eslint/type-utils": "8.24.1",
+ "@typescript-eslint/utils": "8.24.1",
+ "@typescript-eslint/visitor-keys": "8.24.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
+ "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.24.1",
+ "@typescript-eslint/types": "8.24.1",
+ "@typescript-eslint/typescript-estree": "8.24.1",
+ "@typescript-eslint/visitor-keys": "8.24.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
+ "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.24.1",
+ "@typescript-eslint/visitor-keys": "8.24.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
+ "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.24.1",
+ "@typescript-eslint/utils": "8.24.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
+ "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
+ "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.24.1",
+ "@typescript-eslint/visitor-keys": "8.24.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
+ "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.24.1",
+ "@typescript-eslint/types": "8.24.1",
+ "@typescript-eslint/typescript-estree": "8.24.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.24.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
+ "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.24.1",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@uiw/codemirror-extensions-basic-setup": {
+ "version": "4.23.8",
+ "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.8.tgz",
+ "integrity": "sha512-XJR/8AEVcE7ufy1BhW2nCN9qSVDYEdCtYLfvhaMwl6Q3qcaYYCGE2K5QbFCy7LsdP/3uZKvc1OskuqatoOPdhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://jaywcjlove.github.io/#/sponsor"
+ },
+ "peerDependencies": {
+ "@codemirror/autocomplete": ">=6.0.0",
+ "@codemirror/commands": ">=6.0.0",
+ "@codemirror/language": ">=6.0.0",
+ "@codemirror/lint": ">=6.0.0",
+ "@codemirror/search": ">=6.0.0",
+ "@codemirror/state": ">=6.0.0",
+ "@codemirror/view": ">=6.0.0"
+ }
+ },
+ "node_modules/@uiw/react-codemirror": {
+ "version": "4.23.8",
+ "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.23.8.tgz",
+ "integrity": "sha512-/NA5Pj4MmXkLSlmlUm4yfEmRLntrNq5TkQKBSINn7TukXQ4fc+C6Bk0U60Qa4rkvCSgwzZdQ2exyP0t0+2GtqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.6",
+ "@codemirror/commands": "^6.1.0",
+ "@codemirror/state": "^6.1.1",
+ "@codemirror/theme-one-dark": "^6.0.0",
+ "@uiw/codemirror-extensions-basic-setup": "4.23.8",
+ "codemirror": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://jaywcjlove.github.io/#/sponsor"
+ },
+ "peerDependencies": {
+ "@babel/runtime": ">=7.11.0",
+ "@codemirror/state": ">=6.0.0",
+ "@codemirror/theme-one-dark": ">=6.0.0",
+ "@codemirror/view": ">=6.0.0",
+ "codemirror": ">=6.0.0",
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/@yarnpkg/parsers": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz",
+ "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "js-yaml": "^3.10.0",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/@yarnpkg/parsers/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@yarnpkg/parsers/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@zkochan/js-yaml": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz",
+ "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/add-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
+ "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "5.20.3",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.3.tgz",
+ "integrity": "sha512-iNC6BGvipaalFfDfDnXUje8GUlW5asj0cTMsZJwO/0rhsyLx1L7GZFAY8wW+eQ6AM4Yge2p5GSE5hrBlfSD90Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-abtesting": "5.20.3",
+ "@algolia/client-analytics": "5.20.3",
+ "@algolia/client-common": "5.20.3",
+ "@algolia/client-insights": "5.20.3",
+ "@algolia/client-personalization": "5.20.3",
+ "@algolia/client-query-suggestions": "5.20.3",
+ "@algolia/client-search": "5.20.3",
+ "@algolia/ingestion": "1.20.3",
+ "@algolia/monitoring": "1.20.3",
+ "@algolia/recommend": "5.20.3",
+ "@algolia/requester-browser-xhr": "5.20.3",
+ "@algolia/requester-fetch": "5.20.3",
+ "@algolia/requester-node-http": "5.20.3"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/algoliasearch-helper": {
+ "version": "3.24.1",
+ "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.24.1.tgz",
+ "integrity": "sha512-knYRACqLH9UpeR+WRUrBzBFR2ulGuOjI2b525k4PNeqZxeFMHJE7YcL7s6Jh12Qza0rtHqZdgHMfeuaaAkf4wA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/events": "^4.0.1"
+ },
+ "peerDependencies": {
+ "algoliasearch": ">= 3.1 < 6"
+ }
+ },
+ "node_modules/all-contributors-cli": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.26.1.tgz",
+ "integrity": "sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.6",
+ "async": "^3.1.0",
+ "chalk": "^4.0.0",
+ "didyoumean": "^1.2.1",
+ "inquirer": "^7.3.3",
+ "json-fixer": "^1.6.8",
+ "lodash": "^4.11.2",
+ "node-fetch": "^2.6.0",
+ "pify": "^5.0.0",
+ "yargs": "^15.0.1"
+ },
+ "bin": {
+ "all-contributors": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "optionalDependencies": {
+ "prettier": "^2"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/all-contributors-cli/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/all-contributors-cli/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-iterate": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz",
+ "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "license": "MIT"
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/attr-accept": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz",
+ "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
+ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^4.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/babel-loader/node_modules/find-cache-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+ "license": "MIT",
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/babel-loader/node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/babel-loader/node_modules/pkg-dir": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+ "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/babel-plugin-const-enum": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz",
+ "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-syntax-typescript": "^7.3.3",
+ "@babel/traverse": "^7.16.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+ "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "cosmiconfig": "^6.0.0",
+ "resolve": "^1.12.0"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-typescript-metadata": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz",
+ "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "node_modules/backend.freesewing.org": {
+ "resolved": "sites/backend",
+ "link": true
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "license": "MIT"
+ },
+ "node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
+ "license": "MIT"
+ },
+ "node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/bezier-js": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz",
+ "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==",
+ "license": "MIT",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/bin-links": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz",
+ "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cmd-shim": "^6.0.0",
+ "npm-normalize-package-bin": "^3.0.0",
+ "read-cmd-shim": "^4.0.0",
+ "write-file-atomic": "^5.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+ "license": "MIT"
+ },
+ "node_modules/boxen": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz",
+ "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.2",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.0.1",
+ "type-fest": "^2.5.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brotli": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
+ "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.1.2"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/builtins": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.0.0"
+ }
+ },
+ "node_modules/builtins/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/byte-size": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz",
+ "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.17"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/c8": {
+ "version": "10.1.3",
+ "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz",
+ "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==",
+ "license": "ISC",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^1.0.1",
+ "@istanbuljs/schema": "^0.1.3",
+ "find-up": "^5.0.0",
+ "foreground-child": "^3.1.1",
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-reports": "^3.1.6",
+ "test-exclude": "^7.0.1",
+ "v8-to-istanbul": "^9.0.0",
+ "yargs": "^17.7.2",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "c8": "bin/c8.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "monocart-coverage-reports": "^2"
+ },
+ "peerDependenciesMeta": {
+ "monocart-coverage-reports": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/c8/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c8/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c8/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c8/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c8/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/c8/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "18.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz",
+ "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cacache/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cache-content-type": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
+ "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^2.1.18",
+ "ylru": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+ "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "10.2.14",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+ "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-cache-semantics": "^4.0.2",
+ "get-stream": "^6.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "keyv": "^4.5.3",
+ "mimic-response": "^4.0.0",
+ "normalize-url": "^8.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caching-transform/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caching-transform/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/caching-transform/node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001700",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
+ "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chai": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
+ "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/chai-http": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-5.1.1.tgz",
+ "integrity": "sha512-h+QZNfYdlcoyIyOb26N71S7700CP4EY+CQ1X15AsX1RD2xMLAWbMniS7yUTOEC6DzC5yydGV37wu81AGNm8esA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "charset": "^1.0.1",
+ "cookiejar": "^2.1.4",
+ "is-ip": "^5.0.1",
+ "methods": "^1.1.2",
+ "qs": "^6.12.1",
+ "superagent": "^9"
+ },
+ "engines": {
+ "node": ">=18.20.0"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/charset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz",
+ "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cheerio-select/node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cheerio/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/cheerio/node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
+ "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "exit": "0.1.2",
+ "glob": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=0.2.5"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
+ "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cli/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/cli/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/cli/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clone-regexp": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz",
+ "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-regexp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cmd-shim": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz",
+ "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/codemirror": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
+ "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/columnify": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz",
+ "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-ansi": "^6.0.1",
+ "wcwidth": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/combine-promises": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz",
+ "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz",
+ "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
+ "license": "ISC"
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "dev": true,
+ "engines": [
+ "node >= 6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/config-chain/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/configstore": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
+ "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dot-prop": "^6.0.1",
+ "graceful-fs": "^4.2.6",
+ "unique-string": "^3.0.0",
+ "write-file-atomic": "^3.0.3",
+ "xdg-basedir": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/configstore?sponsor=1"
+ }
+ },
+ "node_modules/configstore/node_modules/dot-prop": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
+ "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/configstore/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/configstore/node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/configstore/node_modules/xdg-basedir": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
+ "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/consola": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz",
+ "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==",
+ "dev": true,
+ "dependencies": {
+ "date-now": "^0.1.4"
+ }
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-conventionalcommits": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-core": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz",
+ "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "add-stream": "^1.0.0",
+ "conventional-changelog-writer": "^6.0.0",
+ "conventional-commits-parser": "^4.0.0",
+ "dateformat": "^3.0.3",
+ "get-pkg-repo": "^4.2.1",
+ "git-raw-commits": "^3.0.0",
+ "git-remote-origin-url": "^2.0.0",
+ "git-semver-tags": "^5.0.0",
+ "normalize-package-data": "^3.0.3",
+ "read-pkg": "^3.0.0",
+ "read-pkg-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz",
+ "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-text-path": "^1.0.1",
+ "JSONStream": "^1.3.5",
+ "meow": "^8.1.2",
+ "split2": "^3.2.2"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/git-raw-commits": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz",
+ "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dargs": "^7.0.0",
+ "meow": "^8.1.2",
+ "split2": "^3.2.2"
+ },
+ "bin": {
+ "git-raw-commits": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/split2": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "readable-stream": "^3.0.0"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/text-extensions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
+ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-changelog-core/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-preset-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz",
+ "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-changelog-writer": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz",
+ "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "conventional-commits-filter": "^3.0.0",
+ "dateformat": "^3.0.3",
+ "handlebars": "^4.7.7",
+ "json-stringify-safe": "^5.0.1",
+ "meow": "^8.1.2",
+ "semver": "^7.0.0",
+ "split": "^1.0.1"
+ },
+ "bin": {
+ "conventional-changelog-writer": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-writer/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-changelog-writer/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-commits-filter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz",
+ "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.ismatch": "^4.4.0",
+ "modify-values": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-recommended-bump": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz",
+ "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "concat-stream": "^2.0.0",
+ "conventional-changelog-preset-loader": "^3.0.0",
+ "conventional-commits-filter": "^3.0.0",
+ "conventional-commits-parser": "^4.0.0",
+ "git-raw-commits": "^3.0.0",
+ "git-semver-tags": "^5.0.0",
+ "meow": "^8.1.2"
+ },
+ "bin": {
+ "conventional-recommended-bump": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz",
+ "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-text-path": "^1.0.1",
+ "JSONStream": "^1.3.5",
+ "meow": "^8.1.2",
+ "split2": "^3.2.2"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz",
+ "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dargs": "^7.0.0",
+ "meow": "^8.1.2",
+ "split2": "^3.2.2"
+ },
+ "bin": {
+ "git-raw-commits": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/split2": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "readable-stream": "^3.0.0"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/text-extensions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
+ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-recommended-bump/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/convert-hrtime": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz",
+ "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookies": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
+ "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "keygrip": "~1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/copy-text-to-clipboard": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz",
+ "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
+ "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.1",
+ "globby": "^13.1.1",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/globby": {
+ "version": "13.2.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
+ "license": "MIT",
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.3.0",
+ "ignore": "^5.2.4",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
+ "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
+ "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz",
+ "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig-typescript-loader": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
+ "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jiti": "^2.4.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=9",
+ "typescript": ">=5"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/crelt": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
+ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
+ "license": "MIT"
+ },
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
+ "license": "MIT"
+ },
+ "node_modules/crypto-random-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+ "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/crypto-random-string/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz",
+ "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
+ "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz",
+ "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-loader/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
+ "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "cssnano": "^6.0.1",
+ "jest-worker": "^29.4.3",
+ "postcss": "^8.4.24",
+ "schema-utils": "^4.0.1",
+ "serialize-javascript": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "@swc/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz",
+ "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/css-selector-tokenizer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
+ "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssdb": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz",
+ "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ],
+ "license": "MIT-0"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
+ "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-default": "^6.1.2",
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-preset-advanced": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",
+ "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "autoprefixer": "^10.4.19",
+ "browserslist": "^4.23.0",
+ "cssnano-preset-default": "^6.1.2",
+ "postcss-discard-unused": "^6.0.5",
+ "postcss-merge-idents": "^6.0.3",
+ "postcss-reduce-idents": "^6.0.3",
+ "postcss-zindex": "^6.0.2"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
+ "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-calc": "^9.0.1",
+ "postcss-colormin": "^6.1.0",
+ "postcss-convert-values": "^6.1.0",
+ "postcss-discard-comments": "^6.0.2",
+ "postcss-discard-duplicates": "^6.0.3",
+ "postcss-discard-empty": "^6.0.3",
+ "postcss-discard-overridden": "^6.0.2",
+ "postcss-merge-longhand": "^6.0.5",
+ "postcss-merge-rules": "^6.1.1",
+ "postcss-minify-font-values": "^6.1.0",
+ "postcss-minify-gradients": "^6.0.3",
+ "postcss-minify-params": "^6.1.0",
+ "postcss-minify-selectors": "^6.0.4",
+ "postcss-normalize-charset": "^6.0.2",
+ "postcss-normalize-display-values": "^6.0.2",
+ "postcss-normalize-positions": "^6.0.2",
+ "postcss-normalize-repeat-style": "^6.0.2",
+ "postcss-normalize-string": "^6.0.2",
+ "postcss-normalize-timing-functions": "^6.0.2",
+ "postcss-normalize-unicode": "^6.1.0",
+ "postcss-normalize-url": "^6.0.2",
+ "postcss-normalize-whitespace": "^6.0.2",
+ "postcss-ordered-values": "^6.0.2",
+ "postcss-reduce-initial": "^6.1.0",
+ "postcss-reduce-transforms": "^6.0.2",
+ "postcss-svgo": "^6.0.3",
+ "postcss-unique-selectors": "^6.0.4"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
+ "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/culori": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
+ "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/daisyui": {
+ "version": "4.12.23",
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz",
+ "integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-selector-tokenizer": "^0.8",
+ "culori": "^3",
+ "picocolors": "^1",
+ "postcss-js": "^4"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/daisyui"
+ }
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/dargs": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==",
+ "dev": true
+ },
+ "node_modules/dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/decode-named-character-reference/node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+ "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==",
+ "license": "MIT"
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/default-gateway/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/default-gateway/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-gateway/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/default-gateway/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-gateway/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/default-gateway/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/del": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
+ "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
+ "license": "MIT",
+ "dependencies": {
+ "globby": "^11.0.1",
+ "graceful-fs": "^4.2.4",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.2",
+ "p-map": "^4.0.0",
+ "rimraf": "^3.0.2",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/del/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/del/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/del/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "license": "MIT"
+ },
+ "node_modules/detect-port": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
+ "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "4"
+ },
+ "bin": {
+ "detect": "bin/detect-port.js",
+ "detect-port": "bin/detect-port.js"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "bin": {
+ "detect": "bin/detect-port",
+ "detect-port": "bin/detect-port"
+ },
+ "engines": {
+ "node": ">= 4.2.1"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/dev": {
+ "resolved": "sites/dev",
+ "link": true
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/dfa": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
+ "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==",
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
+ "license": "MIT"
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dotenv": "^16.4.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/echarts": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
+ "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.1"
+ }
+ },
+ "node_modules/echarts-for-react": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.2.tgz",
+ "integrity": "sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "size-sensor": "^1.0.1"
+ },
+ "peerDependencies": {
+ "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0",
+ "react": "^15.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/echarts/node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+ "license": "0BSD"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.103",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz",
+ "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==",
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/emojilib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+ "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/emoticon": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz",
+ "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/encode-utf8": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+ "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
+ "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
+ "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.9",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.0",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-regex": "^1.2.1",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.0",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.3",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.18"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+ "license": "MIT"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-goat": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
+ "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-compat-utils": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.4.tgz",
+ "integrity": "sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-compat-utils/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "14.2.24",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.24.tgz",
+ "integrity": "sha512-9r1ujK++Pgpfixr5+DQ6rXDIQmSzuDbBlAQYMkJRMz9KWqovX7ESUTC0EAyBfOCl3ubkoeplw+aoXDuih3A8fw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "14.2.24",
+ "@rushstack/eslint-patch": "^1.3.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-standard": {
+ "version": "17.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
+ "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
+ "eslint-plugin-promise": "^6.0.0"
+ }
+ },
+ "node_modules/eslint-config-standard-jsx": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz",
+ "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": "^8.8.0",
+ "eslint-plugin-react": "^7.28.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.3.tgz",
+ "integrity": "sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==",
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.3.7",
+ "enhanced-resolve": "^5.15.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^1.0.2",
+ "stable-hash": "^0.0.4",
+ "tinyglobby": "^0.2.12"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-json-compat-utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz",
+ "integrity": "sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esquery": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "jsonc-eslint-parser": "^2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@eslint/json": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsonc": {
+ "version": "2.19.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.19.1.tgz",
+ "integrity": "sha512-MmlAOaZK1+Lg7YoCZPGRjb88ZjT+ct/KTsvcsbZdBm+w8WMzGx+XEmexk0m40P1WV9G2rFV7X3klyRGRpFXEjA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "eslint-compat-utils": "^0.6.0",
+ "eslint-json-compat-utils": "^0.2.1",
+ "espree": "^9.6.1",
+ "graphemer": "^1.4.0",
+ "jsonc-eslint-parser": "^2.0.4",
+ "natural-compare": "^1.4.0",
+ "synckit": "^0.6.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-markdown": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-5.1.0.tgz",
+ "integrity": "sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^0.8.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8"
+ }
+ },
+ "node_modules/eslint-plugin-mongo": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mongo/-/eslint-plugin-mongo-1.0.5.tgz",
+ "integrity": "sha512-hnlJSKwvk0wHWw8dLlZjEKFOgs1XUkYmV5II+yQpTHkcJ03BTQ8PyUFn04wu8Y2eerB8TR53nEU1r5Co6boE8A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "requireindex": "~1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz",
+ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "builtins": "^5.0.1",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-utils": "^3.0.0",
+ "ignore": "^5.1.1",
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-promise": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz",
+ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
+ "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.0.0-canary-7118f5dd7-20230705",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz",
+ "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-yaml": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-yaml/-/eslint-plugin-yaml-0.5.0.tgz",
+ "integrity": "sha512-Z6km4HEiRptSuvzc96nXBND1Vlg57b7pzRmIJOgb9+3PAE+XpaBaiMx+Dg+3Y15tSrEMKCIZ9WoZMwkwUbPI8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^4.1.0",
+ "jshint": "^2.13.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz",
+ "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/estree-util-value-to-estree": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.3.2.tgz",
+ "integrity": "sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/remcohaszing"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-visit/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eta": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz",
+ "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/eta-dev/eta?sponsor=1"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eval": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz",
+ "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==",
+ "dependencies": {
+ "@types/node": "*",
+ "require-like": ">= 0.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "9.5.2",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz",
+ "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "cross-spawn": "^7.0.3",
+ "figures": "^6.1.0",
+ "get-stream": "^9.0.0",
+ "human-signals": "^8.0.0",
+ "is-plain-obj": "^4.1.0",
+ "is-stream": "^4.0.1",
+ "npm-run-path": "^6.0.0",
+ "pretty-ms": "^9.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^4.0.0",
+ "yoctocolors": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
+ "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/express/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/external-editor/node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+ "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-redact": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz",
+ "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
+ "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
+ "funding": [
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
+ "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz",
+ "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/feed": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
+ "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-js": "^1.6.11"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+ "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/file-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/file-loader/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/file-saver": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+ "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==",
+ "license": "MIT"
+ },
+ "node_modules/file-selector": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz",
+ "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.7.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/flat-cache/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flat-cache/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fontkit": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz",
+ "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/helpers": "^0.5.12",
+ "brotli": "^1.3.2",
+ "clone": "^2.1.2",
+ "dfa": "^1.2.0",
+ "fast-deep-equal": "^3.1.3",
+ "restructure": "^3.0.0",
+ "tiny-inflate": "^1.0.3",
+ "unicode-properties": "^1.4.0",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "node_modules/fontkit/node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
+ "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 6",
+ "typescript": ">= 2.7",
+ "vue-template-compiler": "*",
+ "webpack": ">= 4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data-encoder": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+ "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.17"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz",
+ "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dezalgo": "^1.0.4",
+ "hexoid": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/front-matter": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz",
+ "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^3.13.1"
+ }
+ },
+ "node_modules/front-matter/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/front-matter/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/front-matter/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "license": "Unlicense"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function-timeout": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz",
+ "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-pkg-repo": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz",
+ "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@hutson/parse-repository-url": "^3.0.0",
+ "hosted-git-info": "^4.0.0",
+ "through2": "^2.0.0",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "get-pkg-repo": "src/cli.js"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/get-pkg-repo/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
+ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
+ "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/git-raw-commits": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/git-remote-origin-url": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
+ "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "gitconfiglocal": "^1.0.0",
+ "pify": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/git-remote-origin-url/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/git-semver-tags": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz",
+ "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^8.1.2",
+ "semver": "^7.0.0"
+ },
+ "bin": {
+ "git-semver-tags": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/git-semver-tags/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-up": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz",
+ "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-ssh": "^1.4.0",
+ "parse-url": "^8.1.0"
+ }
+ },
+ "node_modules/git-url-parse": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz",
+ "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "git-up": "^7.0.0"
+ }
+ },
+ "node_modules/gitconfiglocal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
+ "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==",
+ "dev": true,
+ "license": "BSD",
+ "dependencies": {
+ "ini": "^1.3.2"
+ }
+ },
+ "node_modules/gitconfiglocal/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/github-slugger": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz",
+ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==",
+ "license": "ISC"
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "4.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/global-dirs/node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/globby/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "12.6.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
+ "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^5.2.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "cacheable-lookup": "^7.0.0",
+ "cacheable-request": "^10.2.8",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "^2.1.2",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/got/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "license": "MIT"
+ },
+ "node_modules/gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/gray-matter/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/gray-matter/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/gray-matter/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "license": "MIT"
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-yarn": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
+ "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasha/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasha/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-embedded": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz",
+ "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-format": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz",
+ "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-minify-whitespace": "^1.0.0",
+ "hast-util-phrasing": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-whitespace-sensitive-tag-names": "^3.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-has-property": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz",
+ "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-body-ok-link": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz",
+ "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-minify-whitespace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz",
+ "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-phrasing": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz",
+ "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-embedded": "^3.0.0",
+ "hast-util-has-property": "^3.0.0",
+ "hast-util-is-body-ok-link": "^3.0.0",
+ "hast-util-is-element": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.2.tgz",
+ "integrity": "sha512-94SDoKOfop5gP8RHyw4vV1aj+oChuD42g08BONGAaWFbbO6iaWUqxk7SWfGybgcVzhK16KifZr3zD2dqQgx3jQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-attach-comments": "^3.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.3.tgz",
+ "integrity": "sha512-pdpkP8YD4v+qMKn2lnKSiJvZvb3FunDmFYQvVOsoO08+eTNWdaWKPMrC5wwNICtU3dQWHhElj5Sf5jPEnv4qJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz",
+ "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-parse5/node_modules/property-information": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+ "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hexoid": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz",
+ "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/history": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
+ "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2",
+ "loose-envify": "^1.2.0",
+ "resolve-pathname": "^3.0.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0",
+ "value-equal": "^1.0.1"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/hooks": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/hooks/-/hooks-0.3.2.tgz",
+ "integrity": "sha512-TqeFzUf12rSzcbm5lUls81jimUC8TmXZ4ANPxxeeMou09hrjBcHYhAQ0WgyN5YqNCXOzz7L6xVNl/+ctFuSeOw==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-dom-parser": {
+ "version": "5.0.13",
+ "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.13.tgz",
+ "integrity": "sha512-B7JonBuAfG32I7fDouUQEogBrz3jK9gAuN1r1AaXpED6dIhtg/JwiSRhjGL7aOJwRz3HU4efowCjQBaoXiREqg==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "5.0.3",
+ "htmlparser2": "10.0.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+ "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "~5.3.2",
+ "commander": "^10.0.0",
+ "entities": "^4.4.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.15.1"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/html-minifier-terser/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/html-react-parser": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.2.2.tgz",
+ "integrity": "sha512-yA5012CJGSFWYZsgYzfr6HXJgDap38/AEP4ra8Cw+WHIi2ZRDXRX/QVYdumRf1P8zKyScKd6YOrWYvVEiPfGKg==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "5.0.3",
+ "html-dom-parser": "5.0.13",
+ "react-property": "2.0.2",
+ "style-to-js": "1.1.16"
+ },
+ "peerDependencies": {
+ "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19",
+ "react": "0.14 || 15 || 16 || 17 || 18 || 19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
+ "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-whitespace-sensitive-tag-names": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz",
+ "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.1",
+ "entities": "^6.0.0"
+ }
+ },
+ "node_modules/http-assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
+ "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-equal": "~1.0.1",
+ "http-errors": "~1.8.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-assert/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-assert/node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-assert/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz",
+ "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/http-proxy/node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
+ "node_modules/http2-wrapper": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+ "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
+ "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ignore-walk": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz",
+ "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.0.tgz",
+ "integrity": "sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==",
+ "license": "MIT",
+ "dependencies": {
+ "queue": "6.0.2"
+ },
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/infima": {
+ "version": "0.2.0-alpha.45",
+ "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz",
+ "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/init-package-json": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz",
+ "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/package-json": "^5.0.0",
+ "npm-package-arg": "^11.0.0",
+ "promzard": "^1.0.0",
+ "read": "^3.0.1",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/init-package-json/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
+ "node_modules/inquirer": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+ "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.19",
+ "mute-stream": "0.0.8",
+ "run-async": "^2.4.0",
+ "rxjs": "^6.6.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/inquirer/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/inquirer/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ip-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz",
+ "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz",
+ "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.6.3"
+ }
+ },
+ "node_modules/is-bun-module/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^3.2.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-ip": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz",
+ "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-regex": "^5.0.0",
+ "super-regex": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-lambda": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-npm": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
+ "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz",
+ "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-ssh": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz",
+ "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "protocols": "^2.0.1"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-yarn-global": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
+ "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isomorphic-rslog": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz",
+ "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.17.6"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jake/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/jake/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/javascript-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
+ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@hapi/hoek": "^9.3.0",
+ "@hapi/topo": "^5.1.0",
+ "@sideway/address": "^4.1.5",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "node_modules/jose": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
+ "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/jotai": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.12.1.tgz",
+ "integrity": "sha512-VUW0nMPYIru5g89tdxwr9ftiVdc/nGV9jvHISN8Ucx+m1vI9dBeHemfqYzEuw5XSkmYjD/MEyApN9k6yrATsZQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=17.0.0",
+ "react": ">=17.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jotai-location": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/jotai-location/-/jotai-location-0.5.5.tgz",
+ "integrity": "sha512-6QW/7W9IJHjhbn7gRgAw4sC30k0/G6JiC4uPlKi8ZPZGYk7R7r9PyMD2eVhL4XSxxag89JxS1iSyr6BIXsB4Sw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "jotai": ">=1.11.0"
+ }
+ },
+ "node_modules/jpeg-exif": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
+ "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jshint": {
+ "version": "2.13.6",
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz",
+ "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli": "~1.0.0",
+ "console-browserify": "1.1.x",
+ "exit": "0.1.x",
+ "htmlparser2": "3.8.x",
+ "lodash": "~4.17.21",
+ "minimatch": "~3.0.2",
+ "strip-json-comments": "1.0.x"
+ },
+ "bin": {
+ "jshint": "bin/jshint"
+ }
+ },
+ "node_modules/jshint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/jshint/node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/jshint/node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/jshint/node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/jshint/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/jshint/node_modules/domhandler": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
+ "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/jshint/node_modules/domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/jshint/node_modules/entities": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
+ "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==",
+ "dev": true,
+ "license": "BSD-like"
+ },
+ "node_modules/jshint/node_modules/htmlparser2": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
+ "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "1",
+ "domhandler": "2.3",
+ "domutils": "1.5",
+ "entities": "1.0",
+ "readable-stream": "1.1"
+ }
+ },
+ "node_modules/jshint/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jshint/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jshint/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/jshint/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jshint/node_modules/strip-json-comments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "strip-json-comments": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-fixer": {
+ "version": "1.6.15",
+ "resolved": "https://registry.npmjs.org/json-fixer/-/json-fixer-1.6.15.tgz",
+ "integrity": "sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.9",
+ "chalk": "^4.1.2",
+ "pegjs": "^0.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+ "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-nice": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz",
+ "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==",
+ "dev": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-eslint-parser": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz",
+ "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.5.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)",
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/just-diff": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz",
+ "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/just-diff-apply": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz",
+ "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/just-extend": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
+ "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/keygrip": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
+ "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tsscmp": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/koa": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.0.tgz",
+ "integrity": "sha512-Afhqq0Vq3W7C+/rW6IqHVBDLzqObwZ07JaUNUEF8yCQ6afiyFE3RAy+i7V0E46XOWlH7vPWn/x0vsZwNy6PWxw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^1.3.5",
+ "cache-content-type": "^1.0.0",
+ "content-disposition": "~0.5.2",
+ "content-type": "^1.0.4",
+ "cookies": "~0.9.0",
+ "debug": "^4.3.2",
+ "delegates": "^1.0.0",
+ "depd": "^2.0.0",
+ "destroy": "^1.0.4",
+ "encodeurl": "^1.0.2",
+ "escape-html": "^1.0.3",
+ "fresh": "~0.5.2",
+ "http-assert": "^1.3.0",
+ "http-errors": "^1.6.3",
+ "is-generator-function": "^1.0.7",
+ "koa-compose": "^4.1.0",
+ "koa-convert": "^2.0.0",
+ "on-finished": "^2.3.0",
+ "only": "~0.0.2",
+ "parseurl": "^1.3.2",
+ "statuses": "^1.5.0",
+ "type-is": "^1.6.16",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4"
+ }
+ },
+ "node_modules/koa-compose": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==",
+ "license": "MIT"
+ },
+ "node_modules/koa-convert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz",
+ "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==",
+ "license": "MIT",
+ "dependencies": {
+ "co": "^4.6.0",
+ "koa-compose": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/koa/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/koa/node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa/node_modules/http-errors/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/latest-version": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
+ "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
+ "license": "MIT",
+ "dependencies": {
+ "package-json": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz",
+ "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/lerna": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.0.tgz",
+ "integrity": "sha512-SLXPPUqU1V6m8pGVNYp8CpqGX92U2fp6XFWQsQMY36VTCGVP/5dGtri4hd2sgk2hcBuFPnxycgEnJecT2MQUsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@lerna/create": "8.2.0",
+ "@npmcli/arborist": "7.5.4",
+ "@npmcli/package-json": "5.2.0",
+ "@npmcli/run-script": "8.1.0",
+ "@nx/devkit": ">=17.1.2 < 21",
+ "@octokit/plugin-enterprise-rest": "6.0.1",
+ "@octokit/rest": "19.0.11",
+ "aproba": "2.0.0",
+ "byte-size": "8.1.1",
+ "chalk": "4.1.0",
+ "clone-deep": "4.0.1",
+ "cmd-shim": "6.0.3",
+ "color-support": "1.1.3",
+ "columnify": "1.6.0",
+ "console-control-strings": "^1.1.0",
+ "conventional-changelog-angular": "7.0.0",
+ "conventional-changelog-core": "5.0.1",
+ "conventional-recommended-bump": "7.0.1",
+ "cosmiconfig": "9.0.0",
+ "dedent": "1.5.3",
+ "envinfo": "7.13.0",
+ "execa": "5.0.0",
+ "fs-extra": "^11.2.0",
+ "get-port": "5.1.1",
+ "get-stream": "6.0.0",
+ "git-url-parse": "14.0.0",
+ "glob-parent": "6.0.2",
+ "globby": "11.1.0",
+ "graceful-fs": "4.2.11",
+ "has-unicode": "2.0.1",
+ "import-local": "3.1.0",
+ "ini": "^1.3.8",
+ "init-package-json": "6.0.3",
+ "inquirer": "^8.2.4",
+ "is-ci": "3.0.1",
+ "is-stream": "2.0.0",
+ "jest-diff": ">=29.4.3 < 30",
+ "js-yaml": "4.1.0",
+ "libnpmaccess": "8.0.6",
+ "libnpmpublish": "9.0.9",
+ "load-json-file": "6.2.0",
+ "lodash": "^4.17.21",
+ "make-dir": "4.0.0",
+ "minimatch": "3.0.5",
+ "multimatch": "5.0.0",
+ "node-fetch": "2.6.7",
+ "npm-package-arg": "11.0.2",
+ "npm-packlist": "8.0.2",
+ "npm-registry-fetch": "^17.1.0",
+ "nx": ">=17.1.2 < 21",
+ "p-map": "4.0.0",
+ "p-map-series": "2.1.0",
+ "p-pipe": "3.1.0",
+ "p-queue": "6.6.2",
+ "p-reduce": "2.1.0",
+ "p-waterfall": "2.1.1",
+ "pacote": "^18.0.6",
+ "pify": "5.0.0",
+ "read-cmd-shim": "4.0.0",
+ "resolve-from": "5.0.0",
+ "rimraf": "^4.4.1",
+ "semver": "^7.3.8",
+ "set-blocking": "^2.0.0",
+ "signal-exit": "3.0.7",
+ "slash": "3.0.0",
+ "ssri": "^10.0.6",
+ "string-width": "^4.2.3",
+ "strong-log-transformer": "2.1.0",
+ "tar": "6.2.1",
+ "temp-dir": "1.0.0",
+ "typescript": ">=3 < 6",
+ "upath": "2.0.1",
+ "uuid": "^10.0.0",
+ "validate-npm-package-license": "3.0.4",
+ "validate-npm-package-name": "5.0.1",
+ "wide-align": "1.1.5",
+ "write-file-atomic": "5.0.1",
+ "write-pkg": "4.0.0",
+ "yargs": "17.7.2",
+ "yargs-parser": "21.1.1"
+ },
+ "bin": {
+ "lerna": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/lerna/node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/lerna/node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lerna/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/lerna/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lerna/node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lerna/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/lerna/node_modules/execa": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+ "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/lerna/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lerna/node_modules/get-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lerna/node_modules/glob": {
+ "version": "9.3.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
+ "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "minimatch": "^8.0.2",
+ "minipass": "^4.2.4",
+ "path-scurry": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/lerna/node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/lerna/node_modules/glob/node_modules/minimatch": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
+ "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/lerna/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/lerna/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lerna/node_modules/inquirer": {
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz",
+ "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/lerna/node_modules/inquirer/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lerna/node_modules/is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lerna/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lerna/node_modules/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/lerna/node_modules/minipass": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+ "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lerna/node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lerna/node_modules/npm-package-arg": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz",
+ "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/lerna/node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lerna/node_modules/rimraf": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz",
+ "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^9.2.0"
+ },
+ "bin": {
+ "rimraf": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/lerna/node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/lerna/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lerna/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lerna/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lerna/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lerna/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/libnpmaccess": {
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz",
+ "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-package-arg": "^11.0.2",
+ "npm-registry-fetch": "^17.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/libnpmaccess/node_modules/npm-package-arg": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/libnpmaccess/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/libnpmpublish": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz",
+ "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "ci-info": "^4.0.0",
+ "normalize-package-data": "^6.0.1",
+ "npm-package-arg": "^11.0.2",
+ "npm-registry-fetch": "^17.0.1",
+ "proc-log": "^4.2.0",
+ "semver": "^7.3.7",
+ "sigstore": "^2.2.0",
+ "ssri": "^10.0.6"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/libnpmpublish/node_modules/ci-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
+ "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/libnpmpublish/node_modules/npm-package-arg": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/libnpmpublish/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
+ "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.29.1",
+ "lightningcss-darwin-x64": "1.29.1",
+ "lightningcss-freebsd-x64": "1.29.1",
+ "lightningcss-linux-arm-gnueabihf": "1.29.1",
+ "lightningcss-linux-arm64-gnu": "1.29.1",
+ "lightningcss-linux-arm64-musl": "1.29.1",
+ "lightningcss-linux-x64-gnu": "1.29.1",
+ "lightningcss-linux-x64-musl": "1.29.1",
+ "lightningcss-win32-arm64-msvc": "1.29.1",
+ "lightningcss-win32-x64-msvc": "1.29.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
+ "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
+ "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
+ "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
+ "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
+ "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
+ "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
+ "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
+ "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
+ "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
+ "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/linebreak": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
+ "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "0.0.8",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "node_modules/linebreak/node_modules/base64-js": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
+ "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz",
+ "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/lint-staged": {
+ "version": "15.4.3",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz",
+ "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.4.1",
+ "commander": "^13.1.0",
+ "debug": "^4.4.0",
+ "execa": "^8.0.1",
+ "lilconfig": "^3.1.3",
+ "listr2": "^8.2.5",
+ "micromatch": "^4.0.8",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.2",
+ "yaml": "^2.7.0"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/lint-staged/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
+ "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/listr2/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz",
+ "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "parse-json": "^5.0.0",
+ "strip-bom": "^4.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/load-json-file/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
+ "license": "MIT"
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.ismatch": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.set": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
+ "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.unset": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz",
+ "integrity": "sha512-bwKX88k2JhCV9D1vtE8+naDKlLiGrSmf8zi/Y9ivFHwbmRfA8RxS/aVJ+sIht2XOwqoNr4xUPUkGZpc1sHFEKg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/long": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
+ "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/luxon": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+ "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "devOptional": true,
+ "license": "ISC"
+ },
+ "node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz",
+ "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "license": "MIT",
+ "dependencies": {
+ "repeat-string": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-directive": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz",
+ "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-directive/node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-directive/node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-directive/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "micromark": "~2.11.0",
+ "parse-entities": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
+ "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-extension-frontmatter": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-frontmatter/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm-table/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-gfm/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-gfm/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-mdx/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-mdx/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-mdx/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/mdast-util-to-markdown/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+ "license": "MIT"
+ },
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz",
+ "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-directive": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz",
+ "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "parse-entities": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-directive/node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/micromark-extension-frontmatter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz",
+ "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz",
+ "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz",
+ "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/acorn": "^4.0.0",
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz",
+ "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz",
+ "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/acorn": "^4.0.0",
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-events-to-acorn/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz",
+ "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
+ "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==",
+ "license": "MIT",
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/minimist-options/node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/minimist-options/node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.8.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
+ "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.3",
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.5",
+ "diff": "^5.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^8.1.0",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^5.1.6",
+ "ms": "^2.1.3",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^6.5.1",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/mocha-steps": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz",
+ "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mocha/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/mocha/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/modify-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/multimatch/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/multimatch/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+ "license": "MIT",
+ "bin": {
+ "mustache": "bin/mustache"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
+ },
+ "node_modules/nise": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz",
+ "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1",
+ "@sinonjs/fake-timers": "^13.0.1",
+ "@sinonjs/text-encoding": "^0.7.3",
+ "just-extend": "^6.2.0",
+ "path-to-regexp": "^8.1.0"
+ }
+ },
+ "node_modules/nise/node_modules/@sinonjs/fake-timers": {
+ "version": "13.0.5",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz",
+ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1"
+ }
+ },
+ "node_modules/nlcst-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz",
+ "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-emoji": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz",
+ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^4.6.0",
+ "char-regex": "^1.0.2",
+ "emojilib": "^2.4.0",
+ "skin-tone": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-emoji/node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz",
+ "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^13.0.0",
+ "nopt": "^7.0.0",
+ "proc-log": "^4.1.0",
+ "semver": "^7.3.5",
+ "tar": "^6.2.1",
+ "which": "^4.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/node-gyp/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-gyp/node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/node-jose": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz",
+ "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "base64url": "^3.0.1",
+ "buffer": "^6.0.3",
+ "es6-promise": "^4.2.8",
+ "lodash": "^4.17.21",
+ "long": "^5.2.0",
+ "node-forge": "^1.2.1",
+ "pako": "^2.0.4",
+ "process": "^0.11.10",
+ "uuid": "^9.0.0"
+ }
+ },
+ "node_modules/node-jose/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/node-jose/node_modules/pako": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/node-jose/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/node-machine-id": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz",
+ "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
+ },
+ "node_modules/nodemon": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz",
+ "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^4",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nodemon/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/nodemon/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/nodemon/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/nodemon/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/nodemon/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
+ "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-bundled": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz",
+ "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-normalize-package-bin": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-install-checks": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
+ "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-install-checks/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-normalize-package-bin": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+ "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-package-arg": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz",
+ "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-package-arg/node_modules/proc-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+ "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-package-arg/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-packlist": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz",
+ "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "ignore-walk": "^6.0.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-pick-manifest": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz",
+ "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-install-checks": "^6.0.0",
+ "npm-normalize-package-bin": "^3.0.0",
+ "npm-package-arg": "^11.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-pick-manifest/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-registry-fetch": {
+ "version": "17.1.0",
+ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz",
+ "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^2.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^13.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minizlib": "^2.1.2",
+ "npm-package-arg": "^11.0.0",
+ "proc-log": "^4.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==",
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/null-loader": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz",
+ "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/null-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/null-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/null-loader/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/null-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/nx": {
+ "version": "20.2.1",
+ "resolved": "https://registry.npmjs.org/nx/-/nx-20.2.1.tgz",
+ "integrity": "sha512-zUw1DT9BW2ajbDZgcUFKfysGqrbJwsMRjPxT6GthuqcLtDc2iJi3+/UBTLsITSeiw4Za4qPVxjaK4+yma9Ju5w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "0.2.4",
+ "@yarnpkg/lockfile": "^1.1.0",
+ "@yarnpkg/parsers": "3.0.2",
+ "@zkochan/js-yaml": "0.0.7",
+ "axios": "^1.7.4",
+ "chalk": "^4.1.0",
+ "cli-cursor": "3.1.0",
+ "cli-spinners": "2.6.1",
+ "cliui": "^8.0.1",
+ "dotenv": "~16.4.5",
+ "dotenv-expand": "~11.0.6",
+ "enquirer": "~2.3.6",
+ "figures": "3.2.0",
+ "flat": "^5.0.2",
+ "front-matter": "^4.0.2",
+ "ignore": "^5.0.4",
+ "jest-diff": "^29.4.1",
+ "jsonc-parser": "3.2.0",
+ "lines-and-columns": "2.0.3",
+ "minimatch": "9.0.3",
+ "node-machine-id": "1.1.12",
+ "npm-run-path": "^4.0.1",
+ "open": "^8.4.0",
+ "ora": "5.3.0",
+ "semver": "^7.5.3",
+ "string-width": "^4.2.3",
+ "tar-stream": "~2.2.0",
+ "tmp": "~0.2.1",
+ "tsconfig-paths": "^4.1.2",
+ "tslib": "^2.3.0",
+ "yaml": "^2.6.0",
+ "yargs": "^17.6.2",
+ "yargs-parser": "21.1.1"
+ },
+ "bin": {
+ "nx": "bin/nx.js",
+ "nx-cloud": "bin/nx-cloud.js"
+ },
+ "optionalDependencies": {
+ "@nx/nx-darwin-arm64": "20.2.1",
+ "@nx/nx-darwin-x64": "20.2.1",
+ "@nx/nx-freebsd-x64": "20.2.1",
+ "@nx/nx-linux-arm-gnueabihf": "20.2.1",
+ "@nx/nx-linux-arm64-gnu": "20.2.1",
+ "@nx/nx-linux-arm64-musl": "20.2.1",
+ "@nx/nx-linux-x64-gnu": "20.2.1",
+ "@nx/nx-linux-x64-musl": "20.2.1",
+ "@nx/nx-win32-arm64-msvc": "20.2.1",
+ "@nx/nx-win32-x64-msvc": "20.2.1"
+ },
+ "peerDependencies": {
+ "@swc-node/register": "^1.8.0",
+ "@swc/core": "^1.3.85"
+ },
+ "peerDependenciesMeta": {
+ "@swc-node/register": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nx/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/nx/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nx/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/nyc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/nyc/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/nyc/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/nyc/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/nyc/node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "license": "MIT"
+ },
+ "node_modules/oidc-provider": {
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/oidc-provider/-/oidc-provider-8.8.1.tgz",
+ "integrity": "sha512-qVChpayTwojUREJxLkFofUSK8kiSRIdzPrVSsoGibqRHl/YO60ege94OZS8vh7zaK+zxcG/Gu8UMaYB5ulohCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@koa/cors": "^5.0.0",
+ "@koa/router": "^13.1.0",
+ "debug": "^4.4.0",
+ "eta": "^3.5.0",
+ "got": "^13.0.0",
+ "jose": "^5.9.6",
+ "jsesc": "^3.1.0",
+ "koa": "^2.15.4",
+ "nanoid": "^5.0.9",
+ "object-hash": "^3.0.0",
+ "oidc-token-hash": "^5.0.3",
+ "quick-lru": "^7.0.0",
+ "raw-body": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/eta": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-3.5.0.tgz",
+ "integrity": "sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/eta-dev/eta?sponsor=1"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/got": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz",
+ "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^5.2.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "cacheable-lookup": "^7.0.0",
+ "cacheable-request": "^10.2.8",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "^2.1.2",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/nanoid": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz",
+ "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/quick-lru": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.0.0.tgz",
+ "integrity": "sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/oidc-provider/node_modules/raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/oidc-token-hash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz",
+ "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || >=12.0.0"
+ }
+ },
+ "node_modules/on-exit-leak-free": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
+ "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/only": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
+ "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "license": "(WTFPL OR MIT)",
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz",
+ "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "log-symbols": "^4.0.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/orgdocs": {
+ "resolved": "sites/org",
+ "link": true
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/otplib": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz",
+ "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@otplib/core": "^12.0.1",
+ "@otplib/preset-default": "^12.0.1",
+ "@otplib/preset-v11": "^12.0.1"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map-series": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz",
+ "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-pipe": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz",
+ "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+ "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.4",
+ "p-timeout": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue/node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/p-reduce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz",
+ "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry/node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+ "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-waterfall": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz",
+ "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-reduce": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/package-json": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
+ "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
+ "license": "MIT",
+ "dependencies": {
+ "got": "^12.1.0",
+ "registry-auth-token": "^5.0.1",
+ "registry-url": "^6.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/package-json/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pacote": {
+ "version": "18.0.6",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz",
+ "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^5.0.0",
+ "@npmcli/installed-package-contents": "^2.0.1",
+ "@npmcli/package-json": "^5.1.0",
+ "@npmcli/promise-spawn": "^7.0.0",
+ "@npmcli/run-script": "^8.0.0",
+ "cacache": "^18.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^11.0.0",
+ "npm-packlist": "^8.0.0",
+ "npm-pick-manifest": "^9.0.0",
+ "npm-registry-fetch": "^17.0.0",
+ "proc-log": "^4.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^2.2.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
+ "license": "MIT"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-conflict-json": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz",
+ "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^3.0.0",
+ "just-diff": "^6.0.0",
+ "just-diff-apply": "^5.2.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/parse-json/node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/parse-latin": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
+ "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "@types/unist": "^3.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-modify-children": "^4.0.0",
+ "unist-util-visit-children": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-latin/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/parse-ms": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+ "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-numeric-range": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
+ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==",
+ "license": "ISC"
+ },
+ "node_modules/parse-path": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.1.tgz",
+ "integrity": "sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "protocols": "^2.0.0"
+ }
+ },
+ "node_modules/parse-url": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz",
+ "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse-path": "^7.0.0"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+ "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^4.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/passport": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
+ "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1",
+ "utils-merge": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-http": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/passport-http/-/passport-http-0.3.0.tgz",
+ "integrity": "sha512-OwK9DkqGVlJfO8oD0Bz1VDIo+ijD3c1ZbGGozIZw+joIP0U60pXY7goB+8wiDWtNqHpkTaQiJ9Ux1jE3Ykmpuw==",
+ "dependencies": {
+ "passport-strategy": "1.x.x"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/passport-jwt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
+ "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jsonwebtoken": "^9.0.0",
+ "passport-strategy": "^1.0.0"
+ }
+ },
+ "node_modules/passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
+ },
+ "node_modules/pdfkit": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.16.0.tgz",
+ "integrity": "sha512-oXMxkIqXH4uTAtohWdYA41i/f6i2ReB78uhgizN8H4hJEpgR3/Xjy3iu2InNAuwCIabN3PVs8P1D6G4+W2NH0A==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-js": "^4.2.0",
+ "fontkit": "^2.0.4",
+ "jpeg-exif": "^1.1.4",
+ "linebreak": "^1.1.0",
+ "png-js": "^1.0.0"
+ }
+ },
+ "node_modules/pegjs": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
+ "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "pegjs": "bin/pegjs"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pino": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz",
+ "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0",
+ "fast-redact": "^3.1.1",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^1.2.0",
+ "pino-std-serializers": "^7.0.0",
+ "process-warning": "^3.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.2.0",
+ "safe-stable-stringify": "^2.3.1",
+ "sonic-boom": "^4.0.1",
+ "thread-stream": "^3.0.0"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-abstract-transport": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz",
+ "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "^4.0.0",
+ "split2": "^4.0.0"
+ }
+ },
+ "node_modules/pino-abstract-transport/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/pino-abstract-transport/node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz",
+ "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==",
+ "license": "MIT"
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-conf": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz",
+ "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0",
+ "load-json-file": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/load-json-file": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz",
+ "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "parse-json": "^4.0.0",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0",
+ "type-fest": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/type-fest": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+ "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/png-js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
+ "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
+ },
+ "node_modules/pngjs": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+ "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz",
+ "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
+ "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.7.tgz",
+ "integrity": "sha512-EZvAHsvyASX63vXnyXOIynkxhaHRSsdb7z6yiXKIovGXAolW4cMZ3qoh7k3VdTsLBS6VGdksGfIo3r6+waLoOw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz",
+ "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz",
+ "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz",
+ "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz",
+ "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz",
+ "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.4",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "14.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz",
+ "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.4",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz",
+ "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/cascade-layer-name-parser": "^2.0.4",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz",
+ "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz",
+ "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz",
+ "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz",
+ "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz",
+ "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-unused": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz",
+ "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz",
+ "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz",
+ "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz",
+ "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz",
+ "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz",
+ "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/utilities": "^2.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.7.tgz",
+ "integrity": "sha512-+ONj2bpOQfsCKZE2T9VGMyVVdGcGUpr7u3SVfvkJlvhTRmDCfY25k4Jc8fubB9DclAPR4+w8uVtDZmdRgdAHig==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/css-color-parser": "^3.0.7",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/utilities": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz",
+ "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.3.5",
+ "jiti": "^1.20.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-loader/node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz",
+ "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-merge-idents": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz",
+ "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz",
+ "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^6.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz",
+ "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz",
+ "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz",
+ "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.3",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz",
+ "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz",
+ "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz",
+ "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-resolve-nested": "^3.0.0",
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz",
+ "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz",
+ "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz",
+ "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz",
+ "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz",
+ "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz",
+ "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz",
+ "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz",
+ "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz",
+ "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz",
+ "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz",
+ "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz",
+ "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz",
+ "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz",
+ "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "10.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.4.tgz",
+ "integrity": "sha512-awWKS3CwyY7I4Eb3YSWOZisbj3qXyuQCrylYiu2vSHxnSZAj3LHStN6jOcpCrc6EjYunLwbeNto3M5/JBtXpzg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/postcss-cascade-layers": "^5.0.1",
+ "@csstools/postcss-color-function": "^4.0.7",
+ "@csstools/postcss-color-mix-function": "^3.0.7",
+ "@csstools/postcss-content-alt-text": "^2.0.4",
+ "@csstools/postcss-exponential-functions": "^2.0.6",
+ "@csstools/postcss-font-format-keywords": "^4.0.0",
+ "@csstools/postcss-gamut-mapping": "^2.0.7",
+ "@csstools/postcss-gradients-interpolation-method": "^5.0.7",
+ "@csstools/postcss-hwb-function": "^4.0.7",
+ "@csstools/postcss-ic-unit": "^4.0.0",
+ "@csstools/postcss-initial": "^2.0.1",
+ "@csstools/postcss-is-pseudo-class": "^5.0.1",
+ "@csstools/postcss-light-dark-function": "^2.0.7",
+ "@csstools/postcss-logical-float-and-clear": "^3.0.0",
+ "@csstools/postcss-logical-overflow": "^2.0.0",
+ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0",
+ "@csstools/postcss-logical-resize": "^3.0.0",
+ "@csstools/postcss-logical-viewport-units": "^3.0.3",
+ "@csstools/postcss-media-minmax": "^2.0.6",
+ "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4",
+ "@csstools/postcss-nested-calc": "^4.0.0",
+ "@csstools/postcss-normalize-display-values": "^4.0.0",
+ "@csstools/postcss-oklab-function": "^4.0.7",
+ "@csstools/postcss-progressive-custom-properties": "^4.0.0",
+ "@csstools/postcss-random-function": "^1.0.2",
+ "@csstools/postcss-relative-color-syntax": "^3.0.7",
+ "@csstools/postcss-scope-pseudo-class": "^4.0.1",
+ "@csstools/postcss-sign-functions": "^1.1.1",
+ "@csstools/postcss-stepped-value-functions": "^4.0.6",
+ "@csstools/postcss-text-decoration-shorthand": "^4.0.1",
+ "@csstools/postcss-trigonometric-functions": "^4.0.6",
+ "@csstools/postcss-unset-value": "^4.0.0",
+ "autoprefixer": "^10.4.19",
+ "browserslist": "^4.24.4",
+ "css-blank-pseudo": "^7.0.1",
+ "css-has-pseudo": "^7.0.2",
+ "css-prefers-color-scheme": "^10.0.0",
+ "cssdb": "^8.2.3",
+ "postcss-attribute-case-insensitive": "^7.0.1",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^7.0.7",
+ "postcss-color-hex-alpha": "^10.0.0",
+ "postcss-color-rebeccapurple": "^10.0.0",
+ "postcss-custom-media": "^11.0.5",
+ "postcss-custom-properties": "^14.0.4",
+ "postcss-custom-selectors": "^8.0.4",
+ "postcss-dir-pseudo-class": "^9.0.1",
+ "postcss-double-position-gradients": "^6.0.0",
+ "postcss-focus-visible": "^10.0.1",
+ "postcss-focus-within": "^9.0.1",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^6.0.0",
+ "postcss-image-set-function": "^7.0.0",
+ "postcss-lab-function": "^7.0.7",
+ "postcss-logical": "^8.0.0",
+ "postcss-nesting": "^13.0.1",
+ "postcss-opacity-percentage": "^3.0.0",
+ "postcss-overflow-shorthand": "^6.0.0",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^10.0.0",
+ "postcss-pseudo-class-any-link": "^10.0.1",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz",
+ "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-reduce-idents": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz",
+ "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
+ "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz",
+ "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz",
+ "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-sort-media-queries": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz",
+ "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==",
+ "license": "MIT",
+ "dependencies": {
+ "sort-css-media-queries": "2.2.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.23"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz",
+ "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^3.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >= 18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz",
+ "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-zindex": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz",
+ "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz",
+ "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/pretty-ms": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz",
+ "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
+ "license": "MIT",
+ "dependencies": {
+ "parse-ms": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.0.0.tgz",
+ "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.1.1",
+ "find-up": "^5.0.0",
+ "ignore": "^5.3.0",
+ "mri": "^1.2.0",
+ "picocolors": "^1.0.0",
+ "picomatch": "^3.0.1",
+ "tslib": "^2.6.2"
+ },
+ "bin": {
+ "pretty-quick": "lib/cli.mjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/picomatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz",
+ "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/pretty-quick/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pretty-quick/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-time": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
+ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prism-react-renderer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz",
+ "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prismjs": "^1.26.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0"
+ }
+ },
+ "node_modules/prisma": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.15.0.tgz",
+ "integrity": "sha512-JA81ACQSCi3a7NUOgonOIkdx8PAVkO+HbUOxmd00Yb8DgIIEpr2V9+Qe/j6MLxIgWtE/OtVQ54rVjfYRbZsCfw==",
+ "devOptional": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/engines": "5.15.0"
+ },
+ "bin": {
+ "prisma": "build/index.js"
+ },
+ "engines": {
+ "node": ">=16.13"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/proc-log": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/process-on-spawn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz",
+ "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/process-warning": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz",
+ "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==",
+ "license": "MIT"
+ },
+ "node_modules/proggy": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz",
+ "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/promise-all-reject-late": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+ "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
+ "dev": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/promise-call-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz",
+ "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==",
+ "dev": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/promzard": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz",
+ "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "read": "^3.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/property-information": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz",
+ "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "license": "ISC"
+ },
+ "node_modules/protocols": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz",
+ "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pupa": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
+ "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-goat": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/qrcode": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz",
+ "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==",
+ "license": "MIT",
+ "dependencies": {
+ "dijkstrajs": "^1.0.1",
+ "encode-utf8": "^1.0.3",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/qrcode/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/qrcode/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "license": "ISC"
+ },
+ "node_modules/qrcode/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "~2.0.3"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
+ "license": "MIT"
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-diff-viewer-continued": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/react-diff-viewer-continued/-/react-diff-viewer-continued-4.0.5.tgz",
+ "integrity": "sha512-L43gIPdhHgu1MYdip4vNqAt5s2JLICKe2/RyGUr2ohAxfhYaH1+QZ6vBO0qgo4xGBhE3jmvbOA/swq4/gdS/0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/css": "^11.13.5",
+ "@emotion/react": "^11.14.0",
+ "classnames": "^2.5.1",
+ "diff": "^5.2.0",
+ "memoize-one": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.25.0"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ }
+ },
+ "node_modules/react-dropzone": {
+ "version": "14.3.5",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz",
+ "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "attr-accept": "^2.2.4",
+ "file-selector": "^2.1.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8 || 18.0.0"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz",
+ "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-helmet-async": {
+ "name": "@slorber/react-helmet-async",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
+ "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.2.0",
+ "shallowequal": "^1.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-loadable": {
+ "name": "@docusaurus/react-loadable",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
+ "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-loadable-ssr-addon-v5-slorber": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz",
+ "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.10.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "react-loadable": "*",
+ "webpack": ">=4.41.1 || 5.x"
+ }
+ },
+ "node_modules/react-markdown": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz",
+ "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-markdown/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/react-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz",
+ "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==",
+ "license": "MIT"
+ },
+ "node_modules/react-router": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
+ "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13",
+ "history": "^4.9.0",
+ "hoist-non-react-statics": "^3.1.0",
+ "loose-envify": "^1.3.1",
+ "path-to-regexp": "^1.7.0",
+ "prop-types": "^15.6.2",
+ "react-is": "^16.6.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=15"
+ }
+ },
+ "node_modules/react-router-config": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz",
+ "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2"
+ },
+ "peerDependencies": {
+ "react": ">=15",
+ "react-router": ">=5"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz",
+ "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13",
+ "history": "^4.9.0",
+ "loose-envify": "^1.3.1",
+ "prop-types": "^15.6.2",
+ "react-router": "5.3.4",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=15"
+ }
+ },
+ "node_modules/react-router/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-router/node_modules/path-to-regexp": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
+ "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
+ "node_modules/react-router/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-zoom-pan-pinch": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz",
+ "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8",
+ "npm": ">=5"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
+ "node_modules/read": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz",
+ "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/read-cache/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-cmd-shim": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz",
+ "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-package-json-fast": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+ "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^3.0.0",
+ "npm-normalize-package-bin": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/read-pkg/node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/read-pkg/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read/node_modules/mute-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+ "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reading-time": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz",
+ "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==",
+ "license": "MIT"
+ },
+ "node_modules/real-require": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
+ "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz",
+ "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/recursive-readdir/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/recursive-readdir/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz",
+ "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/npm-conf": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/registry-url": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+ "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "rc": "1.2.8"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/rehype-format": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz",
+ "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-format": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-recma": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-stringify": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz",
+ "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-to-html": "^9.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/remark-directive": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz",
+ "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-directive": "^3.0.0",
+ "micromark-extension-directive": "^3.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-directive/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-emoji": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz",
+ "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.2",
+ "emoticon": "^4.0.1",
+ "mdast-util-find-and-replace": "^3.0.1",
+ "node-emoji": "^2.1.0",
+ "unified": "^11.0.4"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/remark-emoji/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-frontmatter": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz",
+ "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-frontmatter": "^2.0.0",
+ "micromark-extension-frontmatter": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-frontmatter/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz",
+ "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-parse/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/remark-parse/node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse/node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse/node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/remark-parse/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz",
+ "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/remark-smartypants": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz",
+ "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==",
+ "license": "MIT",
+ "dependencies": {
+ "retext": "^9.0.0",
+ "retext-smartypants": "^6.0.0",
+ "unified": "^11.0.4",
+ "unist-util-visit": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/renderkid/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/renderkid/node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-like": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
+ "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "license": "ISC"
+ },
+ "node_modules/requireindex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz",
+ "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.5"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-pathname": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+ "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+ "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+ "license": "MIT",
+ "dependencies": {
+ "lowercase-keys": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/restructure": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz",
+ "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==",
+ "license": "MIT"
+ },
+ "node_modules/retext": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
+ "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "retext-latin": "^4.0.0",
+ "retext-stringify": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-latin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz",
+ "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "parse-latin": "^7.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-smartypants": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz",
+ "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz",
+ "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rimraf": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rtlcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",
+ "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==",
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.21",
+ "strip-json-comments": "^3.1.1"
+ },
+ "bin": {
+ "rtlcss": "bin/rtlcss.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/rxjs/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "license": "ISC"
+ },
+ "node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "license": "MIT"
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
+ "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/semver-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
+ "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/semver-diff/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-handler": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz",
+ "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.0.0",
+ "content-disposition": "0.5.2",
+ "mime-types": "2.1.18",
+ "minimatch": "3.1.2",
+ "path-is-inside": "1.0.2",
+ "path-to-regexp": "3.3.0",
+ "range-parser": "1.2.0"
+ }
+ },
+ "node_modules/serve-handler/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/serve-handler/node_modules/mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-handler/node_modules/mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "~1.33.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-handler/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/serve-handler/node_modules/path-to-regexp": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
+ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "license": "MIT"
+ },
+ "node_modules/sharp": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
+ "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.3",
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.33.5",
+ "@img/sharp-darwin-x64": "0.33.5",
+ "@img/sharp-libvips-darwin-arm64": "1.0.4",
+ "@img/sharp-libvips-darwin-x64": "1.0.4",
+ "@img/sharp-libvips-linux-arm": "1.0.5",
+ "@img/sharp-libvips-linux-arm64": "1.0.4",
+ "@img/sharp-libvips-linux-s390x": "1.0.4",
+ "@img/sharp-libvips-linux-x64": "1.0.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
+ "@img/sharp-linux-arm": "0.33.5",
+ "@img/sharp-linux-arm64": "0.33.5",
+ "@img/sharp-linux-s390x": "0.33.5",
+ "@img/sharp-linux-x64": "0.33.5",
+ "@img/sharp-linuxmusl-arm64": "0.33.5",
+ "@img/sharp-linuxmusl-x64": "0.33.5",
+ "@img/sharp-wasm32": "0.33.5",
+ "@img/sharp-win32-ia32": "0.33.5",
+ "@img/sharp-win32-x64": "0.33.5"
+ }
+ },
+ "node_modules/sharp/node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sharp/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/shelljs/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/shelljs/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/shelljs/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sigstore": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz",
+ "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^2.3.2",
+ "@sigstore/core": "^1.0.0",
+ "@sigstore/protobuf-specs": "^0.3.2",
+ "@sigstore/sign": "^2.3.2",
+ "@sigstore/tuf": "^2.3.4",
+ "@sigstore/verify": "^1.2.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT"
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sinon": {
+ "version": "18.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz",
+ "integrity": "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1",
+ "@sinonjs/fake-timers": "11.2.2",
+ "@sinonjs/samsam": "^8.0.0",
+ "diff": "^5.2.0",
+ "nise": "^6.0.0",
+ "supports-color": "^7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
+ "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz",
+ "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^17.0.5",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "sitemap": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=12.0.0",
+ "npm": ">=5.6.0"
+ }
+ },
+ "node_modules/sitemap/node_modules/@types/node": {
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap/node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/size-sensor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz",
+ "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==",
+ "license": "ISC"
+ },
+ "node_modules/skin-tone": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
+ "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-emoji-modifier-base": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/sockjs/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
+ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/sonic-boom": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz",
+ "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
+ }
+ },
+ "node_modules/sort-css-media-queries": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz",
+ "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.3.0"
+ }
+ },
+ "node_modules/sort-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+ "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sort-keys/node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/spawn-wrap/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz",
+ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "through": "2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/srcset": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz",
+ "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/stable-hash": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
+ "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==",
+ "license": "MIT"
+ },
+ "node_modules/standard": {
+ "version": "17.1.2",
+ "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz",
+ "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "eslint": "^8.41.0",
+ "eslint-config-standard": "17.1.0",
+ "eslint-config-standard-jsx": "^11.0.0",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-n": "^15.7.0",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-react": "^7.36.1",
+ "standard-engine": "^15.1.0",
+ "version-guard": "^1.1.1"
+ },
+ "bin": {
+ "standard": "bin/cmd.cjs"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/standard-engine": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz",
+ "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "get-stdin": "^8.0.0",
+ "minimist": "^1.2.6",
+ "pkg-conf": "^3.1.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+ "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+ "license": "MIT"
+ },
+ "node_modules/stdin-discarder": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
+ "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-entities/node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/stringify-object/node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stringify-object/node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+ "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.1.tgz",
+ "integrity": "sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/strong-log-transformer": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz",
+ "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "duplexer": "^0.1.1",
+ "minimist": "^1.2.0",
+ "through": "^2.3.4"
+ },
+ "bin": {
+ "sl-log-transformer": "bin/sl-log-transformer.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/style-mod": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
+ "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==",
+ "license": "MIT"
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz",
+ "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.8"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
+ "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
+ "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/super-regex": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz",
+ "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone-regexp": "^3.0.0",
+ "function-timeout": "^0.1.0",
+ "time-span": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/superagent": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz",
+ "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.4",
+ "debug": "^4.3.4",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.0",
+ "formidable": "^3.5.1",
+ "methods": "^1.1.2",
+ "mime": "2.6.0",
+ "qs": "^6.11.0"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/superagent/node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "license": "MIT"
+ },
+ "node_modules/svg-to-pdfkit": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz",
+ "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==",
+ "license": "MIT",
+ "dependencies": {
+ "pdfkit": ">=0.8.1"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/swagger-ui-dist": {
+ "version": "5.17.10",
+ "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.10.tgz",
+ "integrity": "sha512-fp8SYeEK216KS1/noDvursUOGojEbkvtckOpOmAGZUjlx/ma7VLD2PLQwyermjlzFrlHI5uCt1V+M1C3qBvRyQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/swagger-ui-express": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz",
+ "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==",
+ "license": "MIT",
+ "dependencies": {
+ "swagger-ui-dist": ">=5.0.0"
+ },
+ "engines": {
+ "node": ">= v0.10.32"
+ },
+ "peerDependencies": {
+ "express": ">=4.0.0 || >=5.0.0-beta"
+ }
+ },
+ "node_modules/swc-loader": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz",
+ "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ },
+ "peerDependencies": {
+ "@swc/core": "^1.2.147",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.6.2.tgz",
+ "integrity": "sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/temp-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
+ "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.39.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
+ "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
+ "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/terser/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz",
+ "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==",
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^10.4.1",
+ "minimatch": "^9.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "license": "MIT"
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/thirty-two": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
+ "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==",
+ "engines": {
+ "node": ">=0.2.6"
+ }
+ },
+ "node_modules/thread-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz",
+ "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==",
+ "license": "MIT",
+ "dependencies": {
+ "real-require": "^0.2.0"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/through2/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/through2/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "license": "MIT"
+ },
+ "node_modules/time-span": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz",
+ "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "convert-hrtime": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+ "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+ "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tlds": {
+ "version": "1.255.0",
+ "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.255.0.tgz",
+ "integrity": "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==",
+ "license": "MIT",
+ "bin": {
+ "tlds": "bin.js"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/touch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/treeverse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz",
+ "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
+ "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.x"
+ }
+ },
+ "node_modules/tuf-js": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz",
+ "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/models": "2.0.1",
+ "debug": "^4.3.4",
+ "make-fetch-happen": "^13.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
+ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-emoji-modifier-base": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
+ "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-properties": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
+ "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.0",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-trie": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
+ "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "pako": "^0.2.5",
+ "tiny-inflate": "^1.0.0"
+ }
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unified/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unique-filename": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+ "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+ "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-modify-children": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz",
+ "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "array-iterate": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-modify-children/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-position/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-children": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz",
+ "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-children/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/unist-util-visit/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
+ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/upath": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
+ "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/update-notifier": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
+ "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boxen": "^7.0.0",
+ "chalk": "^5.0.1",
+ "configstore": "^6.0.0",
+ "has-yarn": "^3.0.0",
+ "import-lazy": "^4.0.0",
+ "is-ci": "^3.0.1",
+ "is-installed-globally": "^0.4.0",
+ "is-npm": "^6.0.0",
+ "is-yarn-global": "^0.4.0",
+ "latest-version": "^7.0.0",
+ "pupa": "^3.1.0",
+ "semver": "^7.3.7",
+ "semver-diff": "^4.0.0",
+ "xdg-basedir": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/boxen": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz",
+ "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^7.0.1",
+ "chalk": "^5.2.0",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.1.2",
+ "type-fest": "^2.13.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/camelcase": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+ "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/update-notifier/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/update-notifier/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/update-notifier/node_modules/xdg-basedir": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
+ "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "file-loader": "*",
+ "webpack": "^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "file-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/url-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/url-loader/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/url-loader/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/url-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/use-local-storage-state": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-19.5.0.tgz",
+ "integrity": "sha512-sUJAyFvsmqMpBhdwaRr7GTKkkoxb6PWeNVvpBDrLuwQF1PpbJRKIbOYeLLeqJI7B3wdfFlLLCBbmOdopiSTBOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/astoilkov"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "license": "MIT"
+ },
+ "node_modules/utility-types": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz",
+ "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "license": "ISC",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-name": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/value-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
+ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==",
+ "license": "MIT"
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/version-guard": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz",
+ "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==",
+ "dev": true,
+ "license": "0BSD",
+ "engines": {
+ "node": ">=0.10.48"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/vfile-message/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
+ "license": "MIT"
+ },
+ "node_modules/walk-up-path": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz",
+ "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/web-worker": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz",
+ "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/webpack": {
+ "version": "5.98.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz",
+ "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.11",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-bundle-analyzer": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz",
+ "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==",
+ "license": "MIT",
+ "dependencies": {
+ "@discoveryjs/json-ext": "0.5.7",
+ "acorn": "^8.0.4",
+ "acorn-walk": "^8.0.0",
+ "commander": "^7.2.0",
+ "debounce": "^1.2.1",
+ "escape-string-regexp": "^4.0.0",
+ "gzip-size": "^6.0.0",
+ "html-escaper": "^2.0.2",
+ "opener": "^1.5.2",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.3",
+ "ws": "^7.3.1"
+ },
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "license": "MIT",
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/webpackbar": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz",
+ "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "consola": "^3.2.3",
+ "figures": "^3.2.0",
+ "markdown-table": "^2.0.0",
+ "pretty-time": "^1.1.0",
+ "std-env": "^3.7.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "webpack": "3 || 4 || 5"
+ }
+ },
+ "node_modules/webpackbar/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/webpackbar/node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/webpackbar/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "license": "ISC"
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
+ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/widest-line/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/widest-line/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/widest-line/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "license": "MIT"
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/workerpool": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+ "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/write-json-file": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz",
+ "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-indent": "^5.0.0",
+ "graceful-fs": "^4.1.15",
+ "make-dir": "^2.1.0",
+ "pify": "^4.0.1",
+ "sort-keys": "^2.0.0",
+ "write-file-atomic": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/write-json-file/node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/write-json-file/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/write-json-file/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/write-json-file/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write-json-file/node_modules/write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/write-pkg": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz",
+ "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sort-keys": "^2.0.0",
+ "type-fest": "^0.4.1",
+ "write-json-file": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/write-pkg/node_modules/type-fest": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz",
+ "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "xml-js": "bin/cli.js"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yaml-loader": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.8.1.tgz",
+ "integrity": "sha512-BCEndnUoi3BaZmePkwGGe93txRxLgMhBa/gE725v1/GHnura8QvNs7c4+4C1yyhhKoj3Dg63M7IqhA++15j6ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "javascript-stringify": "^2.0.1",
+ "loader-utils": "^2.0.0",
+ "yaml": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ylru": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz",
+ "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz",
+ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zrender": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
+ "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ },
+ "node_modules/zrender/node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+ "license": "0BSD"
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "packages/collection": {
+ "name": "@freesewing/collection",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@freesewing/aaron": "4.0.0-rc.16",
+ "@freesewing/albert": "4.0.0-rc.16",
+ "@freesewing/bee": "4.0.0-rc.16",
+ "@freesewing/bella": "4.0.0-rc.16",
+ "@freesewing/benjamin": "4.0.0-rc.16",
+ "@freesewing/bent": "4.0.0-rc.16",
+ "@freesewing/bibi": "4.0.0-rc.16",
+ "@freesewing/bob": "4.0.0-rc.16",
+ "@freesewing/bonny": "4.0.0-rc.16",
+ "@freesewing/breanna": "4.0.0-rc.16",
+ "@freesewing/brian": "4.0.0-rc.16",
+ "@freesewing/bruce": "4.0.0-rc.16",
+ "@freesewing/carlita": "4.0.0-rc.16",
+ "@freesewing/carlton": "4.0.0-rc.16",
+ "@freesewing/cathrin": "4.0.0-rc.16",
+ "@freesewing/charlie": "4.0.0-rc.16",
+ "@freesewing/core": "4.0.0-rc.16",
+ "@freesewing/core-plugins": "4.0.0-rc.16",
+ "@freesewing/cornelius": "4.0.0-rc.16",
+ "@freesewing/diana": "4.0.0-rc.16",
+ "@freesewing/florence": "4.0.0-rc.16",
+ "@freesewing/florent": "4.0.0-rc.16",
+ "@freesewing/gozer": "4.0.0-rc.16",
+ "@freesewing/hi": "4.0.0-rc.16",
+ "@freesewing/holmes": "4.0.0-rc.16",
+ "@freesewing/hortensia": "4.0.0-rc.16",
+ "@freesewing/huey": "4.0.0-rc.16",
+ "@freesewing/hugo": "4.0.0-rc.16",
+ "@freesewing/jaeger": "4.0.0-rc.16",
+ "@freesewing/jane": "4.0.0-rc.16",
+ "@freesewing/lily": "4.0.0-rc.16",
+ "@freesewing/lucy": "4.0.0-rc.16",
+ "@freesewing/lumina": "4.0.0-rc.16",
+ "@freesewing/lumira": "4.0.0-rc.16",
+ "@freesewing/lunetius": "4.0.0-rc.16",
+ "@freesewing/noble": "4.0.0-rc.16",
+ "@freesewing/octoplushy": "4.0.0-rc.16",
+ "@freesewing/onyx": "4.0.0-rc.16",
+ "@freesewing/opal": "4.0.0-rc.16",
+ "@freesewing/otis": "4.0.0-rc.16",
+ "@freesewing/paco": "4.0.0-rc.16",
+ "@freesewing/penelope": "4.0.0-rc.16",
+ "@freesewing/plugin-bust": "4.0.0-rc.16",
+ "@freesewing/plugin-flip": "4.0.0-rc.16",
+ "@freesewing/sandy": "4.0.0-rc.16",
+ "@freesewing/shelly": "4.0.0-rc.16",
+ "@freesewing/shin": "4.0.0-rc.16",
+ "@freesewing/simon": "4.0.0-rc.16",
+ "@freesewing/simone": "4.0.0-rc.16",
+ "@freesewing/skully": "4.0.0-rc.16",
+ "@freesewing/snapseries": "4.0.0-rc.16",
+ "@freesewing/sven": "4.0.0-rc.16",
+ "@freesewing/tamiko": "4.0.0-rc.16",
+ "@freesewing/teagan": "4.0.0-rc.16",
+ "@freesewing/tiberius": "4.0.0-rc.16",
+ "@freesewing/titan": "4.0.0-rc.16",
+ "@freesewing/trayvon": "4.0.0-rc.16",
+ "@freesewing/tristan": "4.0.0-rc.16",
+ "@freesewing/uma": "4.0.0-rc.16",
+ "@freesewing/umbra": "4.0.0-rc.16",
+ "@freesewing/wahid": "4.0.0-rc.16",
+ "@freesewing/walburga": "4.0.0-rc.16",
+ "@freesewing/waralee": "4.0.0-rc.16",
+ "@freesewing/yuri": "4.0.0-rc.16"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/config": {
+ "name": "@freesewing/config",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/core": {
+ "name": "@freesewing/core",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@freesewing/core-plugins": "4.0.0-rc.16",
+ "bezier-js": "6.1.4",
+ "hooks": "0.3.2",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.get": "4.4.2",
+ "lodash.set": "4.3.2",
+ "lodash.unset": "4.5.2"
+ },
+ "devDependencies": {
+ "chai": "5.1.1",
+ "eslint": "8.57.0",
+ "mocha": "10.4.0",
+ "nyc": "17.1.0",
+ "sinon": "^18.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/core/node_modules/@eslint/js": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "packages/core/node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "packages/core/node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "packages/core/node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "packages/core/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "packages/core/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "packages/core/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "packages/core/node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "packages/core/node_modules/cliui": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "packages/core/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "packages/core/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "packages/core/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "packages/core/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "packages/core/node_modules/eslint": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "packages/core/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "packages/core/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "packages/core/node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "packages/core/node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "packages/core/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/find-up/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/find-up/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/find-up/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/core/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "packages/core/node_modules/locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "packages/core/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "packages/core/node_modules/nyc": {
+ "version": "17.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^3.3.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.2",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/glob": {
+ "version": "7.2.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "packages/core/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/p-map": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/rimraf": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/core/node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "packages/core/node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/core/node_modules/rimraf/node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "packages/core/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "packages/core/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "packages/core/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "packages/core/node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "packages/core/node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/core/node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "packages/core/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/core/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "packages/core/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "packages/core/node_modules/y18n": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "ISC"
+ },
+ "packages/core/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/yargs/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "packages/core/node_modules/yargs/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "packages/core/node_modules/yargs/node_modules/y18n": {
+ "version": "5.0.8",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "packages/core/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/i18n": {
+ "name": "@freesewing/i18n",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/models": {
+ "name": "@freesewing/models",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/new-design": {
+ "name": "@freesewing/new-design",
+ "version": "4.0.0-rc.8",
+ "extraneous": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.2.0",
+ "commander": "^10.0.0",
+ "fs-extra": "^11.1.1",
+ "prompts": "^2.4.2"
+ },
+ "bin": {
+ "new-design": "index.mjs"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/prettier-config": {
+ "name": "@freesewing/prettier-config",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/react": {
+ "name": "@freesewing/react",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/lang-yaml": "^6.1.2",
+ "@uiw/react-codemirror": "^4.23.8",
+ "d3-drag": "3.0.0",
+ "d3-selection": "3.0.0",
+ "diff": "^7.0.0",
+ "echarts": "^5.6.0",
+ "echarts-for-react": "^3.0.2",
+ "file-saver": "^2.0.5",
+ "highlight.js": "^11.11.1",
+ "html-react-parser": "^5.2.2",
+ "jotai": "^2.12.1",
+ "jotai-location": "^0.5.5",
+ "luxon": "^3.5.0",
+ "mustache": "^4.2.0",
+ "pdfkit": "^0.16.0",
+ "react-diff-viewer-continued": "^4.0.5",
+ "react-dropzone": "^14.3.5",
+ "react-zoom-pan-pinch": "^3.7.0",
+ "svg-to-pdfkit": "^0.1.8",
+ "use-local-storage-state": "^19.5.0",
+ "web-worker": "^1.5.0",
+ "yaml": "^2.7.0"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ }
+ },
+ "packages/react/node_modules/diff": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "packages/rehype-highlight-lines": {
+ "version": "3.3.0-rc.1",
+ "extraneous": true,
+ "license": "MIT",
+ "dependencies": {
+ "unist-util-remove": "4.0.0"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/rehype-jargon": {
+ "version": "3.3.0-rc.1",
+ "extraneous": true,
+ "license": "MIT",
+ "dependencies": {
+ "hast-util-from-html": "2.0.1",
+ "unist-util-visit": "5.0.0"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/snapseries": {
+ "name": "@freesewing/snapseries",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/studio": {
+ "name": "@freesewing/studio",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.2.0",
+ "execa": "^9.5.2",
+ "glob": "^11.0.1",
+ "ora": "^8.2.0",
+ "prompts": "^2.4.2"
+ },
+ "bin": {
+ "studio": "index.mjs"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "packages/studio/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "packages/studio/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "packages/studio/node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "license": "MIT"
+ },
+ "packages/studio/node_modules/glob": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
+ "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/studio/node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/jackspeak": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz",
+ "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/studio/node_modules/log-symbols": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
+ "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "is-unicode-supported": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/lru-cache": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
+ "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "packages/studio/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/studio/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/ora": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
+ "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "cli-cursor": "^5.0.0",
+ "cli-spinners": "^2.9.2",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^2.0.0",
+ "log-symbols": "^6.0.0",
+ "stdin-discarder": "^0.2.2",
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "packages/studio/node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/studio/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "packages/utils": {
+ "name": "@freesewing/utils",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "tlds": "^1.255.0"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "plugins/core-plugins": {
+ "name": "@freesewing/core-plugins",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "dependencies": {
+ "@freesewing/plugin-annotations": "4.0.0-rc.16",
+ "@freesewing/plugin-bin-pack": "4.0.0-rc.16",
+ "@freesewing/plugin-measurements": "4.0.0-rc.16",
+ "@freesewing/plugin-mirror": "4.0.0-rc.16",
+ "@freesewing/plugin-round": "4.0.0-rc.16",
+ "@freesewing/plugin-sprinkle": "4.0.0-rc.16"
+ },
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/core-plugins/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/core-plugins/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/core-plugins/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/core-plugins/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/core-plugins/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/core-plugins/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/core-plugins/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/core-plugins/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/core-plugins/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/core-plugins/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/core-plugins/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/core-plugins/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/core-plugins/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/core-plugins/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/core-plugins/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/core-plugins/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/core-plugins/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/core-plugins/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/core-plugins/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/core-plugins/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/core-plugins/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/core-plugins/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/core-plugins/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/core-plugins/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-annotations": {
+ "name": "@freesewing/plugin-annotations",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-annotations/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-annotations/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-annotations/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-annotations/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bin-pack": {
+ "name": "@freesewing/plugin-bin-pack",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-bin-pack/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-bin-pack/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bin-pack/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bust": {
+ "name": "@freesewing/plugin-bust",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-bust/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-bust/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-bust/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-bust/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-bust/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-bust/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-bust/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bust/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-bust/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-bust/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bust/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bust/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bust/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-bust/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bust/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-bust/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-bust/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-bust/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-bust/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-bust/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-bust/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bust/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bust/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-bust/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-flip": {
+ "name": "@freesewing/plugin-flip",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-flip/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-flip/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-flip/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-flip/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-flip/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-flip/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-flip/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-flip/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-flip/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-flip/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-flip/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-flip/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-flip/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-flip/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-flip/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-flip/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-flip/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-flip/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-flip/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-flip/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-flip/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-flip/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-flip/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-flip/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-gore": {
+ "name": "@freesewing/plugin-gore",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-gore/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-gore/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-gore/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-gore/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-gore/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-gore/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-gore/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-gore/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-gore/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-gore/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-gore/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-gore/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-gore/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-gore/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-gore/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-gore/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-gore/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-gore/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-gore/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-gore/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-gore/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-gore/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-gore/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-gore/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-i18n": {
+ "name": "@freesewing/plugin-i18n",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-i18n/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-i18n/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-i18n/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-i18n/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-measurements": {
+ "name": "@freesewing/plugin-measurements",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-measurements/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-measurements/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-measurements/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-measurements/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-mirror": {
+ "name": "@freesewing/plugin-mirror",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-mirror/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-mirror/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-mirror/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-mirror/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-ringsector": {
+ "name": "@freesewing/plugin-ringsector",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-ringsector/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-ringsector/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-ringsector/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-round": {
+ "name": "@freesewing/plugin-round",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-round/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-round/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-round/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-round/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-round/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-round/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-round/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-round/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-round/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-round/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-round/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-round/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-round/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-round/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-round/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-round/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-round/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-round/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-round/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-round/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-round/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-round/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-round/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-round/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-sprinkle": {
+ "name": "@freesewing/plugin-sprinkle",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-sprinkle/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-sprinkle/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-sprinkle/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-svgattr": {
+ "name": "@freesewing/plugin-svgattr",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-svgattr/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-svgattr/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-svgattr/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-theme": {
+ "name": "@freesewing/plugin-theme",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-theme/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-theme/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-theme/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-theme/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-theme/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-theme/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-theme/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-theme/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-theme/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-theme/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-theme/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-theme/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-theme/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-theme/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-theme/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-theme/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-theme/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-theme/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-theme/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-theme/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-theme/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-theme/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-theme/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-theme/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-timing": {
+ "name": "@freesewing/plugin-timing",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-timing/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-timing/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-timing/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-timing/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-timing/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-timing/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-timing/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-timing/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-timing/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-timing/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-timing/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-timing/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-timing/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-timing/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-timing/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-timing/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-timing/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-timing/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-timing/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-timing/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-timing/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-timing/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-timing/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-timing/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-versionfree-svg": {
+ "name": "@freesewing/plugin-versionfree-svg",
+ "version": "4.0.0-rc.16",
+ "license": "MIT",
+ "devDependencies": {
+ "chai": "5.1.1",
+ "mocha": "10.4.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "peerDependencies": {
+ "@freesewing/core": "4.0.0-rc.16"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "plugins/plugin-versionfree-svg/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "plugins/plugin-versionfree-svg/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "plugins/plugin-versionfree-svg/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/backend": {
+ "name": "backend.freesewing.org",
+ "version": "3.3.0-rc.1",
+ "license": "MIT",
+ "dependencies": {
+ "@aws-sdk/client-sesv2": "3.592.0",
+ "@prisma/client": "5.15.0",
+ "bcryptjs": "2.4.3",
+ "cors": "2.8.5",
+ "dotenv": "16.4.5",
+ "express": "4.19.2",
+ "js-yaml": "4.1.0",
+ "lodash.get": "4.4.2",
+ "mustache": "4.2.0",
+ "node-jose": "^2.2.0",
+ "oidc-provider": "^8.8.1",
+ "otplib": "12.0.1",
+ "passport": "0.7.0",
+ "passport-http": "0.3.0",
+ "passport-jwt": "4.0.1",
+ "pino": "9.2.0",
+ "qrcode": "1.5.3",
+ "sharp": "^0.33.5",
+ "swagger-ui-dist": "5.17.10",
+ "swagger-ui-express": "5.0.0"
+ },
+ "devDependencies": {
+ "chai": "5.1.1",
+ "chai-http": "5.1.1",
+ "esbuild": "0.21.3",
+ "mocha": "10.4.0",
+ "mocha-steps": "1.3.0",
+ "nodemon": "3.1.0",
+ "prisma": "5.15.0"
+ },
+ "engines": {
+ "node": ">= 18.17.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ }
+ },
+ "sites/backend/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.3",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "sites/backend/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "sites/backend/node_modules/body-parser": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "sites/backend/node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "sites/backend/node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "sites/backend/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "sites/backend/node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "sites/backend/node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "sites/backend/node_modules/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "sites/backend/node_modules/debug": {
+ "version": "4.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "sites/backend/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "sites/backend/node_modules/dotenv": {
+ "version": "16.4.5",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "sites/backend/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "sites/backend/node_modules/esbuild": {
+ "version": "0.21.3",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.3",
+ "@esbuild/android-arm": "0.21.3",
+ "@esbuild/android-arm64": "0.21.3",
+ "@esbuild/android-x64": "0.21.3",
+ "@esbuild/darwin-arm64": "0.21.3",
+ "@esbuild/darwin-x64": "0.21.3",
+ "@esbuild/freebsd-arm64": "0.21.3",
+ "@esbuild/freebsd-x64": "0.21.3",
+ "@esbuild/linux-arm": "0.21.3",
+ "@esbuild/linux-arm64": "0.21.3",
+ "@esbuild/linux-ia32": "0.21.3",
+ "@esbuild/linux-loong64": "0.21.3",
+ "@esbuild/linux-mips64el": "0.21.3",
+ "@esbuild/linux-ppc64": "0.21.3",
+ "@esbuild/linux-riscv64": "0.21.3",
+ "@esbuild/linux-s390x": "0.21.3",
+ "@esbuild/linux-x64": "0.21.3",
+ "@esbuild/netbsd-x64": "0.21.3",
+ "@esbuild/openbsd-x64": "0.21.3",
+ "@esbuild/sunos-x64": "0.21.3",
+ "@esbuild/win32-arm64": "0.21.3",
+ "@esbuild/win32-ia32": "0.21.3",
+ "@esbuild/win32-x64": "0.21.3"
+ }
+ },
+ "sites/backend/node_modules/express": {
+ "version": "4.19.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.2",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.6.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "sites/backend/node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "sites/backend/node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "sites/backend/node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "sites/backend/node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/backend/node_modules/glob": {
+ "version": "8.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "sites/backend/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "sites/backend/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "sites/backend/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/backend/node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/minimatch": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "sites/backend/node_modules/mocha": {
+ "version": "10.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "8.1.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "sites/backend/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/backend/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/backend/node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "sites/backend/node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "sites/backend/node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "sites/backend/node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "sites/backend/node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "sites/backend/node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "sites/backend/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "sites/backend/node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "sites/backend/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "sites/backend/node_modules/workerpool": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "sites/backend/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "sites/backend/node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "sites/backend/node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "sites/backend/node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "sites/backend/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "sites/dev": {
+ "version": "0.0.0",
+ "dependencies": {
+ "@docusaurus/core": "3.7.0",
+ "@docusaurus/preset-classic": "3.7.0",
+ "@mdx-js/react": "^3.0.0",
+ "clsx": "^2.0.0",
+ "prism-react-renderer": "^2.3.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-markdown": "^9.0.1",
+ "tailwindcss": "^3.4.13"
+ },
+ "devDependencies": {
+ "@babel/preset-react": "^7.26.3",
+ "@docusaurus/module-type-aliases": "3.7.0",
+ "@docusaurus/types": "3.7.0"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "sites/org": {
+ "name": "orgdocs",
+ "version": "0.0.0",
+ "dependencies": {
+ "@docusaurus/core": "^3.7.0",
+ "@docusaurus/faster": "^3.7.0",
+ "@docusaurus/plugin-content-blog": "^3.7.0",
+ "@docusaurus/preset-classic": "^3.7.0",
+ "@mdx-js/react": "^3.0.0",
+ "autoprefixer": "^10.4.20",
+ "clsx": "^2.0.0",
+ "daisyui": "^4.12.23",
+ "lodash": "^4.17.21",
+ "postcss": "^8.4.47",
+ "prism-react-renderer": "^2.3.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-markdown": "^9.0.1",
+ "remark-smartypants": "^3.0.2",
+ "tailwindcss": "^3.4.14"
+ },
+ "devDependencies": {
+ "@babel/plugin-syntax-import-attributes": "^7.25.6",
+ "@docusaurus/module-type-aliases": "^3.7.0",
+ "@docusaurus/types": "^3.7.0",
+ "glob": "^11.0.0",
+ "gray-matter": "^4.0.3",
+ "yaml-loader": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "sites/org/node_modules/glob": {
+ "version": "11.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "sites/org/node_modules/jackspeak": {
+ "version": "4.0.2",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "sites/org/node_modules/lru-cache": {
+ "version": "11.0.2",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "sites/org/node_modules/minimatch": {
+ "version": "10.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "sites/org/node_modules/path-scurry": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index a98a07cde92..4f1700ddadc 100644
--- a/package.json
+++ b/package.json
@@ -12,25 +12,21 @@
"license": "MIT",
"scripts": {
"new": "node --experimental-json-modules --no-warnings scripts/add-software.mjs",
+ "build": "lerna run build:all",
"?": "node scripts/help.mjs",
"tips": "node scripts/help.mjs",
- "org": "cd sites/org && yarn start",
- "dev": "cd sites/dev && yarn start",
- "kickstart": "npx yarn install && yarn prepare && yarn tips",
- "kickstart:windows": "npx yarn install && yarn prepare && yarn tips",
- "cleanall": "lerna run clean",
- "test": "lerna run test",
- "e2e": "lerna run e2e",
+ "org": "cd sites/org && npm run start",
+ "dev": "cd sites/dev && npm run start",
+ "kickstart": "npm install && husky && npm run tips",
+ "cleanall": "npx nx run-many --target=clean",
+ "test": "npx nx run-many --target=test",
+ "e2e": "npx nx run-many --target=e2e",
"prettier": "npx prettier --write 'config/*' 'config/**/*' 'packages/**/src/*.mjs' 'packages/i18n/src/locales/**/*.*' 'packages/**/tests/*.mjs' 'packages/react-components/src/**/*.mjs'",
"reconfigure": "all-contributors generate && node --experimental-json-modules --no-warnings scripts/reconfigure.mjs",
"sitebuildconfigure": "SITEBUILD=1 node --experimental-json-modules --no-warnings scripts/reconfigure.mjs",
- "prerelease": "lerna version --no-git-tag-version --no-push && yarn reconfigure && yarn buildall",
- "buildall": "lerna run build:all",
- "build": "yarn buildall",
- "wbuild": "lerna run wbuild:all",
"testall": "node scripts/testall.js",
- "lint": "LINTER=1 lerna run --no-bail lint -- ",
- "qa": "yarn qa:prettier && yarn qa:lint",
+ "lint": "LINTER=1 nx run-many --target=lint -- ",
+ "qa": "npm run qa:prettier && npm run qa:lint",
"qa:prettier": "npx prettier",
"qa:lint": "npx eslint",
"release": "lerna exec --no-bail -- npm publish",
@@ -44,8 +40,7 @@
"checkdocs": "remark markdown --quiet --frail",
"strapi:translate": "node scripts/strapi-en-to-other.mjs",
"fixdocs": "remark markdown --quiet --frail --output",
- "wbuildall": "lerna run wbuildall",
- "prepare": "husky && yarn buildall"
+ "reversion": "node --no-warnings scripts/reversion.mjs && npm run reconfigure"
},
"repository": {
"type": "git",
@@ -63,13 +58,11 @@
"devDependencies": {
"@commitlint/cli": "^19.0.3",
"@commitlint/config-conventional": "^19.0.3",
+ "@nx/eslint": "20.2.1",
"all-contributors-cli": "^6.26.1",
"axios": "^1.5.1",
"chalk": "^4.1.0",
- "codecov": "^3.8.3",
"cross-env": "^7.0.2",
- "esbuild": "^0.23.0",
- "esbuild-plugin-yaml": "^0.0.1",
"eslint": "^8.23.1",
"eslint-plugin-jsonc": "^2.4.0",
"eslint-plugin-markdown": "^5.0.0",
@@ -82,11 +75,10 @@
"lint-staged": "^15.0.1",
"mocha": "^10.0.0",
"mustache": "^4.0.1",
+ "nx": "20.2.1",
"nyc": "^15.1.0",
"prettier": "^3.0.0",
"pretty-quick": "^4.0.0",
- "prop-types": "^15.7.2",
- "react": "^18.2.0",
"rimraf": "^5.0.0",
"standard": "^17.0.0"
},
@@ -105,10 +97,10 @@
"eslint-config-next": "^14.0.1",
"glob": "^10.3.10",
"rehype-format": "^5.0.0",
- "yarn": "^1.22.19"
+ "rehype-stringify": "^10.0.1",
+ "tlds": "^1.255.0"
},
"engines": {
- "node": ">= 18.17.0 <22"
- },
- "packageManager": "yarn@1.22.19"
+ "node": ">=20.0"
+ }
}
diff --git a/packages/collection/CHANGELOG.md b/packages/collection/CHANGELOG.md
new file mode 100644
index 00000000000..1b5c4c4c24e
--- /dev/null
+++ b/packages/collection/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Change log for: @freesewing/collection
+
+
+## 4.0.0 (2024-04-01)
+
+### Added
+
+ - Added a new `@freesewing/collection` package that bundles all our designs
+
+## 3.0.0 (2023-09-30)
+
+### Changed
+
+ - All FreeSewing packages are now ESM only.
+ - All FreeSewing packages now use named exports.
+ - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
+
+
+This is the **initial release**, and the start of this change log.
+
+> Prior to version 2, FreeSewing was not a JavaScript project.
+> As such, that history is out of scope for this change log.
+
diff --git a/packages/collection/README.md b/packages/collection/README.md
new file mode 100644
index 00000000000..38accea5c13
--- /dev/null
+++ b/packages/collection/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+# @freesewing/collection
+
+All FreeSewing designs bundles into one pacakge, our collection
+
+
+
+# FreeSewing
+
+> [!TIP]
+>#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
+>
+> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
+>
+> If you feel FreeSewing is worthwhile, and you can spend a few coins without
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
+
+## What am I looking at? 🤔
+
+This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
+
+This folder holds: @freesewing/collection
+
+If you're not entirely sure what to do or how to start, type this command:
+
+```
+npm run tips
+```
+
+> [!NOTE]
+> If you don't want to set up a dev environment, you can run it in your browser:
+>
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx @freesewing/studio
+```
+
+Getting started guides are available for:
+- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
+- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
+- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
+
+The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
+show you how to create your first parametric design.
+
+## Getting started ⚡
+
+To get started with FreeSewing, you can spin up our development environment with:
+
+```bash
+npx @freesewing/studio
+```
+
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) on your system.
+Once you have that, clone (or fork) this repo and run `npm run kickstart`:
+
+```bash
+git clone git@codeberg.org:freesewing/freesewing.git
+cd freesewing
+npm run kickstart
+```
+
+## Links 👩💻
+
+**Official channels**
+
+ - 💻 Makers website: [FreeSewing.eu](https://freesewing.eu/)
+ - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev/)
+ - ✅ [Support](https://forum.freesewing.eu/),
+ [Issues](https://codeberg.org/freesewing/freesewing/issues) &
+ [Codeberg](https://codeberg.org/freesewing/freesewing)
+
+**Social media**
+
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
+
+**Places the FreeSewing community hangs out**
+
+ - 💬 [Forum](https://forum.freesewing.eu/)
+ - 💬 [Discord](https://discord.freesewing.org/)
+ - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
+
+## License: MIT 🤓
+
+© [Joost De Cock](https://codeberg.org/joostdecock).
+See [the license file](https://codeberg.org/freesewing/freesewing/blob/develop/LICENSE) for details.
+
+## Where to get help 🤯
+
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
+
diff --git a/packages/collection/package.json b/packages/collection/package.json
new file mode 100644
index 00000000000..131807dfbde
--- /dev/null
+++ b/packages/collection/package.json
@@ -0,0 +1,112 @@
+{
+ "name": "@freesewing/collection",
+ "version": "4.0.0",
+ "description": "All FreeSewing designs bundles into one pacakge, our collection",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "freesewing"
+ ],
+ "type": "module",
+ "module": "src/index.mjs",
+ "exports": {
+ ".": "./src/index.mjs"
+ },
+ "scripts": {
+ "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
+ "test": "echo \"collection: No tests configured. Perhaps you could write some?\" && exit 0",
+ "tips": "node ../../scripts/help.mjs",
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'"
+ },
+ "peerDependencies": {},
+ "dependencies": {
+ "@freesewing/aaron": "4.0.0",
+ "@freesewing/albert": "4.0.0",
+ "@freesewing/bee": "4.0.0",
+ "@freesewing/bella": "4.0.0",
+ "@freesewing/benjamin": "4.0.0",
+ "@freesewing/bent": "4.0.0",
+ "@freesewing/bibi": "4.0.0",
+ "@freesewing/bob": "4.0.0",
+ "@freesewing/bonny": "4.0.0",
+ "@freesewing/breanna": "4.0.0",
+ "@freesewing/brian": "4.0.0",
+ "@freesewing/bruce": "4.0.0",
+ "@freesewing/carlita": "4.0.0",
+ "@freesewing/carlton": "4.0.0",
+ "@freesewing/cathrin": "4.0.0",
+ "@freesewing/charlie": "4.0.0",
+ "@freesewing/cornelius": "4.0.0",
+ "@freesewing/diana": "4.0.0",
+ "@freesewing/florence": "4.0.0",
+ "@freesewing/florent": "4.0.0",
+ "@freesewing/gozer": "4.0.0",
+ "@freesewing/hi": "4.0.0",
+ "@freesewing/holmes": "4.0.0",
+ "@freesewing/hortensia": "4.0.0",
+ "@freesewing/huey": "4.0.0",
+ "@freesewing/hugo": "4.0.0",
+ "@freesewing/jaeger": "4.0.0",
+ "@freesewing/jane": "4.0.0",
+ "@freesewing/lily": "4.0.0",
+ "@freesewing/lucy": "4.0.0",
+ "@freesewing/lumina": "4.0.0",
+ "@freesewing/lumira": "4.0.0",
+ "@freesewing/lunetius": "4.0.0",
+ "@freesewing/noble": "4.0.0",
+ "@freesewing/octoplushy": "4.0.0",
+ "@freesewing/onyx": "4.0.0",
+ "@freesewing/opal": "4.0.0",
+ "@freesewing/otis": "4.0.0",
+ "@freesewing/paco": "4.0.0",
+ "@freesewing/penelope": "4.0.0",
+ "@freesewing/sandy": "4.0.0",
+ "@freesewing/shelly": "4.0.0",
+ "@freesewing/shin": "4.0.0",
+ "@freesewing/simon": "4.0.0",
+ "@freesewing/simone": "4.0.0",
+ "@freesewing/skully": "4.0.0",
+ "@freesewing/sven": "4.0.0",
+ "@freesewing/tamiko": "4.0.0",
+ "@freesewing/teagan": "4.0.0",
+ "@freesewing/tiberius": "4.0.0",
+ "@freesewing/titan": "4.0.0",
+ "@freesewing/trayvon": "4.0.0",
+ "@freesewing/tristan": "4.0.0",
+ "@freesewing/uma": "4.0.0",
+ "@freesewing/umbra": "4.0.0",
+ "@freesewing/wahid": "4.0.0",
+ "@freesewing/walburga": "4.0.0",
+ "@freesewing/waralee": "4.0.0",
+ "@freesewing/yuri": "4.0.0",
+ "@freesewing/plugin-bust": "4.0.0",
+ "@freesewing/plugin-flip": "4.0.0",
+ "@freesewing/core-plugins": "4.0.0",
+ "@freesewing/core": "4.0.0",
+ "@freesewing/snapseries": "4.0.0"
+ },
+ "devDependencies": {},
+ "files": [
+ "src/",
+ "i18n/",
+ "about.json",
+ "README.md"
+ ],
+ "publishConfig": {
+ "access": "public",
+ "tag": "latest"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+}
diff --git a/sites/shared/components/designs/examples.mjs b/packages/collection/src/examples.mjs
similarity index 85%
rename from sites/shared/components/designs/examples.mjs
rename to packages/collection/src/examples.mjs
index a17f374627b..6a89fedd687 100644
--- a/sites/shared/components/designs/examples.mjs
+++ b/packages/collection/src/examples.mjs
@@ -1,6 +1,9 @@
-import { cloudflareImageUrl } from 'shared/utils.mjs'
+import { cloudflare } from '@freesewing/config'
-export const designExamples = {
+/*
+ * This holds the ID of an example image for all designs in the FreeSewing collection
+ */
+export const designExampleIds = {
aaron: 'showcase-tight-aaron',
albert: 'showcase-albert-by-wouter',
bee: 'd0312c99-7b2f-4e37-c131-d626d34cd300',
@@ -56,6 +59,10 @@ export const designExamples = {
yuri: 'showcase-yuri-by-its-designer',
}
-export const designImages = {}
-for (const [design, id] of Object.entries(designExamples))
- designImages[design] = cloudflareImageUrl({ id, variant: 'sq500' })
+/*
+ * Same, but with a full href
+ */
+export const designExampleHrefs = {}
+for (const [design, id] of Object.entries(designExampleIds)) {
+ designExampleHrefs[design] = `${cloudflare.url}${id}/public`
+}
diff --git a/packages/collection/src/i18n.mjs b/packages/collection/src/i18n.mjs
new file mode 100644
index 00000000000..21ac2691059
--- /dev/null
+++ b/packages/collection/src/i18n.mjs
@@ -0,0 +1,125 @@
+// Designs
+import { i18n as aaron } from '@freesewing/aaron'
+import { i18n as albert } from '@freesewing/albert'
+import { i18n as bee } from '@freesewing/bee'
+import { i18n as bella } from '@freesewing/bella'
+import { i18n as benjamin } from '@freesewing/benjamin'
+import { i18n as bent } from '@freesewing/bent'
+import { i18n as bibi } from '@freesewing/bibi'
+import { i18n as bob } from '@freesewing/bob'
+import { i18n as bonny } from '@freesewing/bonny'
+import { i18n as breanna } from '@freesewing/breanna'
+import { i18n as brian } from '@freesewing/brian'
+import { i18n as bruce } from '@freesewing/bruce'
+import { i18n as carlita } from '@freesewing/carlita'
+import { i18n as carlton } from '@freesewing/carlton'
+import { i18n as cathrin } from '@freesewing/cathrin'
+import { i18n as charlie } from '@freesewing/charlie'
+import { i18n as cornelius } from '@freesewing/cornelius'
+import { i18n as diana } from '@freesewing/diana'
+import { i18n as florence } from '@freesewing/florence'
+import { i18n as florent } from '@freesewing/florent'
+import { i18n as gozer } from '@freesewing/gozer'
+import { i18n as hi } from '@freesewing/hi'
+import { i18n as holmes } from '@freesewing/holmes'
+import { i18n as hortensia } from '@freesewing/hortensia'
+import { i18n as huey } from '@freesewing/huey'
+import { i18n as hugo } from '@freesewing/hugo'
+import { i18n as jaeger } from '@freesewing/jaeger'
+import { i18n as jane } from '@freesewing/jane'
+import { i18n as lucy } from '@freesewing/lucy'
+import { i18n as lumina } from '@freesewing/lumina'
+import { i18n as lumira } from '@freesewing/lumira'
+import { i18n as lunetius } from '@freesewing/lunetius'
+import { i18n as noble } from '@freesewing/noble'
+import { i18n as octoplushy } from '@freesewing/octoplushy'
+import { i18n as onyx } from '@freesewing/onyx'
+import { i18n as opal } from '@freesewing/opal'
+import { i18n as otis } from '@freesewing/otis'
+import { i18n as paco } from '@freesewing/paco'
+import { i18n as penelope } from '@freesewing/penelope'
+import { i18n as sandy } from '@freesewing/sandy'
+import { i18n as shelly } from '@freesewing/shelly'
+import { i18n as shin } from '@freesewing/shin'
+import { i18n as simon } from '@freesewing/simon'
+import { i18n as simone } from '@freesewing/simone'
+import { i18n as skully } from '@freesewing/skully'
+import { i18n as sven } from '@freesewing/sven'
+import { i18n as tamiko } from '@freesewing/tamiko'
+import { i18n as teagan } from '@freesewing/teagan'
+import { i18n as tiberius } from '@freesewing/tiberius'
+import { i18n as titan } from '@freesewing/titan'
+import { i18n as trayvon } from '@freesewing/trayvon'
+import { i18n as tristan } from '@freesewing/tristan'
+import { i18n as uma } from '@freesewing/uma'
+import { i18n as umbra } from '@freesewing/umbra'
+import { i18n as wahid } from '@freesewing/wahid'
+import { i18n as walburga } from '@freesewing/walburga'
+import { i18n as waralee } from '@freesewing/waralee'
+import { i18n as yuri } from '@freesewing/yuri'
+import { i18n as lily } from '@freesewing/lily'
+
+/*
+ * Export the translations
+ */
+export const i18n = {
+ aaron,
+ albert,
+ bee,
+ bella,
+ benjamin,
+ bent,
+ bibi,
+ bob,
+ bonny,
+ breanna,
+ brian,
+ bruce,
+ carlita,
+ carlton,
+ cathrin,
+ charlie,
+ cornelius,
+ diana,
+ florence,
+ florent,
+ gozer,
+ hi,
+ holmes,
+ hortensia,
+ huey,
+ hugo,
+ jaeger,
+ jane,
+ lucy,
+ lumina,
+ lumira,
+ lunetius,
+ noble,
+ octoplushy,
+ onyx,
+ opal,
+ otis,
+ paco,
+ penelope,
+ sandy,
+ shelly,
+ shin,
+ simon,
+ simone,
+ skully,
+ sven,
+ tamiko,
+ teagan,
+ tiberius,
+ titan,
+ trayvon,
+ tristan,
+ uma,
+ umbra,
+ wahid,
+ walburga,
+ waralee,
+ yuri,
+ lily,
+}
diff --git a/packages/collection/src/index.mjs b/packages/collection/src/index.mjs
new file mode 100644
index 00000000000..68198ff77f7
--- /dev/null
+++ b/packages/collection/src/index.mjs
@@ -0,0 +1,187 @@
+// Designs
+import { Aaron as aaron } from '@freesewing/aaron'
+import { Albert as albert } from '@freesewing/albert'
+import { Bee as bee } from '@freesewing/bee'
+import { Bella as bella } from '@freesewing/bella'
+import { Benjamin as benjamin } from '@freesewing/benjamin'
+import { Bent as bent } from '@freesewing/bent'
+import { Bibi as bibi } from '@freesewing/bibi'
+import { Bob as bob } from '@freesewing/bob'
+import { Bonny as bonny } from '@freesewing/bonny'
+import { Breanna as breanna } from '@freesewing/breanna'
+import { Brian as brian } from '@freesewing/brian'
+import { Bruce as bruce } from '@freesewing/bruce'
+import { Carlita as carlita } from '@freesewing/carlita'
+import { Carlton as carlton } from '@freesewing/carlton'
+import { Cathrin as cathrin } from '@freesewing/cathrin'
+import { Charlie as charlie } from '@freesewing/charlie'
+import { Cornelius as cornelius } from '@freesewing/cornelius'
+import { Diana as diana } from '@freesewing/diana'
+import { Florence as florence } from '@freesewing/florence'
+import { Florent as florent } from '@freesewing/florent'
+import { Gozer as gozer } from '@freesewing/gozer'
+import { Hi as hi } from '@freesewing/hi'
+import { Holmes as holmes } from '@freesewing/holmes'
+import { Hortensia as hortensia } from '@freesewing/hortensia'
+import { Huey as huey } from '@freesewing/huey'
+import { Hugo as hugo } from '@freesewing/hugo'
+import { Jaeger as jaeger } from '@freesewing/jaeger'
+import { Jane as jane } from '@freesewing/jane'
+import { Lily as lily } from '@freesewing/lily'
+import { Lucy as lucy } from '@freesewing/lucy'
+import { Lumina as lumina } from '@freesewing/lumina'
+import { Lumira as lumira } from '@freesewing/lumira'
+import { Lunetius as lunetius } from '@freesewing/lunetius'
+import { Noble as noble } from '@freesewing/noble'
+import { Octoplushy as octoplushy } from '@freesewing/octoplushy'
+import { Onyx as onyx } from '@freesewing/onyx'
+import { Opal as opal } from '@freesewing/opal'
+import { Otis as otis } from '@freesewing/otis'
+import { Paco as paco } from '@freesewing/paco'
+import { Penelope as penelope } from '@freesewing/penelope'
+import { Sandy as sandy } from '@freesewing/sandy'
+import { Shelly as shelly } from '@freesewing/shelly'
+import { Shin as shin } from '@freesewing/shin'
+import { Simon as simon } from '@freesewing/simon'
+import { Simone as simone } from '@freesewing/simone'
+import { Skully as skully } from '@freesewing/skully'
+import { Sven as sven } from '@freesewing/sven'
+import { Tamiko as tamiko } from '@freesewing/tamiko'
+import { Teagan as teagan } from '@freesewing/teagan'
+import { Tiberius as tiberius } from '@freesewing/tiberius'
+import { Titan as titan } from '@freesewing/titan'
+import { Trayvon as trayvon } from '@freesewing/trayvon'
+import { Tristan as tristan } from '@freesewing/tristan'
+import { Uma as uma } from '@freesewing/uma'
+import { Umbra as umbra } from '@freesewing/umbra'
+import { Wahid as wahid } from '@freesewing/wahid'
+import { Walburga as walburga } from '@freesewing/walburga'
+import { Waralee as waralee } from '@freesewing/waralee'
+import { Yuri as yuri } from '@freesewing/yuri'
+// Translations
+import { i18n as translations } from './i18n.mjs'
+// Examples
+import { designExampleIds, designExampleHrefs } from './examples.mjs'
+
+/*
+ * Export the designs themselves
+ */
+export const designs = {
+ aaron,
+ albert,
+ bee,
+ bella,
+ benjamin,
+ bent,
+ bibi,
+ bob,
+ breanna,
+ brian,
+ bruce,
+ carlita,
+ carlton,
+ cathrin,
+ charlie,
+ cornelius,
+ diana,
+ florence,
+ florent,
+ gozer,
+ hi,
+ holmes,
+ hortensia,
+ huey,
+ hugo,
+ jaeger,
+ jane,
+ lily,
+ lucy,
+ lumina,
+ lumira,
+ lunetius,
+ noble,
+ octoplushy,
+ onyx,
+ opal,
+ otis,
+ paco,
+ penelope,
+ sandy,
+ shelly,
+ shin,
+ simon,
+ simone,
+ skully,
+ sven,
+ tamiko,
+ teagan,
+ tiberius,
+ titan,
+ trayvon,
+ tristan,
+ uma,
+ umbra,
+ wahid,
+ walburga,
+ waralee,
+ yuri,
+}
+
+/*
+ * Export a list of names that make up the FreeSewing collection
+ */
+export const collection = Object.keys(designs)
+
+/*
+ * Create various helper exports to get info about the collection
+ */
+export const requiredMeasurements = {}
+export const optionalMeasurements = {}
+export const measurements = {}
+export const about = {}
+
+const _tags = new Set()
+const _techniques = new Set()
+const _devs = new Set()
+const _dess = new Set()
+
+for (const design in designs) {
+ requiredMeasurements[design] = designs[design].patternConfig.measurements
+ optionalMeasurements[design] = designs[design].patternConfig.optionalMeasurements
+ measurements[design] = [
+ ...designs[design].patternConfig.measurements,
+ ...designs[design].patternConfig.optionalMeasurements,
+ ]
+ about[design] = { ...designs[design].designConfig.data }
+ if (about[design].tags) _tags.add(...about[design].tags)
+ if (about[design].techniques) _techniques.add(...about[design].techniques)
+ if (Array.isArray(about[design].code)) _devs.add(...about[design].code)
+ else _devs.add(about[design].code)
+ if (Array.isArray(about[design].design)) _dess.add(...about[design].design)
+ else _dess.add(about[design].design)
+}
+export const tags = Array.from(_tags)
+ .filter((t) => (t ? true : false))
+ .sort()
+export const techniques = Array.from(_techniques)
+ .filter((t) => (t ? true : false))
+ .sort()
+export const developers = Array.from(_devs)
+ .filter((t) => (t ? true : false))
+ .sort()
+export const designers = Array.from(_dess)
+ .filter((t) => (t ? true : false))
+ .sort()
+
+/*
+ * Export the translations
+ */
+export const i18n = translations
+
+/*
+ * These are examples
+ */
+export const examples = {
+ id: designExampleIds,
+ href: designExampleHrefs,
+}
diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md
new file mode 100644
index 00000000000..026c699db25
--- /dev/null
+++ b/packages/config/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Change log for: @freesewing/config
+
+
+## 4.0.0 (2024-04-01)
+
+### Added
+
+ - Added a new `@freesewing/config` package for shared configuration
+
+## 3.0.0 (2023-09-30)
+
+### Changed
+
+ - All FreeSewing packages are now ESM only.
+ - All FreeSewing packages now use named exports.
+ - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
+
+
+This is the **initial release**, and the start of this change log.
+
+> Prior to version 2, FreeSewing was not a JavaScript project.
+> As such, that history is out of scope for this change log.
+
diff --git a/packages/config/README.md b/packages/config/README.md
new file mode 100644
index 00000000000..ce8e6985330
--- /dev/null
+++ b/packages/config/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+# @freesewing/config
+
+Various configurations for FreeSewing
+
+
+
+# FreeSewing
+
+> [!TIP]
+>#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
+>
+> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
+>
+> If you feel FreeSewing is worthwhile, and you can spend a few coins without
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
+
+## What am I looking at? 🤔
+
+This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
+
+This folder holds: @freesewing/config
+
+If you're not entirely sure what to do or how to start, type this command:
+
+```
+npm run tips
+```
+
+> [!NOTE]
+> If you don't want to set up a dev environment, you can run it in your browser:
+>
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx @freesewing/studio
+```
+
+Getting started guides are available for:
+- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
+- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
+- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
+
+The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
+show you how to create your first parametric design.
+
+## Getting started ⚡
+
+To get started with FreeSewing, you can spin up our development environment with:
+
+```bash
+npx @freesewing/studio
+```
+
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) on your system.
+Once you have that, clone (or fork) this repo and run `npm run kickstart`:
+
+```bash
+git clone git@codeberg.org:freesewing/freesewing.git
+cd freesewing
+npm run kickstart
+```
+
+## Links 👩💻
+
+**Official channels**
+
+ - 💻 Makers website: [FreeSewing.eu](https://freesewing.eu/)
+ - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev/)
+ - ✅ [Support](https://forum.freesewing.eu/),
+ [Issues](https://codeberg.org/freesewing/freesewing/issues) &
+ [Codeberg](https://codeberg.org/freesewing/freesewing)
+
+**Social media**
+
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
+
+**Places the FreeSewing community hangs out**
+
+ - 💬 [Forum](https://forum.freesewing.eu/)
+ - 💬 [Discord](https://discord.freesewing.org/)
+ - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
+
+## License: MIT 🤓
+
+© [Joost De Cock](https://codeberg.org/joostdecock).
+See [the license file](https://codeberg.org/freesewing/freesewing/blob/develop/LICENSE) for details.
+
+## Where to get help 🤯
+
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
+
diff --git a/packages/config/package.json b/packages/config/package.json
new file mode 100644
index 00000000000..c18b21d024b
--- /dev/null
+++ b/packages/config/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "@freesewing/config",
+ "version": "4.0.0",
+ "description": "Various configurations for FreeSewing",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "freesewing"
+ ],
+ "type": "module",
+ "module": "src/index.mjs",
+ "exports": {
+ ".": "./src/index.mjs"
+ },
+ "scripts": {
+ "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
+ "test": "echo \"config: No tests configured. Perhaps you could write some?\" && exit 0",
+ "tips": "node ../../scripts/help.mjs",
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'"
+ },
+ "peerDependencies": {},
+ "dependencies": {},
+ "devDependencies": {},
+ "files": [
+ "src/",
+ "i18n/",
+ "about.json",
+ "README.md"
+ ],
+ "publishConfig": {
+ "access": "public",
+ "tag": "latest"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+}
diff --git a/packages/config/src/apikeys.mjs b/packages/config/src/apikeys.mjs
new file mode 100644
index 00000000000..4a84f741ad2
--- /dev/null
+++ b/packages/config/src/apikeys.mjs
@@ -0,0 +1,11 @@
+export const apikeyLevels = {
+ 0: 'Authenticate only',
+ 1: 'Read access to your own patterns and measurements sets',
+ 2: 'Read access to all your account data',
+ 3: 'Write access to your own patterns and measurements sets',
+ 4: 'Write access to all your account data',
+ 5: 'Read access to patterns and measurements sets of other users',
+ 6: 'Write access to patterns and measurements sets of other users',
+ 7: 'Write access to all account data of other users',
+ 8: 'Impersonate other users, full write access to all data',
+}
diff --git a/packages/config/src/cloudflare.mjs b/packages/config/src/cloudflare.mjs
new file mode 100644
index 00000000000..d74540b5f5d
--- /dev/null
+++ b/packages/config/src/cloudflare.mjs
@@ -0,0 +1,6 @@
+export const cloudflare = {
+ account: 'edd96e8b19d1be5946c5f7983365bda4',
+ url: 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/',
+ variants: ['public', 'sq100', 'sq200', 'sq500', 'w200', 'w500', 'w1000', 'w2000'],
+ dflt: 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/365cc64e-1502-4d2b-60e0-cc8beee73f00/public',
+}
diff --git a/packages/config/src/control.mjs b/packages/config/src/control.mjs
new file mode 100644
index 00000000000..0ed23116eff
--- /dev/null
+++ b/packages/config/src/control.mjs
@@ -0,0 +1,169 @@
+/*
+ * This configuration file holds various control levels.
+ * Control is a setting that determines what to hide/show in the UI
+ *
+ * This file has the following named exports:
+ *
+ * accountControlLevels: Fields and control levels, and other account related settings
+ * controlLevels: Consolidated object holding all control levels
+ * defaultControlLevel: The default control level to apply when we have no user-specific level
+ * editorControlLevels: Configuration for the pattern editor
+ *
+ * They are all re-exported from index.mjs
+ */
+
+/*
+ * The default control level in case we have nothing more specific
+ */
+const dflt = 3
+
+/*
+ * Structure of the various account fields and their control levels
+ */
+const account = {
+ fields: {
+ data: {
+ bookmarks: 2,
+ sets: 1,
+ patterns: 1,
+ },
+ info: {
+ img: 2,
+ bio: 2,
+ email: 3,
+ username: 2,
+ },
+ settings: {
+ consent: 2,
+ compare: 3,
+ newsletter: 2,
+ units: 2,
+ control: 1,
+ },
+ security: {
+ apikeys: 4,
+ mfa: 3,
+ password: 2,
+ },
+ identities: {
+ github: 3,
+ instagram: 3,
+ mastodon: 3,
+ reddit: 3,
+ twitch: 3,
+ tiktok: 3,
+ website: 3,
+ },
+ },
+ sets: {
+ name: 1,
+ img: 1,
+ public: 3,
+ units: 1,
+ notes: 2,
+ createdAt: 2,
+ updatedAt: 2,
+ id: 4,
+ },
+ patterns: {
+ name: 1,
+ img: 1,
+ public: 3,
+ notes: 2,
+ createdAt: 2,
+ updatedAt: 2,
+ id: 4,
+ },
+ statuses: {
+ 0: {
+ name: 'inactive',
+ color: 'neutral',
+ },
+ 1: {
+ name: 'active',
+ color: 'success',
+ },
+ '-1': {
+ name: 'paused',
+ color: 'warning',
+ },
+ '-2': {
+ name: 'disabled',
+ color: 'error',
+ },
+ },
+}
+
+/*
+ * Editor control levels
+ */
+const editor = {
+ core: {
+ sa: 2,
+ paperless: 2,
+ locale: 3,
+ units: 1,
+ complete: 4,
+ expand: 4,
+ only: 4,
+ scale: 4,
+ margin: 4,
+ },
+ ui: {
+ renderer: 4,
+ kiosk: 2,
+ },
+ views: {
+ draft: 1,
+ measies: 1,
+ test: 3,
+ time: 3,
+ print: 1,
+ export: 1,
+ save: 1,
+ edit: 4,
+ logs: 2,
+ inspect: 4,
+ docs: 1,
+ },
+}
+
+export const control = {
+ account,
+ editor,
+ dflt,
+ flat: {
+ ...account.fields.data,
+ ...account.fields.info,
+ ...account.fields.settings,
+ ...account.fields.security,
+ ...account.fields.identities,
+ sets: account.sets,
+ core: editor.core,
+ ui: editor.ui,
+ views: editor.views,
+ },
+}
+
+export const controlDesc = {
+ 1: {
+ title: `Keep it as simple as possible`,
+ desc: `Hides all but the most crucial features.`,
+ },
+ 2: {
+ title: `Keep it simple, but not too simple`,
+ desc: `Hides the majority of features.`,
+ },
+ 3: {
+ title: `Balance simplicity with power`,
+ desc: `Reveals the majority of features, but not all.`,
+ },
+ 4: {
+ title: `Give me all powers, but keep me safe`,
+ desc: `Reveals all features, keeps handrails and safety checks`,
+ },
+ 5: {
+ title: `Get out of my way`,
+ desc: `Reveals all features, removes handrails and safety checks`,
+ },
+}
diff --git a/packages/config/src/index.mjs b/packages/config/src/index.mjs
new file mode 100644
index 00000000000..a29f3a6d38c
--- /dev/null
+++ b/packages/config/src/index.mjs
@@ -0,0 +1,26 @@
+import { cloudflare } from './cloudflare.mjs'
+import { control, controlDesc } from './control.mjs'
+import { logoPath } from './logo.mjs'
+import { measurements, degreeMeasurements, isDegreeMeasurement } from './measurements.mjs'
+import { sewingTechniques } from './sewing.mjs'
+import { roles, uiRoles } from './roles.mjs'
+import { urls } from './urls.mjs'
+import { apikeyLevels } from './apikeys.mjs'
+
+/*
+ * This top-level file bundles all (named) exports for the config package
+ */
+export {
+ apikeyLevels,
+ cloudflare,
+ control,
+ controlDesc,
+ logoPath,
+ measurements,
+ degreeMeasurements,
+ isDegreeMeasurement,
+ sewingTechniques,
+ roles,
+ uiRoles,
+ urls,
+}
diff --git a/config/logo.mjs b/packages/config/src/logo.mjs
similarity index 98%
rename from config/logo.mjs
rename to packages/config/src/logo.mjs
index 47f859b6d9a..22396f1c343 100644
--- a/config/logo.mjs
+++ b/packages/config/src/logo.mjs
@@ -1,2 +1,7 @@
+/*
+ * The actual pathString for the logo. Adapted for a 24x24 viewBox (like our icons)
+ *
+ * We keep this in its own file so it can be imported by pure NodeJS without JSX support
+ */
export const logoPath =
'm18.56 0c-0.4945 0.3515-0.469 0.3065-0.8685 0.437-0.916 0.2995-1.7945 0.135-2.837 0.048-0.3135-0.035-0.6245-0.0555-0.928-0.0575-1.5325-0.0105-2.834 0.439-3.0805 1.694-0.4545 0.2755-0.8725 0.609-1.2865 0.943-0.884 0.6975-1.5495 1.55-2.0035 2.5775-0.62 1.5175-0.06 3.146 0.2175 4.684 0.066 0.36 0.135 0.703 0.172 0.8355 0.0525 0.1865 0.145 0.3645 0.2455 0.5245 0.0235 4e-3 0.1475-0.187 0.177-0.2715 0.043-0.123 0.0385-0.3205-0.0085-0.4905-0.104-0.3825-0.203-0.693-0.2115-0.849-0.015-0.293 0.042-0.5635 0.149-0.6975 0.038-0.0475 0.125 0.1975 0.1025 0.2885-0.0265 0.1095-0.0465 0.297-0.038 0.3835 0.0235 0.293 0.0665 0.6065 0.12 0.8805 0.0685 0.3535 0.098 0.5805 0.0855 0.6685-9e-3 0.064-0.039 0.1285-0.154 0.3265-0.1 0.1735-0.152 0.314-0.16 0.438-0.0085 0.121 0.028 0.4235 0.062 0.4975 0.0495 0.1155 0.1985 0.237 0.3285 0.267 0.1245 0.0475 0.187 0.146 0.251 0.2565 0.1555 0.2965 0.2755 0.6575 0.3945 1.2015 0.058 0.2605 0.1065 0.493 0.122 0.615-0.96 1e-3 -2.1895 0.0015-3.3095 0.0015-0.377 6e-3 -1.058-0.171-1.6825-0.212-0.0905-0.977-0.5195-2.112-1.2535-2.178-0.501-0.0455-0.9165 0.145-1.268 0.9365l0.01 0.0425c0.2075-0.1735 0.4265-0.704 1.2155-0.6675 0.606 0.0275 0.808 1.1745 0.868 1.8645-0.369 0.027-0.683 0.1405-0.847 0.424h-0.0035c0 5e-4 0 0.0015 0.0015 0.0025-0.0015 1e-3 -0.0015 2e-3 -0.0015 3e-3h0.0035c0.169 0.2905 0.4945 0.403 0.877 0.4255 0.2555 7.225 7.047 8.157 8.903 8.157 6.924 0 9.348-4.705 9.7125-6.5685 0.1705 0.794-0.3665 1.8055-0.495 2.552 1.4605-1.6885 1.1965-3.312 0.9295-4.945 0.222 0.264 0.5225 0.4275 0.93 0.337-0.2905-0.194-0.6845-0.058-0.9205-0.8765-0.103-0.3535-0.192-0.6185-0.2805-0.841-0.191-0.7165-0.462-1.401-0.795-2.068-0.281-0.7235-0.0955-1.1925-0.1235-1.8135 0.5055 1.667 0.8215 2.1105 1.4115 2.285-1.484-1.788-0.976-4.5565-1.8145-7.0275 0.3795 0.223 0.8125 0.29 1.2735 0.0175-0.446-0.127-0.891 0.2085-1.531-0.732-0.5405-1.0515-1.3235-1.828-2.2735-2.513-0.509-0.332-1.074-0.555-1.642-0.762 0.5785-0.145 1.2245-0.66 1.2545-1.0445zm-0.9705 5.5535c0.762 0.278 1.602 1.334 1.5925 2.37v0.058c-0.0205 1.407-0.66 2.1635-0.633 3.1005 0.0345 1.1035 0.5095 1.4885 0.604 1.6725-0.162-0.6805-0.257-1.5365-0.043-2.2145 0.275-0.872 0.5525-1.594 0.5325-2.277-0.01-0.16-0.078-0.7585-0.1235-1.0235 0.817 1.179-0.177 2.8935 0.109 4.0155 0.497 1.9545 2.7245 2.2015 2.0615 6.1395-0.5835 3.462-4.5815 6.0895-8.6795 6.0895-3.038 0-8.3025-1.6815-8.5625-7.646 0.6175-0.044 1.2815-0.216 1.654-0.21 1.126 0 2.412 5e-4 3.381 1e-3 0.182 0.821 0.3185 1.019 1.009 1.566 0.768 0.604 0.947 0.6775 2.083 0.6885 1.1365 0.0115 1.4735-0.232 2.576-1.275 0.238-0.279 0.341-0.6445 0.4565-0.988 1.134-0.0105 1.961-0.0305 2.7745-0.0685 0.8285-0.0375 0.9455 0 2.2805-0.1375-1.335-0.1375-1.452-0.1-2.2805-0.138-0.792-0.036-1.594-0.0565-2.6785-0.0665 0.091-0.4085 0.221-0.8075 0.3595-1.202 0.0855-0.2325 0.186-0.459 0.289-0.6845l0.1125-0.035c0.217-0.077 0.409-0.242 0.4855-0.465 0.0985-0.2955 0.0285-0.6275-0.162-0.869-0.0655-0.0905-0.147-0.206-0.1805-0.257-0.1005-0.159-0.103-0.2475-0.018-0.8385 0.0715-0.495 0.0795-0.754 0.03-1.005-0.01-0.1435-0.011-0.4385-0.0155-0.518 0.038 0.021 0.1205 0.209 0.204 0.4635 0.083 0.2555 0.0965 0.3085 0.1155 0.526 0.021 0.247-0.0715 0.43-0.1475 0.7985-0.038 0.19-0.0715 0.3665-0.0715 0.3905 0 0.0255 0.018 0.0795 0.037 0.1215 0.0445 0.094 0.128 0.226 0.1435 0.226 0.2725-0.3005 0.4325-0.6715 0.575-1.048 0.15-0.426 0.194-0.878 0.299-1.3165 0.085-0.382 0.183-0.7645 0.2135-1.1565 0.0615-0.765 0.0255-1.305-0.1435-2.102-0.0405-0.18-0.1575-0.5235-0.239-0.6855zm-2.68 3.7685c0.2925-0.0035 0.582 0.032 0.8575 0.1115 0.3745 0.1435 0.427 0.478 0.496 0.8535 0.0385 0.24 0.037 0.4125-0.0065 0.6945-0.0305 0.409-0.193 0.7255-0.548 0.948-0.5355 0.099-1.108 0.1945-1.562-0.16-0.381-0.525-0.6105-1.1885-0.523-1.8355 0.0555-0.2655 0.179-0.4035 0.433-0.486 0.2735-0.0785 0.563-0.1215 0.853-0.126zm-4.4415 0.0475c0.2735-0.0025 0.55 0.0265 0.702 0.1235 0.6525 0.4415 0.443 1.16 0.185 1.7905-0.3755 0.8255-1.1875 0.795-1.9745 0.7885-0.4355-0.1275-0.4755-0.4845-0.5385-0.866-0.054-0.3685-0.169-0.7635-0.073-1.134 0.2465-0.596 1.1475-0.6645 1.699-0.7025zm9.9515 0.103c0.0035 1.5865 0.2745 2.366 0.8185 3.4895-0.3205-0.6115-0.7785-0.9595-0.949-1.6905-0.326-1.4115 0.0255-1.3325 0.1305-1.799zm-7.9065 1.149c0.086 0.087 0.1275 0.207 0.202 0.3025 0.0575-0.0985 0.1165-0.1965 0.1905-0.284 0.0385 1e-3 0.0855 0.077 0.128 0.213 0.182 0.503 0.2175 1.0565 0.4535 1.54 0.2205 0.35-0.0805 0.554-0.411 0.57-0.241-5e-4 -0.343-0.165-0.4845-0.328-0.0365 0.1065-0.106 0.175-0.189 0.247-0.211 0.177-0.6245 0.1115-0.6885-0.1675 0.085-0.533 0.3565-1.0225 0.5345-1.5335 0.0885-0.1865 0.0895-0.3295 0.2645-0.5595zm-3.096 2.6925c0.1065 0 0.399 0.1985 0.4585 0.3105 0.041 0.0745 0.1345 0.3645 0.141 0.435 0.0105 0.084-0.015 0.283-0.041 0.337-0.019 0.0385-0.0335 0.044-0.0555 0.019-0.0185-0.021-0.2635-0.491-0.42-0.802-0.123-0.249-0.136-0.2995-0.083-0.2995zm6.111 0.1555c4e-3 5e-4 0.01 2e-3 0.0155 0.0035 0.033 0.0135 0.01 0.1305-0.114 0.5555-0.0235 0.128-0.0805 0.229-0.164 0.313-0.0275 0-0.04-0.032-0.083-0.2095-0.0365-0.1515-0.0405-0.2865-0.015-0.4075 0.044-0.1515 0.222-0.198 0.3605-0.255zm-0.7415 0.9265c0.0105-2e-3 0.0205 0.0035 0.0335 0.014 0.045 0.0315 0.0515 0.1145 0.0215 0.277-0.0365 0.209-0.0445 0.232-0.0985 0.2535-0.0235 0.0105-0.0655 0.018-0.0935 0.018-0.0505-9e-3 -0.0635-0.05-0.0515-0.112 0-0.13 0.038-0.243 0.124-0.3765 0.0325-0.05 0.049-0.0715 0.0645-0.074zm-4.3165 0.0095c0.0345 0 0.1385 0.075 0.177 0.127 0.043 0.055 0.092 0.3825 0.0645 0.439-0.0315 0.071-0.1855 0.0355-0.228-0.053-0.026-0.053-0.0875-0.339-0.0875-0.407 0-0.063 0.0305-0.106 0.074-0.106zm3.9455 0.0865c0.042 0.06 0.053 0.137 0.044 0.306l-0.0085 0.154-0.044 0.044c-0.0265 0.0245-0.0715 0.0545-0.0985 0.067-0.0595 0.028-0.105 0.0305-0.1135 8e-3 -0.01-0.03 7e-3 -0.221 0.0255-0.2855 0.0215-0.0665 0.118-0.265 0.15-0.307 0.0145-0.0385 0.0315 0.0095 0.045 0.0135zm-2.5105-9e-3c0.0905 0.023 0.1305 0.1045 0.18 0.1785l0.0335 0.066-0.047 0.1635c-0.025 0.09-0.0515 0.171-0.0595 0.18-9e-3 0.01-0.0425 0.015-0.092 0.0145-0.132-0.0035-0.147-9e-3 -0.1825-0.063l-0.033-0.049 0.028-0.1375c0.0405-0.198 0.06-0.2575 0.105-0.3085 0.0235-0.0275 0.047-0.0425 0.0675-0.0445zm-0.8355 0.1415 0.0745 0.0745 0.0125 0.1685c0.0065 0.092 0.0095 0.1775 0.0045 0.188-0.0045 0.0145-0.0315 0.0185-0.115 0.0185h-0.1085c-0.058-0.0635-0.076-0.141-0.1005-0.221-0.057-0.2405-0.057-0.35 2e-3 -0.3645 0.0965 6e-3 0.16 0.076 0.2305 0.136zm2.9-0.1155c0.118 0.0315 0.0945 0.219 0.094 0.353-9e-3 0.217-0.0175 0.262-0.0455 0.29-0.0485 0.0485-0.1835 0.0215-0.249-0.0505-0.0215-0.026-0.0235-0.034-0.0065-0.1395 0.0195-0.1285 0.0445-0.2085 0.1-0.3185 0.0405-0.079 0.0785-0.1285 0.107-0.1345zm-2.663 0.01c0.0065-5e-4 0.017 0 0.027 1e-3 0.075 6e-3 0.145 0.055 0.207 0.145l0.05 0.0735c0.0045 0.1205 0 0.2475-0.0215 0.3595-0.013 0.0065-0.067 0.0165-0.12 0.0215-0.092 0.0085-0.1005 0.0065-0.1325-0.0215-0.0445-0.038-0.057-0.1085-0.068-0.3425-0.0065-0.191-2e-3 -0.2335 0.058-0.2365zm1.1345 0.04c0.0805 0.017 0.1315 0.06 0.154 0.1305 0.018 0.0605 0.029 0.399 0.0115 0.4225-6e-3 0.01-0.044 0.0225-0.0875 0.028-0.162 0.0205-0.305 5e-3 -0.319-0.0335-0.018-0.044 0.1025-0.48 0.147-0.534 0.019-0.042 0.065-0.0095 0.094-0.0135zm1.049 3e-3c0.0355-0.0035 0.0735 0.0305 0.1105 0.103 0.03 0.0605 0.0345 0.0815 0.0345 0.217 0 0.108-0.0065 0.1545-0.018 0.1645-0.01 8e-3 -0.0505 0.0225-0.0935 0.0335-0.075 0.0195-0.0915 0.0215-0.115 0.0135l-0.1125-0.0205 0.0085-0.067c8e-3 -0.0875 0.0655-0.2815 0.106-0.3655 0.024-0.05 0.0515-0.075 0.0795-0.0785zm-0.489 0.0015c0.0235-1e-3 0.0345 0.0045 0.0495 0.021 0.0355 0.042 0.0805 0.166 0.109 0.2985 0.038 0.1865 0.038 0.186-0.0435 0.2105-0.0355 0.011-0.1105 0.0225-0.164 0.0255-0.1765 9e-3 -0.19-0.0015-0.1685-0.1575 0.017-0.139 0.0855-0.358 0.115-0.374 0.032-0.017 0.069-0.0165 0.1025-0.024zm-8.9965 0.7045c0.0015-5e-4 0.0035 0 0.0035 0 0.0045 0.0975 0.0045 0.196 0.0065 0.294-0.2475-0.019-0.4295-0.078-0.4295-0.1475 0-0.0685 0.1755-0.127 0.4195-0.1465zm0.4325 0.0085c0.2005 0.025 0.339 0.0775 0.3365 0.138 0 0.061-0.134 0.113-0.333 0.1375-2e-3 -0.0915-2e-3 -0.1835-0.0035-0.2755zm9.363 0.2665c0.017-0.0015 0.0245-3e-3 0.0505-5e-4 0.104 0.0105 0.119 0.017 0.119 0.052 0 0.046-0.079 0.1845-0.1325 0.2325-0.025 0.024-0.0595 0.044-0.0715 0.044-0.06 0-0.095-0.1265-0.067-0.243 0.017-0.063 0.048-0.0825 0.1015-0.085zm-0.3775 0.0415c0.0465-4e-3 0.0915 0.0085 0.1365 0.0145-0.013 0.1315-0.072 0.239-0.1815 0.3105-0.027 0-0.0405-0.0515-0.0405-0.164 0-0.134 7e-3 -0.1595 0.0855-0.161zm-0.414 0.0485c0.0965 0 0.1815 0.0045 0.1855 0.01 0.018 0.017-0.034 0.146-0.1105 0.277-0.0655 0.1165-0.075 0.125-0.1155 0.128-0.159-0.018-0.1545-0.2045-0.179-0.3325 0-0.076 0.017-0.0825 0.2195-0.0825zm-1.5045 0.0145c0.1105 2e-3 0.1535 0.0185 0.1535 0.061 0 0.054-0.041 0.1615-0.0645 0.175-0.0355 0.0195-0.0385 0.0185-0.1085-0.0545-0.1105-0.124-0.123-0.147 0.0195-0.1815zm0.532 0.0055c2e-3 3e-3 0.0235 0.042 0.045 0.086 0.047 0.0915 0.0505 0.1315 0.017 0.162-0.079 0.045-0.0955 0.0195-0.167-0.026-0.083-0.0785-0.1485-0.184-0.127-0.206 0.074-0.0265 0.1555-0.0165 0.232-0.016zm0.211 0.0025 0.1975 0.0035c0.077 0 0.1435 4e-3 0.147 0.01 0.0135 0.012-0.03 0.269-0.0535 0.327-0.027 0.065-0.1215 0.0655-0.1705-0.0115-0.07-0.1105-0.116-0.2035-0.1175-0.2675z'
diff --git a/config/measurements.mjs b/packages/config/src/measurements.mjs
similarity index 100%
rename from config/measurements.mjs
rename to packages/config/src/measurements.mjs
diff --git a/config/roles.mjs b/packages/config/src/roles.mjs
similarity index 77%
rename from config/roles.mjs
rename to packages/config/src/roles.mjs
index 0f7f3e9d888..83641f9fcaa 100644
--- a/config/roles.mjs
+++ b/packages/config/src/roles.mjs
@@ -13,3 +13,5 @@ export const roles = {
},
base: 'user',
}
+
+export const uiRoles = ['user', 'curator', 'support', 'admin']
diff --git a/config/sewing-techniques.mjs b/packages/config/src/sewing.mjs
similarity index 100%
rename from config/sewing-techniques.mjs
rename to packages/config/src/sewing.mjs
diff --git a/packages/config/src/urls.mjs b/packages/config/src/urls.mjs
new file mode 100644
index 00000000000..c2b8e5c85d2
--- /dev/null
+++ b/packages/config/src/urls.mjs
@@ -0,0 +1,24 @@
+/*
+ * This configuration file exports various URLs.
+ */
+export const urls = {
+ // FreeSewing Backend
+ backend: 'https://backend.freesewing.eu',
+ // FreeSewing website
+ website: 'https://freesewing.eu',
+ // FreeSewing monorepo
+ monorepo: 'https://github.com/freesewing/freesewing',
+ // FreeSewing github organisation
+ github: 'https://github.com/freesewing',
+ // Social media and other account links for FreeSewing
+ social: {
+ YouTube: 'https://www.youtube.com/@freesewing',
+ Discord: 'https://discord.freesewing.org/',
+ Instagram: 'https://instagram.com/freesewing_org',
+ Facebook: 'https://www.facebook.com/groups/627769821272714/',
+ GitHub: 'https://github.com/freesewing',
+ Reddit: 'https://www.reddit.com/r/freesewing/',
+ Mastodon: 'https://freesewing.social/@freesewing',
+ Bluesky: 'https://bsky.app/profile/freesewing.org',
+ },
+}
diff --git a/packages/config/src/wot.mjs b/packages/config/src/wot.mjs
new file mode 100644
index 00000000000..782944c2064
--- /dev/null
+++ b/packages/config/src/wot.mjs
@@ -0,0 +1,31 @@
+/*
+ * This defines the FreeSewing web of trust
+ * See: https://FreeSewing.dev/reference/trust
+ */
+export const wot = {
+ trustees: {
+ 1: {
+ x: 1306,
+ y: 319,
+ title: 'joost',
+ in: 'Antwerp',
+ },
+ 132: {
+ x: 457,
+ y: 345,
+ title: 'woutervdub',
+ in: 'Seattle',
+ },
+ 13050: {
+ x: 668,
+ y: 399,
+ title: 'karen',
+ in: 'Chicago',
+ },
+ },
+ connections: [
+ [1, 132],
+ [1, 13050],
+ ],
+ lastUpdate: '20240402',
+}
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index ec2c4dfdbd7..9b4fe9dc7e1 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -1,6 +1,22 @@
# Change log for: @freesewing/core
+## 4.0.0 (2024-04-01)
+
+### Breaking
+
+ - FreeSewing new requires NodeJS 20 (or more recent)
+ - We removed all but English translations. We still support i18n in our core library and designs, but no longer provide translations
+
+### Added
+
+ - The `Path.rotate()` method was added to the core API.
+ - The `Path.circleSegment()` method was added to the core API.
+
+### Fixed
+
+ - Fix an issue when splitting path on start or end point. Fixes
+
## 3.2.0 (2024-02-11)
### Added
diff --git a/packages/core/README.md b/packages/core/README.md
index 406a9bd14f7..ae30e9f4295 100644
--- a/packages/core/README.md
+++ b/packages/core/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/core
@@ -59,7 +44,7 @@ A library for creating made-to-measure sewing patterns
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/packages/core/data.mjs b/packages/core/data.mjs
deleted file mode 100644
index 656b15f086e..00000000000
--- a/packages/core/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/core'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/core/package.json b/packages/core/package.json
index a5e897f4af6..0f0df2cbe27 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/core",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "A library for creating made-to-measure sewing patterns",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -26,34 +26,23 @@
"sewing patterns"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "c8 mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
"lint": "npx eslint 'src/*.mjs' 'tests/*.mjs'",
"report": "c8 report",
"testci": "c8 mocha tests/*.test.mjs",
"prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "jsdoc": "jsdoc -c jsdoc.json -r src",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "jsdoc": "jsdoc -c jsdoc.json -r src"
},
"peerDependencies": {},
"dependencies": {
- "@freesewing/core-plugins": "3.3.0-rc.1",
+ "@freesewing/core-plugins": "4.0.0",
"bezier-js": "6.1.4",
"hooks": "0.3.2",
"lodash.get": "4.4.2",
@@ -69,14 +58,16 @@
"sinon": "^18.0.0"
},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/packages/core/src/index.mjs b/packages/core/src/index.mjs
index bd581724564..32ec22b01fb 100644
--- a/packages/core/src/index.mjs
+++ b/packages/core/src/index.mjs
@@ -40,7 +40,9 @@ import {
units,
goldenRatio,
} from './utils.mjs'
-import { version } from '../data.mjs'
+import about from '../about.json' with { type: 'json' }
+
+const version = about.version
// Named exports
export {
diff --git a/packages/core/src/pattern/index.mjs b/packages/core/src/pattern/index.mjs
index 197ed0b718e..8a42fe2cad3 100644
--- a/packages/core/src/pattern/index.mjs
+++ b/packages/core/src/pattern/index.mjs
@@ -4,7 +4,7 @@ import { Point } from '../point.mjs'
import { Path } from '../path.mjs'
import { Snippet } from '../snippet.mjs'
import { Store } from '../store.mjs'
-import { version } from '../../data.mjs'
+import { version } from '../index.mjs'
import { __loadPatternDefaults } from '../config.mjs'
import { PatternConfig } from './pattern-config.mjs'
import { PatternDrafter } from './pattern-drafter.mjs'
diff --git a/packages/core/src/svg.mjs b/packages/core/src/svg.mjs
index a27eca88187..3b5493afc22 100644
--- a/packages/core/src/svg.mjs
+++ b/packages/core/src/svg.mjs
@@ -1,7 +1,7 @@
import { Attributes } from './attributes.mjs'
import { Defs } from './defs.mjs'
import { __addNonEnumProp, round } from './utils.mjs'
-import { version } from '../data.mjs'
+import { version } from './index.mjs'
//////////////////////////////////////////////
// CONSTRUCTOR //
diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md
new file mode 100644
index 00000000000..0ff9933c505
--- /dev/null
+++ b/packages/i18n/CHANGELOG.md
@@ -0,0 +1,228 @@
+# Change log for: @freesewing/i18n
+
+
+## 4.0.0 (2024-04-01)
+
+### Added
+
+ - The `@freesewing/i18n` package holds translations in English for where they are needed
+
+## 3.0.0 (2023-09-30)
+
+### Changed
+
+ - All FreeSewing packages are now ESM only.
+ - All FreeSewing packages now use named exports.
+ - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
+
+## 2.21.0 (2022-06-27)
+
+### Changed
+
+ - Migrated from Rollup to Esbuild for all builds
+
+### Fixed
+
+ - Added missing lab namespace for English
+
+## 2.20.2 (2022-01-27)
+
+### Fixed
+
+ - Patterns options were always in English due to symlinks being used
+
+## 2.20.0 (2022-01-24)
+
+### Fixed
+
+ - Fixed issue that was causing plugin translations to always be in English
+
+## 2.19.0 (2021-10-17)
+
+### Fixed
+
+ - Fixed bug in resolving of shared pattern options
+ - Removed optional chaining which broke node v12 support
+
+## 2.18.0 (2021-09-09)
+
+### Added
+
+ - Added translations for Yuri
+
+### Fixed
+
+ - Added optional chaining so missing options always lead to clear error message
+
+## 2.17.3 (2021-08-16)
+
+### Added
+
+ - New translations
+
+## 2.17.2 (2021-08-15)
+
+### Added
+
+ - Added new ffsa option for simon & simone
+
+## 2.17.0 (2021-07-01)
+
+### Changed
+
+ - Changed antman references to antperson
+
+## 2.16.2 (2021-05-05)
+
+### Changed
+
+ - String updates
+
+## 2.16.1 (2021-05-30)
+
+### Added
+
+ - New translations for pattern filter
+
+## 2.16.0 (2021-05-24)
+
+### Changed
+
+ - Changes to cfp strings
+
+## 2.15.0 (2021-04-15)
+
+### Added
+
+ - Added translation for new Titan options
+ - Added translations for Charlie
+
+## 2.14.0 (2021-03-07)
+
+### Added
+
+ - Added translations for Cornelius
+
+## 2.13.0 (2021-02-13)
+
+### Added
+
+ - Translation for Hortensia
+
+## 2.11.0 (2021-01-10)
+
+### Changed
+
+ - New strings for new features
+
+### Fixed
+
+ - Type in Simon title
+
+## 2.10.5 (2020-11-14)
+
+### Fixed
+
+ - Added missing `cty.` translations to non-English language files
+
+## 2.9.0 (2020-10-02)
+
+### Added
+
+ - Added translations for plugin-title
+ - Added translations for teagan
+ - Added some translations for the UI
+
+### Fixed
+
+ - Replaced a few identical files with symlinks
+
+## 2.7.0 (2020-07-12)
+
+### Changed
+
+ - Added translations for Titan
+ - Removed `Circumference` suffix from measurement names
+
+## 2.6.0 (2020-05-01)
+
+### Changed
+
+ - Changes to support the renaming of @freesewing/fu to @freesewing/florence
+
+## 2.5.0 (2020-04-05)
+
+### Added
+
+ - title, description, and options for Dianna
+
+## 2.4.6 (2020-03-23)
+
+### Fixed
+
+ - Fixed an bug in the i18n package
+
+## 2.4.3 (2020-03-12)
+
+### Added
+
+ - Added more translations
+
+## 2.4.2 (2020-03-08)
+
+### Added
+
+ - Added more strings
+
+## 2.2.0 (2020-02-22)
+
+### Added
+
+ - Added translations for Breanna
+
+### Changed
+
+ - Added/Updated strings for the 2.2 frontend changes
+ - Changed `Joost De Cock` to `Joost` because spam filters don't like cock
+
+### Removed
+
+ - Removed the files for homepage translation, and moved that content to markdown
+ - Removed the files for editor translation, as it is no longer used
+
+## 2.1.3 (2019-10-18)
+
+### Added
+
+ - More translated strings
+
+## 2.1.2 (2019-10-14)
+
+### Fixed
+
+ - Fixed issue where symlinks were causing all languages to export English strings
+
+## 2.1.0 (2019-10-06)
+
+### Added
+
+ - Added translations for Penelope, Waralee, and Simone
+
+## 2.0.2 (2019-09-06)
+
+### Added
+
+ - [#90](https://github.com/freesewing/freesewing/issues/90): Added missing option translations for Benjamin, Florent, Sandy, Shin, and Theo
+
+## 2.0.0 (2019-08-25)
+
+### Added
+
+ - Initial release
+
+
+This is the **initial release**, and the start of this change log.
+
+> Prior to version 2, FreeSewing was not a JavaScript project.
+> As such, that history is out of scope for this change log.
+
diff --git a/packages/i18n/README.md b/packages/i18n/README.md
new file mode 100644
index 00000000000..418e12bd4df
--- /dev/null
+++ b/packages/i18n/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+# @freesewing/i18n
+
+Translation for the FreeSewing project
+
+
+
+# FreeSewing
+
+> [!TIP]
+>#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
+>
+> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
+>
+> If you feel FreeSewing is worthwhile, and you can spend a few coins without
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
+
+## What am I looking at? 🤔
+
+This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
+
+This folder holds: @freesewing/i18n
+
+If you're not entirely sure what to do or how to start, type this command:
+
+```
+npm run tips
+```
+
+> [!NOTE]
+> If you don't want to set up a dev environment, you can run it in your browser:
+>
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx @freesewing/studio
+```
+
+Getting started guides are available for:
+- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
+- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
+- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
+
+The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
+show you how to create your first parametric design.
+
+## Getting started ⚡
+
+To get started with FreeSewing, you can spin up our development environment with:
+
+```bash
+npx @freesewing/studio
+```
+
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) on your system.
+Once you have that, clone (or fork) this repo and run `npm run kickstart`:
+
+```bash
+git clone git@codeberg.org:freesewing/freesewing.git
+cd freesewing
+npm run kickstart
+```
+
+## Links 👩💻
+
+**Official channels**
+
+ - 💻 Makers website: [FreeSewing.eu](https://freesewing.eu/)
+ - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev/)
+ - ✅ [Support](https://forum.freesewing.eu/),
+ [Issues](https://codeberg.org/freesewing/freesewing/issues) &
+ [Codeberg](https://codeberg.org/freesewing/freesewing)
+
+**Social media**
+
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
+
+**Places the FreeSewing community hangs out**
+
+ - 💬 [Forum](https://forum.freesewing.eu/)
+ - 💬 [Discord](https://discord.freesewing.org/)
+ - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
+
+## License: MIT 🤓
+
+© [Joost De Cock](https://codeberg.org/joostdecock).
+See [the license file](https://codeberg.org/freesewing/freesewing/blob/develop/LICENSE) for details.
+
+## Where to get help 🤯
+
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
+
diff --git a/packages/i18n/package.json b/packages/i18n/package.json
new file mode 100644
index 00000000000..083fd4869e1
--- /dev/null
+++ b/packages/i18n/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "@freesewing/i18n",
+ "version": "4.0.0",
+ "description": "Translation for the FreeSewing project",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "i18n",
+ "internationalisation",
+ "languages",
+ "localisation",
+ "translation"
+ ],
+ "type": "module",
+ "module": "src/index.mjs",
+ "exports": {
+ ".": "./src/index.mjs"
+ },
+ "scripts": {
+ "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
+ "test": "echo \"i18n: No tests configured. Perhaps you could write some?\" && exit 0",
+ "tips": "node ../../scripts/help.mjs",
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'"
+ },
+ "peerDependencies": {},
+ "dependencies": {},
+ "devDependencies": {},
+ "files": [
+ "src/",
+ "i18n/",
+ "about.json",
+ "README.md"
+ ],
+ "publishConfig": {
+ "access": "public",
+ "tag": "latest"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+}
diff --git a/packages/i18n/src/flags.mjs b/packages/i18n/src/flags.mjs
new file mode 100644
index 00000000000..1a697d4a15b
--- /dev/null
+++ b/packages/i18n/src/flags.mjs
@@ -0,0 +1,26 @@
+export const flags = {
+ apply: 'Apply',
+ decrease: 'Decrease',
+ disable: 'Disable',
+ dismiss: 'Dismiss',
+ 'expandIsOff.t': 'This design saves space (and trees) because expand is disabled',
+ 'expandIsOff.d':
+ 'Because the **expand** core setting is currently disabled, some parts are not fully drawn or not shown at all. Typically, these are simple rectangles that only take up space, or things that can be cut on the fold. \n\nTo expand all pattern parts to their full size, enable the expand setting.',
+ 'expandIsOn.t': 'This design can save space (and trees)',
+ 'expandIsOn.d':
+ 'Because the **expand** core setting is currently enabled, all parts are fully drawn. You can display this design in a more compact way by disabling the **expand** setting. \n\nDoing so will mean that some parts are not fully drawn or not shown at all. Typically, these are simple rectangles that only take up space, or things that can be cut on the fold.',
+ enable: 'Enable',
+ 'flagMenu.t': 'Messages from the designer',
+ 'flagMenuOne.d':
+ 'The designer of this pattern has flagged something about your current draft that deserves your attention.',
+ 'flagMenuMany.d':
+ 'The designer of this pattern has flagged some things about your current draft that deserve your attention.',
+ hide: 'Hide',
+ increase: 'Increase',
+ show: 'Show',
+ saIncluded: '(This includes seam allowance)',
+ saExcluded: '(This does not include seam allowance)',
+ saUnused: '(This part does not require any seam allowance)',
+ partHiddenByExpand:
+ 'This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part.',
+}
diff --git a/packages/i18n/src/index.mjs b/packages/i18n/src/index.mjs
new file mode 100644
index 00000000000..c4bd6916d92
--- /dev/null
+++ b/packages/i18n/src/index.mjs
@@ -0,0 +1,4 @@
+import { flags } from './flags.mjs'
+import { measurements } from './measurements.mjs'
+
+export { flags, measurements }
diff --git a/packages/i18n/src/measurements.mjs b/packages/i18n/src/measurements.mjs
new file mode 100644
index 00000000000..b1e8beccc75
--- /dev/null
+++ b/packages/i18n/src/measurements.mjs
@@ -0,0 +1,40 @@
+export const measurements = {
+ ankle: 'Ankle circumference',
+ biceps: 'Biceps circumference',
+ bustFront: 'Bust front',
+ bustPointToUnderbust: 'Bust point to underbust',
+ bustSpan: 'Bust span',
+ chest: 'Chest circumference',
+ crossSeam: 'Cross seam',
+ crossSeamFront: 'Cross seam front',
+ head: 'Head circumference',
+ heel: 'Heel circumference',
+ highBustFront: 'High bust front',
+ highBust: 'High bust',
+ hips: 'Hips circumference',
+ hpsToBust: 'HPS to bust',
+ hpsToWaistBack: 'HPS to waist back',
+ hpsToWaistFront: 'HPS to waist front',
+ inseam: 'Inseam',
+ knee: 'Knee circumference',
+ neck: 'Neck circumference',
+ seat: 'Seat circumference',
+ seatBack: 'Seat back',
+ crotchDepth: 'Crotch depth',
+ shoulderSlope: 'Shoulder slope',
+ shoulderToElbow: 'Shoulder to elbow',
+ shoulderToShoulder: 'Shoulder to shoulder',
+ shoulderToWrist: 'Shoulder to wrist',
+ underbust: 'Underbust',
+ upperLeg: 'Upper leg circumference',
+ waist: 'Waist circumference',
+ waistBack: 'Waist back',
+ waistToArmpit: 'Waist to armpit',
+ waistToFloor: 'Waist to floor',
+ waistToHips: 'Waist to hips',
+ waistToKnee: 'Waist to knee',
+ waistToSeat: 'Waist to seat',
+ waistToUnderbust: 'Waist to underbust',
+ waistToUpperLeg: 'Waist to upper leg',
+ wrist: 'Wrist circumference',
+}
diff --git a/packages/models/README.md b/packages/models/README.md
index 5d4b0b5199a..9eafc24831b 100644
--- a/packages/models/README.md
+++ b/packages/models/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/models
@@ -106,7 +91,7 @@ The digits in the model refer to the neck circumference in cm.
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -123,7 +108,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/packages/models/data.mjs b/packages/models/data.mjs
deleted file mode 100644
index 6d0025546d7..00000000000
--- a/packages/models/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/models'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/models/package.json b/packages/models/package.json
index 21bf12b2362..3789be1f322 100644
--- a/packages/models/package.json
+++ b/packages/models/package.json
@@ -1,6 +1,6 @@
{
"name": "@freesewing/models",
- "version": "3.3.0-rc.1",
+ "version": "4.0.0",
"description": "Body measurements data for a range of default sizes",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -22,39 +22,30 @@
"sizes"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
+ ".": "./src/index.mjs"
},
"scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
"test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
"tips": "node ../../scripts/help.mjs",
- "lint": "npx eslint 'src/**' 'tests/*.mjs'",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'"
},
"peerDependencies": {},
"dependencies": {},
"devDependencies": {},
"files": [
- "dist/*",
+ "src/",
+ "i18n/",
+ "about.json",
"README.md"
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/packages/models/src/index.mjs b/packages/models/src/index.mjs
index c9654422691..310abe8d11b 100644
--- a/packages/models/src/index.mjs
+++ b/packages/models/src/index.mjs
@@ -1,5 +1,5 @@
import { measurements, neckstimate, CISFEMALE, CISMALE } from './neckstimate.mjs'
-import { degreeMeasurements } from '../../../config/measurements.mjs'
+import { degreeMeasurements } from '@freesewing/config'
const getMeasurements = (size, index) => {
const all = {}
diff --git a/packages/new-design/CHANGELOG.md b/packages/new-design/CHANGELOG.md
deleted file mode 100644
index 0223cdefee0..00000000000
--- a/packages/new-design/CHANGELOG.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Change log for: @freesewing/new-design
-
-
-## 3.1.0 (2023-12-26)
-
-### Fixed
-
- - Removed unwanted debug output
-
-## 3.0.0 (2023-09-30)
-
-### Changed
-
- - All FreeSewing packages are now ESM only.
- - All FreeSewing packages now use named exports.
- - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
-
-## 2.21.3 (2022-07-02)
-
-### Changed
-
- - We're now loading content from the main branch by default
-
-### Fixed
-
- - Add bin entry to package.json
-
-
-This is the **initial release**, and the start of this change log.
-
-> Prior to version 2, FreeSewing was not a JavaScript project.
-> As such, that history is out of scope for this change log.
-
diff --git a/packages/new-design/README.md b/packages/new-design/README.md
deleted file mode 100644
index 34f7e17ec0c..00000000000
--- a/packages/new-design/README.md
+++ /dev/null
@@ -1,162 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-# @freesewing/new-design
-
-Initializer package for a new FreeSewing design: npx @freesewing/new-design
-
-
-
-# FreeSewing
-
-> [!TIP]
->#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
->
-> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
->
-> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
-
-## What am I looking at? 🤔
-
-This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
-
-This folder holds: @freesewing/new-design
-
-If you're not entirely sure what to do or how to start, type this command:
-
-```
-npm run tips
-```
-
-> [!NOTE]
-> If you don't want to set up a dev environment, you can run it in your browser:
->
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
->
-> We recommend that you fork our repository and then
-> put `gitpod.io/# to start up a browser-based dev environment of your own.
-
-## About FreeSewing 💀
-
-Where the world of makers and developers collide, that's where you'll find FreeSewing.
-
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
-sewing patterns adapted to your measurements.
-
-If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
-The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
-for parametric design of sewing patterns. But FreeSewing also provides a range
-of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
-functionality of the platform.
-
-If you have NodeJS installed, you can try it right now by running:
-
-```bash
-npx @freesewing/new-design
-```
-
-Getting started guides are available for:
-- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
-- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
-- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
-
-The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
-show you how to create your first parametric design.
-
-## Getting started ⚡
-
-To get started with FreeSewing, you can spin up our development environment with:
-
-```bash
-npx @freesewing/new-design
-```
-
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
-
-```bash
-git clone git@github.com:freesewing/freesewing.git
-cd freesewing
-yarn kickstart
-```
-
-## Links 👩💻
-
-**Official channels**
-
- - 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- - ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
- [Issues](https://github.com/freesewing/freesewing/issues) &
- [Discussions](https://github.com/freesewing/freesewing/discussions) on
- [GitHub](https://github.com/freesewing/freesewing)
-
-**Social media**
-
- - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
-
-**Places the FreeSewing community hangs out**
-
- - 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
-
-## License: MIT 🤓
-
-© [Joost De Cock](https://github.com/joostdecock).
-See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
-
-## Where to get help 🤯
-
-For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
-please use the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
-
diff --git a/packages/new-design/build.mjs b/packages/new-design/build.mjs
deleted file mode 100644
index 8c8dc8293c0..00000000000
--- a/packages/new-design/build.mjs
+++ /dev/null
@@ -1,45 +0,0 @@
-/* This script will build the package with esbuild */
-import esbuild from 'esbuild'
-import pkg from './package.json' assert { type: 'json' }
-
-// Create banner based on package info
-const banner = `/**
- * ${pkg.name} | v${pkg.version}
- * ${pkg.description}
- * (c) ${new Date().getFullYear()} ${pkg.author}
- * @license ${pkg.license}
- */`
-
-// Let esbuild generate the build
-let result
-;(async () => {
- result = await esbuild
- .build({
- banner: {
- js:
- banner +
- '\n' +
- `import { createRequire } from 'module';` +
- '\n' +
- `const require = createRequire(import.meta.url);`,
- },
- bundle: true,
- entryPoints: ['index.mjs'],
- format: 'esm',
- outfile: 'dist/index.mjs',
- external: ['fs'],
- metafile: process.env.VERBOSE ? true : false,
- minify: process.env.NO_MINIFY ? false : true,
- sourcemap: true,
- platform: 'node',
- })
- .catch((err) => {
- console.log(err)
- process.exit(1)
- })
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-})()
diff --git a/packages/new-design/data.mjs b/packages/new-design/data.mjs
deleted file mode 100644
index 2d1fd1b961b..00000000000
--- a/packages/new-design/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/new-design'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/new-design/i18n/de.json b/packages/new-design/i18n/de.json
deleted file mode 100644
index ed4e2757202..00000000000
--- a/packages/new-design/i18n/de.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Autor",
- "githubRepo": "GitHub-Repository",
- "packageManager": "Paket-Manager",
- "designName": "Name des Designs",
- "designType": "Entwurfstyp",
- "designCreated": "Dein Entwurfsskelett wurde erstellt unter",
- "runTheseCommands": "Um loszulegen, führe diesen Befehl aus",
- "startRollup": "In einem Terminal startest du den Rollup-Bundler im Beobachtungsmodus",
- "startWebpack": "Dadurch wird der 'example'-Ordner betreten und die Entwicklungsumgebung gestartet.",
- "devDocsAvailableAt": "Entwicklerdokumentation ist verfügbar auf",
- "talkToUs": "Für Fragen, Feedback oder Anregungen trete unserem Discord-Server bei",
- "draftYourDesign": "Entwirf dein Design",
- "testYourDesign": "Teste deinen Entwurf",
- "draftThing": "{thing} erstellen",
- "testThing": "{thing} testen",
- "renderInBrowser": "Klicke unten, um dein Design im Browser darzustellen.",
- "weWillReRender": "Wenn du Änderungen vornimmst, werden wir es erneut für dich rendern.",
- "youCan": "Du kannst",
- "enterMeasurements": "Maße von Hand eingeben",
- "preloadMeasurements": "Einen bestehenden Satz an Maßen einlesen",
- "size": "Größe",
- "noRequiredMeasurements": "Dieses Schnittmuster hat keine benötigten Maße",
- "howtoAddMeasurements": "Um Maße als Anforderung zu definieren, füge sie der Sektion measurements in der Konfigurationsdatei des Schnittmusters hinzu.",
- "seeDocsAt": "Dokumentation zu diesem Thema ist verfügbar unter",
- "clearDesignMode": "Designmodus leeren",
- "designMode": "Designmodus",
- "exportMode": "Exportmodus",
- "thingIsEnabled": "{thing} ist aktiviert",
- "thingIsDisabled": "{thing} ist deaktiviert",
- "turnOn": "Aktivieren",
- "turnOff": "Deaktivieren",
- "validNameWarning": "Bitte wähle einen anderen Namen, da dieser Name Probleme verursachen würde.\nWir verwenden den Entwurfsnamen (auch) als NPM-Paketnamen.\nPaketnamen müssen kleingeschrieben sein und dürfen keine Sonderzeichen enthalten.\nBitte nenne dein Design also dementsprechend, z. B.:"
-}
diff --git a/packages/new-design/i18n/en.json b/packages/new-design/i18n/en.json
deleted file mode 100644
index 589b13a6531..00000000000
--- a/packages/new-design/i18n/en.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Author",
- "githubRepo": "GitHub repository",
- "packageManager": "Package manager",
- "designName": "Design name",
- "designType": "Design type",
- "designCreated": "Your design skeleton has been created at",
- "runTheseCommands": "To get started, run this command",
- "startRollup": "In one terminal, start the rollup bundler in watch mode",
- "startWebpack": "It will enter the 'example' folder, and start the development environment.",
- "devDocsAvailableAt": "Developer documentation is available at",
- "talkToUs": "For questions, feedback or suggestions, join our Discord server",
- "draftYourDesign": "Draft your design",
- "testYourDesign": "Test your design",
- "draftThing": "Draft {thing}",
- "testThing": "Test {thing}",
- "renderInBrowser": "Click below to render your design in the browser.",
- "weWillReRender": "When you make changes, we will re-render for you.",
- "youCan": "You can",
- "enterMeasurements": "Enter measurements by hand",
- "preloadMeasurements": "Preload a set of measurements",
- "size": "Size",
- "noRequiredMeasurements": "This design has no required measurements",
- "howtoAddMeasurements": "To require measurements, add them to the measurements section of the design's configuration file.",
- "seeDocsAt": "Documentation on this topic is available at",
- "clearDesignMode": "Clear design mode",
- "designMode": "Design mode",
- "exportMode": "Export mode",
- "thingIsEnabled": "{thing} is enabled",
- "thingIsDisabled": "{thing} is disabled",
- "turnOn": "Turn on",
- "turnOff": "Turn off",
- "validNameWarning": "Please pick a different name as this name would cause problems.\nWe (re-)use the design name as the NPM package name.\nPackage names must be lowercase and cannot contain special characters.\nSo please name your design accordingly, like:"
-}
diff --git a/packages/new-design/i18n/es.json b/packages/new-design/i18n/es.json
deleted file mode 100644
index 2c00f2da6d9..00000000000
--- a/packages/new-design/i18n/es.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Autor",
- "githubRepo": "Repositorio GitHub",
- "packageManager": "Gestor de paquetes",
- "designName": "Nombre del diseño",
- "designType": "Tipo de diseño",
- "designCreated": "El esqueleto de tu diseño se ha creado en",
- "runTheseCommands": "Para empezar, ejecuta este comando",
- "startRollup": "En una terminal, inicia el paquete de rollup en modo reloj",
- "startWebpack": "Entrará en la carpeta \"ejemplo\" e iniciará el entorno de desarrollo.",
- "devDocsAvailableAt": "Documentación para desarrolladores está disponible en",
- "talkToUs": "Para preguntas, comentarios o sugerencias, únete a nuestro servidor de Discord",
- "draftYourDesign": "Redacta tu diseño",
- "testYourDesign": "Prueba tu diseño",
- "draftThing": "Trazar {thing} ",
- "testThing": "Prueba {thing}",
- "renderInBrowser": "Haz clic abajo para representar tu diseño en el navegador.",
- "weWillReRender": "Cuando realices cambios, lo volveremos a trazar para ti.",
- "youCan": "Puedes",
- "enterMeasurements": "Introducir medidas a mano",
- "preloadMeasurements": "Precarga un conjunto de medidas",
- "size": "Tamaño",
- "noRequiredMeasurements": "Este diseño no tiene medidas obligatorias",
- "howtoAddMeasurements": "Para exigir mediciones, añádelas a la sección measurements del archivo de configuración del diseño.",
- "seeDocsAt": "La documentación sobre este tema está disponible en",
- "clearDesignMode": "Borrar modo de diseño",
- "designMode": "Modo de diseño",
- "exportMode": "Modo de exportación",
- "thingIsEnabled": "{thing} está habilitado",
- "thingIsDisabled": "{thing} está deshabilitado",
- "turnOn": "Encender",
- "turnOff": "Apagar",
- "validNameWarning": "Por favor, elige un nombre diferente, ya que este nombre podría causar problemas.\nNosotros (re)utilizamos el nombre del diseño como nombre del paquete NPM.\nLos nombres de los paquetes deben estar en minúsculas y no pueden contener caracteres especiales.\nAsí que, por favor, ponle a tu diseño un nombre acorde, como"
-}
diff --git a/packages/new-design/i18n/fr.json b/packages/new-design/i18n/fr.json
deleted file mode 100644
index 49107983954..00000000000
--- a/packages/new-design/i18n/fr.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Auteur",
- "githubRepo": "Répertoire GitHub",
- "packageManager": "Gestionnaire de package",
- "designName": "Nom du modèle",
- "designType": "Type de conception",
- "designCreated": "Ton squelette de design a été créé à",
- "runTheseCommands": "Pour commencer, exécutez cette commande",
- "startRollup": "Dans un terminal, démarrez le bundler rollup en mode watch",
- "startWebpack": "Il entrera dans le dossier 'exemple' et démarrera l'environnement de développement.",
- "devDocsAvailableAt": "La documentation pour développeur est disponible sur",
- "talkToUs": "Pour des questions, commentaires ou suggestions, rejoignez notre serveur Discord",
- "draftYourDesign": "Fais une ébauche de ton design",
- "testYourDesign": "Teste ton design",
- "draftThing": "Ébauche de {thing}",
- "testThing": "Tester {thing}",
- "renderInBrowser": "Clique ci-dessous pour afficher ton dessin dans le navigateur.",
- "weWillReRender": "Lorsque vous effectuez des modifications, nous mettons à jour le rendu pour vous.",
- "youCan": "Vous pouvez",
- "enterMeasurements": "Entrer des mesures manuellement",
- "preloadMeasurements": "Pré-charger un set de mesures",
- "size": "Taille",
- "noRequiredMeasurements": "Ce design n'a pas de mesures requises",
- "howtoAddMeasurements": "Pour exiger des mesures, ajoute-les à la section measurements du fichier de configuration du design.",
- "seeDocsAt": "La documentation à ce sujet est disponible sur",
- "clearDesignMode": "Vider le mode design",
- "designMode": "Mode design",
- "exportMode": "Mode d'export",
- "thingIsEnabled": "{thing} est activé",
- "thingIsDisabled": "{thing} est désactivé",
- "turnOn": "Activer",
- "turnOff": "Désactiver",
- "validNameWarning": "Choisis un autre nom, car celui-ci poserait des problèmes.\nNous (ré)utilisons le nom du design comme nom de paquet NPM.\nLes noms de paquets doivent être en minuscules et ne peuvent pas contenir de caractères spéciaux.\nNomme donc ton design en conséquence, par exemple :"
-}
diff --git a/packages/new-design/i18n/nl.json b/packages/new-design/i18n/nl.json
deleted file mode 100644
index ab353ead0a5..00000000000
--- a/packages/new-design/i18n/nl.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Auteur",
- "githubRepo": "GitHub repository",
- "packageManager": "Pakketbeheerder",
- "designName": "Naam ontwerp",
- "designType": "Type ontwerp",
- "designCreated": "Je ontwerpskelet is gemaakt op",
- "runTheseCommands": "Voer dit commando uit om aan de slag te gaan",
- "startRollup": "In één terminal, start de rollup bundler in de volgmodus",
- "startWebpack": "Het zal de map 'voorbeeld' invoeren en de ontwikkelingsomgeving starten.",
- "devDocsAvailableAt": "Documentatie voor ontwikkelaars is beschikbaar op",
- "talkToUs": "Voor vragen, feedback of suggesties, neem deel aan onze Discord server",
- "draftYourDesign": "Ontwerp je ontwerp",
- "testYourDesign": "Test je ontwerp",
- "draftThing": "Teken {thing}",
- "testThing": "Test {thing}",
- "renderInBrowser": "Klik hieronder om je patroon in de browser te tonen.",
- "weWillReRender": "Wanneer je wijzigingen maakt, renderen we opnieuw.",
- "youCan": "Je kan",
- "enterMeasurements": "Maten manueel invoeren",
- "preloadMeasurements": "Een set van maten inladen",
- "size": "Maat",
- "noRequiredMeasurements": "Dit patroon heeft geen vereiste maten",
- "howtoAddMeasurements": "Om maten te vereisen, voeg je ze toe aan de measurements sectie van het configuratiebestand van het patroon.",
- "seeDocsAt": "Documentatie over dit onderwerp is beschikbaar op",
- "clearDesignMode": "Ontwerp modus wissen",
- "designMode": "Ontwerp modus",
- "exportMode": "Export modus",
- "thingIsEnabled": "{thing} is ingeschakeld",
- "thingIsDisabled": "{thing} is uitgeschakeld",
- "turnOn": "Inschakelen",
- "turnOff": "Uitschakelen",
- "validNameWarning": "Kies een andere naam, deze zou voor problemen zorgen.\nWe (her)gebruiken de patroonnaam als naam voor het NPM-pakket.\nPakketnamen mogen geen hoofdletters of speciale tekens bevatten.\nDus geef je patroon een geschikte naam, zoals:"
-}
diff --git a/packages/new-design/i18n/uk.json b/packages/new-design/i18n/uk.json
deleted file mode 100644
index dcc0fa28f31..00000000000
--- a/packages/new-design/i18n/uk.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "author": "Автор",
- "githubRepo": "Репозиторій GitHub",
- "packageManager": "Менеджер пакунків",
- "designName": "Назва дизайну",
- "designType": "Тип конструкції",
- "designCreated": "Скелет вашого дизайну був створений на",
- "runTheseCommands": "Щоб розпочати, запустіть цю команду",
- "startRollup": "У одному терміналі запустіть ролап у режимі перегляду",
- "startWebpack": "Це відкриє папку \"приклад\" та запустить девелопмент.",
- "devDocsAvailableAt": "Документація для розробників доступна за адресою",
- "talkToUs": "Для запитань, відгуків чи пропозицій, приєднуйтесь до нашого серверу в Discord",
- "draftYourDesign": "Створіть свій дизайн",
- "testYourDesign": "Перевірте свій дизайн",
- "draftThing": "Створити {thing}",
- "testThing": "Протестувати {thing}",
- "renderInBrowser": "Натисніть нижче, щоб відобразити ваш дизайн у браузері.",
- "weWillReRender": "Коли Ви виконаєте зміни, ми перезавантажимо зображення для Вас.",
- "youCan": "Ви можете",
- "enterMeasurements": "Ввести вимірювання вручну",
- "preloadMeasurements": "Завантажити набір мірок",
- "size": "Розмір",
- "noRequiredMeasurements": "Ця конструкція не має необхідних розмірів",
- "howtoAddMeasurements": "Щоб вимагати вимірювання, додайте їх до розділу measurements конфігураційного файлу проекту.",
- "seeDocsAt": "Документація по цій темі доступна за адресою",
- "clearDesignMode": "Очистити режим дизайну",
- "designMode": "Режим дизайну",
- "exportMode": "Режим експорту",
- "thingIsEnabled": "{thing} увімкнено",
- "thingIsDisabled": "{thing} вимкнено",
- "turnOn": "Увімкнути",
- "turnOff": "Вимкнути",
- "validNameWarning": "Будь ласка, оберіть іншу назву, оскільки ця назва може спричинити проблеми.\nМи (повторно) використовуємо назву дизайну як назву пакунку NPM.\nНазви пакунків мають бути маленькими літерами і не можуть містити спеціальних символів.\nТому, будь ласка, назвіть свій дизайн відповідно, наприклад"
-}
diff --git a/packages/new-design/index.mjs b/packages/new-design/index.mjs
deleted file mode 100755
index bd79ef34527..00000000000
--- a/packages/new-design/index.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env node
-import { cli } from './lib/cli.mjs'
-
-cli()
-
-/*
-
- ___ ___ _
- | __| _ ___ ___/ __| _____ __ _(_)_ _ __ _
- | _| '_/ -_) -_)__ \/ -_) V V / | ' \/ _` |
- |_||_| \___\___|___/\___|\_/\_/|_|_||_\__, |
- ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡|___/
- Come for the sewing patterns
- Stay for the community
-
-
- */
-
diff --git a/packages/new-design/lib/config.mjs b/packages/new-design/lib/config.mjs
deleted file mode 100644
index a5d2deca46e..00000000000
--- a/packages/new-design/lib/config.mjs
+++ /dev/null
@@ -1,113 +0,0 @@
-import { version } from '../data.mjs'
-import { downloads } from './download-list.mjs'
-
-export const config = {
- // Whether we're publishing next or latest tags
- tag: 'next',
- // Minimum node version
- node: 18,
- // Site to download from
- fileUri: 'https://raw.githubusercontent.com',
- // Repository to download from
- repo: process.env.FS_REPO || 'freesewing/freesewing',
- // Branch to download from
- branch: process.env.FS_BRANCH || `v${version}`,
- i18n: [
- 'account',
- 'common',
- 'patrons',
- 'themes',
- 'workbench',
- 'errors',
- 'i18n',
- 'sde',
- 'measurements',
- 'optiongroups',
- 'o_bella',
- 'o_bent',
- 'o_breanna',
- 'o_brian',
- 'o_titan',
- 'parts',
- 'plugin',
- 'settings',
- 'welcome',
- ],
- gitignore: `
-# See https://help.github.com/ignore-files/ for more about ignoring files.
-
-# dependencies
-node_modules
-
-# builds
-dist
-.next
-
-# misc
-.DS_Store
-.env
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-`,
- fetch: {
- config: [
- {
- from: 'measurements.mjs',
- to: 'shared/config/measurements.mjs',
- },
- {
- from: 'social.mjs',
- to: 'shared/config/social.mjs',
- },
- {
- from: 'roles.mjs',
- to: 'shared/config/roles.mjs',
- },
- ],
- sites: [
- // Mock MDX components
- ...[
- 'highlight',
- 'youtube',
- 'read-more',
- 'tabbed-example',
- 'http',
- 'legend',
- 'docs-helpers',
- ].map((file) => ({
- from: `sde/mock/${file}.mjs`,
- to: `shared/components/mdx/${file}.mjs`,
- })),
- // Mock various other files
- {
- from: `sde/mock/info.mjs`,
- to: `shared/components/designs/info.mjs`,
- },
- {
- from: `sde/mock/designs.mjs`,
- to: `shared/config/designs.mjs`,
- },
- {
- from: `sde/mock/linedrawings.mjs`,
- to: `shared/components/designs/linedrawings/index.mjs`,
- },
- // .env file
- {
- from: 'sde/env.local',
- to: 'sde/.env.local',
- },
- ...downloads.sites,
- ],
- packages: downloads.pkgs.map((file) => ({
- from: file,
- to: `pkgs/${file}`,
- })),
- },
-}
diff --git a/packages/new-design/lib/download-list.mjs b/packages/new-design/lib/download-list.mjs
deleted file mode 100644
index e8c60c24feb..00000000000
--- a/packages/new-design/lib/download-list.mjs
+++ /dev/null
@@ -1,735 +0,0 @@
-export const downloads = {
- 'sites': [
- 'sde/README.md',
- 'sde/env.local',
- 'sde/i18n.config.mjs',
- 'sde/next-i18next.config.js',
- 'sde/next.config.mjs',
- 'sde/package.json',
- 'sde/postcss.config.js',
- 'sde/site.config.mjs',
- 'sde/tailwind.config.mjs',
- 'sde/hooks/use-design.mjs',
- 'sde/mock/designs.mjs',
- 'sde/mock/docs-helpers.mjs',
- 'sde/mock/highlight.mjs',
- 'sde/mock/http.mjs',
- 'sde/mock/info.mjs',
- 'sde/mock/legend.mjs',
- 'sde/mock/linedrawings.mjs',
- 'sde/mock/read-more.mjs',
- 'sde/mock/tabbed-example.mjs',
- 'sde/mock/youtube.mjs',
- 'sde/pkgs/.gitkeep',
- 'sde/prebuild/.gitkeep',
- 'sde/prebuild/sitenav.en.mjs',
- 'sde/prebuild/sitenav.es.mjs',
- 'sde/prebuild/sitenav.fr.mjs',
- 'sde/prebuild/sitenav.mjs',
- 'sde/prebuild/sitenav.nl.mjs',
- 'sde/prebuild/sitenav.uk.mjs',
- 'sde/prebuild/sluglut.mjs',
- 'sde/prebuild/sitenav.de.mjs',
- 'sde/components/design-examples.mjs',
- 'sde/components/dynamic-org-docs.mjs',
- 'sde/components/feeds.mjs',
- 'sde/components/search.mjs',
- 'sde/components/header/index.mjs',
- 'sde/components/header/design-picker.mjs',
- 'sde/components/layouts/bare.mjs',
- 'sde/components/layouts/default.mjs',
- 'sde/components/layouts/workbench.mjs',
- 'sde/components/wrappers/page.mjs',
- 'sde/components/navigation/modal-menu.mjs',
- 'sde/pages/_app.mjs',
- 'sde/pages/account.mjs',
- 'sde/pages/design.mjs',
- 'sde/pages/index.mjs',
- 'sde/pages/design/[design].mjs',
- 'sde/pages/sde/en.yaml',
- 'sde/pages/sde/es.yaml',
- 'sde/pages/sde/de.yaml',
- 'sde/pages/sde/fr.yaml',
- 'sde/pages/sde/index.mjs',
- 'sde/pages/sde/uk.yaml',
- 'sde/pages/sde/nl.yaml',
- 'sde/pages/signup/index.mjs',
- 'sde/pages/signin/index.mjs',
- 'sde/pages/signin/callback/[provider].mjs',
- 'sde/design/from-bella/en.json',
- 'sde/design/from-bella/src/back.mjs',
- 'sde/design/from-bella/src/front.mjs',
- 'sde/design/from-bella/src/index.mjs',
- 'sde/design/from-bella/i18n/de.json',
- 'sde/design/from-bella/i18n/en.json',
- 'sde/design/from-bella/i18n/es.json',
- 'sde/design/from-bella/i18n/index.mjs',
- 'sde/design/from-bella/i18n/fr.json',
- 'sde/design/from-bella/i18n/nl.json',
- 'sde/design/from-bella/i18n/uk.json',
- 'sde/design/from-bent/i18n/de.json',
- 'sde/design/from-bent/i18n/en.json',
- 'sde/design/from-bent/i18n/es.json',
- 'sde/design/from-bent/i18n/fr.json',
- 'sde/design/from-bent/i18n/nl.json',
- 'sde/design/from-bent/i18n/index.mjs',
- 'sde/design/from-bent/i18n/uk.json',
- 'sde/design/from-bent/src/front.mjs',
- 'sde/design/from-bent/src/back.mjs',
- 'sde/design/from-bent/src/index.mjs',
- 'sde/design/from-bent/src/under-sleeve.mjs',
- 'sde/design/from-bent/src/top-sleeve.mjs',
- 'sde/design/from-breanna/i18n/de.json',
- 'sde/design/from-breanna/i18n/en.json',
- 'sde/design/from-breanna/i18n/index.mjs',
- 'sde/design/from-breanna/i18n/nl.json',
- 'sde/design/from-breanna/i18n/fr.json',
- 'sde/design/from-breanna/i18n/es.json',
- 'sde/design/from-breanna/i18n/uk.json',
- 'sde/design/from-breanna/src/back.mjs',
- 'sde/design/from-breanna/src/front.mjs',
- 'sde/design/from-breanna/src/index.mjs',
- 'sde/design/from-breanna/src/sleeve.mjs',
- 'sde/design/from-titan/i18n/de.json',
- 'sde/design/from-titan/i18n/es.json',
- 'sde/design/from-titan/i18n/en.json',
- 'sde/design/from-titan/i18n/index.mjs',
- 'sde/design/from-titan/i18n/fr.json',
- 'sde/design/from-titan/i18n/uk.json',
- 'sde/design/from-titan/i18n/nl.json',
- 'sde/design/from-titan/src/back.mjs',
- 'sde/design/from-titan/src/front.mjs',
- 'sde/design/from-titan/src/index.mjs',
- 'sde/design/tutorial/i18n/es.json',
- 'sde/design/tutorial/i18n/en.json',
- 'sde/design/tutorial/i18n/de.json',
- 'sde/design/tutorial/i18n/fr.json',
- 'sde/design/tutorial/i18n/index.mjs',
- 'sde/design/tutorial/i18n/nl.json',
- 'sde/design/tutorial/i18n/uk.json',
- 'sde/design/tutorial/src/bib.mjs',
- 'sde/design/tutorial/src/index.mjs',
- 'sde/design/from-scratch/i18n/de.json',
- 'sde/design/from-scratch/i18n/en.json',
- 'sde/design/from-scratch/i18n/nl.json',
- 'sde/design/from-scratch/i18n/uk.json',
- 'sde/design/from-scratch/i18n/index.mjs',
- 'sde/design/from-scratch/i18n/es.json',
- 'sde/design/from-scratch/i18n/fr.json',
- 'sde/design/from-scratch/src/bib.mjs',
- 'sde/design/from-scratch/src/index.mjs',
- 'sde/design/from-brian/i18n/de.json',
- 'sde/design/from-brian/i18n/en.json',
- 'sde/design/from-brian/i18n/fr.json',
- 'sde/design/from-brian/i18n/nl.json',
- 'sde/design/from-brian/i18n/es.json',
- 'sde/design/from-brian/i18n/index.mjs',
- 'sde/design/from-brian/i18n/uk.json',
- 'sde/design/from-brian/src/back.mjs',
- 'sde/design/from-brian/src/front.mjs',
- 'sde/design/from-brian/src/index.mjs',
- 'sde/design/from-brian/src/sleeve.mjs',
- 'sde/public/brands/bugsnag.svg',
- 'sde/public/brands/algolia.svg',
- 'sde/public/brands/netlify.svg',
- 'sde/public/brands/vercel.svg',
- 'sde/public/brands/crowdin.svg',
- 'sde/public/img/lineup-backdrop.svg',
- 'sde/public/locales/es/account.json',
- 'sde/public/locales/es/auth.json',
- 'sde/public/locales/es/bella.json',
- 'sde/public/locales/es/bent.json',
- 'sde/public/locales/es/breanna.json',
- 'sde/public/locales/es/brian.json',
- 'sde/public/locales/es/common.json',
- 'sde/public/locales/es/core-settings.json',
- 'sde/public/locales/es/curate.json',
- 'sde/public/locales/es/cut.json',
- 'sde/public/locales/es/design-options.json',
- 'sde/public/locales/es/designs.json',
- 'sde/public/locales/es/docs.json',
- 'sde/public/locales/es/errors.json',
- 'sde/public/locales/es/flag.json',
- 'sde/public/locales/es/footer.json',
- 'sde/public/locales/es/frombella.json',
- 'sde/public/locales/es/frombent.json',
- 'sde/public/locales/es/frombreanna.json',
- 'sde/public/locales/es/fromscratch.json',
- 'sde/public/locales/es/fromtitan.json',
- 'sde/public/locales/es/frombrian.json',
- 'sde/public/locales/es/gdpr.json',
- 'sde/public/locales/es/hodl.json',
- 'sde/public/locales/es/header.json',
- 'sde/public/locales/es/homepage.json',
- 'sde/public/locales/es/lab.json',
- 'sde/public/locales/es/locales.json',
- 'sde/public/locales/es/logs.json',
- 'sde/public/locales/es/measurements.json',
- 'sde/public/locales/es/modal.json',
- 'sde/public/locales/es/newsletter.json',
- 'sde/public/locales/es/patrons.json',
- 'sde/public/locales/es/plugin-annotations.json',
- 'sde/public/locales/es/plugins.json',
- 'sde/public/locales/es/popout.json',
- 'sde/public/locales/es/print.json',
- 'sde/public/locales/es/sde.json',
- 'sde/public/locales/es/roles.json',
- 'sde/public/locales/es/sections.json',
- 'sde/public/locales/es/sets.json',
- 'sde/public/locales/es/sponsors.json',
- 'sde/public/locales/es/stats.json',
- 'sde/public/locales/es/status.json',
- 'sde/public/locales/es/submissions.json',
- 'sde/public/locales/es/support.json',
- 'sde/public/locales/es/susi.json',
- 'sde/public/locales/es/tags.json',
- 'sde/public/locales/es/techniques.json',
- 'sde/public/locales/es/themes.json',
- 'sde/public/locales/es/timeago.json',
- 'sde/public/locales/es/titan.json',
- 'sde/public/locales/es/tutorial.json',
- 'sde/public/locales/es/ui-settings.json',
- 'sde/public/locales/es/workbench.json',
- 'sde/public/locales/fr/account.json',
- 'sde/public/locales/fr/auth.json',
- 'sde/public/locales/fr/bella.json',
- 'sde/public/locales/fr/bent.json',
- 'sde/public/locales/fr/breanna.json',
- 'sde/public/locales/fr/brian.json',
- 'sde/public/locales/fr/common.json',
- 'sde/public/locales/fr/core-settings.json',
- 'sde/public/locales/fr/curate.json',
- 'sde/public/locales/fr/cut.json',
- 'sde/public/locales/fr/designs.json',
- 'sde/public/locales/fr/docs.json',
- 'sde/public/locales/fr/errors.json',
- 'sde/public/locales/fr/flag.json',
- 'sde/public/locales/fr/design-options.json',
- 'sde/public/locales/fr/footer.json',
- 'sde/public/locales/fr/frombella.json',
- 'sde/public/locales/fr/frombent.json',
- 'sde/public/locales/fr/frombreanna.json',
- 'sde/public/locales/fr/frombrian.json',
- 'sde/public/locales/fr/fromscratch.json',
- 'sde/public/locales/fr/fromtitan.json',
- 'sde/public/locales/fr/gdpr.json',
- 'sde/public/locales/fr/hodl.json',
- 'sde/public/locales/fr/header.json',
- 'sde/public/locales/fr/lab.json',
- 'sde/public/locales/fr/locales.json',
- 'sde/public/locales/fr/logs.json',
- 'sde/public/locales/fr/homepage.json',
- 'sde/public/locales/fr/measurements.json',
- 'sde/public/locales/fr/modal.json',
- 'sde/public/locales/fr/newsletter.json',
- 'sde/public/locales/fr/plugin-annotations.json',
- 'sde/public/locales/fr/plugins.json',
- 'sde/public/locales/fr/popout.json',
- 'sde/public/locales/fr/print.json',
- 'sde/public/locales/fr/sde.json',
- 'sde/public/locales/fr/sections.json',
- 'sde/public/locales/fr/patrons.json',
- 'sde/public/locales/fr/sets.json',
- 'sde/public/locales/fr/roles.json',
- 'sde/public/locales/fr/status.json',
- 'sde/public/locales/fr/sponsors.json',
- 'sde/public/locales/fr/submissions.json',
- 'sde/public/locales/fr/stats.json',
- 'sde/public/locales/fr/susi.json',
- 'sde/public/locales/fr/tags.json',
- 'sde/public/locales/fr/techniques.json',
- 'sde/public/locales/fr/themes.json',
- 'sde/public/locales/fr/support.json',
- 'sde/public/locales/fr/timeago.json',
- 'sde/public/locales/fr/titan.json',
- 'sde/public/locales/fr/tutorial.json',
- 'sde/public/locales/fr/ui-settings.json',
- 'sde/public/locales/fr/workbench.json',
- 'sde/public/locales/de/account.json',
- 'sde/public/locales/de/auth.json',
- 'sde/public/locales/de/bella.json',
- 'sde/public/locales/de/bent.json',
- 'sde/public/locales/de/breanna.json',
- 'sde/public/locales/de/brian.json',
- 'sde/public/locales/de/common.json',
- 'sde/public/locales/de/curate.json',
- 'sde/public/locales/de/core-settings.json',
- 'sde/public/locales/de/cut.json',
- 'sde/public/locales/de/design-options.json',
- 'sde/public/locales/de/designs.json',
- 'sde/public/locales/de/flag.json',
- 'sde/public/locales/de/docs.json',
- 'sde/public/locales/de/footer.json',
- 'sde/public/locales/de/errors.json',
- 'sde/public/locales/de/frombella.json',
- 'sde/public/locales/de/frombent.json',
- 'sde/public/locales/de/frombrian.json',
- 'sde/public/locales/de/fromtitan.json',
- 'sde/public/locales/de/gdpr.json',
- 'sde/public/locales/de/header.json',
- 'sde/public/locales/de/fromscratch.json',
- 'sde/public/locales/de/frombreanna.json',
- 'sde/public/locales/de/hodl.json',
- 'sde/public/locales/de/homepage.json',
- 'sde/public/locales/de/lab.json',
- 'sde/public/locales/de/locales.json',
- 'sde/public/locales/de/logs.json',
- 'sde/public/locales/de/measurements.json',
- 'sde/public/locales/de/modal.json',
- 'sde/public/locales/de/newsletter.json',
- 'sde/public/locales/de/patrons.json',
- 'sde/public/locales/de/plugin-annotations.json',
- 'sde/public/locales/de/plugins.json',
- 'sde/public/locales/de/popout.json',
- 'sde/public/locales/de/print.json',
- 'sde/public/locales/de/roles.json',
- 'sde/public/locales/de/sde.json',
- 'sde/public/locales/de/sections.json',
- 'sde/public/locales/de/sets.json',
- 'sde/public/locales/de/sponsors.json',
- 'sde/public/locales/de/stats.json',
- 'sde/public/locales/de/status.json',
- 'sde/public/locales/de/submissions.json',
- 'sde/public/locales/de/support.json',
- 'sde/public/locales/de/susi.json',
- 'sde/public/locales/de/tags.json',
- 'sde/public/locales/de/techniques.json',
- 'sde/public/locales/de/themes.json',
- 'sde/public/locales/de/timeago.json',
- 'sde/public/locales/de/titan.json',
- 'sde/public/locales/de/tutorial.json',
- 'sde/public/locales/de/ui-settings.json',
- 'sde/public/locales/de/workbench.json',
- 'sde/public/locales/en/account.json',
- 'sde/public/locales/en/auth.json',
- 'sde/public/locales/en/bella.json',
- 'sde/public/locales/en/bent.json',
- 'sde/public/locales/en/breanna.json',
- 'sde/public/locales/en/brian.json',
- 'sde/public/locales/en/common.json',
- 'sde/public/locales/en/core-settings.json',
- 'sde/public/locales/en/curate.json',
- 'sde/public/locales/en/cut.json',
- 'sde/public/locales/en/design-options.json',
- 'sde/public/locales/en/designs.json',
- 'sde/public/locales/en/docs.json',
- 'sde/public/locales/en/errors.json',
- 'sde/public/locales/en/flag.json',
- 'sde/public/locales/en/footer.json',
- 'sde/public/locales/en/frombella.json',
- 'sde/public/locales/en/frombent.json',
- 'sde/public/locales/en/frombreanna.json',
- 'sde/public/locales/en/frombrian.json',
- 'sde/public/locales/en/fromscratch.json',
- 'sde/public/locales/en/fromtitan.json',
- 'sde/public/locales/en/gdpr.json',
- 'sde/public/locales/en/header.json',
- 'sde/public/locales/en/hodl.json',
- 'sde/public/locales/en/homepage.json',
- 'sde/public/locales/en/lab.json',
- 'sde/public/locales/en/locales.json',
- 'sde/public/locales/en/logs.json',
- 'sde/public/locales/en/measurements.json',
- 'sde/public/locales/en/modal.json',
- 'sde/public/locales/en/newsletter.json',
- 'sde/public/locales/en/patrons.json',
- 'sde/public/locales/en/plugin-annotations.json',
- 'sde/public/locales/en/plugins.json',
- 'sde/public/locales/en/popout.json',
- 'sde/public/locales/en/print.json',
- 'sde/public/locales/en/roles.json',
- 'sde/public/locales/en/sde.json',
- 'sde/public/locales/en/sections.json',
- 'sde/public/locales/en/sets.json',
- 'sde/public/locales/en/sponsors.json',
- 'sde/public/locales/en/stats.json',
- 'sde/public/locales/en/status.json',
- 'sde/public/locales/en/submissions.json',
- 'sde/public/locales/en/support.json',
- 'sde/public/locales/en/susi.json',
- 'sde/public/locales/en/tags.json',
- 'sde/public/locales/en/techniques.json',
- 'sde/public/locales/en/themes.json',
- 'sde/public/locales/en/timeago.json',
- 'sde/public/locales/en/titan.json',
- 'sde/public/locales/en/tutorial.json',
- 'sde/public/locales/en/ui-settings.json',
- 'sde/public/locales/en/workbench.json',
- 'sde/public/locales/nl/account.json',
- 'sde/public/locales/nl/auth.json',
- 'sde/public/locales/nl/bella.json',
- 'sde/public/locales/nl/bent.json',
- 'sde/public/locales/nl/breanna.json',
- 'sde/public/locales/nl/brian.json',
- 'sde/public/locales/nl/common.json',
- 'sde/public/locales/nl/core-settings.json',
- 'sde/public/locales/nl/curate.json',
- 'sde/public/locales/nl/cut.json',
- 'sde/public/locales/nl/design-options.json',
- 'sde/public/locales/nl/designs.json',
- 'sde/public/locales/nl/docs.json',
- 'sde/public/locales/nl/errors.json',
- 'sde/public/locales/nl/flag.json',
- 'sde/public/locales/nl/footer.json',
- 'sde/public/locales/nl/frombella.json',
- 'sde/public/locales/nl/frombent.json',
- 'sde/public/locales/nl/frombreanna.json',
- 'sde/public/locales/nl/frombrian.json',
- 'sde/public/locales/nl/fromscratch.json',
- 'sde/public/locales/nl/fromtitan.json',
- 'sde/public/locales/nl/gdpr.json',
- 'sde/public/locales/nl/header.json',
- 'sde/public/locales/nl/hodl.json',
- 'sde/public/locales/nl/homepage.json',
- 'sde/public/locales/nl/lab.json',
- 'sde/public/locales/nl/locales.json',
- 'sde/public/locales/nl/logs.json',
- 'sde/public/locales/nl/measurements.json',
- 'sde/public/locales/nl/modal.json',
- 'sde/public/locales/nl/newsletter.json',
- 'sde/public/locales/nl/patrons.json',
- 'sde/public/locales/nl/plugin-annotations.json',
- 'sde/public/locales/nl/plugins.json',
- 'sde/public/locales/nl/popout.json',
- 'sde/public/locales/nl/print.json',
- 'sde/public/locales/nl/roles.json',
- 'sde/public/locales/nl/sde.json',
- 'sde/public/locales/nl/sections.json',
- 'sde/public/locales/nl/sets.json',
- 'sde/public/locales/nl/sponsors.json',
- 'sde/public/locales/nl/stats.json',
- 'sde/public/locales/nl/status.json',
- 'sde/public/locales/nl/submissions.json',
- 'sde/public/locales/nl/support.json',
- 'sde/public/locales/nl/susi.json',
- 'sde/public/locales/nl/tags.json',
- 'sde/public/locales/nl/techniques.json',
- 'sde/public/locales/nl/themes.json',
- 'sde/public/locales/nl/timeago.json',
- 'sde/public/locales/nl/titan.json',
- 'sde/public/locales/nl/tutorial.json',
- 'sde/public/locales/nl/ui-settings.json',
- 'sde/public/locales/nl/workbench.json',
- 'sde/public/locales/uk/account.json',
- 'sde/public/locales/uk/auth.json',
- 'sde/public/locales/uk/bella.json',
- 'sde/public/locales/uk/bent.json',
- 'sde/public/locales/uk/breanna.json',
- 'sde/public/locales/uk/brian.json',
- 'sde/public/locales/uk/common.json',
- 'sde/public/locales/uk/core-settings.json',
- 'sde/public/locales/uk/curate.json',
- 'sde/public/locales/uk/cut.json',
- 'sde/public/locales/uk/design-options.json',
- 'sde/public/locales/uk/designs.json',
- 'sde/public/locales/uk/docs.json',
- 'sde/public/locales/uk/errors.json',
- 'sde/public/locales/uk/flag.json',
- 'sde/public/locales/uk/footer.json',
- 'sde/public/locales/uk/frombella.json',
- 'sde/public/locales/uk/frombent.json',
- 'sde/public/locales/uk/frombreanna.json',
- 'sde/public/locales/uk/frombrian.json',
- 'sde/public/locales/uk/fromscratch.json',
- 'sde/public/locales/uk/fromtitan.json',
- 'sde/public/locales/uk/gdpr.json',
- 'sde/public/locales/uk/header.json',
- 'sde/public/locales/uk/hodl.json',
- 'sde/public/locales/uk/homepage.json',
- 'sde/public/locales/uk/lab.json',
- 'sde/public/locales/uk/locales.json',
- 'sde/public/locales/uk/logs.json',
- 'sde/public/locales/uk/measurements.json',
- 'sde/public/locales/uk/modal.json',
- 'sde/public/locales/uk/newsletter.json',
- 'sde/public/locales/uk/patrons.json',
- 'sde/public/locales/uk/plugin-annotations.json',
- 'sde/public/locales/uk/plugins.json',
- 'sde/public/locales/uk/popout.json',
- 'sde/public/locales/uk/print.json',
- 'sde/public/locales/uk/roles.json',
- 'sde/public/locales/uk/sde.json',
- 'sde/public/locales/uk/sections.json',
- 'sde/public/locales/uk/sets.json',
- 'sde/public/locales/uk/sponsors.json',
- 'sde/public/locales/uk/stats.json',
- 'sde/public/locales/uk/status.json',
- 'sde/public/locales/uk/submissions.json',
- 'sde/public/locales/uk/support.json',
- 'sde/public/locales/uk/susi.json',
- 'sde/public/locales/uk/tags.json',
- 'sde/public/locales/uk/techniques.json',
- 'sde/public/locales/uk/themes.json',
- 'sde/public/locales/uk/timeago.json',
- 'sde/public/locales/uk/titan.json',
- 'sde/public/locales/uk/tutorial.json',
- 'sde/public/locales/uk/ui-settings.json',
- 'sde/public/locales/uk/workbench.json',
- 'shared/utils.mjs',
- 'shared/components/icons.mjs',
- 'shared/components/mdx/design-options.mjs',
- 'shared/components/mdx/dynamic.mjs',
- 'shared/components/mdx/index.mjs',
- 'shared/components/mdx/design-measurements.mjs',
- 'shared/components/header.mjs',
- 'shared/components/wrappers/header.mjs',
- 'shared/components/wrappers/context.mjs',
- 'shared/components/wrappers/layout.mjs',
- 'shared/components/wrappers/auth/index.mjs',
- 'shared/components/wrappers/page.mjs',
- 'shared/components/wrappers/modal.mjs',
- 'shared/components/wrappers/swipes.mjs',
- 'shared/components/wrappers/mdx.mjs',
- 'shared/components/wrappers/chart.mjs',
- 'shared/components/footer/index.mjs',
- 'shared/components/v3-wip.mjs',
- 'shared/components/designs/difficulty.mjs',
- 'shared/components/designs/info.mjs',
- 'shared/components/buttons/continue-button.mjs',
- 'shared/components/copy-to-clipboard.mjs',
- 'shared/components/patrons/plea.mjs',
- 'shared/components/patrons/please-subscribe.mjs',
- 'shared/components/patrons/subscribe.mjs',
- 'shared/components/spinner.mjs',
- 'shared/components/choice-link.mjs',
- 'shared/components/navigation/sections-menu.mjs',
- 'shared/components/navigation/primary.mjs',
- 'shared/components/navigation/sitenav.mjs',
- 'shared/components/logos/freesewing.mjs',
- 'shared/components/bookmarks.mjs',
- 'shared/components/susi/sign-in.mjs',
- 'shared/components/susi/sign-up.mjs',
- 'shared/components/robot/index.mjs',
- 'shared/components/robot/poses.mjs',
- 'shared/components/code-box.mjs',
- 'shared/components/collapse.mjs',
- 'shared/components/sponsors/crowdin.mjs',
- 'shared/components/sponsors/vercel.mjs',
- 'shared/components/sponsors/algolia.mjs',
- 'shared/components/sponsors/index.mjs',
- 'shared/components/sponsors/bugsnag.mjs',
- 'shared/components/gdpr/form.mjs',
- 'shared/components/gdpr/details.mjs',
- 'shared/components/social/icons.mjs',
- 'shared/components/tabs.mjs',
- 'shared/components/support/support.mjs',
- 'shared/components/workbench/header.mjs',
- 'shared/components/workbench/new.mjs',
- 'shared/components/workbench/pan-zoom-pattern.mjs',
- 'shared/components/workbench/exporting/pdf-maker.mjs',
- 'shared/components/workbench/exporting/export-worker.js',
- 'shared/components/workbench/exporting/export-handler.mjs',
- 'shared/components/workbench/exporting/pdf.mjs',
- 'shared/components/workbench/exporting/single-pdf-maker.mjs',
- 'shared/components/workbench/menus/design-options/values.mjs',
- 'shared/components/workbench/menus/design-options/index.mjs',
- 'shared/components/workbench/menus/design-options/inputs.mjs',
- 'shared/components/workbench/menus/mobile-menubar.mjs',
- 'shared/components/workbench/menus/core-settings/values.mjs',
- 'shared/components/workbench/menus/core-settings/index.mjs',
- 'shared/components/workbench/menus/core-settings/inputs.mjs',
- 'shared/components/workbench/menus/core-settings/config.mjs',
- 'shared/components/workbench/menus/ui-settings/values.mjs',
- 'shared/components/workbench/menus/ui-settings/index.mjs',
- 'shared/components/workbench/menus/ui-settings/inputs.mjs',
- 'shared/components/workbench/menus/ui-settings/config.mjs',
- 'shared/components/workbench/menus/shared/menu-wrapper.mjs',
- 'shared/components/workbench/menus/shared/menu-item.mjs',
- 'shared/components/workbench/menus/shared/values.mjs',
- 'shared/components/workbench/menus/shared/index.mjs',
- 'shared/components/workbench/menus/shared/inputs.mjs',
- 'shared/components/workbench/pattern/utils.mjs',
- 'shared/components/workbench/pattern/pan-zoom-context.mjs',
- 'shared/components/workbench/pattern/movable/stack.mjs',
- 'shared/components/workbench/pattern/movable/transform-buttons.mjs',
- 'shared/components/workbench/pattern/movable/index.mjs',
- 'shared/components/workbench/views/draft/header.mjs',
- 'shared/components/workbench/views/draft/menu.mjs',
- 'shared/components/workbench/views/draft/index.mjs',
- 'shared/components/workbench/views/inspect/menu.mjs',
- 'shared/components/workbench/views/inspect/inspector/menu.mjs',
- 'shared/components/workbench/views/inspect/inspector/stack.mjs',
- 'shared/components/workbench/views/inspect/inspector/shared.mjs',
- 'shared/components/workbench/views/inspect/inspector/point.mjs',
- 'shared/components/workbench/views/inspect/inspector/pattern.mjs',
- 'shared/components/workbench/views/inspect/inspector/path.mjs',
- 'shared/components/workbench/views/inspect/index.mjs',
- 'shared/components/workbench/views/test/menu.mjs',
- 'shared/components/workbench/views/test/options.mjs',
- 'shared/components/workbench/views/test/index.mjs',
- 'shared/components/workbench/views/test/measurements.mjs',
- 'shared/components/workbench/views/flags.mjs',
- 'shared/components/workbench/views/docs/index.mjs',
- 'shared/components/workbench/views/print/menu.mjs',
- 'shared/components/workbench/views/print/index.mjs',
- 'shared/components/workbench/views/print/settings.mjs',
- 'shared/components/workbench/views/print/actions.mjs',
- 'shared/components/workbench/views/print/config.mjs',
- 'shared/components/workbench/views/time/index.mjs',
- 'shared/components/workbench/views/exporting/index.mjs',
- 'shared/components/workbench/views/edit/settings-validator.mjs',
- 'shared/components/workbench/views/edit/index.mjs',
- 'shared/components/workbench/views/logs/errors.mjs',
- 'shared/components/workbench/views/logs/index.mjs',
- 'shared/components/workbench/views/pattern-with-menu.mjs',
- 'shared/components/workbench/views/cut/menu.mjs',
- 'shared/components/workbench/views/cut/hooks.mjs',
- 'shared/components/workbench/views/cut/index.mjs',
- 'shared/components/workbench/views/cut/settings.mjs',
- 'shared/components/workbench/views/measies/index.mjs',
- 'shared/components/workbench/views/measies/editor.mjs',
- 'shared/components/workbench/views/save/index.mjs',
- 'shared/components/link.mjs',
- 'shared/components/curated-sets.mjs',
- 'shared/components/popout/index.mjs',
- 'shared/components/inputs.mjs',
- 'shared/components/account/sets.mjs',
- 'shared/components/account/shared.mjs',
- 'shared/components/account/control.mjs',
- 'shared/components/breadcrumbs.mjs',
- 'shared/components/modal/theme-picker.mjs',
- 'shared/components/modal/locale-picker.mjs',
- 'shared/components/accordion.mjs',
- 'shared/components/error/view.mjs',
- 'shared/components/measurements/image.mjs',
- 'shared/components/measurements/tim/acrossback.svg',
- 'shared/components/measurements/tim/waisttohips.svg',
- 'shared/components/measurements/tim/chest.svg',
- 'shared/components/measurements/tim/crotchdepth.svg',
- 'shared/components/measurements/tim/shouldertowrist.svg',
- 'shared/components/measurements/tim/waist.svg',
- 'shared/components/measurements/tim/waisttounderbust.svg',
- 'shared/components/measurements/tim/seat.svg',
- 'shared/components/measurements/tim/highbustfront.svg',
- 'shared/components/measurements/tim/bustspan.svg',
- 'shared/components/measurements/tim/crossseamfront.svg',
- 'shared/components/measurements/tim/shouldertoshoulder.svg',
- 'shared/components/measurements/tim/shoulderslope.svg',
- 'shared/components/measurements/tim/knee.svg',
- 'shared/components/measurements/tim/seatback.svg',
- 'shared/components/measurements/tim/hipstoupperleg.svg',
- 'shared/components/measurements/tim/biceps.svg',
- 'shared/components/measurements/tim/hpstobust.svg',
- 'shared/components/measurements/tim/bustfront.svg',
- 'shared/components/measurements/tim/heel.svg',
- 'shared/components/measurements/tim/waistback.svg',
- 'shared/components/measurements/tim/waisttoarmpit.svg',
- 'shared/components/measurements/tim/hpstowaistfront.svg',
- 'shared/components/measurements/tim/ankle.svg',
- 'shared/components/measurements/tim/neck.svg',
- 'shared/components/measurements/tim/hpstowaistback.svg',
- 'shared/components/measurements/tim/index.mjs',
- 'shared/components/measurements/tim/hips.svg',
- 'shared/components/measurements/tim/waisttoupperleg.svg',
- 'shared/components/measurements/tim/highbust.svg',
- 'shared/components/measurements/tim/bustpointtounderbust.svg',
- 'shared/components/measurements/tim/inseam.svg',
- 'shared/components/measurements/tim/crossseam.svg',
- 'shared/components/measurements/tim/head.svg',
- 'shared/components/measurements/tim/waisttoknee.svg',
- 'shared/components/measurements/tim/underbust.svg',
- 'shared/components/measurements/tim/waisttofloor.svg',
- 'shared/components/measurements/tim/waisttoseat.svg',
- 'shared/components/measurements/tim/wrist.svg',
- 'shared/components/measurements/tim/shouldertoelbow.svg',
- 'shared/components/measurements/tim/upperleg.svg',
- 'shared/components/measurements/sarah/acrossback.svg',
- 'shared/components/measurements/sarah/waisttohips.svg',
- 'shared/components/measurements/sarah/chest.svg',
- 'shared/components/measurements/sarah/crotchdepth.svg',
- 'shared/components/measurements/sarah/shouldertowrist.svg',
- 'shared/components/measurements/sarah/waist.svg',
- 'shared/components/measurements/sarah/waisttounderbust.svg',
- 'shared/components/measurements/sarah/seat.svg',
- 'shared/components/measurements/sarah/highbustfront.svg',
- 'shared/components/measurements/sarah/bustspan.svg',
- 'shared/components/measurements/sarah/crossseamfront.svg',
- 'shared/components/measurements/sarah/shouldertoshoulder.svg',
- 'shared/components/measurements/sarah/shoulderslope.svg',
- 'shared/components/measurements/sarah/knee.svg',
- 'shared/components/measurements/sarah/seatback.svg',
- 'shared/components/measurements/sarah/hipstoupperleg.svg',
- 'shared/components/measurements/sarah/biceps.svg',
- 'shared/components/measurements/sarah/hpstobust.svg',
- 'shared/components/measurements/sarah/bustfront.svg',
- 'shared/components/measurements/sarah/heel.svg',
- 'shared/components/measurements/sarah/waistback.svg',
- 'shared/components/measurements/sarah/waisttoarmpit.svg',
- 'shared/components/measurements/sarah/hpstowaistfront.svg',
- 'shared/components/measurements/sarah/ankle.svg',
- 'shared/components/measurements/sarah/neck.svg',
- 'shared/components/measurements/sarah/hpstowaistback.svg',
- 'shared/components/measurements/sarah/index.mjs',
- 'shared/components/measurements/sarah/hips.svg',
- 'shared/components/measurements/sarah/waisttoupperleg.svg',
- 'shared/components/measurements/sarah/highbust.svg',
- 'shared/components/measurements/sarah/bustpointtounderbust.svg',
- 'shared/components/measurements/sarah/inseam.svg',
- 'shared/components/measurements/sarah/crossseam.svg',
- 'shared/components/measurements/sarah/head.svg',
- 'shared/components/measurements/sarah/waisttoknee.svg',
- 'shared/components/measurements/sarah/underbust.svg',
- 'shared/components/measurements/sarah/waisttofloor.svg',
- 'shared/components/measurements/sarah/waisttoseat.svg',
- 'shared/components/measurements/sarah/wrist.svg',
- 'shared/components/measurements/sarah/shouldertoelbow.svg',
- 'shared/components/measurements/sarah/upperleg.svg',
- 'shared/components/control/score.mjs',
- 'shared/components/control/tip.mjs',
- 'shared/components/wordmark.mjs',
- 'shared/components/joost.mjs',
- 'shared/config/social.mjs',
- 'shared/config/paypal.mjs',
- 'shared/config/i18n.config.mjs',
- 'shared/config/tailwind-force.html',
- 'shared/config/freesewing.config.mjs',
- 'shared/config/cloudflare.mjs',
- 'shared/context/loading-status-context.mjs',
- 'shared/context/navigation-context.mjs',
- 'shared/context/modal-context.mjs',
- 'shared/context/mobile-menubar-context.mjs',
- 'shared/hooks/use-view.mjs',
- 'shared/hooks/use-theme.mjs',
- 'shared/hooks/use-id.mjs',
- 'shared/hooks/use-backend.mjs',
- 'shared/hooks/use-pattern-settings.mjs',
- 'shared/hooks/use-account.mjs',
- 'shared/mdx/browser-compile.mjs',
- 'shared/mdx/remark-github-images.mjs',
- 'shared/plugins/plugin-cut-layout.mjs',
- 'shared/plugins/plugin-layout-part.mjs',
- 'shared/styles/svg-freesewing-draft.css',
- 'shared/styles/code.css',
- 'shared/styles/globals.css',
- 'shared/themes/monochrome.mjs',
- 'shared/themes/light.mjs',
- 'shared/themes/hax0r.mjs',
- 'shared/themes/aqua.mjs',
- 'shared/themes/pastel.mjs',
- 'shared/themes/index.mjs',
- 'shared/themes/dark.mjs',
- 'shared/themes/lgbtq.mjs',
- 'shared/prebuild/data/design-options.mjs',
- 'shared/prebuild/data/designs.mjs',
- 'shared/prebuild/data/design-measurements.mjs'
- ],
- 'pkgs': [
- 'react-components/src/pattern-xray/index.mjs',
- 'react-components/src/pattern-xray/point.mjs',
- 'react-components/src/pattern-xray/path.mjs',
- 'react-components/src/pattern/stack.mjs',
- 'react-components/src/pattern/defs.mjs',
- 'react-components/src/pattern/utils.mjs',
- 'react-components/src/pattern/text.mjs',
- 'react-components/src/pattern/snippet.mjs',
- 'react-components/src/pattern/svg.mjs',
- 'react-components/src/pattern/part.mjs',
- 'react-components/src/pattern/index.mjs',
- 'react-components/src/pattern/group.mjs',
- 'react-components/src/pattern/point.mjs',
- 'react-components/src/pattern/grid.mjs',
- 'react-components/src/pattern/path.mjs',
- 'react-components/src/pattern/circle.mjs',
- 'react-components/src/editor/swizzle/components/popout.mjs'
- ]
-}
\ No newline at end of file
diff --git a/packages/new-design/lib/utils.mjs b/packages/new-design/lib/utils.mjs
deleted file mode 100644
index da97f8b3af3..00000000000
--- a/packages/new-design/lib/utils.mjs
+++ /dev/null
@@ -1,316 +0,0 @@
-import { config } from './config.mjs'
-import { mkdir, writeFile, copyFile, open, opendir } from 'node:fs/promises'
-import { join, dirname } from 'path'
-import mustache from 'mustache'
-import chalk from 'chalk'
-import prompts from 'prompts'
-import { oraPromise } from 'ora'
-import { execa } from 'execa'
-import axios from 'axios'
-import { fileURLToPath } from 'url'
-
-// Current working directory
-let filename
-try {
- filename = __filename
-} catch {
- filename = fileURLToPath(new URL(import.meta.url))
-}
-const newDesignDir = join(filename, '../..')
-
-const nl = '\n'
-const tab = ' '
-const nlt = nl + tab
-
-// Checks for node 18 or higher
-export const checkNodeVersion = () => {
- const node_version = process.version.slice(1).split('.')[0]
- if (parseInt(node_version) < config.node) {
- console.log(
- chalk.yellow(nlt + `⚠️ FreeSewing requires Node v${config.node} or newer`) +
- nl +
- nlt +
- 'We highly recommend using NVM to manage your Node versions:' +
- nlt +
- chalk.blue('https://github.com/nvm-sh/nvm') +
- nl +
- nlt +
- 'When in doubt, pick an active LTS version:' +
- nlt +
- chalk.blue('https://nodejs.org/en/about/releases/') +
- nl +
- nl
- )
- process.exit(1)
- }
-}
-
-// Gets user input to figure out what to do
-export const getChoices = async () => {
- let finalName = false // we're going to use this to track whether we stay in the naming loop
- let overwrite = true // should we overwrite existing files?
- let name // name will go here
- let sideStep // allows to do something custom
- const cwd = process.cwd()
-
- // while we're not finalized on a name
- while (finalName === false) {
- // request a name
- name = (
- await prompts({
- type: 'text',
- name: 'name',
- message: 'Give a folder name in which we can setup the development environment? 🏷️ ',
- })
- ).name
-
- // check whether a folder with that name already exists
- const dest = join(cwd, name)
- try {
- const dir = await opendir(dest)
- dir.close()
- } catch {
- // the folder didn't exist, so we're good to go
- finalName = true
- break
- }
-
- // the folder did exist, so now we need to ask what to do
- const { nextStep } = await prompts({
- type: 'select',
- name: 'nextStep',
- message: 'It looks like that folder already exists. What should we do?',
- choices: [
- { title: 'Go back', value: 'rename', description: 'Choose a different folder name' },
- {
- title: 'Overwrite',
- value: 'overwrite',
- description: 'Overwrite the contents in the existing folder',
- },
- {
- title: 'Re-initialize',
- value: 'reinit',
- description:
- 'Re-install dependencies, and update the development environment in this folder',
- },
- {
- title: 'Re-download',
- value: 'redownload',
- description: 'Update the development environment in this folder',
- },
- ],
- })
- sideStep = nextStep
-
- // if they said rename, we loop again. otherwise
- if (nextStep !== 'rename') {
- finalName = true
- // set the overwrite choice
- overwrite = nextStep === 'overwrite'
- }
- }
-
- const { manager } = await prompts({
- type: 'select',
- name: 'manager',
- message: 'What package manager should we use? 📦',
- choices: [
- { title: 'yarn', value: 'yarn', description: 'Yarn - Nice if you have it' },
- { title: 'npm', value: 'npm', description: 'NPM - Comes with NodeJS' },
- ],
- initial: 0,
- })
-
- return { name, manager, overwrite, sideStep }
-}
-
-// Keep track of directories that need to be created
-const dirPromises = {}
-const ensureDir = async (file, suppress = false) => {
- const dir = suppress ? dirname(file.replace(suppress)) : dirname(file)
- if (!dirPromises[dir]) {
- dirPromises[dir] = mkdir(dir, { recursive: true })
- }
- await dirPromises[dir]
-}
-
-// Helper method to copy template files
-const copyFileOrTemplate = async (
- fromRootOrTemplate,
- toRoot,
- relativeDest,
- templateVars,
- overwrite = true
-) => {
- const to = join(toRoot, relativeDest)
-
- // if the file shouldn't be overwritten, open it to see if it exists
- if (!overwrite) {
- try {
- // if the file doesn't exist, this will throw an error
- const fd = await open(to)
- fd.close()
- // we only reach this return if the file exists, which means we're safe to leave
- return
- } catch {
- // don't do anything with the error because it just means the file wasn't there and we can continue
- }
- }
-
- await ensureDir(to)
-
- if (templateVars) {
- const rendered = mustache.render(fromRootOrTemplate, templateVars)
- await writeFile(to, rendered)
- } else {
- const from = join(fromRootOrTemplate, relativeDest)
- await copyFile(from, to)
- }
-}
-
-// Helper method to run [yarn|npm] install
-const installDependencies = async (config, choices) =>
- await execa(`${choices.manager} install`, {
- cwd: config.dest,
- shell: true,
- })
-
-// Helper method to download web environment
-const downloadFiles = async (config) => {
- const promises = []
- for (const dir in config.fetch) {
- promises.push(
- ...config.fetch[dir].map(async (file) => {
- const to =
- typeof file === 'string'
- ? join(config.dest, file.slice(0, 4) === 'sde/' ? file.slice(4) : file)
- : join(config.dest, file.to)
- await ensureDir(to)
- const url = `${config.fileUri}/${config.repo}/${config.branch}/${dir}/${
- typeof file === 'string' ? file : file.from
- }`
- try {
- const res = await axios.get(url)
- await writeFile(
- to,
- typeof res.data === 'object' ? JSON.stringify(res.data, null, 2) : res.data
- )
- } catch (err) {
- if (err.response?.status === 404) console.log(`404: ${url}`)
- else console.log(err)
- }
- })
- )
- }
-
- return Promise.all(promises)
-}
-
-// Helper method to initialize a git repository
-const initGitRepo = async (config, choices) => {
- await copyFileOrTemplate(config.gitignore, config.dest, '.gitignore', {}, choices.overwrite)
-
- return execa(
- `git init -b main && git add . && git commit -m ":tada: Initialized FreeSewing stand-alone development environment"`,
- {
- cwd: config.dest,
- shell: true,
- }
- )
-}
-
-// Tips
-const showTips = (config, choices) =>
- console.log(`
- All done 🤓 Your FreeSewing development environment was initialized in: ${chalk.green.bold(
- config.dest
- )}
-
- The templates for various designs are in the ${chalk.yellow.bold('design')} folder.
- The other files and folders are the development environment. You can safely ignore those.
-
- To start your development environment, follow these three steps:
-
- 1) Start by entering the directory: ${chalk.blue.bold('cd ' + config.dest)}
- 2) Then run this command: ${chalk.blue.bold(
- choices.manager === 'yarn' ? 'yarn dev' : 'npm run dev'
- )}
- 3) Now open your browser and navigate to ${chalk.green('http://localhost:8000/')}
-
- Thanks for giving FreeSewing a shot. I hope you'll 💜 it.
-
- Have fun 🤓
-
- joost
-`)
-
-// Creates the environment based on the user's choices
-export const createEnvironment = async (choices) => {
- config.dest = join(process.cwd(), choices.name)
- // Store directories for re-use
- config.source = {
- templateData: join(newDesignDir, `templates/from-${choices.template}.mjs`),
- templates: join(newDesignDir, `templates/shared`),
- shared: join(newDesignDir, `shared`),
- }
-
- // Output a linebreak
- console.log()
-
- // Download files from GitHub
- try {
- const count = [...config.fetch.config, ...config.fetch.sites].length
- await oraPromise(downloadFiles(config), {
- text:
- chalk.white.bold(`🟧⬜⬜ Downloading ${count} (small) files from GitHub`) +
- chalk.white.dim(' | Give it a moment'),
- successText: chalk.white.bold(`🟩⬜⬜ Downloaded ${count}/${count} files from GitHub`),
- failText: chalk.white.bold(
- '🟥⬜⬜ Failed to download components from GitHub | The development environment will not function'
- ),
- })
- } catch (err) {
- console.log(err)
- /* no feedback here */
- }
-
- if (!choices.sideStep) {
- // Create target directory
- await mkdir(config.dest, { recursive: true })
-
- // Install dependencies
- try {
- await oraPromise(installDependencies(config, choices), {
- text:
- chalk.white.bold('🟩🟧⬜ Installing dependencies') +
- chalk.white.dim(' | Please wait, this will take a while'),
- successText: chalk.white.bold('🟩🟩⬜ Installed dependencies'),
- failText: chalk.white.bold(
- '🟩🟥⬜ Failed to install dependencies | The development environment will not function'
- ),
- })
- } catch (err) {
- /* no feedback here */
- }
- }
-
- if (!choices.sideStep) {
- // Initialize git repository
- try {
- await oraPromise(initGitRepo(config, choices), {
- text:
- chalk.white.bold('🟩🟩🟧 Initializing git repository') +
- chalk.white.dim(' | You have git, right?'),
- successText: chalk.white.bold('🟩🟩🟩 Initialized git repository'),
- failText:
- chalk.white.bold('🟩🟩🟥 Failed to initialize git repository') +
- chalk.white.dim(' | This does not stop the development environment from functioning'),
- })
- } catch (err) {
- console.log(err)
- }
- }
-
- // All done. Show tips
- showTips(config, choices)
-}
diff --git a/packages/new-design/package.json b/packages/new-design/package.json
deleted file mode 100644
index 12935a5a66d..00000000000
--- a/packages/new-design/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "@freesewing/new-design",
- "version": "3.3.0-rc.1",
- "description": "Initializer package for a new FreeSewing design: npx @freesewing/new-design",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/freesewing/freesewing/issues"
- },
- "funding": {
- "type": "individual",
- "url": "https://freesewing.org/patrons/join"
- },
- "keywords": [
- "freesewing",
- "freesewing"
- ],
- "type": "module",
- "scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
- "lab": "cd ../../sites/lab && yarn start",
- "tips": "node ../../scripts/help.mjs",
- "lint": "npx eslint 'lib/*.mjs'",
- "i18n-only": "SITE=\"new-design/shared\" node --conditions=internal ../../sites/shared/prebuild/i18n-only.mjs",
- "prebuild": "node --conditions=internal ./prebuild.mjs",
- "wbuild": "node build.mjs",
- "prewbuild": "node --conditions=internal ./prebuild.mjs",
- "wbuild:all": "yarn wbuild",
- "prebuild:all": "yarn prebuild",
- "prewbuild:all": "yarn prewbuild"
- },
- "peerDependencies": {},
- "dependencies": {
- "axios": "1.7.2",
- "chalk": "5.3.0",
- "execa": "9.2.0",
- "mustache": "4.2.0",
- "ora": "8.0.1",
- "prompts": "2.4.2",
- "recursive-readdir": "2.2.3"
- },
- "devDependencies": {},
- "files": [
- "README.md",
- "package.json",
- "lib/**/*",
- "shared/**/*",
- "templates/**/*",
- "index.mjs",
- "package.json",
- "data.mjs"
- ],
- "publishConfig": {
- "access": "public",
- "tag": "next"
- },
- "engines": {
- "node": ">= 18.17.0 <22"
- },
- "bin": {
- "new-design": "./index.mjs"
- }
-}
diff --git a/packages/prettier-config/README.md b/packages/prettier-config/README.md
index 61f358a37e0..c1632d6bf7f 100644
--- a/packages/prettier-config/README.md
+++ b/packages/prettier-config/README.md
@@ -9,24 +9,14 @@
>
-
-
-
# @freesewing/prettier-config
@@ -59,7 +44,7 @@ FreeSewing's shared configuration for prettier
> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
>
> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
## What am I looking at? 🤔
@@ -76,7 +61,7 @@ npm run tips
> [!NOTE]
> If you don't want to set up a dev environment, you can run it in your browser:
>
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/# (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
@@ -17,12 +17,15 @@
"prettier"
],
"type": "module",
- "module": "dist/index.mjs",
+ "module": "src/index.mjs",
"exports": {
".": "./index.json"
},
"scripts": {
- "build": "echo \"prettier-config: No build required\" && exit 0"
+ "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
+ "test": "echo \"prettier-config: No tests configured. Perhaps you could write some?\" && exit 0",
+ "tips": "node ../../scripts/help.mjs",
+ "lint": "npx eslint 'src/**' 'tests/*.mjs'"
},
"peerDependencies": {},
"dependencies": {},
@@ -33,9 +36,9 @@
],
"publishConfig": {
"access": "public",
- "tag": "next"
+ "tag": "latest"
},
"engines": {
- "node": ">= 18.17.0 <22"
+ "node": ">= 20"
}
}
diff --git a/packages/react-components/CHANGELOG.md b/packages/react-components/CHANGELOG.md
deleted file mode 100644
index 169941b4ea5..00000000000
--- a/packages/react-components/CHANGELOG.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Change log for: @freesewing/react-components
-
-
-## 3.2.0 (2024-02-11)
-
-### Added
-
- - This Pattern component now supports translation of nested arrays of strings, giving you more flexibility to concatenate translated parts of strings
-
-## 3.0.0 (2023-09-30)
-
-### Changed
-
- - All FreeSewing packages are now ESM only.
- - All FreeSewing packages now use named exports.
- - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
-
-
-This is the **initial release**, and the start of this change log.
-
-> Prior to version 2, FreeSewing was not a JavaScript project.
-> As such, that history is out of scope for this change log.
-
diff --git a/packages/react-components/README.md b/packages/react-components/README.md
deleted file mode 100644
index 7dea16c88a5..00000000000
--- a/packages/react-components/README.md
+++ /dev/null
@@ -1,162 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-# @freesewing/react-components
-
-React components by/for FreeSewing
-
-
-
-# FreeSewing
-
-> [!TIP]
->#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
->
-> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
->
-> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
-
-## What am I looking at? 🤔
-
-This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
-
-This folder holds: @freesewing/react-components
-
-If you're not entirely sure what to do or how to start, type this command:
-
-```
-npm run tips
-```
-
-> [!NOTE]
-> If you don't want to set up a dev environment, you can run it in your browser:
->
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
->
-> We recommend that you fork our repository and then
-> put `gitpod.io/# to start up a browser-based dev environment of your own.
-
-## About FreeSewing 💀
-
-Where the world of makers and developers collide, that's where you'll find FreeSewing.
-
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
-sewing patterns adapted to your measurements.
-
-If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
-The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
-for parametric design of sewing patterns. But FreeSewing also provides a range
-of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
-functionality of the platform.
-
-If you have NodeJS installed, you can try it right now by running:
-
-```bash
-npx @freesewing/new-design
-```
-
-Getting started guides are available for:
-- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
-- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
-- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
-
-The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
-show you how to create your first parametric design.
-
-## Getting started ⚡
-
-To get started with FreeSewing, you can spin up our development environment with:
-
-```bash
-npx @freesewing/new-design
-```
-
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
-
-```bash
-git clone git@github.com:freesewing/freesewing.git
-cd freesewing
-yarn kickstart
-```
-
-## Links 👩💻
-
-**Official channels**
-
- - 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- - ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
- [Issues](https://github.com/freesewing/freesewing/issues) &
- [Discussions](https://github.com/freesewing/freesewing/discussions) on
- [GitHub](https://github.com/freesewing/freesewing)
-
-**Social media**
-
- - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
-
-**Places the FreeSewing community hangs out**
-
- - 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
-
-## License: MIT 🤓
-
-© [Joost De Cock](https://github.com/joostdecock).
-See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
-
-## Where to get help 🤯
-
-For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
-please use the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
-
diff --git a/packages/react-components/build.mjs b/packages/react-components/build.mjs
deleted file mode 100644
index 30420e8d453..00000000000
--- a/packages/react-components/build.mjs
+++ /dev/null
@@ -1,36 +0,0 @@
-/* This script will build the package with esbuild */
-import esbuild from 'esbuild'
-import pkg from './package.json' assert { type: 'json' }
-
-// Create banner based on package info
-const banner = `/**
- * ${pkg.name} | v${pkg.version}
- * ${pkg.description}
- * (c) ${new Date().getFullYear()} ${pkg.author}
- * @license ${pkg.license}
- */`
-
-// Shared esbuild options
-const options = {
- banner: { js: banner },
- bundle: true,
- entryPoints: ['src/index.mjs'],
- format: 'esm',
- outfile: 'dist/index.mjs',
- external: ['@freesewing', 'react'],
- metafile: process.env.VERBOSE ? true : false,
- minify: process.env.NO_MINIFY ? false : true,
- sourcemap: true,
- loader: { '.mjs': 'jsx' },
-}
-
-// Let esbuild generate the build
-const build = async () => {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/packages/react-components/data.mjs b/packages/react-components/data.mjs
deleted file mode 100644
index 8d481e2a790..00000000000
--- a/packages/react-components/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/react-components'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/react-components/package.json b/packages/react-components/package.json
deleted file mode 100644
index b7ffa9d9bc2..00000000000
--- a/packages/react-components/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "@freesewing/react-components",
- "version": "3.3.0-rc.1",
- "description": "React components by/for FreeSewing",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/freesewing/freesewing/issues"
- },
- "funding": {
- "type": "individual",
- "url": "https://freesewing.org/patrons/join"
- },
- "keywords": [
- "freesewing",
- "freesewing"
- ],
- "type": "module",
- "module": "dist/index.mjs",
- "exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- },
- "./linedrawings": "./src/linedrawings/index.mjs",
- "./pattern": "./src/pattern/index.mjs",
- "./xray": "./src/pattern-xray/index.mjs"
- },
- "scripts": {
- "build": "node build.mjs",
- "build:all": "yarn build",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
- "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
- "test": "echo \"react-components: No tests configured. Perhaps you could write some?\" && exit 0",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
- "tips": "node ../../scripts/help.mjs",
- "lint": "eslint 'src/**/*.mjs'",
- "wbuild": "node build.mjs",
- "wbuild:all": "yarn wbuild"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- },
- "dependencies": {
- "axios": "1.7.2",
- "html-react-parser": "^5.0.7",
- "nuqs": "^1.17.6",
- "react-markdown": "^9.0.1",
- "use-local-storage-state": "19.1.0",
- "use-session-storage-state": "^19.0.0"
- },
- "devDependencies": {},
- "files": [
- "dist/*",
- "README.md"
- ],
- "publishConfig": {
- "access": "public",
- "tag": "next"
- },
- "engines": {
- "node": ">= 18.17.0 <22"
- }
-}
diff --git a/packages/react-components/src/editor/components/view-wrapper.mjs b/packages/react-components/src/editor/components/view-wrapper.mjs
deleted file mode 100644
index ff6f1949d06..00000000000
--- a/packages/react-components/src/editor/components/view-wrapper.mjs
+++ /dev/null
@@ -1,137 +0,0 @@
-// Hooks
-import { useState } from 'react'
-
-/**
- * The editor view wrapper component
- *
- * Figures out what view to load initially,
- * and handles state for the pattern, inclding the view
- *
- * @param (object) props - All the props
- * @param {object} props.designs - An object holding all designs
- * @param {object} props.preload - Object holding state to preload
- * @param {object} props.locale - The locale (language) code
- * @param {object} props.design - A design name to force the editor to use this design
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const ViewWrapper = ({ designs = {}, preload = {}, design = false, Swizzled }) => {
- /*
- * Ephemeral state will not be stored in the state backend
- * It is used for things like loading state and so on
- */
- const [ephemeralState, setEphemeralState] = useState({})
- // Editor state
- const allState = Swizzled.hooks.useEditorState(
- Swizzled.methods.initialEditorState(preload),
- setEphemeralState
- )
- const state = allState[0]
- const update = allState[2]
-
- // Don't bother before state is initialized
- if (!state) return
-
- // Figure out what view to load
- const [View, extraProps] = viewfinder({ design, designs, preload, state, Swizzled })
-
- /*
- * Pass this down to allow disabling features that require measurements
- */
- const { missingMeasurements = [] } = extraProps
-
- /*
- * Almost all editor state has a default settings, and when that is selected
- * we just unset that value in the state. This way, state holds only what is
- * customized, and it makes it a lot easier to see how a pattern was edited.
- * The big exception is the 'ui.ux' setting. If it is unset, a bunch of
- * components will not function properly. We could guard against this by passing
- * the default to all of these components, but instead, we just check that state
- * is undefined, and if so pass down the default ux value here.
- * This way, should more of these exceptions get added over time, we can use
- * the same centralized solution.
- */
- const passDownState =
- state.ui.ux === undefined
- ? {
- ...state,
- ui: { ...state.ui, ux: Swizzled.config.defaultUx },
- _: { ...ephemeralState, missingMeasurements },
- }
- : { ...state, _: { ...ephemeralState, missingMeasurements } }
-
- return (
-
- {Swizzled.config.withAside ? (
-
- ) : null}
-
-
-
-
-
- )
-}
-
-/**
- * Helper method to figure out what view to load
- * based on the props passed in, and destructure
- * the props we need for it.
- *
- * @param (object) props - All the props
- * @param {object} props.design - The (name of the) current design
- * @param {object} props.designs - An object holding all designs
- * @param (object) props.state - React state passed down from the wrapper view
- */
-const viewfinder = ({ design, designs, state, Swizzled }) => {
- /*
- * Grab Design from props or state and make them extra props
- */
- if (!design && state?.design) design = state.design
- const Design = designs[design] || false
- const extraProps = { design, Design }
-
- /*
- * If no design is set, return the designs view
- */
- if (!designs[design]) return [getViewComponent('designs', Swizzled), extraProps]
-
- /*
- * If we have a design, do we have the measurements?
- */
- const [measurementsOk, missingMeasurements] = Swizzled.methods.hasRequiredMeasurements(
- designs[design],
- state.settings?.measurements
- )
- if (missingMeasurements) extraProps.missingMeasurements = missingMeasurements
-
- /*
- * Allow all views that do not require measurements before
- * we force the user to the measurements view
- */
- if (state.view && Swizzled.config.measurementsFreeViews.includes(state.view)) {
- const view = getViewComponent(state.view, Swizzled)
- if (view) return [view, extraProps]
- }
-
- if (!measurementsOk) return [getViewComponent('measurements', Swizzled), extraProps]
-
- /*
- * If a view is set, return that
- */
- const view = getViewComponent(state.view, Swizzled)
- if (view) return [view, extraProps]
-
- /*
- * If no obvious view was found, return the view picker
- */
- return [getViewComponent('picker', Swizzled), extraProps]
-}
-
-const getViewComponent = (view = false, Swizzled) =>
- view ? Swizzled.components[Swizzled.config.viewComponents[view]] : false
diff --git a/packages/react-components/src/editor/en.yaml b/packages/react-components/src/editor/en.yaml
deleted file mode 100644
index fb9d3eb5e8e..00000000000
--- a/packages/react-components/src/editor/en.yaml
+++ /dev/null
@@ -1,290 +0,0 @@
-# Popout component
-comment: Comment
-note: Note
-tip: Tip
-warning: Warning
-fixme: FIXME
-link: Link
-related: Related
-
-# Designs view
-chooseADesign: Choose a Design
-# Mesurements view
-measurements: Measurements
-measurementsAreOk: We have all required measurements to draft this pattern.
-editMeasurements: Edit Measurements
-editMeasurementsDesc: You can manually set or override measurements below.
-requiredMeasurements: Required Measurements
-optionalMeasurements: Optional Measurements
-missingMeasurements: Missing Measurements
-missingMeasurementsInfo: To generate this pattern, we need the following additional measurements
-missingMeasurementsNotify: To generate this pattern, we need some additional measurements
-
-# Measurements sets
-noOwnSets: You do not have any of your own measurements sets (yet)
-pleaseMtm: Because our patterns are bespoke, we strongly suggest you take accurate measurements.
-noOwnSetsMsg: You can store your measurements as a measurements set, after which you can generate as many patterns as you want for them.
-chooseFromOwnSets: Choose one of your own measurements sets
-chooseFromOwnSetsDesc: Pick any of your own measurements sets that have all required measurements to generate this pattern.
-newSet: Create a new measurements set
-someSetsLacking: Some of your measurements sets lack the measurements required to generate this pattern
-chooseFromBookmarkedSets: Choose one of the measurements sets you've bookmarked
-chooseFromBookmarkedSetsDesc: If you've bookmarked any measurements sets, you can select from those too.
-chooseFromCuratedSets: Choose one of FreeSewing's curated measurements sets
-chooseFromCuratedSetsDesc: If you're just looking to try out our platform, you can select from our list of curated measurements sets.
-
-# View wrapper
-requiredPropsMissing.t: Required props are missing
-requiredPropsMissing.d: The FreeSewing pattern editor needs to be initialized properly. It currently lacks some props to be able to bootstrap.
-
-# View picker
-chooseAnActivity: Choose an activity
-chooseAnotherActivity: Choose a different activity
-view.draft.t: Draft Pattern
-view.draft.d: Choose this if you are not certain what to pick
-view.measurements.t: Pattern Measurements
-view.measurements.d: Update or load measurements to generate a pattern for
-view.test.t: Test Design
-view.test.d: See how different options or changes in measurements influence the design
-view.timing.t: Time Design
-view.timing.d: Shows detailed timing of the pattern being drafted, allowing you to find bottlenecks in performance
-view.printLayout.t: Print Layout
-view.printLayout.d: Organize your pattern parts to minimize paper use
-view.save.t: Save pattern as...
-view.save.d: Save the changes to this pattern in your account, or save it as a new pattern
-view.export.t: Export Pattern
-view.export.d: Export this pattern into a variety of formats
-view.editSettings.t: Edit settings by hand
-view.editSettings.d: Throw caution to the wind, and hand-edit the pattern's settings
-view.logs.t: Pattern Logs
-view.logs.d: Show the logs generated by the pattern, useful to troubleshoot problems
-view.inspect.t: Pattern inspector
-view.inspect.d: Load the pattern in the inspector, giving you in-depth info about a pattern's components
-view.docs.t: Documentation
-view.docs.d: More information and links to documentation
-view.designs.t: Choose a different Design
-view.designs.d: "Current design: {- design }"
-view.picker.t: Choose a different view
-view.undos.t: Undo History
-view.undos.d: Time-travel through your recent pattern changes
-showAdvancedOptions: Show advanced options
-hideAdvancedOptions: Hide advanced options
-views.t: Views
-views.d: Choose between the main views of the pattern editor
-measurementsFreeViewsOnly.t: We are only showing activities that do not require measurements
-measurementsFreeViewsOnly.d: Once we have all measurements required to generate a pattern, you will have more choices here.
-
-
-# menus
-youAreUsingTheDefaultValue: You are using the default value
-youAreUsingACustomValue: You are using a custom value
-designOptions.t: Design Options
-designOptions.d: These options are specific to this design. You can use them to customize your pattern in a variety of ways.
-fit.t: Fit
-style.t: Style
-advanced.t: Advanced
-coreSettings.t: Core Settings
-coreSettings.d: These settings are not specific to the design, but instead allow you to customize various parameters of the FreeSewing core library, which generates the design for you.
-paperless.t: Paperless
-paperless.d: Trees are awesome, and taping together sewing patterns is not much fun. Try our paperless mode to avoid the need to print out your pattern altogether.
-samm.t: Seam Allowance Size
-samm.d: Controls the amount of seam allowance used in your pattern
-sabool.t: Include Seam Allowance
-sabool.d: Controls whether or not to include seam allowance in your pattern
-complete.t: Details
-complete.d: Controls how detailed the pattern is; Either a complete pattern with all details, or a basic outline of the pattern parts
-expand.t: Expand
-expand.d: Controls efforts to save paper. Disable this to expand all pattern parts at the cost of using more space.
-only.t: Included Parts
-only.d: Use this to control exactly which pattern parts will be included in your pattern
-units.t: Units
-units.d: This setting determines how unit are displayed on your pattern
-margin.t: Margin
-margin.d: Controls the margin around pattern parts
-scale.t: Scale
-scale.d: Controls the overall line width, font size, and other elements that do not scale with the pattern's measurements
-yes: Yes
-no: No
-completeYes.t: Generate a complete pattern
-completeYes.d: This will generate a complete pattern with all notations, lines, markings. Use this if you are not certain what to choose.
-completeNo.t: Generate a pattern outline
-completeNo.d: Only generate the outline of the pattern parts. Use this if you are looking to use a laser cutter or have other specific needs.
-expandYes.t: Expand all pattern parts
-expandYes.d: This will generate a pattern where all pattern parts are drawn to their full size, even if they are simple rectangles.
-expandNo.t: Keep patterns parts compact where possible
-expandNo.d: This will draw a more dense representation of the pattern which includes all info without using up too much space & paper.
-saNo.t: Do not include seam allowance
-saNo.d: This generates a pattern which does not include any seam allowance. The size of the seam allowance does not matter as no seam allowance will be included.
-saYes.t: Include seam allowance
-saYes.d: This generates a pattern that will include seam allowance. The size of the seam allowance is set individually.
-paperlessNo.t: Generate a regular pattern
-paperlessNo.d: This will generate a regular pattern, which you can then print out.
-paperlessYes.t: Generate a paperless pattern
-paperlessYes.d: This generates a pattern with dimensions and a grid, which allows you to transfer it on fabric or another medium without the need to print out the pattern.
-metric: Metric
-uiPreferences.t: UI Preferences
-uiPreferences.d: These preferences control the UI (User Interface) of the pattern editor
-renderer.t: Render Engine
-renderer.d: Controls how the pattern is rendered (drawn) on the screen
-renderWithReact.t: Render with FreeSewing's React components
-renderWithReact.d: Render as SVG through our React components. Allows interactivity and is optimized for screen. Use this if you are not sure what to pick.
-renderWithCore.t: Render with FreeSewing's Core library
-renderWithCore.d: Render directly to SVG from Core. Allows no interactivity and is optimized for print. Use this if you want to know what it will look like when exported.
-kiosk.t: Kiosk Mode
-kiosk.d: Controls how the pattern editor is embedded in the web page.
-aside.t: Aside Menu
-aside.d: Controls whether or not to show menus on the side of larger screens
-withAside.t: Also show menus on the side
-withAside.d: Shows menus both on the side of the screen, as well as the drop-downs in the header (this only applies to larger screens)
-noAside.t: Only show menus in the header
-noAside.d: Only shows the drop-down variant of the menus, making more room for your pattern
-rotate.t: Rotate pattern
-rotate.d: Allows you to rotate your pattern 90 degrees to better fit your screen
-rotateNo.t: Do not rotate pattern
-rotateNo.d: Show the pattern as it is
-rotateYes.t: Rotate pattern 90 degrees
-rotateYes.d: Rotate the pattern 90 degrees counter clockwise
-websiteMode.t: Use inline mode
-websiteMode.d: Embeds the pattern editor in the natural flow of the web page.
-kioskMode.t: Use kiosk mode
-kioskMode.d: Breaks out the pattern editor to fill the entire page.
-ux.t: User Experience
-ux.d: Which user experience do you prefer? From keep it simple, to give me all the powers.
-inspect.t: Inspect
-inspect.d: Enabling this will allow you to drill down into the pattern, and pull up information about its various parts, paths, and points.
-inspectNo.t: Disable the inspector
-inspectNo.d: This is the default, the pattern inspector is disabled and the pattern is displayed as usual.
-inspectYes.t: Enable the inspector
-inspectYes.d: With the pattern inspector enabled and the React rendering engine selected, we will add interactivity to the pattern to allow you to inspect the various elements that make up the pattern.
-draft: Draft
-test: Test
-print: Print layout
-cut: Cut Layout
-save: Save
-export: Export
-edit: Edit
-draft.t: Draft your pattern
-draft.d: Launches FreeSewing flagship pattern editor, where you can tweak your pattern to your heart's desire
-test.t: Test your pattern
-test.d: See how your pattern adapts to changes in options, or measurements
-print.t: Print Layout
-print.d: Allows you to arrange your pattern pieces so you can printing your pattern on as little pages as possible
-cut.t: Cutting layout
-cut.d: Allows you to arrange your pattern pieces so you can determine exactly how much fabric you need to make it.
-save.t: Save your pattern
-save.d: Save the current pattern to your FreeSewing account
-export.t: Export your pattern
-export.d: Allows you to export this pattern to a variety of formats
-logs.t: Pattern logs
-enterCustomValue: Enter a custom value
-
-# ux
-ux1.t: Keep it as simple as possible
-ux1.d: Hides all but the most essential features.
-ux2.t: Keep it simple, but not too simple
-ux2.d: Hides the majority of features.
-ux3.t: Balance simplicity with power
-ux3.d: Reveals the majority of features, but not all.
-ux4.t: Give me all powers, but keep me safe
-ux4.d: Reveals all features, keeps handrails and safety checks.
-ux5.t: Get out of my way
-ux5.d: Reveals all features, removes all handrails and safety checks.
-
-# Tooltips
-tt.changeEditorView: Change to a different view
-tt.toggleSa: Turns Seam Allowance on or off (see Core Settings)
-tt.togglePaperless: Turns Paperless on or off (see Core Settings)
-tt.toggleComplete: Turns Details on or off (see Core Settings)
-tt.toggleExpand: Turns Expand on or off (see Core Settings)
-tt.toggleUnits: Switches Units between metric and imperial (see Core Settings)
-tt.changeUx: Changes your UX setting (see UI Preferences)
-tt.toggleAside: Turn the Aside Menu on or off (see UI Preferences)
-tt.toggleKiosk: Turns Kiosk Mode on or off (see UI Preferences)
-tt.toggleRotate: Turns Rotate Pattern on or off (see UI Preferences)
-tt.toggleRenderer: Switches the Render Engine between React and SVG (see UI Preferences)
-tt.exportPattern: Export pattern
-tt.savePattern: Save pattern
-tt.savePatternAs: Save pattern as...
-tt.undo: Undo most recent change
-tt.undoAll: Undo all changes since the last save point
-tt.resetDesign: Reset all settings, but keep the design and measurements
-tt.resetAll: Reset the editor completely
-
-# flags
-apply: Apply
-decrease: Decrease
-disable: Disable
-dismiss: Dismiss
-expandIsOff.t: This design saves space (and trees) because expand is disabled
-expandIsOff.d: "Because the **expand** core setting is currently disabled, some parts are not fully drawn or not shown at all. Typically, these are simple rectangles that only take up space, or things that can be cut on the fold. \n\nTo expand all pattern parts to their full size, enable the expand setting."
-expandIsOn.t: This design can save space (and trees)
-expandIsOn.d: "Because the **expand** core setting is currently enabled, all parts are fully drawn. You can display this design in a more compact way by disabling the **expand** setting. \n\nDoing so will mean that some parts are not fully drawn or not shown at all. Typically, these are simple rectangles that only take up space, or things that can be cut on the fold."
-enable: Enable
-flags: Flags
-flagMenu.t: Flags
-flagMenuOne.d: A specific issue about your current pattern needs your attention.
-flagMenuMany.d: Some issues about your current pattern need your attention.
-hide: Hide
-increase: Increase
-show: Show
-saIncluded: (This includes seam allowance)
-saExcluded: (This does not include seam allowance)
-saUnused: (This part does not require any seam allowance)
-partHiddenByExpand: This part is not shown because the **expand** core setting is currently disabled. Enable it to show this pattern part.
-
-# Auth
-authRequired: Authentication required
-membersOnly: This functionality requires a FreeSewing account.
-signUp: Sign Up
-signIn: Sign In
-statusUnknown: Account status warning
-statusUnknownMsg: Your account status prohibits us from processing your data. Please contact support.
-consentLacking: Consent lacking
-consentLackingMsg: We do not have your consent for processing your data. Without consent, we have no legal basis to process your data.
-accountProhibited: Your account has been disabled
-accountProhibitedMsg: Your account has been administratively disabled.
-accountDisabled: Account disabled
-accountDisabledMsg: You cannot re-enable a disabled account. You need to contact support to address this.
-accountInactive: Your account is inactive
-accountInactiveMsg: You must activate your account via the signup link we sent you.
-signupAgain: If you cannot find the link, you can receive a new one by signing up again.
-cannotUse: A disabled account cannot be used.
-contactSupport: Contact support
-reviewConsent: Review your consent
-roleLacking: You lack the required role to access this content
-roleLackingMsg: This content requires the { requiredRole } role. Your role is { role } which does not grant you access to this content.
-
-# save pattern
-bookmarkPattern: Bookmark pattern
-savePattern: Save pattern
-saveAsNewPattern: Save as a New Pattern
-savePatternAs: Save pattern as...
-savePatternAsHellip: Save pattern as...
-patternBookmarkCreated: Pattern bookmark created
-see: See
-addNotes: Add notes
-addSettingsToNotes: Add settings to notes
-exporting: Exporting
-exportAsData: Export as data
-exportForEditing: Export for editing
-exportForPrinting: Export for printing
-exportPattern-txt: Export a PDF suitable for your printer, or download this pattern in a variety of formats
-exportPattern: Export pattern
-settings: Settings
-patternTitle: Pattern Title
-patternNotes: Pattern Notes
-toAccessPatternsGoTo: To access your patterns, go to
-genericLoadingMessage: Hang tight, we're working on it...
-patternSavedAs: Pattern saved as
-cancel: Cancel
-
-# undo history
-secondsAgo: seconds ago
-minutesAgo: minutes ago
-hoursAgo: hours ago
-undos.unknown.t: Unknown Change
-defaultRestored: Cleared (default restored)
-includeAllParts: Include all parts
-allFirstLetter: A
-undo: Undo
-xMeasurementsChanged: "{ count } Measurements changed"
diff --git a/packages/react-components/src/editor/index.mjs b/packages/react-components/src/editor/index.mjs
deleted file mode 100644
index 13f00b88dd6..00000000000
--- a/packages/react-components/src/editor/index.mjs
+++ /dev/null
@@ -1,89 +0,0 @@
-import { useState, useEffect } from 'react'
-import { swizzleConfig } from './swizzle/config.mjs'
-import { swizzleComponents } from './swizzle/components/index.mjs'
-import { swizzleHooks } from './swizzle/hooks/index.mjs'
-import { swizzleMethods } from './swizzle/methods/index.mjs'
-import { ViewWrapper } from './components/view-wrapper.mjs'
-// This is an exception as we need to show something before Swizzled components are ready
-import { TemporaryLoader as UnswizzledTemporaryLoader } from './swizzle/components/loaders.mjs'
-
-/*
- * Namespaces used by the pattern editor
- */
-export const ns = ['pe', 'measurements']
-
-/**
- * PatternEditor is the high-level FreeSewing component
- * that provides the entire pattern editing environment
- *
- * @param {object} props.design = The name of the design we are editing
- * @param {object} props.designs = An object holding the designs code
- * @param {object} props.components = An object holding components to swizzle
- * @param {object} props.hooks = An object holding hooks to swizzle
- * @param {object} props.methods = An object holding methods to swizzle
- * @param {object} props.config = An object holding the editor config to swizzle
- * @param {object} props.locale = The locale (language) code
- * @param {object} props.preload = Any state to preload
- *
- */
-export const PatternEditor = (props) => {
- const [swizzled, setSwizzled] = useState(false)
-
- useEffect(() => {
- if (!swizzled) {
- const merged = {
- config: swizzleConfig(props.config),
- }
- merged.methods = swizzleMethods(props.methods, merged)
- merged.components = swizzleComponents(props.components, merged)
- merged.hooks = swizzleHooks(props.hooks, merged)
- setSwizzled(merged)
- }
- }, [swizzled, props.components, props.config, props.hooks, props.methods])
-
- if (!swizzled?.hooks) return
- /*
- * First of all, make sure we have all the required props
- */
- const lackingProps = lackingPropsCheck(props)
- if (lackingProps !== false) return
-
- /*
- * Extract props we care about
- */
- const { designs = {}, locale = 'en', preload } = props
-
- /*
- * Now return the view wrapper and pass it the relevant props and the swizzled props
- */
- return
-}
-
-/**
- * Helper function to verify that all props that are required to
- * run the editor are present.
- *
- * Note that these errors are not translation, because they are
- * not intended for end-users, but rather for developers.
- *
- * @param {object} props - The props passed to the PatternEditor component
- * @return {bool} result - Either true or false depending on required props being present
- */
-const lackingPropsCheck = (props) => {
- if (typeof props.designs !== 'object')
- return "Please pass a 'designs' prop with the designs supported by this editor"
- if (Object.keys(props.designs).length < 1) return "The 'designs' prop does not hold any designs"
-
- return false
-}
-
-/**
- * A component to inform the user that the editor cannot be started
- * because there are missing required props
- */
-const LackingPropsError = ({ error }) => (
-
-
Unable to initialize pattern editor
-
{error}
-
-)
diff --git a/packages/react-components/src/editor/nl.yaml b/packages/react-components/src/editor/nl.yaml
deleted file mode 100644
index 58d34e436a4..00000000000
--- a/packages/react-components/src/editor/nl.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Popout component
-comment: Opmerking
-note: Notitie
-tip: Tip
-warning: Waarschuwing
-fixme: FIXME
-link: Link
-related: Gerelateerd
-
-# Mesurements view
-measurements: Maten
-measurementsAreOk: We hebben alle benodigde maten om dit patroon te tekenen.
-editMeasurements: Maten Aanpassen
-editMeasurementsDesc: Hier kan je manueel de maten aanpassen.
-requiredMeasurements: Vereiste Maten
-optionalMeasurements: Optionele Maten
-
-# Designs view
-pickADesign: Kies een ontwerp
-
-# View wrapper
-requiredPropsMissing.t: Vereiste props ontbreken
-requiredPropsMissing.d: De FreeSewing patroon editor moet correct geinitialiseerd worden. Momenteel ontbreken een aantal props die noodzakelijk zijn om de editor te starten.
diff --git a/packages/react-components/src/editor/props.md b/packages/react-components/src/editor/props.md
deleted file mode 100644
index 7933b55d590..00000000000
--- a/packages/react-components/src/editor/props.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# List of props that can be passed to the pattern editor
-
-| Prop | Default | Description |
-| ---- | ------- | ----------- |
-| `design` | `undefined` | Name of the current design (key in the `objects` prop). Note that this will set the initial state, but it can be changed by the user. |
-| `designs` | `{}` |Object holding all designs that are available. |
-| `locale` | `en` | Language code |
-| `imperial`| `false` | Whether to use imperial units as the default, or not |
-| `components` | `{}` | Object holding swizzled components |
-| `hooks` | `{}` | Object holding swizzled hooks |
-| `methods` | `{}` | Object holding swizzled methods |
-
-
-## Defaults object
-
-```mjs
-{
- locale: 'en',
- imperial: 'false',
- ui: {
- renderer: 'react',
- kiosk: false,
- }
-}
-```
-
diff --git a/packages/react-components/src/editor/swizzle/components/accordion.mjs b/packages/react-components/src/editor/swizzle/components/accordion.mjs
deleted file mode 100644
index d2d561f0cbe..00000000000
--- a/packages/react-components/src/editor/swizzle/components/accordion.mjs
+++ /dev/null
@@ -1,64 +0,0 @@
-import { useState } from 'react'
-
-/*
- * DaisyUI's accordion seems rather unreliable.
- * So instead, we handle this in React state
- */
-const getProps = (isActive) => ({
- className: `p-2 px-4 rounded-lg bg-transparent shadow
- w-full mt-2 py-4 h-auto content-start text-left bg-opacity-20
- ${isActive ? 'hover:bg-transparent' : 'hover:bg-secondary hover:bg-opacity-10'}`,
-})
-
-const getSubProps = (isActive) => ({
- className: ` p-2 px-4 rounded bg-transparent w-full mt-2 py-4 h-auto
- content-start bg-secondary text-left bg-opacity-20
- ${
- isActive
- ? 'bg-opacity-100 hover:bg-transparent shadow'
- : 'hover:bg-opacity-10 hover:bg-secondary '
- }`,
-})
-
-const components = {
- button: (props) => {props.children} ,
- div: (props) => {props.children}
,
-}
-
-export const BaseAccordion = ({
- items, // Items in the accordion
- act, // Allows one to preset the active (opened) entry
- propsGetter = getProps, // Method to get the relevant props
- component = 'button',
-}) => {
- const [active, setActive] = useState(act)
- const Component = components[component]
-
- return (
-
- {items
- .filter((item) => item[0])
- .map((item, i) =>
- active === item[2] ? (
-
-
- {item[0]}
-
- {item[1]}
-
- ) : (
- setActive(item[2])}
- >
- {item[0]}
-
- )
- )}
-
- )
-}
-
-export const SubAccordion = (props) =>
-export const Accordion = (props) =>
diff --git a/packages/react-components/src/editor/swizzle/components/aside-view-menu.mjs b/packages/react-components/src/editor/swizzle/components/aside-view-menu.mjs
deleted file mode 100644
index 13bca1d376a..00000000000
--- a/packages/react-components/src/editor/swizzle/components/aside-view-menu.mjs
+++ /dev/null
@@ -1,122 +0,0 @@
-import { useState } from 'react'
-
-export const AsideViewMenuButton = ({
- href,
- label,
- children,
- onClick = false,
- active = false,
- extraClasses = 'lg:hover:bg-secondary lg:hover:text-secondary-content',
- Swizzled,
-}) => {
- const className = `w-full flex flex-row items-center px-4 py-2 ${extraClasses} ${
- active
- ? 'font-bold lg:font-normal bg-secondary bg-opacity-10 lg:bg-secondary lg:text-secondary-content lg:bg-opacity-50'
- : 'lg:bg-neutral lg:text-neutral-content'
- }`
- const span = {label}
-
- return onClick ? (
-
- {span}
- {children}
-
- ) : (
-
- {span}
- {children}
-
- )
-}
-
-export const ViewTypeIcon = ({ Swizzled, view, className = 'h-6 w-6 grow-0' }) => {
- const Icon = Swizzled.components[`View${Swizzled.methods.capitalize(view)}Icon`]
- if (!Icon) return
-
- return
-}
-
-export const AsideViewMenuSpacer = () => (
-
-)
-
-export const AsideViewMenuIcons = ({ state, update, setDense, dense, Swizzled }) => {
- const { t } = Swizzled.methods
- const iconSize = 'h-6 w-6 grow-0'
-
- const output = [
- setDense(!dense)}
- label={
- dense ? (
- ''
- ) : (
-
- Editor Views
-
- )
- }
- extraClasses="hidden lg:flex text-accent bg-neutral hover:bg-accent hover:text-neutral-content"
- >
- {dense ? (
-
- ) : (
-
- )}
- ,
- ]
-
- let i = 1
- for (const view of [
- 'spacer',
- ...Swizzled.config.mainViews,
- 'spacer',
- ...Swizzled.config.extraViews,
- 'spacerOver3',
- ...Swizzled.config.devViews,
- 'spacer',
- 'picker',
- ]) {
- if (view === 'spacer') output.push( )
- else if (view === 'spacerOver3')
- output.push(state.ui.ux > 3 ? : null)
- else if (state.ui.ux >= Swizzled.config.uxLevels.views[view])
- output.push(
- update.view(view)}
- label={t(`pe:view.${view}.t`)}
- active={state.view === view}
- >
-
-
- )
- i++
- }
-
- return output
-}
-
-export const AsideViewMenu = ({ Swizzled, update, state }) => {
- const [dense, setDense] = useState(true)
- return (
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/auth-wrapper.mjs b/packages/react-components/src/editor/swizzle/components/auth-wrapper.mjs
deleted file mode 100644
index 26ff0ad6be6..00000000000
--- a/packages/react-components/src/editor/swizzle/components/auth-wrapper.mjs
+++ /dev/null
@@ -1,210 +0,0 @@
-import { useState, useEffect } from 'react'
-
-export const AuthMessageWrapper = ({ children }) => (
- {children}
-)
-
-export const ContactSupport = ({ t, Swizzled }) => (
-
-
- {t('contactSupport')}
-
-
-)
-
-export const AuthRequired = ({ t, banner, Swizzled }) => (
-
- {banner}
- {Swizzled.methods.t('pe:authRequired')}
- {t('pe:membersOnly')}
-
-
-
- {t('pe:signUp')}
-
-
-
- {t('signIn')}
-
-
-
-)
-
-export const AccountInactive = ({ t, banner, Swizzled }) => (
-
- {banner}
- {t('accountInactive')}
- {t('accountInactiveMsg')}
- {t('signupAgain')}
-
-
- {t('signUp')}
-
-
-
-)
-
-export const AccountDisabled = ({ t, banner, Swizzled }) => (
-
- {banner}
- {t('accountDisabled')}
- {t('accountDisabledMsg')}
-
-
-)
-
-export const AccountProhibited = ({ t, banner, Swizzled }) => (
-
- {banner}
- {t('accountProhibited')}
- {t('accountProhibitedMsg')}
-
-
-)
-
-export const AccountStatusUnknown = ({ t, banner, Swizzled }) => (
-
- {banner}
- {t('statusUnknown')}
- {t('statusUnknownMsg')}
-
-
-)
-
-export const RoleLacking = ({ t, requiredRole, role, banner, Swizzled }) => (
-
- {banner}
- {t('roleLacking')}
-
-
-
-)
-
-export const ConsentLacking = ({ banner, Swizzled }) => {
- //const { setAccount, setToken, setSeenUser } = Swizzled.hooks.useAccount()
- //const backend = Swizzled.hooks.useBackend()
-
- //const updateConsent = async ({ consent1, consent2 }) => {
- // let consent = 0
- // if (consent1) consent = 1
- // if (consent1 && consent2) consent = 2
- // if (consent > 0) {
- // const result = await backend.updateConsent(consent)
- // if (result.success) {
- // setToken(result.data.token)
- // setAccount(result.data.account)
- // setSeenUser(result.data.account.username)
- // refresh()
- // } else {
- // console.log('something went wrong', result)
- // refresh()
- // }
- // }
- //}
-
- return (
-
-
- {banner}
-
FIXME: Handle content form
- {/*
*/}
-
-
- )
-}
-
-export const AuthWrapper = ({ children, requiredRole = 'user', Swizzled }) => {
- const { t } = Swizzled.methods
- const { useAccount, useBackend } = Swizzled.hooks
- const { account, setAccount, token, admin, stopImpersonating, signOut } = useAccount()
- const backend = useBackend()
-
- const [ready, setReady] = useState(false)
- const [impersonating, setImpersonating] = useState(false)
- const [error, setError] = useState(false)
- const [refreshCount, setRefreshCount] = useState(0)
-
- /*
- * Avoid hydration errors
- */
- useEffect(() => {
- const verifyAdmin = async () => {
- const result = await backend.adminPing(admin.token)
- if (result.success && result.data.account.role === 'admin') {
- setImpersonating({
- admin: result.data.account.username,
- user: account.username,
- })
- }
- setReady(true)
- }
- const verifyUser = async () => {
- const result = await backend.ping()
- if (result.success) {
- // Refresh account in local storage
- setAccount({
- ...account,
- ...result.data.account,
- })
- } else {
- if (result.data?.error?.error) setError(result.data.error.error)
- else signOut()
- }
- setReady(true)
- }
- if (admin && admin.token) verifyAdmin()
- if (token) verifyUser()
- else setReady(true)
- }, [admin, token, refreshCount])
-
- const refresh = () => {
- setRefreshCount(refreshCount + 1)
- setError(false)
- }
-
- if (!ready) return
-
- const banner = impersonating ? (
-
-
- Hi {impersonating.admin} , you are currently impersonating {impersonating.user}
-
-
- Stop Impersonating
-
-
- ) : null
-
- const childProps = { t, banner, Swizzled }
-
- if (!token || !account.username) return
- if (error) {
- if (error === 'accountInactive') return
- if (error === 'accountDisabled') return
- if (error === 'accountBlocked') return
- if (error === 'consentLacking')
- return
- return
- }
-
- if (
- !Swizzled.config.roles.levels[account.role] ||
- Swizzled.config.roles.levels[account.role] < Swizzled.config.roles.levels[requiredRole]
- ) {
- return (
-
- )
- }
-
- return children
-}
diff --git a/packages/react-components/src/editor/swizzle/components/curated-sets.mjs b/packages/react-components/src/editor/swizzle/components/curated-sets.mjs
deleted file mode 100644
index bb25160bf82..00000000000
--- a/packages/react-components/src/editor/swizzle/components/curated-sets.mjs
+++ /dev/null
@@ -1,37 +0,0 @@
-export const CuratedMeasurementsSetLineup = ({ sets = [], locale, clickHandler, Swizzled }) => (
- 1 ? 'justify-start px-8' : 'justify-center'
- } overflow-x-scroll`}
- style={{
- backgroundImage: `url(/img/lineup-backdrop.svg)`,
- width: 'auto',
- backgroundSize: 'auto 100%',
- backgroundRepeat: 'repeat-x',
- }}
- >
- {sets.map((set) => {
- const props = {
- className: 'aspect-[1/3] w-auto h-96',
- style: {
- backgroundImage: `url(${Swizzled.methods.cloudImageUrl({
- id: `cset-${set.id}`,
- type: 'lineup',
- })})`,
- width: 'auto',
- backgroundSize: 'contain',
- backgroundRepeat: 'no-repeat',
- backgroundPosition: 'center',
- },
- onClick: () => clickHandler(set),
- }
-
- return (
-
-
- {set[`name${Swizzled.methods.capitalize(locale)}`]}
-
- )
- })}
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/designs-view.mjs b/packages/react-components/src/editor/swizzle/components/designs-view.mjs
deleted file mode 100644
index f6ed0a3a326..00000000000
--- a/packages/react-components/src/editor/swizzle/components/designs-view.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * The design view is loaded if and only if not design is passed to the editor
- *
- * @param {Object} props - All the props
- * @param {Object} designs - Object holding all designs
- * @param {object} props.Swizzled - An object holding swizzled code
- * @param {Object} update - ViewWrapper state update object
- */
-export const DesignsView = ({ designs = {}, Swizzled, update }) => (
-
-
{Swizzled.methods.t('pe:chooseADesign')}
-
- {Object.keys(designs).map((name) => (
-
- {
- update.design(name)
- update.view('draft')
- }}
- >
- {name}
-
-
- ))}
-
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/draft-view.mjs b/packages/react-components/src/editor/swizzle/components/draft-view.mjs
deleted file mode 100644
index 39975a0255e..00000000000
--- a/packages/react-components/src/editor/swizzle/components/draft-view.mjs
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * The draft view allows users to tweak their pattern
- *
- * @param (object) props - All the props
- * @param {function} props.Design - The design constructor
- * @param {array} props.missingMeasurements - List of missing measurements for the current design
- * @param {object} props.state - The ViewWrapper state object
- * @param {object} props.state.settings - The current settings
- * @param {object} props.update - Helper object for updating the ViewWrapper state
- * @param {object} props.Swizzled - An object holding swizzled code
- * @return {function} DraftView - React component
- */
-export const DraftView = ({ Design, state, update, Swizzled }) => {
- /*
- * Don't trust that we have all measurements
- *
- * We do not need to change the view here. That is done in the central
- * ViewWrapper componenet. However, checking the measurements against
- * the design takes a brief moment, so this component will typically
- * render before that happens, and if measurments are missing it will
- * throw and error.
- *
- * So when measurements are missing, we just return here and the view
- * will switch on the next render loop.
- */
- if (Swizzled.methods.missingMeasurements(state)) return null
-
- /*
- * First, attempt to draft
- */
- const { pattern } = Swizzled.methods.draft(Design, state.settings)
-
- let output = null
- let renderProps = false
- if (state.ui?.renderer === 'svg') {
- try {
- const __html = pattern.render()
- output = (
-
-
-
- )
- } catch (err) {
- console.log(err)
- }
- } else {
- renderProps = pattern.getRenderProps()
- output = (
-
- )
- }
-
- return (
-
- ) : null
- }
- />
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/dynamic-mdx.mjs b/packages/react-components/src/editor/swizzle/components/dynamic-mdx.mjs
deleted file mode 100644
index 27319260e6e..00000000000
--- a/packages/react-components/src/editor/swizzle/components/dynamic-mdx.mjs
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Loading MDX dynamically is non-trivial an depends on the
- * environment in which the component is loaded.
- * By default, we use this component, which disabled loading
- * inline docs. If you want this to work, you need to pass in
- * your own DynamicMdx component into the editor:
- *
- *
- */
-export const DynamicMdx = ({ Swizzled }) => (
- Not implemented
-)
diff --git a/packages/react-components/src/editor/swizzle/components/error-view.mjs b/packages/react-components/src/editor/swizzle/components/error-view.mjs
deleted file mode 100644
index d2997094f14..00000000000
--- a/packages/react-components/src/editor/swizzle/components/error-view.mjs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * The error view is loaded if and only an error occurs that we can't handle
- *
- * @param {object} props - The component's props
- * @param {object} props.Swizzled - Swizzled code
- * @param {function} props.Design - The design constructor
- * @param {object} props.state - The ViewWrapper state object
- * @param {object} props.state.settings - The current settings
- * @param {object} props.update - Helper object for updating the ViewWrapper state
- * @param {array} props.missingMeasurements - List of missing measurements for the current design
- * @param {object} props.components - The possibly swizzled components
- * @param {object} props.methods - The possibly swizzled methods
- * @param {function} props.methods.t - The translation method
- * @param {object} props.config - The possibly swizzled pattern editor configuration
- * @return {function} MeasurementsView - React component
- */
-export const ErrorView = ({ Swizzled, state }) => (
-
-
{Swizzled.methods.t('oops')}
-
FIXME: Something went wrong
-
{JSON.stringify(state, null, 2)}
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/flags.mjs b/packages/react-components/src/editor/swizzle/components/flags.mjs
deleted file mode 100644
index c549905f1fd..00000000000
--- a/packages/react-components/src/editor/swizzle/components/flags.mjs
+++ /dev/null
@@ -1,103 +0,0 @@
-import mustache from 'mustache'
-
-export const FlagTypeIcon = ({ Swizzled, type, className = 'w-6 h-6' }) => {
- const Icon = Swizzled.components[`Flag${Swizzled.methods.capitalize(type)}Icon`]
-
- return Icon ? : null
-}
-
-export const Flag = ({ Swizzled, data, handleUpdate }) => {
- const btnIcon = data.suggest?.icon ? (
-
- ) : null
- const { t } = Swizzled.methods
-
- const button =
- data.suggest?.text && data.suggest?.update ? (
- handleUpdate(data.suggest.update)}
- >
- {btnIcon}
- {t(data.suggest.text)}
-
- ) : null
-
- const desc = data.replace ? mustache.render(t(data.desc), data.replace) : t(data.desc)
- const notes = data.notes
- ? Array.isArray(data.notes)
- ? '\n\n' +
- data.notes
- .map((note) => (data.replace ? mustache.render(t(note), data.replace) : t(note)))
- .join('\n\n')
- : '\n\n' + (data.replace ? mustache.render(t(data.notes), data.replace) : t(data.notes))
- : null
-
- return (
-
-
- {button ?
{button}
: null}
-
- )
-}
-//
-
-export const FlagsAccordionTitle = ({ flags, Swizzled }) => {
- const { t } = Swizzled.methods
- const flagList = Swizzled.methods.flattenFlags(flags)
-
- if (Object.keys(flagList).length < 1) return null
-
- return (
- <>
-
-
- {t('pe:flagMenu.t')} ({Object.keys(flagList).length})
-
-
-
-
- {Object.keys(flagList).length > 1 ? t('pe:flagMenuMany.d') : t('pe:flagMenuOne.d')}
-
- >
- )
-}
-
-export const FlagsAccordionEntries = ({ flags, update, Swizzled }) => {
- const flagList = Swizzled.methods.flattenFlags(flags)
- const { t } = Swizzled.methods
-
- if (Object.keys(flagList).length < 1) return null
-
- const handleUpdate = (config) => {
- if (config.settings) update.settings(...config.settings)
- if (config.ui) update.ui(...config.settings)
- }
-
- return (
- {
- const title = flag.replace ? mustache.render(t(flag.title), flag.replace) : t(flag.title)
-
- return [
- ,
- ,
- key,
- ]
- })}
- />
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/header-menu.mjs b/packages/react-components/src/editor/swizzle/components/header-menu.mjs
deleted file mode 100644
index e88d0812c77..00000000000
--- a/packages/react-components/src/editor/swizzle/components/header-menu.mjs
+++ /dev/null
@@ -1,525 +0,0 @@
-import { useState } from 'react'
-
-export const HeaderMenu = ({ state, Swizzled, update, Design, pattern }) => {
- const [open, setOpen] = useState()
-
- /*
- * Guard views that require measurements agains missing measurements
- * and make sure there's a view-specific header menu
- */
- const ViewMenu =
- !Swizzled.methods.missingMeasurements(state) &&
- Swizzled.components[`HeaderMenu${Swizzled.config.viewComponents[state.view]}`]
- ? Swizzled.components[`HeaderMenu${Swizzled.config.viewComponents[state.view]}`]
- : Swizzled.components.Null
-
- return (
-
- )
-}
-
-export const HeaderMenuAllViews = ({ state, Swizzled, update, open, setOpen }) => (
-
-)
-
-export const HeaderMenuDraftView = (props) => {
- const { Swizzled } = props
- const flags = props.pattern?.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
-
- return (
- <>
-
-
-
-
- {flags ? : null}
-
-
-
-
- >
- )
-}
-
-export const HeaderMenuDropdown = (props) => {
- const { Swizzled, tooltip, toggle, open, setOpen, id } = props
- /*
- * We need to use both !fixed and md:!absolute here to override DaisyUI's
- * classes on dropdown-content to force the dropdown to use the available
- * screen space on mobile, rather than be positioned under its toggle button
- */
-
- return props.disabled ? (
-
-
- {toggle}
-
-
- ) : (
-
-
-
setOpen(open === id ? false : id)}
- >
- {toggle}
-
-
- {props.children}
-
- {open === id && (
-
setOpen(false)}
- >
- )}
-
-
- )
-}
-
-export const HeaderMenuDraftViewDesignOptions = (props) => {
- const { Swizzled } = props
-
- return (
-
-
- {Swizzled.methods.t('pe:designOptions.t')}
- >
- }
- >
-
-
- )
-}
-
-export const HeaderMenuDraftViewCoreSettings = (props) => {
- const { Swizzled } = props
-
- return (
-
-
- {Swizzled.methods.t('pe:coreSettings.t')}
- >
- }
- >
-
-
- )
-}
-
-export const HeaderMenuDraftViewUiPreferences = (props) => {
- const { Swizzled } = props
-
- return (
-
-
- {Swizzled.methods.t('pe:uiPreferences.t')}
- >
- }
- >
-
-
- )
-}
-
-export const HeaderMenuDraftViewFlags = (props) => {
- const { Swizzled } = props
- const count = Object.keys(Swizzled.methods.flattenFlags(props.flags)).length
-
- return (
-
-
-
- {Swizzled.methods.t('pe:flags')}
- ({count})
-
- >
- }
- >
-
-
- )
-}
-
-export const HeaderMenuDraftViewIcons = (props) => {
- const { Swizzled, update } = props
- const Button = Swizzled.components.HeaderMenuButton
- const size = 'w-5 h-5'
- const muted = 'text-current opacity-50'
- const ux = props.state.ui.ux
- const levels = {
- ...props.Swizzled.config.uxLevels.core,
- ...props.Swizzled.config.uxLevels.ui,
- }
-
- return (
-
- {ux >= levels.sa ? (
-
-
-
- ) : null}
- {ux >= levels.paperless ? (
-
update.settings('paperless', props.state.settings.paperless ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.togglePaperless')}
- >
-
-
- ) : null}
- {ux >= levels.complete ? (
-
update.settings('complete', props.state.settings.complete ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.toggleComplete')}
- >
-
-
- ) : null}
- {ux >= levels.expand ? (
-
update.settings('expand', props.state.settings.expand ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.toggleExpand')}
- >
-
-
- ) : null}
- {ux >= levels.units ? (
-
- update.settings(
- 'units',
- props.state.settings.units === 'imperial' ? 'metric' : 'imperial'
- )
- }
- tooltip={Swizzled.methods.t('pe:tt.toggleUnits')}
- >
-
-
- ) : null}
-
- {ux >= levels.ux ? (
-
-
- {[0, 1, 2, 3, 4].map((i) => (
- update.ui('ux', i + 1)}
- >
-
-
- ))}
-
-
- ) : null}
- {ux >= levels.aside ? (
-
update.ui('aside', props.state.ui.aside ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.toggleAside')}
- >
-
-
- ) : null}
- {ux >= levels.kiosk ? (
-
update.ui('kiosk', props.state.ui.kiosk ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.toggleKiosk')}
- >
-
-
- ) : null}
- {ux >= levels.rotate ? (
-
update.ui('rotate', props.state.ui.rotate ? 0 : 1)}
- tooltip={Swizzled.methods.t('pe:tt.toggleRotate')}
- >
-
-
- ) : null}
- {ux >= levels.renderer ? (
-
- update.ui('renderer', props.state.ui.renderer === 'react' ? 'svg' : 'react')
- }
- tooltip={Swizzled.methods.t('pe:tt.toggleRenderer')}
- >
-
-
- ) : null}
-
- )
-}
-
-export const HeaderMenuUndoIcons = (props) => {
- const { Swizzled, update, state, Design } = props
- const Button = Swizzled.components.HeaderMenuButton
- const size = 'w-5 h-5'
- const undos = props.state._?.undos && props.state._.undos.length > 0 ? props.state._.undos : false
-
- return (
-
-
update.restore(0, state._)}
- tooltip={Swizzled.methods.t('pe:tt.undo')}
- disabled={undos ? false : true}
- >
-
-
-
update.restore(undos.length - 1, state._)}
- tooltip={Swizzled.methods.t('pe:tt.undoAll')}
- disabled={undos ? false : true}
- >
-
-
-
-
- {Swizzled.methods.t('pe:undo')}
- >
- }
- >
- {undos ? (
-
- {undos.slice(0, 9).map((step, index) => (
-
-
-
- ))}
-
- {
- return null /*update.state(index, state._) */
- }}
- >
-
-
-
- {Swizzled.methods.t(`pe:view.undos.t`)}...
-
- {undos.length}
-
-
-
-
- ) : null}
-
-
-
-
-
-
-
-
- )
-}
-
-export const HeaderMenuSaveIcons = (props) => {
- const { Swizzled, update } = props
- const Button = Swizzled.components.HeaderMenuButton
- const size = 'w-5 h-5'
- const saveable = props.state._?.undos && props.state._.undos.length > 0
-
- return (
-
-
-
-
- update.view('save')}
- tooltip={Swizzled.methods.t('pe:tt.savePatternAs')}
- >
-
-
-
-
-
-
- )
-}
-
-export const HeaderMenuIcon = (props) => {
- const { Swizzled, name, extraClasses = '' } = props
- const Icon =
- Swizzled.components[`${Swizzled.methods.capitalize(name)}Icon`] || Swizzled.components.Noop
- return
-}
-export const HeaderMenuIconSpacer = () => |
-
-export const HeaderMenuButton = ({
- Swizzled,
- updateHandler,
- children,
- tooltip,
- disabled = false,
-}) => (
-
-
- {children}
-
-
-)
-
-export const HeaderMenuViewMenu = (props) => {
- const { Swizzled, update, state } = props
- const output = []
- let i = 1
- for (const viewName of [
- 'spacer',
- ...Swizzled.config.mainViews,
- 'spacer',
- ...Swizzled.config.extraViews,
- 'spacerOver3',
- ...Swizzled.config.devViews,
- 'spacer',
- 'picker',
- ]) {
- if (viewName === 'spacer') output.push( )
- else if (viewName === 'spacerOver3')
- output.push(state.ui.ux > 3 ? : null)
- else if (
- state.ui.ux >= Swizzled.config.uxLevels.views[viewName] &&
- (Swizzled.config.measurementsFreeViews.includes(viewName) ||
- state._.missingMeasurements.length < 1)
- )
- output.push(
-
- update.view(viewName)}
- >
-
- {Swizzled.methods.t(`pe:view.${viewName}.t`)}
-
-
- )
- i++
- }
-
- return (
-
-
- {Swizzled.methods.t('pe:views.t')}
- >
- }
- >
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/html-span.mjs b/packages/react-components/src/editor/swizzle/components/html-span.mjs
deleted file mode 100644
index 3d98e8acc26..00000000000
--- a/packages/react-components/src/editor/swizzle/components/html-span.mjs
+++ /dev/null
@@ -1 +0,0 @@
-export const HtmlSpan = ({ html }) =>
diff --git a/packages/react-components/src/editor/swizzle/components/icons.mjs b/packages/react-components/src/editor/swizzle/components/icons.mjs
deleted file mode 100644
index b62c5272b44..00000000000
--- a/packages/react-components/src/editor/swizzle/components/icons.mjs
+++ /dev/null
@@ -1,1135 +0,0 @@
-import React from 'react'
-/*
- * Used inside the pattern editor
- */
-export const logoPath =
- 'm18.56 0c-0.4945 0.3515-0.469 0.3065-0.8685 0.437-0.916 0.2995-1.7945 0.135-2.837 0.048-0.3135-0.035-0.6245-0.0555-0.928-0.0575-1.5325-0.0105-2.834 0.439-3.0805 1.694-0.4545 0.2755-0.8725 0.609-1.2865 0.943-0.884 0.6975-1.5495 1.55-2.0035 2.5775-0.62 1.5175-0.06 3.146 0.2175 4.684 0.066 0.36 0.135 0.703 0.172 0.8355 0.0525 0.1865 0.145 0.3645 0.2455 0.5245 0.0235 4e-3 0.1475-0.187 0.177-0.2715 0.043-0.123 0.0385-0.3205-0.0085-0.4905-0.104-0.3825-0.203-0.693-0.2115-0.849-0.015-0.293 0.042-0.5635 0.149-0.6975 0.038-0.0475 0.125 0.1975 0.1025 0.2885-0.0265 0.1095-0.0465 0.297-0.038 0.3835 0.0235 0.293 0.0665 0.6065 0.12 0.8805 0.0685 0.3535 0.098 0.5805 0.0855 0.6685-9e-3 0.064-0.039 0.1285-0.154 0.3265-0.1 0.1735-0.152 0.314-0.16 0.438-0.0085 0.121 0.028 0.4235 0.062 0.4975 0.0495 0.1155 0.1985 0.237 0.3285 0.267 0.1245 0.0475 0.187 0.146 0.251 0.2565 0.1555 0.2965 0.2755 0.6575 0.3945 1.2015 0.058 0.2605 0.1065 0.493 0.122 0.615-0.96 1e-3 -2.1895 0.0015-3.3095 0.0015-0.377 6e-3 -1.058-0.171-1.6825-0.212-0.0905-0.977-0.5195-2.112-1.2535-2.178-0.501-0.0455-0.9165 0.145-1.268 0.9365l0.01 0.0425c0.2075-0.1735 0.4265-0.704 1.2155-0.6675 0.606 0.0275 0.808 1.1745 0.868 1.8645-0.369 0.027-0.683 0.1405-0.847 0.424h-0.0035c0 5e-4 0 0.0015 0.0015 0.0025-0.0015 1e-3 -0.0015 2e-3 -0.0015 3e-3h0.0035c0.169 0.2905 0.4945 0.403 0.877 0.4255 0.2555 7.225 7.047 8.157 8.903 8.157 6.924 0 9.348-4.705 9.7125-6.5685 0.1705 0.794-0.3665 1.8055-0.495 2.552 1.4605-1.6885 1.1965-3.312 0.9295-4.945 0.222 0.264 0.5225 0.4275 0.93 0.337-0.2905-0.194-0.6845-0.058-0.9205-0.8765-0.103-0.3535-0.192-0.6185-0.2805-0.841-0.191-0.7165-0.462-1.401-0.795-2.068-0.281-0.7235-0.0955-1.1925-0.1235-1.8135 0.5055 1.667 0.8215 2.1105 1.4115 2.285-1.484-1.788-0.976-4.5565-1.8145-7.0275 0.3795 0.223 0.8125 0.29 1.2735 0.0175-0.446-0.127-0.891 0.2085-1.531-0.732-0.5405-1.0515-1.3235-1.828-2.2735-2.513-0.509-0.332-1.074-0.555-1.642-0.762 0.5785-0.145 1.2245-0.66 1.2545-1.0445zm-0.9705 5.5535c0.762 0.278 1.602 1.334 1.5925 2.37v0.058c-0.0205 1.407-0.66 2.1635-0.633 3.1005 0.0345 1.1035 0.5095 1.4885 0.604 1.6725-0.162-0.6805-0.257-1.5365-0.043-2.2145 0.275-0.872 0.5525-1.594 0.5325-2.277-0.01-0.16-0.078-0.7585-0.1235-1.0235 0.817 1.179-0.177 2.8935 0.109 4.0155 0.497 1.9545 2.7245 2.2015 2.0615 6.1395-0.5835 3.462-4.5815 6.0895-8.6795 6.0895-3.038 0-8.3025-1.6815-8.5625-7.646 0.6175-0.044 1.2815-0.216 1.654-0.21 1.126 0 2.412 5e-4 3.381 1e-3 0.182 0.821 0.3185 1.019 1.009 1.566 0.768 0.604 0.947 0.6775 2.083 0.6885 1.1365 0.0115 1.4735-0.232 2.576-1.275 0.238-0.279 0.341-0.6445 0.4565-0.988 1.134-0.0105 1.961-0.0305 2.7745-0.0685 0.8285-0.0375 0.9455 0 2.2805-0.1375-1.335-0.1375-1.452-0.1-2.2805-0.138-0.792-0.036-1.594-0.0565-2.6785-0.0665 0.091-0.4085 0.221-0.8075 0.3595-1.202 0.0855-0.2325 0.186-0.459 0.289-0.6845l0.1125-0.035c0.217-0.077 0.409-0.242 0.4855-0.465 0.0985-0.2955 0.0285-0.6275-0.162-0.869-0.0655-0.0905-0.147-0.206-0.1805-0.257-0.1005-0.159-0.103-0.2475-0.018-0.8385 0.0715-0.495 0.0795-0.754 0.03-1.005-0.01-0.1435-0.011-0.4385-0.0155-0.518 0.038 0.021 0.1205 0.209 0.204 0.4635 0.083 0.2555 0.0965 0.3085 0.1155 0.526 0.021 0.247-0.0715 0.43-0.1475 0.7985-0.038 0.19-0.0715 0.3665-0.0715 0.3905 0 0.0255 0.018 0.0795 0.037 0.1215 0.0445 0.094 0.128 0.226 0.1435 0.226 0.2725-0.3005 0.4325-0.6715 0.575-1.048 0.15-0.426 0.194-0.878 0.299-1.3165 0.085-0.382 0.183-0.7645 0.2135-1.1565 0.0615-0.765 0.0255-1.305-0.1435-2.102-0.0405-0.18-0.1575-0.5235-0.239-0.6855zm-2.68 3.7685c0.2925-0.0035 0.582 0.032 0.8575 0.1115 0.3745 0.1435 0.427 0.478 0.496 0.8535 0.0385 0.24 0.037 0.4125-0.0065 0.6945-0.0305 0.409-0.193 0.7255-0.548 0.948-0.5355 0.099-1.108 0.1945-1.562-0.16-0.381-0.525-0.6105-1.1885-0.523-1.8355 0.0555-0.2655 0.179-0.4035 0.433-0.486 0.2735-0.0785 0.563-0.1215 0.853-0.126zm-4.4415 0.0475c0.2735-0.0025 0.55 0.0265 0.702 0.1235 0.6525 0.4415 0.443 1.16 0.185 1.7905-0.3755 0.8255-1.1875 0.795-1.9745 0.7885-0.4355-0.1275-0.4755-0.4845-0.5385-0.866-0.054-0.3685-0.169-0.7635-0.073-1.134 0.2465-0.596 1.1475-0.6645 1.699-0.7025zm9.9515 0.103c0.0035 1.5865 0.2745 2.366 0.8185 3.4895-0.3205-0.6115-0.7785-0.9595-0.949-1.6905-0.326-1.4115 0.0255-1.3325 0.1305-1.799zm-7.9065 1.149c0.086 0.087 0.1275 0.207 0.202 0.3025 0.0575-0.0985 0.1165-0.1965 0.1905-0.284 0.0385 1e-3 0.0855 0.077 0.128 0.213 0.182 0.503 0.2175 1.0565 0.4535 1.54 0.2205 0.35-0.0805 0.554-0.411 0.57-0.241-5e-4 -0.343-0.165-0.4845-0.328-0.0365 0.1065-0.106 0.175-0.189 0.247-0.211 0.177-0.6245 0.1115-0.6885-0.1675 0.085-0.533 0.3565-1.0225 0.5345-1.5335 0.0885-0.1865 0.0895-0.3295 0.2645-0.5595zm-3.096 2.6925c0.1065 0 0.399 0.1985 0.4585 0.3105 0.041 0.0745 0.1345 0.3645 0.141 0.435 0.0105 0.084-0.015 0.283-0.041 0.337-0.019 0.0385-0.0335 0.044-0.0555 0.019-0.0185-0.021-0.2635-0.491-0.42-0.802-0.123-0.249-0.136-0.2995-0.083-0.2995zm6.111 0.1555c4e-3 5e-4 0.01 2e-3 0.0155 0.0035 0.033 0.0135 0.01 0.1305-0.114 0.5555-0.0235 0.128-0.0805 0.229-0.164 0.313-0.0275 0-0.04-0.032-0.083-0.2095-0.0365-0.1515-0.0405-0.2865-0.015-0.4075 0.044-0.1515 0.222-0.198 0.3605-0.255zm-0.7415 0.9265c0.0105-2e-3 0.0205 0.0035 0.0335 0.014 0.045 0.0315 0.0515 0.1145 0.0215 0.277-0.0365 0.209-0.0445 0.232-0.0985 0.2535-0.0235 0.0105-0.0655 0.018-0.0935 0.018-0.0505-9e-3 -0.0635-0.05-0.0515-0.112 0-0.13 0.038-0.243 0.124-0.3765 0.0325-0.05 0.049-0.0715 0.0645-0.074zm-4.3165 0.0095c0.0345 0 0.1385 0.075 0.177 0.127 0.043 0.055 0.092 0.3825 0.0645 0.439-0.0315 0.071-0.1855 0.0355-0.228-0.053-0.026-0.053-0.0875-0.339-0.0875-0.407 0-0.063 0.0305-0.106 0.074-0.106zm3.9455 0.0865c0.042 0.06 0.053 0.137 0.044 0.306l-0.0085 0.154-0.044 0.044c-0.0265 0.0245-0.0715 0.0545-0.0985 0.067-0.0595 0.028-0.105 0.0305-0.1135 8e-3 -0.01-0.03 7e-3 -0.221 0.0255-0.2855 0.0215-0.0665 0.118-0.265 0.15-0.307 0.0145-0.0385 0.0315 0.0095 0.045 0.0135zm-2.5105-9e-3c0.0905 0.023 0.1305 0.1045 0.18 0.1785l0.0335 0.066-0.047 0.1635c-0.025 0.09-0.0515 0.171-0.0595 0.18-9e-3 0.01-0.0425 0.015-0.092 0.0145-0.132-0.0035-0.147-9e-3 -0.1825-0.063l-0.033-0.049 0.028-0.1375c0.0405-0.198 0.06-0.2575 0.105-0.3085 0.0235-0.0275 0.047-0.0425 0.0675-0.0445zm-0.8355 0.1415 0.0745 0.0745 0.0125 0.1685c0.0065 0.092 0.0095 0.1775 0.0045 0.188-0.0045 0.0145-0.0315 0.0185-0.115 0.0185h-0.1085c-0.058-0.0635-0.076-0.141-0.1005-0.221-0.057-0.2405-0.057-0.35 2e-3 -0.3645 0.0965 6e-3 0.16 0.076 0.2305 0.136zm2.9-0.1155c0.118 0.0315 0.0945 0.219 0.094 0.353-9e-3 0.217-0.0175 0.262-0.0455 0.29-0.0485 0.0485-0.1835 0.0215-0.249-0.0505-0.0215-0.026-0.0235-0.034-0.0065-0.1395 0.0195-0.1285 0.0445-0.2085 0.1-0.3185 0.0405-0.079 0.0785-0.1285 0.107-0.1345zm-2.663 0.01c0.0065-5e-4 0.017 0 0.027 1e-3 0.075 6e-3 0.145 0.055 0.207 0.145l0.05 0.0735c0.0045 0.1205 0 0.2475-0.0215 0.3595-0.013 0.0065-0.067 0.0165-0.12 0.0215-0.092 0.0085-0.1005 0.0065-0.1325-0.0215-0.0445-0.038-0.057-0.1085-0.068-0.3425-0.0065-0.191-2e-3 -0.2335 0.058-0.2365zm1.1345 0.04c0.0805 0.017 0.1315 0.06 0.154 0.1305 0.018 0.0605 0.029 0.399 0.0115 0.4225-6e-3 0.01-0.044 0.0225-0.0875 0.028-0.162 0.0205-0.305 5e-3 -0.319-0.0335-0.018-0.044 0.1025-0.48 0.147-0.534 0.019-0.042 0.065-0.0095 0.094-0.0135zm1.049 3e-3c0.0355-0.0035 0.0735 0.0305 0.1105 0.103 0.03 0.0605 0.0345 0.0815 0.0345 0.217 0 0.108-0.0065 0.1545-0.018 0.1645-0.01 8e-3 -0.0505 0.0225-0.0935 0.0335-0.075 0.0195-0.0915 0.0215-0.115 0.0135l-0.1125-0.0205 0.0085-0.067c8e-3 -0.0875 0.0655-0.2815 0.106-0.3655 0.024-0.05 0.0515-0.075 0.0795-0.0785zm-0.489 0.0015c0.0235-1e-3 0.0345 0.0045 0.0495 0.021 0.0355 0.042 0.0805 0.166 0.109 0.2985 0.038 0.1865 0.038 0.186-0.0435 0.2105-0.0355 0.011-0.1105 0.0225-0.164 0.0255-0.1765 9e-3 -0.19-0.0015-0.1685-0.1575 0.017-0.139 0.0855-0.358 0.115-0.374 0.032-0.017 0.069-0.0165 0.1025-0.024zm-8.9965 0.7045c0.0015-5e-4 0.0035 0 0.0035 0 0.0045 0.0975 0.0045 0.196 0.0065 0.294-0.2475-0.019-0.4295-0.078-0.4295-0.1475 0-0.0685 0.1755-0.127 0.4195-0.1465zm0.4325 0.0085c0.2005 0.025 0.339 0.0775 0.3365 0.138 0 0.061-0.134 0.113-0.333 0.1375-2e-3 -0.0915-2e-3 -0.1835-0.0035-0.2755zm9.363 0.2665c0.017-0.0015 0.0245-3e-3 0.0505-5e-4 0.104 0.0105 0.119 0.017 0.119 0.052 0 0.046-0.079 0.1845-0.1325 0.2325-0.025 0.024-0.0595 0.044-0.0715 0.044-0.06 0-0.095-0.1265-0.067-0.243 0.017-0.063 0.048-0.0825 0.1015-0.085zm-0.3775 0.0415c0.0465-4e-3 0.0915 0.0085 0.1365 0.0145-0.013 0.1315-0.072 0.239-0.1815 0.3105-0.027 0-0.0405-0.0515-0.0405-0.164 0-0.134 7e-3 -0.1595 0.0855-0.161zm-0.414 0.0485c0.0965 0 0.1815 0.0045 0.1855 0.01 0.018 0.017-0.034 0.146-0.1105 0.277-0.0655 0.1165-0.075 0.125-0.1155 0.128-0.159-0.018-0.1545-0.2045-0.179-0.3325 0-0.076 0.017-0.0825 0.2195-0.0825zm-1.5045 0.0145c0.1105 2e-3 0.1535 0.0185 0.1535 0.061 0 0.054-0.041 0.1615-0.0645 0.175-0.0355 0.0195-0.0385 0.0185-0.1085-0.0545-0.1105-0.124-0.123-0.147 0.0195-0.1815zm0.532 0.0055c2e-3 3e-3 0.0235 0.042 0.045 0.086 0.047 0.0915 0.0505 0.1315 0.017 0.162-0.079 0.045-0.0955 0.0195-0.167-0.026-0.083-0.0785-0.1485-0.184-0.127-0.206 0.074-0.0265 0.1555-0.0165 0.232-0.016zm0.211 0.0025 0.1975 0.0035c0.077 0 0.1435 4e-3 0.147 0.01 0.0135 0.012-0.03 0.269-0.0535 0.327-0.027 0.065-0.1215 0.0655-0.1705-0.0115-0.07-0.1105-0.116-0.2035-0.1175-0.2675z'
-
-export const IconWrapper = ({
- className = 'w-6 h-6',
- stroke = 2,
- children = null,
- fill = false,
- fillOpacity = 1,
- dasharray = null,
- wrapped = true,
-}) =>
- wrapped ? (
-
- {children}
-
- ) : (
- <> {children} >
- )
-
-// Looks like a play triangle
-export const ApplyIcon = (props) => (
-
-
-
-)
-
-// Looks like a lab beaker
-export const BeakerIcon = (props) => (
-
-
-
-)
-
-// Looks like a left U-turn that we slightly rotate
-export const BackIcon = (props) => (
-
-
-
-)
-
-// Looks like a red X
-export const BoolNoIcon = ({ size = 6 }) => (
-
-)
-
-// Looks like a green checkbox
-export const BoolYesIcon = ({ size = 6 }) => (
-
-)
-
-// Looks like a bookmark
-export const BookmarkIcon = (props) => (
-
-
-
-)
-
-// Looks lik a speech bubble
-export const ChatIcon = (props) => (
-
-
-
-)
-
-// Looks like a circle
-export const CircleIcon = (props) => (
-
-
-
-)
-
-// Looks like a X
-export const CloseIcon = (props) => (
-
-
-
-)
-
-// Looks like a museum building
-export const CuratedMeasurementsSetIcon = (props) => (
-
-
-
-)
-
-// Looks like a coathanger
-export const DesignIcon = (props) => (
-
-
-
-)
-
-// Looks like a left and right pane with different level of detail
-export const DetailIcon = (props) => (
-
-
-
-)
-
-// Looks like a document icon
-export const DocsIcon = (props) => (
-
-
-
-)
-
-// Looks like a down pointing chevron
-export const DownIcon = (props) => (
-
-
-
-)
-
-// Looks like a pencil
-export const EditIcon = (props) => (
-
-
-
-)
-
-// Looks like FIXME
-export const ErrorIcon = (props) => (
-
-
-
-)
-
-// Looks like arrows pointing outwards
-export const ExpandIcon = (props) => (
-
-
-
-)
-
-// Looks like a file/sheet with an arrow pointing downwards
-export const ExportIcon = (props) => (
-
-
-
-)
-
-// Looks like a ! in a triangle, is intended to be shown on an error background
-export const FailureIcon = ({ size = 6 }) => (
-
-)
-
-// Looks lik a flag
-export const FlagIcon = (props) => (
-
-
-
-)
-
-// Looks like a gauge or speedometer
-export const GaugeIcon = (props) => (
-
-
-
-
-)
-
-// Looks like abox
-export const GroupIcon = (props) => (
-
-
-
-)
-
-// Looks like a question mark in a circle
-export const HelpIcon = (props) => (
-
-
-
-)
-
-// Looks like a pie with a slice a bit out of it
-export const IncludeIcon = (props) => (
-
-
-
-
-)
-
-// Looks like a rectangle with rounded corners (like a full screen display)
-export const KioskIcon = (props) => (
-
-
-
-)
-
-// Looks like a left pointing chevron
-export const LeftIcon = (props) => (
-
-
-
-)
-
-// Looks like a bullet list
-export const ListIcon = (props) => (
-
-
-
-)
-
-// Looks like a padlock
-export const LockIcon = (props) => (
-
-
-
-)
-
-// Looks like 4 boxes spaces out
-export const MarginIcon = (props) => (
-
-
-
-)
-
-// Looks like a tape measure
-export const MeasurementsIcon = (props) => (
-
-
-
-)
-
-// Looks like two people's heads next/behinf to each other, one bigger, one smaller
-export const MeasurementsSetIcon = (props) => (
-
-
-
-)
-
-// Looks like 3 horizontal lines (hamburger menu)
-export const MenuIcon = (props) => (
-
-
-
-)
-
-// Looks like a X
-export const NoIcon = (props) => (
-
-
-
-)
-
-// Looks like a checkmark
-export const OkIcon = (props) => (
-
-
-
-)
-
-// Looks like sliders on a mixing panel
-export const OptionsIcon = (props) => (
-
-
-
-)
-
-// Looks like a grid
-export const PaperlessIcon = (props) => (
-
-
-
-
-)
-
-// Looks like a +
-export const PlusIcon = (props) => (
-
-
-
-)
-
-// Looks like a printer
-export const PrintIcon = (props) => (
-
-
-
-)
-
-// Looks like a single rewind arrow
-export const ResetIcon = (props) => (
-
-
-
-)
-
-// Looks like a double rewind arrow
-export const ResetAllIcon = (props) => (
-
-
-
-)
-
-// Looks like a right pointing chevron
-export const RightIcon = (props) => (
-
-
-
-)
-
-// Looks like a rocket
-export const RocketIcon = (props) => (
-
-
-
-)
-
-// Looks like two arrows in a circular layout
-export const RotateIcon = (props) => (
-
-
-
-)
-
-// Looks like a cloud with a plus sign in it
-export const SaveIcon = (props) => (
-
-
-
-)
-
-// Looks like a cloud with a plus sign in it
-export const SaveAsIcon = (props) => (
-
-
-
-)
-
-// Looks like a small solid circle with a larger dashed circle around it
-export const SaIcon = (props) => (
-
-
-
-
-)
-
-// Looks like lines of varying thickness
-export const ScaleIcon = (props) => (
-
-
-
-
-
-)
-
-// Looks like a gear
-export const SettingsIcon = (props) => (
-
-
-
-
-)
-
-// Looks like a spinning circle
-export const SpinnerIcon = (props) => (
-
-
-
-
-)
-
-// Looks like a white checkbox, intended to be shown on a success-colored background
-export const SuccessIcon = ({ size = 6 }) => (
-
-)
-
-// Looks like a light bulb
-export const TipIcon = (props) => (
-
-
-
-)
-
-// Looks like a trashcan
-export const TrashIcon = (props) => (
-
-
-
-)
-
-// Looks like a desktop screen
-export const UiIcon = (props) => (
-
-
-
-)
-
-// Looks like a rewind arrow, but takes text to go inside it
-export const UndoIcon = (props) => (
-
-
- {props.text ? (
-
- {props.text}
-
- ) : null}
-
-)
-
-// Looks like a bit of measuring tape
-export const UnitsIcon = (props) => (
-
-
-
-
-)
-
-// Looks like an up pointing chevron
-export const UpIcon = (props) => (
-
-
-
-)
-// Looks like a cloud with an arrow pointing upwards in it
-export const UploadIcon = (props) => (
-
-
-
-)
-
-// Looks like old-timey scales
-export const UxIcon = (props) => (
-
-
-
-)
-
-// Looks like an ! in a triangle
-export const WarningIcon = (props) => (
-
-
-
-)
-
-// Looks like a wrench
-export const WrenchIcon = (props) => (
-
-
-
-)
-
-// Looks like a box in dashed lines
-export const XrayIcon = (props) => (
-
-
-
-)
-
-// These icons all reuse existing icons
-export const ViewDraftIcon = OptionsIcon
-export const ViewMeasurementsIcon = MeasurementsIcon
-export const ViewTestIcon = BeakerIcon
-export const ViewTimingIcon = GaugeIcon
-export const ViewPrintLayoutIcon = PrintIcon
-export const ViewSaveIcon = SaveIcon
-export const ViewExportIcon = ExportIcon
-export const ViewEditSettingsIcon = EditIcon
-export const ViewLogsIcon = ListIcon
-export const ViewInspectIcon = XrayIcon
-export const ViewDocsIcon = DocsIcon
-export const ViewDesignsIcon = DesignIcon
-export const ViewViewPickerIcon = UiIcon
-export const ViewUndosIcon = BackIcon
-// Flag icons
-export const FlagNoteIcon = ChatIcon
-export const FlagInfoIcon = DocsIcon
-export const FlagTipIcon = TipIcon
-export const FlagWarningIcon = WarningIcon
-export const FlagErrorIcon = ErrorIcon
-export const FlagFixmeIcon = WrenchIcon
-export const FlagExpandIcon = ExpandIcon
-export const FlagOtionsIcon = OptionsIcon
-
-/*
- * Not used inside the pattern editor
-// Used in several icons
-const page =
- 'M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z'
-
-export const BeakerIcon = (props) => (
-
-
-
-)
-
-export const BioIcon = (props) => (
-
-
-
-)
-
-
-export const BoxIcon = (props) => (
-
-
-
-)
-
-export const BriefcaseIcon = (props) => (
-
-
-
-)
-
-export const BugIcon = (props) => (
-
-
-
-)
-
-export const BulletIcon = (props) => (
-
-
-
-)
-
-export const CalendarIcon = (props) => (
-
-
-
-)
-
-export const CameraIcon = (props) => (
-
-
-
-
-)
-
-export const CcByIcon = (props) => (
-
-
-
-)
-
-export const CisFemaleIcon = (props) => (
-
-
-
-)
-
-export const CisMaleIcon = (props) => (
-
-
-
-)
-
-export const ClearIcon = (props) => (
-
-
-
-)
-
-export const CloneIcon = (props) => (
-
-
-
-)
-
-export const CodeIcon = (props) => (
-
-
-
-)
-
-export const CogIcon = (props) => (
-
-
-
-)
-
-export const CommunityIcon = (props) => (
-
-
-
-)
-
-export const CompareIcon = (props) => (
-
-
-
-)
-
-export const CopyIcon = (props) => (
-
-
-
-)
-
-export const CoverPageIcon = (props) => (
-
-
-
-
-
-
-)
-
-export const CsetIcon = (props) => (
-
-
-
-)
-export const CuratedMeasurementsSetIcon = CsetIcon
-
-export const CloudIcon = (props) => (
-
-
-
-)
-
-export const CutIcon = (props) => (
-
-
-
-)
-
-export const CuttingLayoutIcon = (props) => (
-
-
-
-
-)
-
-export const DetailIcon = (props) => (
-
-
-
-
-)
-
-export const DiscordIcon = (props) => (
-
-
-
-)
-
-export const DoubleLeftIcon = (props) => (
-
-
-
-)
-export const DoubleRightIcon = (props) => (
-
-
-
-)
-
-export const DownloadIcon = (props) => (
-
-
-
-)
-
-export const EmailIcon = (props) => (
-
-
-
-)
-
-export const FacebookIcon = (props) => (
-
-
-
-)
-
-export const FilterIcon = (props) => (
-
-
-
-)
-
-export const FingerprintIcon = (props) => (
-
-
-
-)
-
-export const ForbiddenIcon = (props) => (
-
-
-
-)
-
-export const FreeSewingIcon = (props) => (
-
-
-
-)
-
-export const GaugeIcon = (props) => (
-
-
-
-
-)
-
-export const GitHubIcon = (props) => (
-
-
-
-)
-
-export const GuideIcon = (props) => (
-
-
-
-)
-
-export const GoogleIcon = (props) => (
-
-
-
-)
-
-export const HeartIcon = (props) => (
-
-
-
-)
-
-export const HomeIcon = (props) => (
-
-
-
-)
-
-export const I18nIcon = (props) => (
-
-
-
-)
-
-export const ImportIcon = (props) => (
-
-
-
-)
-
-export const IncludeIcon = (props) => (
-
-
-
-
-)
-
-export const InstagramIcon = (props) => (
-
-
-
-)
-
-export const KeyIcon = (props) => (
-
-
-
-)
-
-export const LabelIcon = (props) => (
-
-
-
-
-)
-
-export const LeftRightIcon = (props) => (
-
-
-
-)
-
-export const LinkIcon = (props) => (
-
-
-
-)
-
-export const MastodonIcon = (props) => (
-
-
-
-)
-
-export const MarginIcon = (props) => (
-
-
-
-)
-
-export const MeasieIcon = (props) => (
-
-
-
-)
-
-export const MegaphoneIcon = (props) => (
-
-
-
-)
-
-export const MenuAltIcon = (props) => (
-
-
-
-)
-
-export const MeasurementsSetIcon = MsetIcon
-
-export const MsfIcon = (props) => (
-
-
-
-)
-
-// NarrowIcon - Looks like two arrow pointing inwards
-export const NarrowIcon = (props) => (
-
-
-
-)
-
-export const NewMsetIcon = (props) => (
-
-
-
-)
-
-export const NewsletterIcon = (props) => (
-
-
-
-)
-
-export const NoteIcon = (props) => (
-
-
-
-)
-
-export const OpackIcon = (props) => (
-
-
-
-)
-export const OptionPackIcon = OpackIcon
-
-export const OpenSourceIcon = (props) => (
-
-
-
-)
-
-export const PageMarginIcon = (props) => (
-
-
-
-
-)
-
-export const PageOrientationIcon = (props) => (
-
-
-
-
-)
-
-export const PageSizeIcon = (props) => (
-
-
-
-
-)
-
-export const PatternIcon = (props) => (
-
-
-
-)
-
-export const NewPatternIcon = (props) => (
-
-
-
-)
-
-export const PluginIcon = (props) => (
-
-
-
-)
-
-
-export const PrintIcon = (props) => (
-
-
-
-)
-
-export const PrivacyIcon = (props) => (
-
-
-
-)
-
-export const RedditIcon = (props) => (
-
-
-
-)
-
-export const ReloadIcon = (props) => (
-
-
-
-)
-
-export const RssIcon = (props) => (
-
-
-
-)
-
-export const ScaleIcon = (props) => (
-
-
-
-
-
-)
-
-export const SearchIcon = (props) => (
-
-
-
-)
-
-export const ShieldIcon = (props) => (
-
-
-
-)
-
-export const ShowcaseIcon = (props) => (
-
-
-
-
-)
-
-export const SigninIcon = (props) => (
-
-
-
-)
-
-export const SignoutIcon = (props) => (
-
-
-
-)
-
-export const StarIcon = (props) => (
-
-
-
-)
-
-export const ThemeIcon = (props) => (
-
-
-
-)
-
-export const TikTokIcon = (props) => (
-
-
-
-)
-
-export const TutorialIcon = (props) => (
-
-
-
-
-
-)
-
-export const TrophyIcon = (props) => (
-
-
-
-)
-
-export const TwitchIcon = (props) => (
-
-
-
-)
-
-export const TwitterIcon = (props) => (
-
-
-
-)
-
-
-export const UserIcon = (props) => (
-
-
-
-)
-
-export const VersionIcon = (props) => (
-
-
-
-)
-
-// WideIcon - Looks like two arrow pointing outwards
-export const WideIcon = (props) => (
-
-
-
-)
-
-export const XrayIcon = (props) => (
-
-
-
-)
-
-export const YouTubeIcon = (props) => (
-
-
-
-)
-
-export const ZoomInIcon = (props) => (
-
-
-
-)
-
-export const ZoomOutIcon = (props) => (
-
-
-
-)
-*/
diff --git a/packages/react-components/src/editor/swizzle/components/index.mjs b/packages/react-components/src/editor/swizzle/components/index.mjs
deleted file mode 100644
index f7a6dcdfdc4..00000000000
--- a/packages/react-components/src/editor/swizzle/components/index.mjs
+++ /dev/null
@@ -1,659 +0,0 @@
-/*************************************************************************
- * *
- * FreeSewing's pattern editor allows swizzling components *
- * *
- * To 'swizzle' means to replace the default implementation of a *
- * component with a custom one. It allows one to customize *
- * the pattern editor. *
- * *
- * This file holds the 'swizzleComponents' method that will return *
- * the various components that can be swizzled, or their default *
- * implementation. *
- * *
- * To use a custom version, simply pas it as a prop into the editor *
- * under the 'components' key. So to pass a custom 'TemporaryLoader' *
- * component, you do: *
- * *
- * *
- * *
- *************************************************************************/
-
-/*
- * Import of components that can be swizzled
- */
-import { Link, AnchorLink, PageLink, WebLink, CardLink } from './link.mjs'
-// Accordion
-import { BaseAccordion, SubAccordion, Accordion } from './accordion.mjs'
-// Auth wrapper
-import {
- AuthWrapper,
- AuthMessageWrapper,
- ContactSupport,
- AuthRequired,
- AccountInactive,
- AccountDisabled,
- AccountProhibited,
- AccountStatusUnknown,
- RoleLacking,
- ConsentLacking,
-} from './auth-wrapper.mjs'
-// Ux
-import { Ux } from './ux.mjs'
-// Popout
-import { Popout } from './popout.mjs'
-// Loader
-import { TemporaryLoader } from './loaders.mjs'
-// Measurements Sets
-import { UserSetPicker, BookmarkedSetPicker, CuratedSetPicker } from './sets.mjs'
-// Curated Measurements Sets
-import { CuratedMeasurementsSetLineup } from './curated-sets.mjs'
-import { MeasurementsSetCard } from './measurements-set-card.mjs'
-// Icons
-import {
- ApplyIcon,
- BackIcon,
- BeakerIcon,
- BookmarkIcon,
- BoolNoIcon,
- BoolYesIcon,
- CircleIcon,
- CloseIcon,
- CuratedMeasurementsSetIcon,
- DesignIcon,
- DetailIcon,
- DocsIcon,
- DownIcon,
- EditIcon,
- ExpandIcon,
- ExportIcon,
- FailureIcon,
- FlagIcon,
- FlagNoteIcon,
- FlagInfoIcon,
- FlagTipIcon,
- FlagWarningIcon,
- FlagErrorIcon,
- FlagFixmeIcon,
- FlagExpandIcon,
- FlagOtionsIcon,
- GaugeIcon,
- GroupIcon,
- IncludeIcon,
- HelpIcon,
- KioskIcon,
- LeftIcon,
- ListIcon,
- LockIcon,
- MarginIcon,
- MeasurementsIcon,
- MeasurementsSetIcon,
- MenuIcon,
- NoIcon,
- OkIcon,
- OptionsIcon,
- PaperlessIcon,
- PlusIcon,
- PrintIcon,
- ResetAllIcon,
- ResetIcon,
- RightIcon,
- RocketIcon,
- RotateIcon,
- SaIcon,
- SaveIcon,
- SaveAsIcon,
- ScaleIcon,
- SettingsIcon,
- SpinnerIcon,
- SuccessIcon,
- TipIcon,
- TrashIcon,
- UiIcon,
- UndoIcon,
- UnitsIcon,
- UpIcon,
- UploadIcon,
- UxIcon,
- XrayIcon,
- ViewDraftIcon,
- ViewMeasurementsIcon,
- ViewTestIcon,
- ViewTimingIcon,
- ViewPrintLayoutIcon,
- ViewSaveIcon,
- ViewExportIcon,
- ViewEditSettingsIcon,
- ViewLogsIcon,
- ViewInspectIcon,
- ViewDocsIcon,
- ViewDesignsIcon,
- ViewViewPickerIcon,
- ViewUndosIcon,
-} from './icons.mjs'
-// Measurements Editor
-import { MeasurementsEditor } from './measurements-editor.mjs'
-// Zoomable pattern
-import { ZoomablePattern, ZoomContextProvider } from './zoomable-pattern.mjs'
-import { PatternLayout } from './pattern-layout.mjs'
-// inputs
-import {
- FormControl,
- ButtonFrame,
- NumberInput,
- StringInput,
- ListInput,
- MarkdownInput,
- MeasurementInput,
- ToggleInput,
-} from './inputs.mjs'
-// Views
-import { DesignsView } from './designs-view.mjs'
-import { DraftView } from './draft-view.mjs'
-import { ErrorView } from './error-view.mjs'
-import { MeasurementsView } from './measurements-view.mjs'
-import { SaveView } from './save-view.mjs'
-import { ViewPicker } from './view-picker.mjs'
-import { UndoStep, UndoStepTimeAgo, UndosView } from './undos-view.mjs'
-// Pattern
-import { Pattern } from '@freesewing/react-components/pattern'
-// Menus
-import { DraftMenu } from './menus/draft-menu.mjs'
-import { CoreSettingsMenu, CoreSetting } from './menus/core-settings-menu.mjs'
-import { DesignOptionsMenu, DesignOption } from './menus/design-options-menu.mjs'
-import { UiPreferencesMenu, UiPreference } from './menus/ui-preferences-menu.mjs'
-import { MenuItem, MenuItemGroup, MenuItemTitle } from './menus/containers.mjs'
-import {
- MenuBoolInput,
- MenuConstantInput,
- MenuDegInput,
- MenuEditOption,
- MenuListInput,
- MenuListToggle,
- MenuMmInput,
- //MenuNumberInput,
- MenuUxSettingInput,
- MenuOnlySettingInput,
- MenuPctInput,
- MenuSliderInput,
-} from './menus/shared-inputs.mjs'
-import {
- MenuBoolValue,
- MenuConstantOptionValue,
- MenuCountOptionValue,
- MenuDegOptionValue,
- MenuHighlightValue,
- MenuListOptionValue,
- MenuListValue,
- MenuMmOptionValue,
- MenuMmValue,
- MenuOnlySettingValue,
- MenuPctOptionValue,
- MenuScaleSettingValue,
- MenuShowValue,
-} from './menus/shared-values.mjs'
-import {
- HeaderMenu,
- HeaderMenuAllViews,
- HeaderMenuDraftView,
- HeaderMenuButton,
- HeaderMenuDropdown,
- HeaderMenuDraftViewDesignOptions,
- HeaderMenuDraftViewCoreSettings,
- HeaderMenuDraftViewUiPreferences,
- HeaderMenuDraftViewFlags,
- HeaderMenuDraftViewIcons,
- HeaderMenuIcon,
- HeaderMenuIconSpacer,
- HeaderMenuSaveIcons,
- HeaderMenuUndoIcons,
- HeaderMenuViewMenu,
-} from './header-menu.mjs'
-// Flags
-import { Flag, FlagTypeIcon, FlagsAccordionTitle, FlagsAccordionEntries } from './flags.mjs'
-// View Menu
-import {
- AsideViewMenu,
- AsideViewMenuIcons,
- AsideViewMenuButton,
- AsideViewMenuSpacer,
- ViewTypeIcon,
-} from './aside-view-menu.mjs'
-import { Null } from './null.mjs'
-import { LargeScreenOnly } from './large-screen-only.mjs'
-import { Tooltip } from './tooltip.mjs'
-import { LoadingStatus } from './loading-status.mjs'
-import { Spinner, Loading } from './spinner.mjs'
-import { Tab, Tabs } from './tabs.mjs'
-import { Markdown } from './markdown.mjs'
-import { HtmlSpan } from './html-span.mjs'
-/**
- * This object holds all components that can be swizzled
- */
-const defaultComponents = {
- Accordion,
- AuthWrapper,
- AuthMessageWrapper,
- BackIcon,
- ContactSupport,
- AuthRequired,
- AccountInactive,
- AccountDisabled,
- AccountProhibited,
- AccountStatusUnknown,
- AnchorLink,
- AsideViewMenu,
- AsideViewMenuIcons,
- AsideViewMenuButton,
- AsideViewMenuSpacer,
- RoleLacking,
- ConsentLacking,
- BaseAccordion,
- BookmarkedSetPicker,
- ButtonFrame,
- CardLink,
- CircleIcon,
- CoreSetting,
- CoreSettingsMenu,
- CuratedMeasurementsSetIcon,
- CuratedMeasurementsSetLineup,
- CuratedSetPicker,
- DesignOption,
- DesignOptionsMenu,
- DesignsView,
- DraftMenu,
- DraftView,
- ErrorView,
- SaveView,
- Flag,
- FlagsAccordionTitle,
- FlagsAccordionEntries,
- FlagTypeIcon,
- FormControl,
- HeaderMenu,
- HeaderMenuAllViews,
- HeaderMenuDraftView,
- HeaderMenuDraftViewDesignOptions,
- HeaderMenuDraftViewCoreSettings,
- HeaderMenuDraftViewUiPreferences,
- HeaderMenuDraftViewFlags,
- HeaderMenuDraftViewIcons,
- HeaderMenuButton,
- HeaderMenuDropdown,
- HeaderMenuIcon,
- HeaderMenuIconSpacer,
- HeaderMenuSaveIcons,
- HeaderMenuUndoIcons,
- HtmlSpan,
- LargeScreenOnly,
- Link,
- ListInput,
- Loading,
- LoadingStatus,
- Markdown,
- MarkdownInput,
- MeasurementInput,
- MeasurementsSetCard,
- MeasurementsView,
- MeasurementsEditor,
- MenuIcon,
- NumberInput,
- Null,
- PageLink,
- Pattern,
- PatternLayout,
- Popout,
- StringInput,
- SubAccordion,
- Spinner,
- SpinnerIcon,
- Tab,
- Tabs,
- TemporaryLoader,
- ToggleInput,
- Tooltip,
- UiPreferencesMenu,
- UiPreference,
- UndoStep,
- UndoStepTimeAgo,
- UndosView,
- UserSetPicker,
- Ux,
- HeaderMenuViewMenu,
- ViewPicker,
- ViewTypeIcon,
- WebLink,
- ZoomablePattern,
- ZoomContextProvider,
- // icons
- ApplyIcon,
- BeakerIcon,
- BookmarkIcon,
- BoolNoIcon,
- BoolYesIcon,
- CloseIcon,
- DesignIcon,
- DetailIcon,
- DocsIcon,
- DownIcon,
- EditIcon,
- ExpandIcon,
- ExportIcon,
- FailureIcon,
- FlagIcon,
- FlagNoteIcon,
- FlagInfoIcon,
- FlagTipIcon,
- FlagWarningIcon,
- FlagErrorIcon,
- FlagFixmeIcon,
- FlagExpandIcon,
- FlagOtionsIcon,
- GaugeIcon,
- GroupIcon,
- HelpIcon,
- IncludeIcon,
- KioskIcon,
- LeftIcon,
- ListIcon,
- LockIcon,
- MarginIcon,
- MeasurementsIcon,
- MeasurementsSetIcon,
- NoIcon,
- OkIcon,
- OptionsIcon,
- PaperlessIcon,
- PlusIcon,
- PrintIcon,
- ResetAllIcon,
- ResetIcon,
- RightIcon,
- RocketIcon,
- RotateIcon,
- SaIcon,
- SaveIcon,
- SaveAsIcon,
- ScaleIcon,
- SettingsIcon,
- SuccessIcon,
- TipIcon,
- TrashIcon,
- UiIcon,
- UndoIcon,
- UnitsIcon,
- UpIcon,
- UploadIcon,
- UxIcon,
- XrayIcon,
- ViewDraftIcon,
- ViewMeasurementsIcon,
- ViewTestIcon,
- ViewTimingIcon,
- ViewPrintLayoutIcon,
- ViewSaveIcon,
- ViewExportIcon,
- ViewEditSettingsIcon,
- ViewLogsIcon,
- ViewInspectIcon,
- ViewDocsIcon,
- ViewDesignsIcon,
- ViewViewPickerIcon,
- ViewUndosIcon,
- // menus
- MenuItem,
- MenuItemGroup,
- MenuItemTitle,
- MenuBoolInput,
- MenuConstantInput,
- MenuDegInput,
- MenuEditOption,
- MenuListInput,
- MenuListToggle,
- MenuMmInput,
- //MenuNumberInput,
- MenuUxSettingInput,
- MenuOnlySettingInput,
- MenuPctInput,
- MenuSliderInput,
- MenuBoolValue,
- MenuConstantOptionValue,
- MenuCountOptionValue,
- MenuDegOptionValue,
- MenuHighlightValue,
- MenuListOptionValue,
- MenuListValue,
- MenuMmOptionValue,
- MenuMmValue,
- MenuOnlySettingValue,
- MenuPctOptionValue,
- MenuScaleSettingValue,
- MenuShowValue,
-}
-
-/*
- * This method returns a component that can be swizzled
- * So either the passed-in component, or the default one
- */
-const swizzleComponents = (components = {}, Swizzled) => {
- /*
- * We need to return all resulting components, swizzled or not
- * So we create this object so we can pass that down
- */
- const all = {}
- for (let [name, Component] of Object.entries(defaultComponents)) {
- all[name] = components[name]
- ? (props) => components[name]({ Swizzled, ...props })
- : (props) =>
- }
-
- /*
- * Return all components
- */
- return all
-}
-
-/*
- * Named exports
- */
-export {
- swizzleComponents,
- // Re-export all components for specific imports
- Accordion,
- AuthWrapper,
- AuthMessageWrapper,
- BackIcon,
- ContactSupport,
- AuthRequired,
- AccountInactive,
- AccountDisabled,
- AccountProhibited,
- AccountStatusUnknown,
- AnchorLink,
- AsideViewMenu,
- AsideViewMenuIcons,
- AsideViewMenuButton,
- AsideViewMenuSpacer,
- RoleLacking,
- ConsentLacking,
- BaseAccordion,
- BookmarkedSetPicker,
- ButtonFrame,
- CardLink,
- CircleIcon,
- CoreSetting,
- CoreSettingsMenu,
- CuratedMeasurementsSetIcon,
- CuratedMeasurementsSetLineup,
- CuratedSetPicker,
- DesignOption,
- DesignOptionsMenu,
- DesignsView,
- DraftMenu,
- DraftView,
- ErrorView,
- SaveView,
- Flag,
- FlagsAccordionTitle,
- FlagsAccordionEntries,
- FlagTypeIcon,
- FormControl,
- HeaderMenu,
- HeaderMenuAllViews,
- HeaderMenuDraftView,
- HeaderMenuDraftViewDesignOptions,
- HeaderMenuDraftViewCoreSettings,
- HeaderMenuDraftViewUiPreferences,
- HeaderMenuDraftViewFlags,
- HeaderMenuDraftViewIcons,
- HeaderMenuButton,
- HeaderMenuDropdown,
- HeaderMenuIcon,
- HeaderMenuIconSpacer,
- HeaderMenuSaveIcons,
- HeaderMenuUndoIcons,
- HtmlSpan,
- LargeScreenOnly,
- Link,
- ListInput,
- Loading,
- LoadingStatus,
- Markdown,
- MarkdownInput,
- MeasurementInput,
- MeasurementsSetCard,
- MeasurementsView,
- MeasurementsEditor,
- MenuIcon,
- NumberInput,
- Null,
- PageLink,
- Pattern,
- PatternLayout,
- Popout,
- StringInput,
- SubAccordion,
- Spinner,
- SpinnerIcon,
- Tab,
- Tabs,
- TemporaryLoader,
- ToggleInput,
- Tooltip,
- UiPreferencesMenu,
- UiPreference,
- UndoStep,
- UndoStepTimeAgo,
- UndosView,
- UserSetPicker,
- Ux,
- HeaderMenuViewMenu,
- ViewPicker,
- ViewTypeIcon,
- WebLink,
- ZoomablePattern,
- ZoomContextProvider,
- // icons
- ApplyIcon,
- BeakerIcon,
- BookmarkIcon,
- BoolNoIcon,
- BoolYesIcon,
- CloseIcon,
- DesignIcon,
- DetailIcon,
- DocsIcon,
- DownIcon,
- EditIcon,
- ExpandIcon,
- ExportIcon,
- FailureIcon,
- FlagIcon,
- FlagNoteIcon,
- FlagInfoIcon,
- FlagTipIcon,
- FlagWarningIcon,
- FlagErrorIcon,
- FlagFixmeIcon,
- FlagExpandIcon,
- FlagOtionsIcon,
- GaugeIcon,
- GroupIcon,
- HelpIcon,
- IncludeIcon,
- KioskIcon,
- LeftIcon,
- ListIcon,
- LockIcon,
- MarginIcon,
- MeasurementsIcon,
- MeasurementsSetIcon,
- NoIcon,
- OkIcon,
- OptionsIcon,
- PaperlessIcon,
- PlusIcon,
- PrintIcon,
- ResetAllIcon,
- ResetIcon,
- RightIcon,
- RocketIcon,
- RotateIcon,
- SaIcon,
- SaveIcon,
- SaveAsIcon,
- ScaleIcon,
- SettingsIcon,
- SuccessIcon,
- TipIcon,
- TrashIcon,
- UiIcon,
- UndoIcon,
- UnitsIcon,
- UpIcon,
- UploadIcon,
- UxIcon,
- XrayIcon,
- ViewDraftIcon,
- ViewMeasurementsIcon,
- ViewTestIcon,
- ViewTimingIcon,
- ViewPrintLayoutIcon,
- ViewSaveIcon,
- ViewExportIcon,
- ViewEditSettingsIcon,
- ViewLogsIcon,
- ViewInspectIcon,
- ViewDocsIcon,
- ViewDesignsIcon,
- ViewViewPickerIcon,
- ViewUndosIcon,
- // menus
- MenuItem,
- MenuItemGroup,
- MenuItemTitle,
- MenuBoolInput,
- MenuConstantInput,
- MenuDegInput,
- MenuEditOption,
- MenuListInput,
- MenuListToggle,
- MenuMmInput,
- //MenuNumberInput,
- MenuUxSettingInput,
- MenuOnlySettingInput,
- MenuPctInput,
- MenuSliderInput,
- MenuBoolValue,
- MenuConstantOptionValue,
- MenuCountOptionValue,
- MenuDegOptionValue,
- MenuHighlightValue,
- MenuListOptionValue,
- MenuListValue,
- MenuMmOptionValue,
- MenuMmValue,
- MenuOnlySettingValue,
- MenuPctOptionValue,
- MenuScaleSettingValue,
- MenuShowValue,
-}
diff --git a/packages/react-components/src/editor/swizzle/components/inputs.mjs b/packages/react-components/src/editor/swizzle/components/inputs.mjs
deleted file mode 100644
index 9fa1b579575..00000000000
--- a/packages/react-components/src/editor/swizzle/components/inputs.mjs
+++ /dev/null
@@ -1,349 +0,0 @@
-// Hooks
-import { useState } from 'react'
-
-/*
- * Helper component to wrap a form control with a label
- */
-export const FormControl = ({
- label, // the (top-left) label
- children, // Children to go inside the form control
- docs = false, // Optional top-right label
- labelBL = false, // Optional bottom-left label
- labelBR = false, // Optional bottom-right label
- forId = false, // ID of the for element we are wrapping
- Swizzled, // Object holding swizzled code
-}) => {
- if (labelBR && !labelBL) labelBL =
-
- const topLabelChildren = (
- <>
- {label}
- {docs ? (
-
-
- Swizzled.methods.setModal(
-
- {docs}
-
- )
- }
- >
-
-
-
- ) : null}
- >
- )
- const bottomLabelChildren = (
- <>
- {labelBL ? {labelBL} : null}
- {labelBR ? {labelBR} : null}
- >
- )
-
- return (
-
- {forId ? (
-
- {topLabelChildren}
-
- ) : (
-
{topLabelChildren}
- )}
- {children}
- {labelBL || labelBR ? (
- forId ? (
-
- {bottomLabelChildren}
-
- ) : (
-
{bottomLabelChildren}
- )
- ) : null}
-
- )
-}
-
-/*
- * Helper method to wrap content in a button
- */
-export const ButtonFrame = ({
- children, // Children of the button
- onClick, // onClick handler
- active, // Whether or not to render the button as active/selected
- accordion = false, // Set this to true to not set a background color when active
- dense = false, // Use less padding
-}) => (
-
- {children}
-
-)
-
-/*
- * Input for integers
- */
-export const NumberInput = ({
- label, // Label to use
- update, // onChange handler
- valid, // Method that should return whether the value is valid or not
- current, // The current value
- original, // The original value
- placeholder, // The placeholder text
- docs = false, // Docs to load, if any
- id = '', // An id to tie the input to the label
- labelBL = false, // Bottom-Left label
- labelBR = false, // Bottom-Right label
- max = 0,
- min = 220,
- step = 1,
- Swizzled, // Object holding swizzled code
-}) => (
-
- update(evt.target.value)}
- className={`input w-full input-bordered ${
- current === original ? 'input-secondary' : valid(current) ? 'input-success' : 'input-error'
- }`}
- {...{ max, min, step }}
- />
-
-)
-
-/*
- * Input for strings
- */
-export const StringInput = ({
- label, // Label to use
- update, // onChange handler
- valid, // Method that should return whether the value is valid or not
- current, // The current value
- original, // The original value
- placeholder, // The placeholder text
- docs = false, // Docs to load, if any
- id = '', // An id to tie the input to the label
- labelBL = false, // Bottom-Left label
- labelBR = false, // Bottom-Right label
- Swizzled, // Object holding swizzled code
-}) => (
-
- update(evt.target.value)}
- className={`input w-full input-bordered ${
- current === original ? 'input-secondary' : valid(current) ? 'input-success' : 'input-error'
- }`}
- />
-
-)
-
-/*
- * Input for a list of things to pick from
- */
-export const ListInput = ({
- update, // the onChange handler
- label, // The label
- list, // The list of items to present { val, label, desc }
- current, // The (value of the) current item
- docs = false, // Docs to load, if any
- Swizzled, // Object holding swizzled code
-}) => (
-
- {list.map((item, i) => (
- update(item.val)}
- >
-
-
{item.label}
- {item.desc ? (
-
- {item.desc}
-
- ) : null}
-
-
- ))}
-
-)
-
-/*
- * Input for markdown content
- */
-export const MarkdownInput = ({
- label, // The label
- current, // The current value (markdown)
- update, // The onChange handler
- placeholder, // The placeholder content
- docs = false, // Docs to load, if any
- id = '', // An id to tie the input to the label
- labelBL = false, // Bottom-Left label
- labelBR = false, // Bottom-Right label
- Swizzled, // Swizzled code
-}) => (
-
-
-
-
-
-
-
-
- {current}
-
-
-
-
-)
-
-export const MeasurementInput = ({
- imperial, // True for imperial, False for metric
- m, // The measurement name
- original, // The original value
- update, // The onChange handler
- placeholder, // The placeholder content
- docs = false, // Docs to load, if any
- id = '', // An id to tie the input to the label
- Swizzled, // Swizzled code
-}) => {
- const { t } = Swizzled.methods
- const isDegree = Swizzled.methods.isDegreeMeasurement(m)
- const units = imperial ? 'imperial' : 'metric'
-
- const [localVal, setLocalVal] = useState(
- typeof original === 'undefined'
- ? original
- : isDegree
- ? Number(original)
- : Swizzled.methods.measurementAsUnits(original, units)
- )
- const [validatedVal, setValidatedVal] = useState(
- Swizzled.methods.measurementAsUnits(original, units)
- )
- const [valid, setValid] = useState(null)
-
- // Update onChange
- const localUpdate = (newVal) => {
- setLocalVal(newVal)
- const parsedVal = isDegree
- ? Number(newVal)
- : Swizzled.methods.parseDistanceInput(newVal, imperial)
- if (parsedVal) {
- update(m, isDegree ? parsedVal : Swizzled.methods.measurementAsMm(parsedVal, units))
- setValid(true)
- setValidatedVal(parsedVal)
- } else setValid(false)
- }
-
- if (!m) return null
-
- // Various visual indicators for validating the input
- let inputClasses = 'input-secondary'
- let bottomLeftLabel = null
- if (valid === true) {
- inputClasses = 'input-success'
- const val = `${validatedVal}${isDegree ? '°' : imperial ? '"' : 'cm'}`
- bottomLeftLabel = {val}
- } else if (valid === false) {
- inputClasses = 'input-error'
- bottomLeftLabel = (
- ¯\_(ツ)_/¯
- )
- }
-
- /*
- * I'm on the fence here about using a text input rather than number
- * Obviously, number is the more correct option, but when the user enter
- * text, it won't fire an onChange event and thus they can enter text and it
- * will not be marked as invalid input.
- * See: https://github.com/facebook/react/issues/16554
- */
- return (
-
- localUpdate(evt.target.value)}
- className={`input w-full input-bordered ${inputClasses}`}
- />
-
- )
-}
-
-/*
- * Input for booleans
- */
-export const ToggleInput = ({
- label, // Label to use
- update, // onChange handler
- current, // The current value
- disabled = false, // Allows rendering a disabled view
- list = [true, false], // The values to chose between
- labels = ['Yes', 'No'], // The labels for the values
- on = true, // The value that should show the toggle in the 'on' state
- id = '', // An id to tie the input to the label
- labelTR = false, // Top-Right label
- labelBL = false, // Bottom-Left label
- labelBR = false, // Bottom-Right label
- Swizzled, // Object holding swizzled code
-}) => (
-
- update(list.indexOf(current) === 0 ? list[1] : list[0])}
- className="toggle my-3 toggle-primary"
- checked={list.indexOf(current) === 0 ? true : false}
- />
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/large-screen-only.mjs b/packages/react-components/src/editor/swizzle/components/large-screen-only.mjs
deleted file mode 100644
index e10119cfc44..00000000000
--- a/packages/react-components/src/editor/swizzle/components/large-screen-only.mjs
+++ /dev/null
@@ -1 +0,0 @@
-export const LargeScreenOnly = ({ children }) => {children}
diff --git a/packages/react-components/src/editor/swizzle/components/link.mjs b/packages/react-components/src/editor/swizzle/components/link.mjs
deleted file mode 100644
index 91e05f0d4d3..00000000000
--- a/packages/react-components/src/editor/swizzle/components/link.mjs
+++ /dev/null
@@ -1,48 +0,0 @@
-import Link from 'next/link'
-
-const AnchorLink = ({ id, txt = false, children, Swizzled }) => (
-
- {txt ? txt : children}
-
-)
-
-const PageLink = ({ href, txt = false, children, Swizzled }) => (
-
- {children ? children : txt}
-
-)
-
-const WebLink = ({ href, txt = false, children, Swizzled }) => (
-
- {children ? children : txt}
-
-)
-
-const CardLink = ({
- bg = 'bg-base-200',
- textColor = 'text-base-content',
- href,
- title,
- text,
- icon,
- Swizzled,
-}) => (
-
-
- {title}
- {icon}
-
- {text}
-
-)
-
-export { Link, AnchorLink, PageLink, WebLink, CardLink }
diff --git a/packages/react-components/src/editor/swizzle/components/loaders.mjs b/packages/react-components/src/editor/swizzle/components/loaders.mjs
deleted file mode 100644
index 774cdd91141..00000000000
--- a/packages/react-components/src/editor/swizzle/components/loaders.mjs
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * A temporary loader 'one moment please' style
- * Just a spinner in this case, but could also be branded.
- */
-export const TemporaryLoader = ({ Swizzled = false }) =>
- Swizzled ? : ...
diff --git a/packages/react-components/src/editor/swizzle/components/loading-status.mjs b/packages/react-components/src/editor/swizzle/components/loading-status.mjs
deleted file mode 100644
index c0741fd69a7..00000000000
--- a/packages/react-components/src/editor/swizzle/components/loading-status.mjs
+++ /dev/null
@@ -1,57 +0,0 @@
-import { useEffect } from 'react'
-
-export const LoadingStatus = ({ Swizzled, state, update }) => {
- useEffect(() => {
- if (typeof state._.loading === 'object') {
- for (const conf of Object.values(state._.loading)) {
- if (conf.fadeTimer)
- window.setTimeout(function () {
- update.fadeNotify(conf.id)
- }, conf.fadeTimer)
- if (conf.clearTimer)
- window.setTimeout(function () {
- update.clearNotify(conf.id)
- }, conf.clearTimer)
- }
- }
- }, [state._, update])
-
- if (!state._.loading || Object.keys(state._.loading).length < 1) return null
-
- return (
-
-
- {Object.entries(state._.loading).map(([id, config]) => {
- const conf = {
- ...Swizzled.config.loadingStatus.defaults,
- ...config,
- }
- const Icon =
- typeof conf.icon === 'undefined'
- ? Swizzled.components.Spinner
- : Swizzled.components[`${Swizzled.methods.capitalize(conf.icon)}Icon`] ||
- Swizzled.components.Noop
- return (
-
-
-
-
- {conf.msg}
-
- )
- })}
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/markdown.mjs b/packages/react-components/src/editor/swizzle/components/markdown.mjs
deleted file mode 100644
index 6ff5cedafbf..00000000000
--- a/packages/react-components/src/editor/swizzle/components/markdown.mjs
+++ /dev/null
@@ -1,3 +0,0 @@
-import Markdown from 'react-markdown'
-
-export { Markdown }
diff --git a/packages/react-components/src/editor/swizzle/components/measurements-editor.mjs b/packages/react-components/src/editor/swizzle/components/measurements-editor.mjs
deleted file mode 100644
index b65d0534d8c..00000000000
--- a/packages/react-components/src/editor/swizzle/components/measurements-editor.mjs
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * This MeasurementsEditor component allows inline-editing of the measurements
- *
- * @param {object} props - The component's props
- * @param {function} props.Design - The design constructor
- * @param {object} props.state - The ViewWrapper state object
- * @param {object} props.state.settings - The current settings
- * @param {object} props.update - Helper object for updating the ViewWrapper state
- * @param {object} props.Swizzled - An object holding swizzled code
- * @return {function} MeasurementsEditor - React component
- */
-export const MeasurementsEditor = ({ Design, update, state, Swizzled }) => {
- /*
- * Helper method to handle state updates for measurements
- */
- const onUpdate = (m, newVal) => {
- update.settings(['measurements', m], newVal)
- }
-
- return (
-
-
{Swizzled.methods.t('pe:requiredMeasurements')}
- {Object.keys(Design.patternConfig.measurements).length === 0 ? (
-
({Swizzled.methods.t('account:none')})
- ) : (
-
- {Design.patternConfig.measurements.map((m) => (
- onUpdate(m, newVal)}
- id={`edit-${m}`}
- />
- ))}
-
-
- )}
-
{Swizzled.methods.t('pe:optionalMeasurements')}
- {Object.keys(Design.patternConfig.optionalMeasurements).length === 0 ? (
-
({Swizzled.methods.t('account:none')})
- ) : (
- Design.patternConfig.optionalMeasurements.map((m) => (
-
onUpdate(m, newVal)}
- id={`edit-${m}`}
- />
- ))
- )}
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/measurements-set-card.mjs b/packages/react-components/src/editor/swizzle/components/measurements-set-card.mjs
deleted file mode 100644
index 213f2b8da85..00000000000
--- a/packages/react-components/src/editor/swizzle/components/measurements-set-card.mjs
+++ /dev/null
@@ -1,94 +0,0 @@
-const sizes = { lg: 96, md: 52, sm: 36 }
-
-export const MeasurementsSetCard = ({
- set,
- onClick = false,
- href = false,
- useA = false,
- Design = false,
- language = false,
- size = 'lg',
- Swizzled,
-}) => {
- const s = sizes[size]
- const { t, hasRequiredMeasurements } = Swizzled.methods
- const { NoIcon, OkIcon } = Swizzled.components
-
- const wrapperProps = {
- className: `bg-base-300 aspect-square h-${s} w-${s} mb-2
- mx-auto flex flex-col items-start text-center justify-between rounded-none md:rounded shadow`,
- style: {
- backgroundImage: `url(${Swizzled.methods.cloudImageUrl({ type: 'w500', id: set.img })})`,
- backgroundSize: 'cover',
- backgroundRepeat: 'no-repeat',
- backgroundPosition: '50%',
- },
- }
- if (!set.img || set.img === 'default-avatar')
- wrapperProps.style.backgroundPosition = 'bottom right'
-
- let icon =
- let missingMeasies = ''
- let linebreak = ''
- const maxLength = 75
- if (Design) {
- const [hasMeasies, missing] = hasRequiredMeasurements(Design, set.measies)
- const iconClasses = 'w-8 h-8 p-1 rounded-full -mt-2 -ml-2 shadow'
- icon = hasMeasies ? (
-
- ) : (
-
- )
- if (missing.length > 0) {
- const translated = missing.map((m) => {
- return t(m)
- })
- let missingString = translated.join(', ')
- if (missingString.length > maxLength) {
- const lastSpace = missingString.lastIndexOf(', ', maxLength)
- missingString = missingString.substring(0, lastSpace) + ', ' + '...'
- }
- const measieClasses = 'font-normal text-xs'
- missingMeasies = {missingString}
- linebreak =
- }
- }
-
- const inner = (
- <>
- {icon}
-
- {language ? set[`name${Swizzled.methods.capitalize(language)}`] : set.name}
- {linebreak}
- {missingMeasies}
-
- >
- )
-
- // Is it a button with an onClick handler?
- if (onClick)
- return (
- onClick(set)}>
- {inner}
-
- )
-
- // Returns a link to an internal page
- if (href && !useA)
- return (
-
- {inner}
-
- )
-
- // Returns a link to an external page
- if (href && useA)
- return (
-
- {inner}
-
- )
-
- // Returns a div
- return {inner}
-}
diff --git a/packages/react-components/src/editor/swizzle/components/measurements-view.mjs b/packages/react-components/src/editor/swizzle/components/measurements-view.mjs
deleted file mode 100644
index fd46ebae11a..00000000000
--- a/packages/react-components/src/editor/swizzle/components/measurements-view.mjs
+++ /dev/null
@@ -1,171 +0,0 @@
-import { Fragment, useEffect } from 'react'
-import { horFlexClasses } from '../../utils.mjs'
-
-const iconClasses = { className: 'w-8 h-8 md:w-10 md:h-10 lg:w-12 lg:h-12 shrink-0', stroke: 1.5 }
-
-/**
- * The measurements view is loaded to update/set measurements
- *
- * It will be automatically loaded if we do not have all required measurements for a design.
- *
- * @param {Object} props - All the props
- * @param {Object} props.Swizzled - An object with swizzled components, hooks, methods, and config
- * @param {Function} props.Design - The design constructor
- * @param {string} props.design - The design name
- * @param {Object} props.state - The editor state object
- * @param {Object} props.update - Helper object for updating the ViewWrapper state
- * @param {Array} props.missingMeasurements - List of missing measurements for the current design
- * @return {Function} MeasurementsView - React component
- */
-export const MeasurementsView = ({ Design, missingMeasurements, update, Swizzled, state }) => {
- // Swizzled components
- const {
- Accordion,
- Popout,
- MeasurementsEditor,
- MeasurementsSetIcon,
- UserSetPicker,
- BookmarkIcon,
- BookmarkedSetPicker,
- CuratedMeasurementsSetIcon,
- CuratedSetPicker,
- EditIcon,
- } = Swizzled.components
- // Swizzled methods
- const { t, designMeasurements, capitalize } = Swizzled.methods
- // Swizzled config
- const { config } = Swizzled
- // Editor state
- const { locale } = state
-
- /*
- * If there is no view set, completing measurements will switch to the view picker
- * Which is a bit confusing. So in this case, set the view to measurements.
- */
- useEffect(() => {
- if (!config.views.includes(state.view)) update.view('measurements')
- if (state._.missingMeasurements && state._.missingMeasurements.length > 0)
- update.notify({ msg: t('pe:missingMeasurementsNotify'), icon: 'tip' }, 'missingMeasurements')
- else update.notifySuccess(t('pe:measurementsAreOk'))
- }, [state.view, update])
-
- const loadMeasurements = (set) => {
- update.settings(['measurements'], designMeasurements(Design, set.measies))
- update.settings(['units'], set.imperial ? 'imperial' : 'metric')
- // Save the measurement set name to pattern settings
- if (set[`name${capitalize(locale)}`])
- // Curated measurement set
- update.settings(['metadata'], { setName: set[`name${capitalize(locale)}`] })
- else if (set.name)
- // User measurement set
- update.settings(['metadata'], { setName: set.name })
- }
-
- // Construct accordion items based on the editor configuration
- const items = []
- if (config.enableBackend)
- items.push(
- [
-
-
-
{t('pe:chooseFromOwnSets')}
-
-
- {t('pe:chooseFromOwnSetsDesc')}
- ,
- ,
- 'ownSets',
- ],
- [
-
-
-
{t('pe:chooseFromBookmarkedSets')}
-
-
- {t('pe:chooseFromBookmarkedSetsDesc')}
- ,
- ,
- 'bmSets',
- ],
- [
-
-
-
{t('pe:chooseFromCuratedSets')}
-
-
- {t('pe:chooseFromCuratedSetsDesc')}
- ,
- ,
- 'csets',
- ]
- )
- // Manual editing is always an option
- items.push([
-
-
-
{t('pe:editMeasurements')}
-
-
- {t('pe:editMeasurementsDesc')}
- ,
- ,
- 'edit',
- ])
-
- return (
- <>
-
-
-
{t('pe:measurements')}
- {missingMeasurements && missingMeasurements.length > 0 ? (
-
- {t('pe:missingMeasurementsInfo')}:
-
- {missingMeasurements.map((m, i) => (
-
- {i > 0 ? , : null}
- {t(`measurements:${m}`)}
-
- ))}
-
-
- ({missingMeasurements.length} {t('pe:missingMeasurements')})
-
-
- ) : (
-
- {t('pe:measurementsAreOk')}
-
- update.view('draft')}>
- {t('pe:view.draft.t')}
-
- update.view('picker')}
- >
- {t('pe:chooseAnotherActivity')}
-
-
-
- )}
- {items.length > 1 ?
: items}
-
- >
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/menus/containers.mjs b/packages/react-components/src/editor/swizzle/components/menus/containers.mjs
deleted file mode 100644
index 9ee30172276..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/containers.mjs
+++ /dev/null
@@ -1,272 +0,0 @@
-import { useState, useMemo } from 'react'
-
-/** @type {String} class to apply to buttons on open menu items */
-const iconButtonClass = 'btn btn-xs btn-ghost px-0 text-accent'
-
-/**
- * A generic component for handling a menu item.
- * Wraps the given input in a {@see Collapse} with the appropriate buttons
- * @param {String} options.name the name of the item, for using as a key
- * @param {Object} options.config the configuration for the input
- * @param {Sting|Boolean|Number} options.current the current value of the item
- * @param {Function} options.updateFunc the function that will be called by event handlers to update the value
- * @param {Function} options.t the translation function
- * @param {Object} options.passProps props to pass to the Input component
- * @param {Boolean} changed has the value changed from default?
- * @param {React.Component} Input the input component this menu item will use
- * @param {React.Component} Value a value display component this menu item will use
- * @param {Boolean} allowOverride all a text input to be used to override the given input component
- * @param {Number} ux the user-defined ux level
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const MenuItem = ({
- name,
- Swizzled,
- current,
- updateHandler,
- passProps = {},
- changed,
- Input = () => {},
- allowOverride = false,
- ux = 5,
- docs,
- config,
- Design,
-}) => {
- // Local state - whether the override input should be shown
- const [override, setOverride] = useState(false)
-
- // generate properties to pass to the Input
- const drillProps = useMemo(
- () => ({
- name,
- config,
- ux,
- current,
- updateHandler,
- t: Swizzled.methods.t,
- changed,
- override,
- Design,
- ...passProps,
- }),
- [name, config, current, updateHandler, changed, override, passProps, ux]
- )
-
- if (!config) {
- console.log('no config in containers', { name, current, config })
- return null
- }
-
- // don't render if this item is more advanced than the user has chosen to see
- if (config.ux && config.ux > ux) return null
-
- // get buttons for open and closed states
- const buttons = []
- if (allowOverride)
- buttons.push(
- {
- evt.stopPropagation()
- setOverride(!override)
- }}
- >
-
-
- )
- const ResetButton = ({ disabled = false }) => (
- {
- evt.stopPropagation()
- updateHandler([name], '__UNSET__')
- }}
- >
-
-
- )
-
- buttons.push( )
-
- return (
- {Swizzled.methods.t(`${name}.d`)}}
- id={config.name}
- labelBR={{buttons}
}
- labelBL={
-
- {Swizzled.methods.t(`pe:youAreUsing${changed ? 'ACustom' : 'TheDefault'}Value`)}
-
- }
- docs={docs}
- >
-
-
- )
-}
-
-/**
- * A component for recursively displaying groups of menu items.
- * Accepts any object where menu item configurations are keyed by name
- * Items that are group headings are expected to have an isGroup: true property
- * @param {Boolean} options.collapsible Should this group be collapsible (use false for the top level of a menu)
- * @param {Number} options.ux the user-defined ux level
- * @param {String} options.name the name of the group or item
- * @param {Object} options.currentValues a map of current values for items in the group, keyed by name
- * @param {Object} structure the configuration for the group.
- * @param {React.Component} Icon the icon to display next to closed groups
- * @param {React.Component} Item the component to use for menu items
- * @param {Object} values a map of Value display components to be used by menu items in the group
- * @param {Object} inputs a map of Input components to be used by menu items in the group
- * @param {Object} passProps properties to pass to Inputs within menu items
- * @param {Object} emojis a map of emojis to use as icons for groups or items
- * @param {Function} updateHandler the function called by change handlers on inputs within menu items
- * @param {Boolean} topLevel is this group the top level group? false for nested
- * @param {Function} t translation function
- * @param {object} props.Swizzled - An object holding swizzled code
-
- */
-export const MenuItemGroup = ({
- collapsible = true,
- ux,
- currentValues = {},
- structure,
- Icon,
- Item = false,
- inputs = {},
- values = {},
- passProps = {},
- updateHandler,
- topLevel = false,
- isDesignOptionsGroup = false,
- Design,
- Swizzled,
- state,
-}) => {
- if (!Item) Item = Swizzled.components.MenuItem
-
- // map the entries in the structure
- const content = Object.entries(structure).map(([itemName, item]) => {
- // if it's the isGroup property, or it is false, it shouldn't be shown
- if (itemName === 'isGroup' || item === false) return null
- if (!item) return null
- if (item.ux && ux && item.ux > ux) return null
-
- const ItemIcon = item.icon
- ? item.icon
- : item.isGroup
- ? Swizzled.components.GroupIcon
- : Icon
- ? Icon
- : () => fixme-icon
- const Value = item.isGroup
- ? () => (
-
- {Object.keys(item).filter((i) => i !== 'isGroup').length}
-
-
- )
- : isDesignOptionsGroup
- ? values[Swizzled.methods.designOptionType(item)]
- : values[itemName]
- ? values[itemName]
- : () => ¯\_(ツ)_/¯
-
- return [
-
-
-
-
- {Swizzled.methods.t([`pe:${itemName}.t`, `pe:${itemName}`])}
-
-
-
-
-
-
,
- item.isGroup ? (
-
- ) : (
-
- ),
- itemName,
- ]
- })
-
- return item !== null)} />
-}
-
-/**
- * A generic component to present the title of a menu item
- * @param {String} options.name the name of the item, to act as its translation key
- * @param {Function} options.t the translation function
- * @param {String|React.Component} options.current a the current value, or a Value component to display it
- * @param {Boolean} options.open is the menu item open?
- * @param {String} options.emoji the emoji icon of the menu item
- */
-export const MenuItemTitle = ({
- name,
- current = null,
- open = false,
- emoji = '',
- Icon = false,
- Swizzled,
-}) => (
-
-
- {Icon ? : {emoji} }
- {Swizzled.methods.t([`${name}.t`, name])}
-
- {current}
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/menus/core-settings-menu.mjs b/packages/react-components/src/editor/swizzle/components/menus/core-settings-menu.mjs
deleted file mode 100644
index 673ce6a76bf..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/core-settings-menu.mjs
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * The core settings menu
- * @param {Object} options.update settings and ui update functions
- * @param {Object} options.settings core settings
- * @param {Object} options.patternConfig the configuration from the pattern
- * @param {String} options.language the menu language
- * @param {Object} options.account the user account data
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const CoreSettingsMenu = ({ update, state, language, Design, Swizzled }) => {
- const structure = Swizzled.methods.menuCoreSettingsStructure({
- language,
- units: state.settings?.units,
- sabool: state.settings?.sabool,
- parts: Design.patternConfig.draftOrder,
- })
-
- const inputs = {
- complete: Swizzled.components.MenuListInput,
- expand: Swizzled.components.MenuListInput,
- margin: Swizzled.components.MenuMmInput,
- only: Swizzled.components.MenuOnlySettingInput,
- paperless: Swizzled.components.MenuBoolInput,
- sabool: Swizzled.components.MenuBoolInput,
- samm: Swizzled.components.MenuMmInput,
- scale: Swizzled.components.MenuSliderInput,
- units: Swizzled.components.MenuBoolInput,
- }
-
- const values = {
- complete: Swizzled.components.MenuListValue,
- expand: Swizzled.components.MenuListValue,
- margin: Swizzled.components.MenuMmValue,
- only: Swizzled.components.MenuOnlySettingValue,
- paperless: Swizzled.components.MenuListValue,
- sabool: Swizzled.components.MenuListValue,
- samm: Swizzled.components.MenuMmValue,
- scale: Swizzled.components.MenuScaleSettingValue,
- units: Swizzled.components.MenuListValue,
- }
-
- return (
- (
-
- ),
- isFirst: true,
- name: 'pe:designOptions',
- language: state.locale,
- passProps: {
- ux: state.ui.ux,
- settings: state.settings,
- patternConfig: Design.patternConfig,
- toggleSa: update.toggleSa,
- },
- updateHandler: update.settings,
- isDesignOptionsGroup: false,
- Swizzled,
- state,
- Design,
- inputs,
- values,
- }}
- />
- )
-}
-
-/** A wrapper for {@see MenuItem} to handle core settings-specific business */
-export const CoreSetting = ({
- Swizzled,
- name,
- config,
- ux,
- updateHandler,
- current,
- passProps,
- ...rest
-}) => {
- // is toggling allowed?
- const allowToggle = ux > 3 && config.list?.length === 2
-
- const handlerArgs = {
- updateHandler,
- current,
- config,
- ...passProps,
- }
-
- /*
- * Load a specific update handler if one is configured
- */
- const handler = Swizzled.config.menuCoreSettingsHandlerMethods?.[name.toLowerCase()]
- ? Swizzled.methods[Swizzled.config.menuCoreSettingsHandlerMethods[name.toLowerCase()]](
- handlerArgs
- )
- : updateHandler
-
- return (
-
- )
-}
-
-export const ClearAllButton = ({ setSettings, compact = false, Swizzled }) => {
- return (
-
- setSettings({})}
- >
-
- {Swizzled.methods.t('clearSettings')}
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/menus/design-options-menu.mjs b/packages/react-components/src/editor/swizzle/components/menus/design-options-menu.mjs
deleted file mode 100644
index e061c1821bc..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/design-options-menu.mjs
+++ /dev/null
@@ -1,112 +0,0 @@
-import { useCallback, useMemo } from 'react'
-
-/**
- * The design options menu
- * @param {object} props.Design - An object holding the Design instance
- * @param {String} props.isFirst - Boolean indicating whether this is the first/top entry of the menu
- * @param {Object} props.state - Object holding state
- * @param {Object} props.update - Object holding state handlers
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const DesignOptionsMenu = ({ Design, isFirst = true, state, update, Swizzled }) => {
- const structure = useMemo(
- () => Swizzled.methods.menuDesignOptionsStructure(Design.patternConfig.options, state.settings),
- [Design.patternConfig, state.settings]
- )
- const updateHandler = useCallback(
- (name, value = '__UNSET__') => update.settings(['options', ...name], value),
- [update.settings]
- )
-
- const drillProps = { Design, state, update }
- const inputs = {
- bool: (props) => ,
- constant: (props) => ,
- count: (props) => (
-
- ),
- deg: (props) => ,
- list: (props) => (
-
- ),
- mm: () => FIXME: Mm options are deprecated. Please report this ,
- pct: (props) => ,
- }
- const values = {
- bool: (props) => ,
- constant: (props) => ,
- count: (props) => ,
- deg: (props) => ,
- list: (props) => ,
- mm: (props) => ,
- pct: (props) => ,
- }
-
- return (
- (
-
- ),
- isFirst,
- name: 'pe:designOptions',
- language: state.locale,
- passProps: {
- ux: state.ui.ux,
- settings: state.settings,
- patternConfig: Design.patternConfig,
- },
- updateHandler,
- isDesignOptionsGroup: true,
- Swizzled,
- state,
- Design,
- inputs,
- values,
- }}
- />
- )
-}
-
-/**
- * A wrapper for {@see MenuItem} to handle design option-specific business
- * @param {Object} options.config the config for the item
- * @param {Object} options.settings core settings
- * @param {Object} options.rest the rest of the props
- */
-export const DesignOption = ({ config, settings, ux, inputs, values, Swizzled, ...rest }) => {
- const type = Swizzled.methods.designOptionType(config)
- const Input = inputs[type]
- const Value = values[type]
- const allowOverride = ['pct', 'count', 'deg'].includes(type)
- const allowToggle = (ux > 3 && type === 'bool') || (type == 'list' && config.list.length === 2)
-
- // Hide option?
- if (config?.hide || (typeof config?.hide === 'function' && config.hide(settings))) return null
-
- return (
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/menus/draft-menu.mjs b/packages/react-components/src/editor/swizzle/components/menus/draft-menu.mjs
deleted file mode 100644
index 2ebe13aa6a7..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/draft-menu.mjs
+++ /dev/null
@@ -1,52 +0,0 @@
-export const DraftMenu = ({ Design, pattern, state, Swizzled, update }) => {
- // Swizzled methods
- const { t } = Swizzled.methods
- // Swizzled components
- const { FlagsAccordionTitle, FlagsAccordionEntries, Accordion } = Swizzled.components
-
- const menuProps = { Design, state, Swizzled, pattern, update }
-
- const sections = [
- {
- name: 'designOptions',
- icon: ,
- menu: ,
- },
- {
- name: 'coreSettings',
- icon: ,
- menu: ,
- },
- {
- name: 'uiPreferences',
- icon: ,
- menu: ,
- },
- ]
-
- const items = []
- items.push(
- ...sections.map((section) => [
- <>
-
- {t(`pe:${section.name}.t`)}
- {section.icon}
-
- {t(`pe:${section.name}.d`)}
- >,
- section.menu,
- section.name,
- ])
- )
-
- const flags = pattern.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
-
- if (flags)
- items.push([
- ,
- ,
- 'flags',
- ])
-
- return
-}
diff --git a/packages/react-components/src/editor/swizzle/components/menus/shared-inputs.mjs b/packages/react-components/src/editor/swizzle/components/menus/shared-inputs.mjs
deleted file mode 100644
index c2cb878fa05..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/shared-inputs.mjs
+++ /dev/null
@@ -1,459 +0,0 @@
-import { useMemo, useCallback, useState } from 'react'
-
-/** A boolean version of {@see MenuListInput} that sets up the necessary configuration */
-export const MenuBoolInput = (props) => {
- const { name, config, Swizzled } = props
- const boolConfig = useBoolConfig(name, config)
-
- return
-}
-
-/** A placeholder for an input to handle constant values */
-export const MenuConstantInput = ({
- type = 'number',
- name,
- current,
- updateHandler,
- changed,
- config,
-}) => (
- <>
- updateHandler([name], evt.target.value)}
- />
- >
-)
-
-/** A {@see MenuSliderInput} to handle degree values */
-export const MenuDegInput = (props) => {
- const { updateHandler } = props
- const { MenuSliderInput } = props.Swizzled.components
- const { round } = props.Swizzled.methods
- const degUpdateHandler = useCallback(
- (path, newVal) => {
- updateHandler(path, newVal === undefined ? undefined : Number(newVal))
- },
- [updateHandler]
- )
- return (
-
- )
-}
-
-/**
- * An input for selecting and item from a list
- * @param {String} options.name the name of the property this input changes
- * @param {Object} options.config configuration for the input
- * @param {String|Number} options.current the current value of the input
- * @param {Function} options.updateFunc the function called by the event handler to update the value
- * @param {Boolean} options.compact include descriptions with the list items?
- * @param {Function} options.t translation function
- * @param {String} design name of the design
- * @param {Boolean} isDesignOption Whether or not it's a design option
- */
-export const MenuListInput = ({
- name,
- config,
- current,
- updateHandler,
- compact = false,
- t,
- changed,
- design,
- isDesignOption = false,
- Swizzled,
-}) => {
- const handleChange = useSharedHandlers({
- dflt: config.dflt,
- updateHandler,
- name,
- isDesignOption,
- })
-
- return config.list.map((entry) => {
- const titleKey = config.choiceTitles
- ? config.choiceTitles[entry]
- : isDesignOption
- ? `${design}:${name}.${entry}`
- : `${name}.o.${entry}`
- const title = config.titleMethod ? config.titleMethod(entry, t) : t(`${titleKey}.t`)
- const desc = config.valueMethod ? config.valueMethod(entry, t) : t(`${titleKey}.d`)
- const sideBySide = config.sideBySide || desc.length + title.length < 42
-
- return (
- handleChange(entry)}
- >
-
-
{title}
- {compact ? null :
{desc}
}
-
-
- )
- })
-}
-
-/** a toggle input for list/boolean values */
-export const MenuListToggle = ({ config, changed, updateHandler, name }) => {
- const boolConfig = useBoolConfig(name, config)
- const handleChange = useSharedHandlers({ dflt: boolConfig.dflt, updateHandler, name })
-
- const dfltIndex = boolConfig.list.indexOf(boolConfig.dflt)
-
- const doToggle = () =>
- handleChange(boolConfig.list[changed ? dfltIndex : Math.abs(dfltIndex - 1)])
-
- const checked = boolConfig.dflt == false ? changed : !changed
-
- return (
- evt.stopPropagation()}
- />
- )
-}
-
-export const MenuMmInput = (props) => {
- const { units, updateHandler, current, config } = props
- const { MenuSliderInput } = props.Swizzled.components
- const mmUpdateHandler = useCallback(
- (path, newCurrent) => {
- const calcCurrent =
- typeof newCurrent === 'undefined'
- ? undefined
- : props.Swizzled.methods.measurementAsMm(newCurrent, units)
- updateHandler(path, calcCurrent)
- },
- [updateHandler, units]
- )
-
- // add a default step that's appropriate to the unit. can be overwritten by config
- const defaultStep = units === 'imperial' ? 0.125 : 0.1
-
- return (
-
- units === 'imperial' ? props.Swizzle.methods.formatFraction128(val, null) : val,
- suffix: units === 'imperial' ? '"' : 'cm',
- }}
- />
- )
-}
-
-/**
- * A number input that accepts comma or period decimal separators.
- * Because our use case is almost never going to include thousands, we're using a very simple way of accepting commas:
- * The validator checks for the presence of a single comma or period followed by numbers
- * The parser replaces a single comma with a period
- *
- * optionally accepts fractions
- * @param {Number} options.val the value of the input
- * @param {Function} options.onUpdate a function to handle when the value is updated to a valid value
- * @param {Boolean} options.fractions should the input allow fractional input
- */
-//export const MenuNumberInput = ({
-// value,
-// onUpdate,
-// onMount,
-// className,
-// fractions = true,
-// min = -Infinity,
-// max = Infinity,
-// swizzled,
-//}) => {
-// const valid = useRef(validateVal(value, fractions, min, max))
-//
-// const handleChange = useCallback(
-// (newVal) => {
-// // only actually update if the value is valid
-// if (typeof onUpdate === 'function') {
-// onUpdate(valid.current, newVal)
-// }
-// },
-// [onUpdate, valid]
-// )
-//
-// // onChange
-// const onChange = useCallback(
-// (evt) => {
-// const newVal = evt.target.value
-// // set validity so it will display
-// valid.current = validateVal(newVal, fractions, min, max)
-//
-// // handle the change
-// handleChange(newVal)
-// },
-// [fractions, min, max, valid]
-// )
-//
-// const val = typeof value === 'undefined' ? config.dflt : value
-//
-// useEffect(() => {
-// if (typeof onMount === 'function') {
-// onMount(valid.current)
-// }
-// }, [onMount, valid])
-//
-// return (
-//
-// )
-//}
-
-/** A {@see SliderInput} to handle percentage values */
-export const MenuPctInput = ({ current, changed, updateHandler, config, Swizzled, ...rest }) => {
- const factor = 100
- let pctCurrent = changed ? Swizzled.methods.menuRoundPct(current, factor) : current
- const pctUpdateHandler = useCallback(
- (path, newVal) =>
- updateHandler(
- path,
- newVal === undefined ? undefined : Swizzled.methods.menuRoundPct(newVal, 1 / factor)
- ),
- [updateHandler]
- )
-
- return (
-
- )
-}
-
-/**
- * An input component that uses a slider to change a number value
- * @param {String} options.name the name of the property being changed by the input
- * @param {Object} options.config configuration for the input
- * @param {Number} options.current the current value of the input
- * @param {Function} options.updateHandler the function called by the event handler to update the value
- * @param {Function} options.t translation function
- * @param {Boolean} options.override open the text input to allow override of the slider?
- * @param {String} options.suffix a suffix to append to value labels
- * @param {Function} options.valFormatter a function that accepts a value and formats it for display as a label
- * @param {Function} options.setReset a setter for the reset function on the parent component
- */
-export const MenuSliderInput = ({
- name,
- config,
- current,
- updateHandler,
- override,
- suffix = '',
- valFormatter = (val) => val,
- setReset,
- children,
- changed,
- Swizzled,
-}) => {
- const { max, min } = config
- const handleChange = useSharedHandlers({
- current,
- dflt: config.dflt,
- updateHandler,
- name,
- setReset,
- })
-
- const val = typeof current === 'undefined' ? config.dflt : current
-
- if (override)
- return (
- <>
-
-
-
- {children}
- >
- )
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
- handleChange(evt.target.value)}
- className={`
- range range-sm mt-1
- ${changed ? 'range-accent' : 'range-secondary'}
- `}
- />
- {children}
- >
- )
-}
-
-export const MenuEditOption = (props) => {
- const [manualEdit, setManualEdit] = useState(props.current)
- const { config, handleChange, Swizzled } = props
- const type = Swizzled.methods.designOptionType(config)
-
- const onUpdate = useCallback(
- (validVal) => {
- if (validVal !== null && validVal !== false) handleChange(validVal)
- },
- [handleChange]
- )
-
- if (!['pct', 'count', 'deg', 'mm'].includes(type))
- return This design option type does not have a component to handle manual input.
-
- return (
-
-
-
- {Swizzled.methods.t('pe:enterCustomValue')} ({Swizzled.config.menuOptionEditLabels[type]})
-
-
-
-
- onUpdate(manualEdit)}>
-
-
-
-
- )
-}
-
-/**
- * A hook to get the change handler for an input.
- * @param {Number|String|Boolean} options.dflt the default value for the input
- * @param {Function} options.updateHandler the onChange
- * @param {string} options.name the name of the property being changed
- * @return the change handler for the input
- */
-const useSharedHandlers = ({ dflt, updateHandler, name, isDesignOption }) => {
- return useCallback(
- (newCurrent = '__UNSET__') => {
- /*
- * When a design option is set to the default, just unset it instead
- * This is both more efficient, and makes it easy to see in which ways
- * your pattern differs from the defaults
- */
- if (isDesignOption && newCurrent === dflt) newCurrent = '__UNSET__'
- updateHandler([name], newCurrent)
- },
- [dflt, updateHandler, name, isDesignOption]
- )
-}
-
-/** get the configuration that allows a boolean value to use the list input */
-const useBoolConfig = (name, config) => {
- return useMemo(
- () => ({
- list: [false, true],
- choiceTitles: {
- false: `${name}No`,
- true: `${name}Yes`,
- },
- valueTitles: {
- false: 'no',
- true: 'yes',
- },
- ...config,
- }),
- [name, config]
- )
-}
-
-/** an input for the 'only' setting. toggles individual parts*/
-export const MenuOnlySettingInput = (props) => {
- const { Swizzled, config } = props
- const { t } = Swizzled.methods
- config.sideBySide = true
- config.titleMethod = (entry, t) => {
- const chunks = entry.split('.')
- return {t(`${chunks[0]}:${chunks[1]}`)}
- }
- config.valueMethod = (entry) => (
- {Swizzled.methods.capitalize(entry.split('.')[0])}
- )
- config.dense = true
- // Sort alphabetically (translated)
- const order = []
- for (const part of config.list) {
- const [ns, name] = part.split('.')
- order.push(t(`${ns}:${name}`) + `|${part}`)
- }
- order.sort()
- config.list = order.map((entry) => entry.split('|')[1])
-
- return
-}
-
-export const MenuUxSettingInput = (props) => {
- const { state, update, Swizzled } = props
-
- return (
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/menus/shared-values.mjs b/packages/react-components/src/editor/swizzle/components/menus/shared-values.mjs
deleted file mode 100644
index c94b6da8866..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/shared-values.mjs
+++ /dev/null
@@ -1,142 +0,0 @@
-import { mergeOptions } from '@freesewing/core'
-
-/** Displays that constant values are not implemented in the front end */
-export const MenuConstantOptionValue = () => (
- FIXME: No ConstantOptionvalue implemented
-)
-
-/** Displays a count value*/
-export const MenuCountOptionValue = ({ Swizzled, config, current, changed }) => (
-
-)
-
-/** Displays a degree value */
-export const MenuDegOptionValue = ({ config, current, changed, Swizzled }) => (
-
- {' '}
- {changed ? current : config.deg}°
-
-)
-
-/**
- * A component to highlight a changed value
- * @param {Boolean} changed - Whether the value is changed or not
- * @param {Function} children - The React children
- */
-export const MenuHighlightValue = ({ changed, children }) => (
- {children}
-)
-
-/** Displays a list option value */
-export const MenuListOptionValue = (props) => (
- props.Swizzled.methods.t(`${props.design}:${props.config.name}.${input}.t`)}
- />
-)
-
-/**
- * Displays the correct, translated value for a list
- * @param {String|Boolean} options.current the current value, if it has been changed
- * @param {Function} options.t a translation function
- * @param {Object} options.config the item config
- * @param {Boolean} options.changed has the value been changed?
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const MenuListValue = ({ current, config, changed, Swizzled }) => {
- // get the values
- const val = changed ? current : config.dflt
-
- // key will be based on a few factors
- let key
- // are valueTitles configured?
- if (config.valueTitles) key = config.valueTitles[val]
- // if not, is the value a string
- else if (typeof val === 'string') key = val
- // otherwise stringify booleans
- else if (val) key =
- else key =
-
- const translated =
- config.doNotTranslate || typeof key !== 'string' ? key : Swizzled.methods.t(key)
-
- return (
-
- {translated}
-
- )
-}
-
-/** Displays the corrent, translated value for a boolean */
-export const MenuBoolValue = MenuListOptionValue
-
-/** Displays the MmOptions are not supported */
-export const MenuMmOptionValue = () => (
- FIXME: No Mm Options are not supported
-)
-
-/** Displays a formated mm value based on the current units */
-export const MenuMmValue = ({ current, config, units, changed, Swizzled }) => (
-
-
-
-)
-
-/** Displays the current percentage value, and the absolute value if configured
- *
- **************************************************************************
- * SliderIcon Title THIS *
- * min% max% *
- * ----------------------0----------------------------------------------- *
- * msg PencilIcon ResetIcon *
- **************************************************************************
- * */
-export const MenuPctOptionValue = ({
- config,
- current,
- settings,
- changed,
- patternConfig,
- Swizzled,
-}) => {
- const val = changed ? current : config.pct / 100
-
- return (
-
- {Swizzled.methods.formatPercentage(val)}
- {config.toAbs && settings?.measurements
- ? ` | ${Swizzled.methods.formatMm(
- config.toAbs(val, settings, mergeOptions(settings, patternConfig.options))
- )}`
- : null}
-
- )
-}
-
-/**
- * A component to display a value, highligting it if it changed
- * @param {Number|String|Boolean} options.current - The current value, if it has been changed
- * @param {Number|String|Boolean} options.dflt - The default value
- * @param {Boolean} options.changed - Has the value been changed?
- */
-export const MenuShowValue = ({ Swizzled, current, dflt, changed }) => {
- const { MenuHighlightValue } = Swizzled.components
-
- return {changed ? current : dflt}
-}
-
-export const MenuScaleSettingValue = ({ Swizzled, current, config, changed }) => (
-
-)
-
-export const MenuOnlySettingValue = ({ Swizzled, current, config }) => (
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/menus/ui-preferences-menu.mjs b/packages/react-components/src/editor/swizzle/components/menus/ui-preferences-menu.mjs
deleted file mode 100644
index b28f57436a6..00000000000
--- a/packages/react-components/src/editor/swizzle/components/menus/ui-preferences-menu.mjs
+++ /dev/null
@@ -1,60 +0,0 @@
-export const UiPreferencesMenu = ({ Swizzled, update, state, Design }) => {
- const structure = Swizzled.methods.menuUiPreferencesStructure()
-
- const drillProps = { Design, state, update }
- const inputs = {
- ux: (props) => ,
- aside: (props) => ,
- kiosk: (props) => ,
- rotate: (props) => ,
- renderer: (props) => ,
- }
- const values = {
- ux: (props) => ,
- aside: Swizzled.components.MenuListValue,
- kiosk: Swizzled.components.MenuListValue,
- rotate: Swizzled.components.MenuListValue,
- renderer: Swizzled.components.MenuListValue,
- }
-
- return (
- (
-
- ),
- isFirst: true,
- name: 'pe:uiPreferences',
- language: state.locale,
- passProps: {
- ux: state.ui?.ux,
- settings: state.settings,
- patternConfig: Design.patternConfig,
- },
- updateHandler: update.ui,
- isDesignOptionsGroup: false,
- Swizzled,
- state,
- Design,
- inputs,
- values,
- }}
- />
- )
-}
-
-export const UiPreference = ({ Swizzled, name, ux, ...rest }) => (
- 3}
- ux={ux}
- />
-)
diff --git a/packages/react-components/src/editor/swizzle/components/null.mjs b/packages/react-components/src/editor/swizzle/components/null.mjs
deleted file mode 100644
index 4850fbdfb6b..00000000000
--- a/packages/react-components/src/editor/swizzle/components/null.mjs
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * When debugging, you can override this component to catch errors
- * as it is typically used when a component can't be found.
- */
-export const Null = () => null
diff --git a/packages/react-components/src/editor/swizzle/components/pattern-layout.mjs b/packages/react-components/src/editor/swizzle/components/pattern-layout.mjs
deleted file mode 100644
index 1d4602b063e..00000000000
--- a/packages/react-components/src/editor/swizzle/components/pattern-layout.mjs
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * A layout for views that include a drafted pattern
- *
- * @param {object} settings - The pattern settings/state
- * @param {object} ui - The UI settings/state
- * @param {object} update - Object holding methods to manipulate state
- * @param {function} Design - The Design contructor
- * @param {object] pattern - The drafted pattern
- * @param {object} props.Swizzled - An object holding swizzled code
- */
-export const PatternLayout = (props) => {
- const { menu = null, Design, pattern, update, Swizzled } = props
-
- return (
-
-
-
-
-
{props.output}
- {menu ? (
-
- {menu}
-
- ) : null}
-
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/popout.mjs b/packages/react-components/src/editor/swizzle/components/popout.mjs
deleted file mode 100644
index 9eab3dd7ed7..00000000000
--- a/packages/react-components/src/editor/swizzle/components/popout.mjs
+++ /dev/null
@@ -1,102 +0,0 @@
-import React, { useState } from 'react'
-
-const colors = {
- comment: 'secondary',
- note: 'primary',
- tip: 'accent',
- warning: 'error',
- error: 'error',
- fixme: 'warning',
- link: 'secondary',
- related: 'info',
- tldr: 'info',
- none: '',
-}
-
-/**
- * This popout component is a way to make some content stand out
- *
- * @param {object} components - Object holding possibly swizzled components
- * @param {object} methods - Object holding possibly swizzled methods
- */
-export const Popout = (props) => {
- /*
- * Load (swizzled) components
- */
- const { CloseIcon } = props.Swizzled.components
-
- /*
- * Load (swizzled) methods
- */
- const { t } = props.Swizzled.methods
-
- 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 || (
- <>
- {t(`pe:${type}`).toUpperCase()}
- |
- >
- )}
-
-
{props.noP ? props.children :
{props.children}
}
-
-
- ) : (
-
-
-
-
-
- {type === 'tldr' ? 'TL;DR' : t(`pe:${type}`).toUpperCase()}
-
-
- {type === 'comment' && (
- <>
- {' '}
- by {props.by}
- >
- )}
-
-
- {props.hideable && (
-
setHide(true)} className="hover:text-secondary" title="Close">
-
-
- )}
-
-
{props.children}
- {type === 'comment' &&
{props.by}
}
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/save-view.mjs b/packages/react-components/src/editor/swizzle/components/save-view.mjs
deleted file mode 100644
index 4c1abb99b67..00000000000
--- a/packages/react-components/src/editor/swizzle/components/save-view.mjs
+++ /dev/null
@@ -1,214 +0,0 @@
-import { useState } from 'react'
-import yaml from 'js-yaml'
-
-export const SaveView = ({ Swizzled, state, update }) => {
- // Hooks
- const backend = Swizzled.hooks.useBackend()
- const { t } = Swizzled.methods
-
- // State
- const [name, setName] = useState(
- `${Swizzled.methods.capitalize(state.design)} / ${Swizzled.methods.shortDate(status.locale)}`
- )
- const [withNotes, setWithNotes] = useState(false)
- const [notes, setNotes] = useState('')
- const [savedId, setSavedId] = useState()
- const [bookmarkedId] = useState() // FIXME
- const [saveAs] = useState(false) // FIXME
-
- const addSettingsToNotes = () => {
- setNotes(
- notes +
- '\n\n#### ' +
- Swizzled.methods.t('pe:settings') +
- '\n\n' +
- '```yaml\n' +
- yaml.dump(state.settings) +
- '````'
- )
- }
-
- const saveAsNewPattern = async () => {
- const loadingId = 'savePatternAs'
- update.startLoading(loadingId)
- const patternData = {
- design: state.design,
- name,
- public: false,
- settings: state.settings,
- data: {},
- }
- if (withNotes) patternData.notes = notes
- const result = await backend.createPattern(patternData)
- if (result.success) {
- const id = result.data.pattern.id
- update.stopLoading(loadingId)
- update.view('draft')
- update.notifySuccess(
-
- {t('pe:patternSavedAs')}:{' '}
-
- /account/pattern?id={id}
-
- ,
- id
- )
- } else update.notifyFailure('oops', loadingId)
- }
-
- const savePattern = async () => {
- //setLoadingStatus([true, 'savingPattern'])
- const patternData = {
- design: state.design,
- settings: state.settings,
- name,
- public: false,
- data: {},
- }
- const result = await backend.updatePattern(saveAs.pattern, patternData)
- if (result.success) {
- //setLoadingStatus([
- // true,
- // <>
- // {t('status:patternSaved')} [#{saveAs.pattern}]
- // >,
- // true,
- // true,
- //])
- setSavedId(saveAs.pattern)
- update.notify({ color: 'success', msg: 'boom' }, saveAs.pattern)
- } //else setLoadingStatus([true, 'backendError', true, false])
- }
-
- //const bookmarkPattern = async () => {
- // setLoadingStatus([true, 'creatingBookmark'])
- // const result = await backend.createBookmark({
- // type: 'pattern',
- // title: name,
- // url: window.location.pathname + window.location.search + window.location.hash,
- // })
- // if (result.success) {
- // const id = result.data.bookmark.id
- // setLoadingStatus([
- // true,
- // <>
- // {t('status:bookmarkCreated')} [#{id}]
- // >,
- // true,
- // true,
- // ])
- // setBookmarkedId(id)
- // } else setLoadingStatus([true, 'backendError', true, false])
- //}
-
- return (
-
-
-
- {saveAs && saveAs.pattern ? (
- <>
-
{t('pe:savePattern')}
- {savedId && (
-
- {t('workbend:patternSaved')}
- {t('pe:see')}:{' '}
-
-
- )}
-
-
- {t('pe:savePattern')} #{saveAs.pattern}
-
- >
- ) : null}
-
{t('pe:saveAsNewPattern')}
- {bookmarkedId && (
-
- {t('pe:patternBookmarkCreated')}
- {t('pe:see')}:{' '}
-
-
- )}
-
-
- {withNotes ? (
-
- setWithNotes(false)}
- >
- {t('pe:hideNotes')}
-
-
- {t('pe:addSettingsToNotes')}
-
-
- ) : (
- setWithNotes(true)}
- >
- {t('pe:addNotes')}
-
- )}
- >
- }
- />
- {withNotes ? (
-
- ) : null}
-
-
- {t('pe:cancel')}
-
-
-
- {t('pe:saveAsNewPattern')}
-
-
-
- To access your saved patterns, go to:{' '}
-
-
- /account/patterns
-
-
-
-
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/sets.mjs b/packages/react-components/src/editor/swizzle/components/sets.mjs
deleted file mode 100644
index 54d77e1bca6..00000000000
--- a/packages/react-components/src/editor/swizzle/components/sets.mjs
+++ /dev/null
@@ -1,225 +0,0 @@
-import { useState, useEffect } from 'react'
-import orderBy from 'lodash.orderby'
-
-export const UserSetPicker = ({
- Design,
- clickHandler,
- missingClickHandler,
- size = 'lg',
- Swizzled,
-}) => {
- // Swizzled components
- const { Popout, MeasurementsSetCard } = Swizzled.components
- // Swizzled hooks
- const { useBackend } = Swizzled.hooks
- const backend = useBackend()
- // Swizzled methods
- const { t, hasRequiredMeasurements } = Swizzled.methods
- // Swizzled config
- const { config } = Swizzled
-
- // Local state
- const [sets, setSets] = useState({})
-
- // Effects
- useEffect(() => {
- const getSets = async () => {
- const result = await backend.getSets()
- if (result.success) {
- const all = {}
- for (const set of result.data.sets) all[set.id] = set
- setSets(all)
- }
- }
- getSets()
- }, [backend])
- let hasSets = false
- const okSets = []
- const lackingSets = []
- if (Object.keys(sets).length > 0) {
- hasSets = true
- for (const setId in sets) {
- const [hasMeasies] = hasRequiredMeasurements(Design, sets[setId].measies)
- if (hasMeasies) okSets.push(sets[setId])
- else lackingSets.push(sets[setId])
- }
- }
-
- if (!hasSets)
- return (
-
-
- {t('pe:noOwnSets')}
- {t('pe:noOwnSetsMsg')}
- {config.hrefNewSet ? (
-
- {t('pe:newSet')}
-
- ) : null}
- {t('pe:pleaseMtm')}
-
-
- )
-
- return (
- <>
- {okSets.length > 0 && (
-
- {okSets.map((set) => (
-
- ))}
-
- )}
- {lackingSets.length > 0 ? (
-
-
- {t('pe:someSetsLacking')}
-
-
- {lackingSets.map((set) => (
-
- ))}
-
-
- ) : null}
- >
- )
-}
-
-export const BookmarkedSetPicker = ({
- Design,
- clickHandler,
- missingClickHandler,
- size = 'lg',
- Swizzled,
-}) => {
- // Swizzled components
- const { Popout, MeasurementsSetCard } = Swizzled.components
- // Swizzled hooks
- const { useBackend } = Swizzled.hooks
- const backend = useBackend()
- // Swizzled methods
- const { t, hasRequiredMeasurements } = Swizzled.methods
- // Swizzled config
- const { config } = Swizzled
-
- // Local state
- const [sets, setSets] = useState({})
-
- // Effects
- useEffect(() => {
- const getBookmarks = async () => {
- const result = await backend.getBookmarks()
- const loadedSets = {}
- if (result.success) {
- for (const bookmark of result.data.bookmarks.filter(
- (bookmark) => bookmark.type === 'set'
- )) {
- let set
- try {
- set = await backend.getSet(bookmark.url.slice(6))
- if (set.success) {
- const [hasMeasies] = hasRequiredMeasurements(Design, set.data.set.measies)
- loadedSets[set.data.set.id] = { ...set.data.set, hasMeasies }
- }
- } catch (err) {
- console.log(err)
- }
- }
- }
- setSets(loadedSets)
- }
- getBookmarks()
- }, [])
-
- const okSets = Object.values(sets).filter((set) => set.hasMeasies)
- const lackingSets = Object.values(sets).filter((set) => !set.hasMeasies)
-
- return (
- <>
- {okSets.length > 0 && (
-
- {okSets.map((set) => (
-
- ))}
-
- )}
- {lackingSets.length > 0 && (
-
-
- {t('pe:someSetsLacking')}
-
-
- {lackingSets.map((set) => (
-
- ))}
-
-
- )}
- >
- )
-}
-
-export const CuratedSetPicker = ({ clickHandler, Swizzled, locale }) => {
- // Swizzled components
- const { CuratedMeasurementsSetLineup } = Swizzled.components
- // Swizzled hooks
- const { useBackend } = Swizzled.hooks
- const backend = useBackend()
-
- // Local state
- const [sets, setSets] = useState([])
-
- // Effects
- useEffect(() => {
- const getSets = async () => {
- const result = await backend.getCuratedSets()
- if (result.success) {
- const allSets = {}
- for (const set of result.data.curatedSets) {
- if (set.published) allSets[set.id] = set
- }
- setSets(allSets)
- }
- }
- getSets()
- }, [])
-
- return (
-
-
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/spinner.mjs b/packages/react-components/src/editor/swizzle/components/spinner.mjs
deleted file mode 100644
index 2c1f9ee445a..00000000000
--- a/packages/react-components/src/editor/swizzle/components/spinner.mjs
+++ /dev/null
@@ -1,21 +0,0 @@
-export const Spinner = ({ className = 'h-6 w-6 animate-spin' }) => (
-
-
-
-
-)
-
-export const Loading = () => (
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/tabs.mjs b/packages/react-components/src/editor/swizzle/components/tabs.mjs
deleted file mode 100644
index 29c7ff1df6b..00000000000
--- a/packages/react-components/src/editor/swizzle/components/tabs.mjs
+++ /dev/null
@@ -1,66 +0,0 @@
-import React, { useState } from 'react'
-
-export const Tabs = ({ tabs = '', active = 0, children, withModal = false, Swizzled }) => {
- // Keep active tab in state
- const [activeTab, setActiveTab] = useState(active)
-
- /*
- * In MDX, tabs are passed as a comma-seperated list.
- * In React, they come as an array.
- * So we need to handle both cases.
- */
- const tablist = Array.isArray(tabs) ? tabs : tabs.split(',').map((tab) => tab.trim())
-
- /*
- * Don't bother unless there's actual tabs to show
- */
- if (!tablist) return null
-
- /*
- * Pass down activeTab and tabId for conditional rendering
- */
- const childrenWithTabSetter = children.map((child, tabId) =>
- React.cloneElement(child, { activeTab, tabId, key: tabId })
- )
-
- return (
-
-
- {tablist.map((title, tabId) => {
- const btnClasses = `text-lg font-bold capitalize tab h-auto tab-bordered grow py-2 ${
- activeTab === tabId ? 'tab-active' : ''
- }`
-
- return withModal && activeTab === tabId ? (
-
- Swizzled.methods.setModal(
-
- {childrenWithTabSetter}
-
- )
- }
- >
- {title}
-
-
- ) : (
- setActiveTab(tabId)}>
- {title}
-
- )
- })}
-
-
{childrenWithTabSetter}
-
- )
-}
-
-export const Tab = ({ children, tabId, activeTab }) => (activeTab === tabId ? children : null)
diff --git a/packages/react-components/src/editor/swizzle/components/tooltip.mjs b/packages/react-components/src/editor/swizzle/components/tooltip.mjs
deleted file mode 100644
index 4e704e66dd9..00000000000
--- a/packages/react-components/src/editor/swizzle/components/tooltip.mjs
+++ /dev/null
@@ -1,13 +0,0 @@
-export const Tooltip = (props) => {
- const { children, tip, ...rest } = props
-
- return (
-
- {children}
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/undos-view.mjs b/packages/react-components/src/editor/swizzle/components/undos-view.mjs
deleted file mode 100644
index 2093d8aad07..00000000000
--- a/packages/react-components/src/editor/swizzle/components/undos-view.mjs
+++ /dev/null
@@ -1,144 +0,0 @@
-import orderBy from 'lodash.orderby'
-
-/**
- * The undos view shows the undo history, and allows restoring any undo state
- *
- * @param (object) props - All the props
- * @param {object} props.swizzled - An object with swizzled components, hooks, methods, config, and defaults
- * @param {object} designs - Object holding all designs
- * @param {object} update - ViewWrapper state update object
- */
-export const UndosView = ({ Design, Swizzled, update, state }) => {
- const steps = orderBy(state._.undos, 'time', 'desc')
-
- return (
- <>
-
-
-
{Swizzled.methods.t('pe:view.undos.t')}
-
{Swizzled.methods.t('pe:view.undos.d')}
-
- Tip: Click on any change to undo all changes up to, and including, that change.
-
- {steps.length < 1 ? (
-
- Your undo history is currently empty
- When you make changes to your pattern, they will show up here.
- For example, you can click the button below to change the pattern rotation:
- update.settings('ui.rotate', state.settings?.ui?.rotate ? 0 : 1)}
- >
- {Swizzled.methods.t('pe:example')}: {Swizzled.methods.t('pe:rotate.t')}
-
- As soon as you do, the change will show up here, and you can undo it.
-
- ) : (
-
- {steps.map((step, index) => (
-
- ))}
-
- )}
-
- >
- )
-}
-
-export const UndoStepTimeAgo = ({ Swizzled, step }) => {
- if (!step.time) return null
- const secondsAgo = Math.floor((Date.now() - step.time) / 100) / 10
- const minutesAgo = Math.floor(secondsAgo / 60)
- const hoursAgo = Math.floor(minutesAgo / 60)
-
- return hoursAgo ? (
-
- {hoursAgo} {Swizzled.methods.t('pe:hoursAgo')}
-
- ) : minutesAgo ? (
-
- {minutesAgo} {Swizzled.methods.t('pe:minutesAgo')}
-
- ) : (
-
- {secondsAgo} {Swizzled.methods.t('pe:secondsAgo')}
-
- )
-}
-
-export const UndoStep = ({ Swizzled, update, state, step, Design, compact = false, index = 0 }) => {
- const { t } = Swizzled.methods
-
- /*
- * Ensure path is always an array
- */
- if (!Array.isArray(step.path)) step.path = step.path.split('.')
-
- /*
- * Figure this out once
- */
- const imperial = state.settings?.units === 'imperial' ? true : false
-
- /*
- * Metadata can be ignored
- */
- if (step.name === 'settings' && step.path[1] === 'metadata') return null
-
- /*
- * Defer for anything else to this method
- */
- const data = Swizzled.methods.getUndoStepData({ step, state, Design, imperial })
-
- if (data === false) return {JSON.stringify(step, null, 2)} //null
- if (data === null) return Unsupported
-
- if (compact)
- return (
- update.restore(index, state._)}>
-
-
- {data.msg ? data.msg : t(`pe:${data.optCode}`)}
-
-
- )
-
- return (
- <>
-
-
-
- update.restore(index, state._)}>
-
-
- {data.fieldIcon || null}
- {t(`pe:${data.optCode}`)}
-
-
- {data.icon || null} {t(`pe:${data.titleCode}`)}
-
-
-
- {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/src/editor/swizzle/components/ux.mjs b/packages/react-components/src/editor/swizzle/components/ux.mjs
deleted file mode 100644
index a48f72a2781..00000000000
--- a/packages/react-components/src/editor/swizzle/components/ux.mjs
+++ /dev/null
@@ -1,12 +0,0 @@
-export const Ux = ({ Swizzled, ux = 0 }) => (
-
- {[0, 1, 2, 3, 4].map((i) => (
-
- ))}
-
-)
diff --git a/packages/react-components/src/editor/swizzle/components/view-picker.mjs b/packages/react-components/src/editor/swizzle/components/view-picker.mjs
deleted file mode 100644
index 0b84fe656fc..00000000000
--- a/packages/react-components/src/editor/swizzle/components/view-picker.mjs
+++ /dev/null
@@ -1,111 +0,0 @@
-import { useState } from 'react'
-
-/**
- * The design view is loaded if and only if not design is passed to the editor
- *
- * @param (object) props - All the props
- * @param {object} props.swizzled - An object with swizzled components, hooks, methods, config, and defaults
- * @param {object} designs - Object holding all designs
- * @param {object} update - ViewWrapper state update object
- */
-export const ViewPicker = ({ Design, Swizzled, update, state }) => {
- const [showDev, setShowDev] = useState(false)
-
- /*
- * If we don't have the measurments, only present measurements free views
- */
- if (state._.missingMeasurements.length > 1)
- return (
-
-
{Swizzled.methods.t('Choose an activity')}
-
- {Swizzled.config.measurementsFreeViews
- .filter((view) => view !== 'picker')
- .map((view) => (
-
- ))}
-
-
-
{Swizzled.methods.t('pe:measurementsFreeViewsOnly.t')}:
-
{Swizzled.methods.t('pe:measurementsFreeViewsOnly.d')}
-
-
-
-
- )
-
- return (
-
-
{Swizzled.methods.t('Choose an activity')}
-
- {Swizzled.config.mainViews.map((view) => (
-
- ))}
-
-
- {Swizzled.config.extraViews.map((view) => (
-
- ))}
-
- {showDev || state.ui.ux > 3 ? (
-
- {Swizzled.config.devViews.map((view) => (
-
- ))}
-
- ) : null}
- {state.ui.ux < 4 ? (
-
setShowDev(!showDev)}>
- {Swizzled.methods.t(`pe:${showDev ? 'hide' : 'show'}AdvancedOptions`)}
-
- ) : null}
-
- )
-}
-
-const MainCard = ({ view, Swizzled, update, Design }) => {
- const Icon = Swizzled.components[`View${Swizzled.methods.capitalize(view)}Icon`]
- const { NoIcon } = Swizzled.components
- const color = Swizzled.config.mainViewColors[view] || 'neutral'
- return (
- update.view(view)}
- >
-
- {Swizzled.methods.t(`pe:view.${view}.t`)}
- {Icon ? : }
-
-
- {Swizzled.methods.t(`pe:view.${view}.d`, {
- design: `${Design.designConfig.data.name} v${Design.designConfig.data.version}`,
- })}
-
-
- )
-}
-
-const ExtraCard = ({ view, Swizzled, update }) => {
- const Icon = Swizzled.components[`View${Swizzled.methods.capitalize(view)}Icon`]
- const { NoIcon } = Swizzled.components
- return (
- update.view(view)}
- >
-
- {Swizzled.methods.t(`pe:view.${view}.t`)}
- {Icon ? : }
-
- {Swizzled.methods.t(`pe:view.${view}.d`)}
-
- )
-}
diff --git a/packages/react-components/src/editor/swizzle/components/zoomable-pattern.mjs b/packages/react-components/src/editor/swizzle/components/zoomable-pattern.mjs
deleted file mode 100644
index 8d6566c0d16..00000000000
--- a/packages/react-components/src/editor/swizzle/components/zoomable-pattern.mjs
+++ /dev/null
@@ -1,88 +0,0 @@
-import React, { useState, useMemo, useCallback, forwardRef, useContext } from 'react'
-import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'
-
-/*
- * A pattern you can pan and zoom
- */
-export const ZoomablePattern = forwardRef(function ZoomablePatternRef(props, ref) {
- const { renderProps, Swizzled, rotate } = props
- const { onTransformed, setZoomFunctions } = useContext(ZoomContext)
-
- return (
-
-
- {props.children || (
-
- )}
-
-
- )
-})
-
-/*
- * Context
- */
-
-/**
- * A context for managing zoom state of a ZoomablePattern
- * Makes transform handlers to be available in components
- */
-const ZoomContext = React.createContext({})
-
-/**
- * Provider for the ZoomContext
- */
-export const ZoomContextProvider = ({ children }) => {
- const [zoomed, setZoomed] = useState(false)
- const [zoomFunctions, _setZoomFunctions] = useState(false)
-
- const setZoomFunctions = useCallback(
- (zoomInstance) => {
- const reset = () => {
- setZoomed(false)
- zoomInstance.resetTransform()
- }
-
- if (zoomInstance) {
- const { zoomIn, zoomOut, resetTransform } = zoomInstance
- _setZoomFunctions({ zoomIn, zoomOut, resetTransform, reset })
- }
- },
- [_setZoomFunctions, setZoomed]
- )
-
- const onTransformed = useCallback(
- (_ref, state) => {
- setZoomed(state.scale !== 1)
- },
- [setZoomed]
- )
-
- const value = useMemo(() => {
- return {
- zoomed,
- zoomFunctions,
- setZoomFunctions,
- onTransformed,
- }
- }, [zoomed, zoomFunctions, setZoomFunctions, onTransformed])
-
- return {children}
-}
diff --git a/packages/react-components/src/editor/swizzle/config.mjs b/packages/react-components/src/editor/swizzle/config.mjs
deleted file mode 100644
index 5ea04e81f04..00000000000
--- a/packages/react-components/src/editor/swizzle/config.mjs
+++ /dev/null
@@ -1,198 +0,0 @@
-/*************************************************************************
- * *
- * FreeSewing's pattern editor allows swizzling the config *
- * *
- * To 'swizzle' means to replace a default implementation with a *
- * custom one. It allows one to customize the pattern editor. *
- * *
- * This file holds the 'swizzleConfig' method that will return *
- * the merged configuration. *
- * *
- * To use a custom config, simply pas it as a prop into the editor *
- * under the 'config' key. So to pass a custom 'newSet' link (used to *
- * link to a page to create a new measurements set), you do: *
- * *
- * *
- * *
- *************************************************************************/
-
-/*
- * Default config for the FreeSewing pattern editor
- */
-export const defaultConfig = {
- // Enable use of a (FreeSewing) backend to load data from
- enableBackend: true,
- // Link to create a new measurements set, set to false to disable
- hrefNewSet: 'https://freesewing.org/new/set',
- // Cloud default image
- cloudImageDflt:
- 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/365cc64e-1502-4d2b-60e0-cc8beee73f00/public',
- // Cloud image base URL
- cloudImageUrl: 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/',
- // Cloud image variants
- cloudImageVariants: ['public', 'sq100', 'sq200', 'sq500', 'w200', 'w500', 'w1000', 'w2000'],
- // Views
- mainViews: ['draft', 'designs', 'save', 'export'],
- extraViews: ['measurements', 'undos', 'printLayout', 'docs'],
- devViews: ['editSettings', 'inspect', 'logs', 'test', 'timing'],
- utilViews: ['picker'],
- measurementsFreeViews: ['designs', 'measurements', 'docs', 'picker'],
- mainViewColors: {
- draft: 'primary',
- save: 'none',
- export: 'none',
- designs: 'accent',
- measurements: 'primary',
- docs: 'secondary',
- },
- // View components
- // Facilitate lookup of view components
- viewComponents: {
- draft: 'DraftView',
- designs: 'DesignsView',
- save: 'SaveView',
- export: 'ViewPicker',
- measurements: 'MeasurementsView',
- undos: 'UndosView',
- printLayout: 'ViewPicker',
- editSettings: 'ViewPicker',
- docs: 'ViewPicker',
- inspect: 'ViewPicker',
- logs: 'ViewPicker',
- test: 'ViewPicker',
- timing: 'ViewPicker',
- picker: 'ViewPicker',
- error: 'ViewPicker',
- },
- // Facilitate lookup of menu value components
- menuValueComponents: {
- bool: 'BoolValue',
- constant: 'ConstantOptionValue',
- count: 'CountOptionValue',
- deg: 'DegOptionValue',
- list: 'ListOptionValue',
- mm: 'MmOptionValue',
- pct: 'PctOptionValue',
- },
- // Facilitate custom handlers for core settings
- menuCoreSettingsHandlerMethods: {
- only: 'menuCoreSettingsOnlyHandler',
- sabool: 'menuCoreSettingsSaboolHandler',
- samm: 'menuCoreSettingsSammHandler',
- },
- menuGroupEmojis: {
- advanced: '🤓',
- fit: '👕',
- style: '💃🏽',
- dflt: '🕹️',
- groupDflt: '📁',
- },
- menuOptionEditLabels: {
- pct: '%',
- count: '#',
- deg: '°',
- mm: 'mm',
- },
- // i18n
- i18nPatternNamespaces: ['plugin-annotations'],
- // State backend (one of 'react', 'storage', 'session', or 'url')
- stateBackend: 'url',
- // UX levels
- uxLevels: {
- core: {
- sa: 1,
- paperless: 2,
- units: 1,
- complete: 3,
- expand: 4,
- only: 4,
- scale: 3,
- margin: 3,
- },
- ui: {
- renderer: 4,
- aside: 3,
- kiosk: 3,
- rotate: 4,
- ux: 1,
- },
- views: {
- draft: 1,
- measurements: 1,
- test: 4,
- timing: 4,
- printLayout: 2,
- export: 1,
- save: 1,
- undos: 2,
- editSettings: 3,
- logs: 4,
- inspect: 4,
- docs: 1,
- designs: 1,
- picker: 1,
- },
- },
- defaultUx: 4,
- // Flag types
- flagTypes: ['error', 'warn', 'note', 'info', 'tip', 'fixme'],
- // Initial state
- initialState: {
- settings: {},
- ui: {
- renderer: 'react',
- kiosk: 0,
- aside: 1,
- ux: 4,
- },
- locale: 'en',
- },
- loadingStatus: {
- timeout: 2,
- defaults: {
- color: 'secondary',
- icon: 'Spinner',
- },
- },
- classes: {
- horFlex: 'flex flex-row items-center justify-between gap-4 w-full',
- horFlexNoSm: 'md:flex md:flex-row md:items-center md:justify-between md:gap-4 md-w-full',
- link: 'underline decoration-2 hover:decoration-4 text-secondary hover:text-secondary-focus',
- },
- roles: {
- levels: {
- readNone: 0,
- readSome: 1,
- readOnly: 2,
- writeSome: 3,
- user: 4,
- tester: 4,
- curator: 5,
- bughunter: 6,
- support: 8,
- admin: 9,
- },
- base: 'user',
- },
- // Ms before to fade out a notification
- notifyTimeout: 6660,
- degreeMeasurements: ['shoulderSlope'],
-}
-
-/*
- * This method returns the swizzled configuration
- */
-export const swizzleConfig = (config = {}) => {
- const mergedConfig = {
- ...defaultConfig,
- ...config,
- }
- mergedConfig.views = [
- ...mergedConfig.mainViews,
- ...mergedConfig.extraViews,
- ...mergedConfig.devViews,
- ...mergedConfig.utilViews,
- ]
-
- return mergedConfig
-}
diff --git a/packages/react-components/src/editor/swizzle/hooks/index.mjs b/packages/react-components/src/editor/swizzle/hooks/index.mjs
deleted file mode 100644
index ddde3bcc2e5..00000000000
--- a/packages/react-components/src/editor/swizzle/hooks/index.mjs
+++ /dev/null
@@ -1,73 +0,0 @@
-/*************************************************************************
- * *
- * FreeSewing's pattern editor allows swizzling hooks *
- * *
- * To 'swizzle' means to replace the default implementation of a *
- * hook with a custom one. It allows one to customize *
- * the pattern editor. *
- * *
- * This file holds the 'swizzleHooks' method that will return *
- * the various hooks that can be swizzled, or their default *
- * implementation. *
- * *
- * To use a custom version, simply pas it as a prop into the editor *
- * under the 'hooks' key. So to pass a custom 'useAccount' method *
- * (used for loading the user's account data) you do: *
- * *
- * *
- * *
- *************************************************************************/
-
-/*
- * Import of components that can be swizzled
- */
-// useAccount
-import { useAccount } from './use-account.mjs'
-import { useBackend } from './use-backend.mjs'
-import {
- useReactEditorState,
- useStorageEditorState,
- useSessionEditorState,
- useUrlEditorState,
-} from './use-editor-state.mjs'
-
-/*
- * We support different state backend, so let's handle those
- */
-const stateBackends = {
- react: useReactEditorState,
- storage: useStorageEditorState,
- session: useSessionEditorState,
- url: useUrlEditorState,
-}
-
-/**
- * This object holds all hooks that can be swizzled
- */
-const defaultHooks = (config) => ({
- useAccount,
- useBackend,
- useEditorState: stateBackends[config.stateBackend] || useReactEditorState,
-})
-
-/*
- * This method returns hooks that can be swizzled
- * So either the passed-in methods, or the default ones
- */
-export const swizzleHooks = (hooks = {}, Swizzled) => {
- /*
- * We need to return the resulting hooks, swizzled or not
- * So we put this in this object so we can pass that down
- */
- const all = {}
- for (const [name, hook] of Object.entries(defaultHooks(Swizzled.config))) {
- all[name] = hooks[name]
- ? (...params) => hooks[name](Swizzled, ...params)
- : (...params) => hook(Swizzled, ...params)
- }
-
- /*
- * Return all hooks
- */
- return all
-}
diff --git a/packages/react-components/src/editor/swizzle/hooks/use-account.mjs b/packages/react-components/src/editor/swizzle/hooks/use-account.mjs
deleted file mode 100644
index 9e1b7e1a7f9..00000000000
--- a/packages/react-components/src/editor/swizzle/hooks/use-account.mjs
+++ /dev/null
@@ -1,59 +0,0 @@
-import useLocalStorageState from 'use-local-storage-state'
-
-/*
- * Make it possible to always check for account.username and account.ux
- */
-const noAccount = { username: false, ux: 3 }
-
-/*
- * The useAccount hook
- */
-export function useAccount(Swizzled) {
- // (persisted) State (saved to local storage)
- const [account, setAccount] = useLocalStorageState('fs-account', { defaultValue: noAccount })
- const [admin, setAdmin] = useLocalStorageState('fs-admin', { defaultValue: noAccount })
- const [token, setToken] = useLocalStorageState('fs-token', { defaultValue: null })
- const [seenUser, setSeenUser] = useLocalStorageState('fs-seen-user', { defaultValue: false })
-
- // Clear user data. This gets called when signing out
- const signOut = () => {
- setAccount(noAccount)
- setToken(null)
- }
-
- // Impersonate a user.
- // Only admins can do this but that is enforced at the backend.
- const impersonate = (data) => {
- setAdmin({ token, account })
- const newAccount = {
- ...data.account,
- impersonatingAdmin: { id: account.id, username: account.username },
- }
- setAdmin({ token, account: { ...account } })
- setAccount(newAccount)
- setToken(data.token)
- }
-
- const stopImpersonating = () => {
- setAccount(admin.account)
- setToken(admin.token)
- clearAdmin()
- }
-
- const clearAdmin = () => setAdmin(noAccount)
-
- return {
- account,
- setAccount,
- token,
- setToken,
- seenUser,
- setSeenUser,
- signOut,
- admin,
- clearAdmin,
- impersonate,
- stopImpersonating,
- ux: account?.control || account?.ux || Swizzled.config.defaultUx,
- }
-}
diff --git a/packages/react-components/src/editor/swizzle/hooks/use-backend.mjs b/packages/react-components/src/editor/swizzle/hooks/use-backend.mjs
deleted file mode 100644
index c54b3087693..00000000000
--- a/packages/react-components/src/editor/swizzle/hooks/use-backend.mjs
+++ /dev/null
@@ -1,633 +0,0 @@
-// Dependencies
-import axios from 'axios'
-// Hooks
-import { useMemo } from 'react'
-import { freeSewingConfig } from 'shared/config/freesewing.config.mjs'
-
-/*
- * Helper methods to interact with the FreeSewing backend
- */
-const apiHandler = axios.create({
- baseURL: freeSewingConfig.backend,
- timeout: 6660,
-})
-
-const auth = (token) =>
- token ? { headers: { Authorization: 'Bearer ' + token } } : { headers: {} }
-
-/*
- * This api object handles async code for different HTTP methods
- */
-const api = {
- get: async (uri, config = {}) => {
- let result
- try {
- result = await apiHandler.get(uri, config)
- return result
- } catch (err) {
- return err
- }
- },
- post: async (uri, data = null, config = {}) => {
- let result
- try {
- result = await apiHandler.post(uri, data, config)
- return result
- } catch (err) {
- return err
- }
- },
- put: async (uri, data = null, config = {}) => {
- let result
- try {
- result = await apiHandler.put(uri, data, config)
- return result
- } catch (err) {
- return err
- }
- },
- patch: async (uri, data = null, config = {}) => {
- let result
- try {
- result = await apiHandler.patch(uri, data, config)
- return result
- } catch (err) {
- return err
- }
- },
- delete: async (uri, config = {}) => {
- let result
- try {
- result = await apiHandler.delete(uri, config)
- return result
- } catch (err) {
- return err
- }
- },
-}
-
-/*
- * Helper method to handle the response and verify that it was successful
- */
-const responseHandler = (response, expectedStatus = 200, expectData = true) => {
- if (response && response.status === expectedStatus) {
- if (!expectData || response.data) {
- return { success: true, data: response.data, response }
- }
- return { success: true, response }
- }
-
- // Unpack axios errors
- if (response?.name === 'AxiosError')
- return {
- success: false,
- status: response.response?.status,
- data: response.response?.data,
- error: response.message,
- }
-
- return { success: false, response }
-}
-
-function Backend(auth) {
- this.auth = auth
-}
-
-/*
- * backend.signUp: User signup
- */
-Backend.prototype.signUp = async function ({ email, language }) {
- return responseHandler(await api.post('/signup', { email, language }), 201)
-}
-
-/*
- * backend.oauthInit: Init Oauth flow for oauth provider
- */
-Backend.prototype.oauthInit = async function ({ provider, language }) {
- return responseHandler(await api.post('/signin/oauth/init', { provider, language }))
-}
-
-/*
- * backend.oauthSignIn: User sign in via oauth provider
- */
-Backend.prototype.oauthSignIn = async function ({ state, code, provider }) {
- return responseHandler(await api.post('/signin/oauth', { state, code, provider }))
-}
-
-/*
- * Backend.prototype.loadConfirmation: Load a confirmation
- */
-Backend.prototype.loadConfirmation = async function ({ id, check }) {
- return responseHandler(await api.get(`/confirmations/${id}/${check}`))
-}
-/*
- * Backend.prototype.confirmSignup: Confirm a signup
- */
-Backend.prototype.confirmSignup = async function ({ id, consent }) {
- return responseHandler(await api.post(`/confirm/signup/${id}`, { consent }))
-}
-
-/*
- * Backend.prototype.signIn: User signin/login
- */
-Backend.prototype.signIn = async function ({ username, password = false, token = false }) {
- return password === false
- ? responseHandler(await api.post('/signinlink', { username }))
- : responseHandler(await api.post('/signin', { username, password, token }))
-}
-
-/*
- * Backend.prototype.signInFromLink: Trade in sign-in link id & check for JWT token
- */
-Backend.prototype.signInFromLink = async function ({ id, check }) {
- return responseHandler(await api.post(`/signinlink/${id}/${check}`))
-}
-
-/*
- * Generic update account method
- */
-Backend.prototype.updateAccount = async function (data) {
- return responseHandler(await api.patch(`/account/jwt`, data, this.auth))
-}
-
-/*
- * Update consent (uses the jwt-guest middleware)
- */
-Backend.prototype.updateConsent = async function (consent) {
- return responseHandler(await api.patch(`/consent/jwt`, { consent }, this.auth))
-}
-
-/*
- * Checks whether a username is available
- */
-Backend.prototype.isUsernameAvailable = async function (username) {
- const response = await api.post(`/available/username/jwt`, { username }, this.auth)
-
- // 404 means username is available, which is success in this case
- return response.status === 404
- ? { success: true, data: false, available: true, response }
- : { success: false, available: false, response }
-}
-
-/*
- * Remove account method
- */
-Backend.prototype.removeAccount = async function () {
- return responseHandler(await api.delete(`/account/jwt`, this.auth))
-}
-/*
- * Enable MFA
- */
-Backend.prototype.enableMfa = async function () {
- return responseHandler(await api.post(`/account/mfa/jwt`, { mfa: true }, this.auth))
-}
-
-/*
- * Confirm MFA
- */
-Backend.prototype.confirmMfa = async function (data) {
- return responseHandler(await api.post(`/account/mfa/jwt`, { ...data, mfa: true }, this.auth))
-}
-
-/*
- * Disable MFA
- */
-Backend.prototype.disableMfa = async function (data) {
- return responseHandler(await api.post(`/account/mfa/jwt`, { ...data, mfa: false }, this.auth))
-}
-
-/*
- * Reload account
- */
-Backend.prototype.reloadAccount = async function () {
- return responseHandler(await api.get(`/whoami/jwt`, this.auth))
-}
-
-/*
- * Export account data
- */
-Backend.prototype.exportAccount = async function () {
- return responseHandler(await api.get(`/account/export/jwt`, this.auth))
-}
-
-/*
- * Restrict processing of account data
- */
-Backend.prototype.restrictAccount = async function () {
- return responseHandler(await api.get(`/account/restrict/jwt`, this.auth))
-}
-
-/*
- * Remove account
- */
-Backend.prototype.restrictAccount = async function () {
- return responseHandler(await api.delete(`/account/jwt`, this.auth))
-}
-
-/*
- * Load all user data
- */
-Backend.prototype.getUserData = async function (uid) {
- return responseHandler(await api.get(`/users/${uid}/jwt`, this.auth))
-}
-
-/*
- * Load user profile
- */
-Backend.prototype.getProfile = async function (uid) {
- return responseHandler(await api.get(`/users/${uid}`))
-}
-
-/*
- * Load user count
- */
-Backend.prototype.getUserCount = async function () {
- return responseHandler(await api.get(`/info/users`))
-}
-
-/*
- * Load stats
- */
-Backend.prototype.getStats = async function () {
- return responseHandler(await api.get(`/info/stats`))
-}
-
-/*
- * Create bookmark
- */
-Backend.prototype.createBookmark = async function (data) {
- return responseHandler(await api.post(`/bookmarks/jwt`, data, this.auth), 201)
-}
-
-/*
- * Get bookmark
- */
-Backend.prototype.getBookmark = async function (id) {
- return responseHandler(await api.get(`/bookmarks/${id}/jwt`, this.auth))
-}
-/*
- * Get bookmarks
- */
-Backend.prototype.getBookmarks = async function () {
- return responseHandler(await api.get(`/bookmarks/jwt`, this.auth))
-}
-
-/*
- * Remove bookmark
- */
-Backend.prototype.removeBookmark = async function (id) {
- const response = await api.delete(`/bookmarks/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Create API key
- */
-Backend.prototype.createApikey = async function (data) {
- return responseHandler(await api.post(`/apikeys/jwt`, data, this.auth), 201)
-}
-
-/*
- * Get API key
- */
-Backend.prototype.getApikey = async function (id) {
- return responseHandler(await api.get(`/apikeys/${id}/jwt`, this.auth))
-}
-
-/*
- * Get API keys
- */
-Backend.prototype.getApikeys = async function () {
- return responseHandler(await api.get(`/apikeys/jwt`, this.auth))
-}
-
-/*
- * Remove API key
- */
-Backend.prototype.removeApikey = async function (id) {
- const response = await api.delete(`/apikeys/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Get measurements sets
- */
-Backend.prototype.getSets = async function () {
- return responseHandler(await api.get(`/sets/jwt`, this.auth))
-}
-
-/*
- * Get measurements set
- */
-Backend.prototype.getSet = async function (id) {
- return responseHandler(await api.get(`/sets/${id}/jwt`, this.auth))
-}
-
-/*
- * Get public measurements set
- */
-Backend.prototype.getPublicSet = async function (id) {
- return responseHandler(await api.get(`/sets/${id}.json`))
-}
-
-/*
- * Create measurements set
- */
-Backend.prototype.createSet = async function (data) {
- return responseHandler(await api.post(`/sets/jwt`, data, this.auth), 201)
-}
-
-/*
- * Remove measurements set
- */
-Backend.prototype.removeSet = async function (id) {
- const response = await api.delete(`/sets/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Generic update measurements set method
- */
-Backend.prototype.updateSet = async function (id, data) {
- return responseHandler(await api.patch(`/sets/${id}/jwt`, data, this.auth))
-}
-
-/*
- * Get curated measurements sets
- */
-Backend.prototype.getCuratedSets = async function () {
- return responseHandler(await api.get(`/curated-sets`))
-}
-
-/*
- * Get measurements sets suggested for curation
- */
-Backend.prototype.getSuggestedSets = async function () {
- return responseHandler(await api.get(`/suggested-sets/jwt`, this.auth))
-}
-
-/*
- * Get option packs suggested for curation
- */
-Backend.prototype.getSuggestedPacks = async function () {
- return responseHandler(await api.get(`/suggested-packs/jwt`, this.auth))
-}
-
-/*
- * Remove suggested measurements set
- */
-Backend.prototype.removeSuggestedMeasurementsSet = async function (id) {
- const response = await api.delete(`/suggested-sets/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Get curated measurements set
- */
-Backend.prototype.getCuratedSet = async function (id) {
- return responseHandler(await api.get(`/curated-sets/${id}`))
-}
-
-/*
- * Generic update curated measurements set method
- */
-Backend.prototype.updateCuratedSet = async function (id, data) {
- return responseHandler(await api.patch(`/curated-sets/${id}/jwt`, data, this.auth))
-}
-
-/*
- * Remove curated measurements set
- */
-Backend.prototype.removeCuratedMeasurementsSet = async function (id) {
- const response = await api.delete(`/curated-sets/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Get pattern
- */
-Backend.prototype.getPattern = async function (id) {
- return responseHandler(await api.get(`/patterns/${id}/jwt`, this.auth))
-}
-
-/*
- * Get public pattern
- */
-Backend.prototype.getPublicPattern = async function (id) {
- return responseHandler(await api.get(`/patterns/${id}.json`))
-}
-
-/*
- * Get patterns
- */
-Backend.prototype.getPatterns = async function () {
- return responseHandler(await api.get(`/patterns/jwt`, this.auth))
-}
-
-/*
- * Create pattern
- */
-Backend.prototype.createPattern = async function (data) {
- return responseHandler(await api.post(`/patterns/jwt`, data, this.auth), 201)
-}
-
-/*
- * Remove pattern
- */
-Backend.prototype.removePattern = async function (id) {
- const response = await api.delete(`/patterns/${id}/jwt`, this.auth)
-
- return response && response.status === 204 ? true : false
-}
-
-/*
- * Generic update pattern set method
- */
-Backend.prototype.updatePattern = async function (id, data) {
- return responseHandler(await api.patch(`/patterns/${id}/jwt`, data, this.auth))
-}
-
-/*
- * Create GitHub issue
- */
-Backend.prototype.createIssue = async function (data) {
- return responseHandler(await api.post(`/issues`, data), 201)
-}
-
-/*
- * Create GitHub discussion
- */
-Backend.prototype.createDiscussion = async function (data) {
- return responseHandler(await api.post(`/discussions`, data), 201)
-}
-
-/*
- * Check whether a slug is available
- */
-Backend.prototype.isSlugAvailable = async function ({ slug, type }) {
- const response = await api.get(`/slugs/${type}/${slug}/jwt`, this.auth)
-
- // 404 means username is available, which is success in this case
- return response.status === 200
- ? { success: false, available: false, response }
- : { success: true, data: false, available: true, response }
-}
-
-/*
- * Create showcase/blog post (pull request)
- */
-Backend.prototype.createPost = async function (type, data) {
- return responseHandler(await api.post(`/flows/pr/${type}/jwt`, data, this.auth), 201)
-}
-
-/*
- * Send translation invite
- */
-Backend.prototype.sendTranslatorInvite = async function (language) {
- return responseHandler(await api.post(`/flows/translator-invite/jwt`, { language }, this.auth))
-}
-
-/*
- * Send language suggestion
- */
-Backend.prototype.sendLanguageSuggestion = async function (data) {
- return responseHandler(await api.post(`/flows/language-suggestion/jwt`, data, this.auth))
-}
-
-/*
- * Subscribe to newsletter
- */
-Backend.prototype.newsletterSubscribe = async function ({ email, language }) {
- return responseHandler(await api.post('/subscriber', { email, language }))
-}
-
-/*
- * Confirm newsletter subscribe
- */
-Backend.prototype.confirmNewsletterSubscribe = async function ({ id, ehash }) {
- return responseHandler(await api.put('/subscriber', { id, ehash }))
-}
-
-/*
- * Newsletter unsubscribe
- */
-Backend.prototype.newsletterUnsubscribe = async function (ehash) {
- return responseHandler(await api.delete(`/subscriber/${ehash}`))
-}
-
-/*
- * Upload an image
- */
-Backend.prototype.uploadImage = async function (body) {
- return responseHandler(await api.post('/images/jwt', body, this.auth))
-}
-
-/*
- * Upload an image anonymously
- */
-Backend.prototype.uploadAnonImage = async function (body) {
- return responseHandler(await api.post('/images', body))
-}
-
-/*
- * Remove an (uploaded) image
- */
-Backend.prototype.removeImage = async function (id) {
- return responseHandler(await api.delete(`/images/${id}/jwt`, this.auth))
-}
-
-/*
- * Suggest a measurements set for curation
- */
-Backend.prototype.suggestCset = async function (data) {
- return responseHandler(await api.post(`/curated-sets/suggest/jwt`, data, this.auth))
-}
-
-/*
- * Suggest an option pack
- */
-Backend.prototype.suggestOpack = async function (data) {
- return responseHandler(await api.post(`/option-packs/suggest/jwt`, data, this.auth))
-}
-
-/*
- * Create a curated set from a suggested set
- */
-Backend.prototype.csetFromSuggestedSet = async function (id) {
- return responseHandler(await api.post(`/curated-sets/from/${id}/jwt`, {}, this.auth))
-}
-
-/*
- * Ping backend to see if current token is still valid
- */
-Backend.prototype.ping = async function () {
- return responseHandler(await api.get(`/whoami/jwt`, this.auth))
-}
-
-/*
- * Search user (admin method)
- */
-Backend.prototype.adminSearchUsers = async function (q) {
- return responseHandler(await api.post('/admin/search/users/jwt', { q }, this.auth))
-}
-
-/*
- * Load user (admin method)
- */
-Backend.prototype.adminLoadUser = async function (id) {
- return responseHandler(await api.get(`/admin/user/${id}/jwt`, this.auth))
-}
-
-/*
- * Update user (admin method)
- */
-Backend.prototype.adminUpdateUser = async function ({ id, data }) {
- return responseHandler(await api.patch(`/admin/user/${id}/jwt`, data, this.auth))
-}
-
-/*
- * Impersonate user (admin method)
- */
-Backend.prototype.adminImpersonateUser = async function (id) {
- return responseHandler(await api.get(`/admin/impersonate/${id}/jwt`, this.auth))
-}
-
-/*
- * Load newsletter subscribers (admin method)
- */
-Backend.prototype.adminLoadSubscribers = async function () {
- return responseHandler(await api.get(`/admin/subscribers/jwt`, this.auth))
-}
-
-/*
- * Verify an admin account while impersonating another user
- */
-Backend.prototype.adminPing = async function (token) {
- return responseHandler(await api.get(`/whoami/jwt`, auth(token)))
-}
-
-/*
- * backend.img: Generate a social media image
- */
-Backend.prototype.img = async function (data) {
- return responseHandler(await api.post('/img', data, { responseType: 'arraybuffer' }))
-}
-
-export function useBackend(Swizzled) {
- /*
- * Load swizzled useAccount hook and use it
- */
- const { token } = Swizzled.hooks.useAccount()
-
- /*
- * This backend object is what we'll end up returning
- */
- const backend = useMemo(() => new Backend(auth(token)), [token])
-
- return backend
-}
diff --git a/packages/react-components/src/editor/swizzle/hooks/use-editor-state.mjs b/packages/react-components/src/editor/swizzle/hooks/use-editor-state.mjs
deleted file mode 100644
index e949f0bf902..00000000000
--- a/packages/react-components/src/editor/swizzle/hooks/use-editor-state.mjs
+++ /dev/null
@@ -1,120 +0,0 @@
-import { useMemo, useState, useEffect } from 'react'
-import useLocalStorageState from 'use-local-storage-state'
-import useSessionStorageState from 'use-session-storage-state'
-import { useQueryState, createParser } from 'nuqs'
-
-/**
- * react
- * This holds the editor state, using React state.
- * It also provides helper methods to manipulate state.
- *
- * @params {object} init - Initial pattern settings
- * @return {array} return - And array with get, set, and update methods
- */
-export const useReactEditorState = (Swizzled, init = {}, setEphemeralState) => {
- const [state, setState] = useState(init)
- const update = useMemo(
- () => Swizzled.methods.stateUpdateFactory(setState, setEphemeralState),
- [setState]
- )
-
- return [state, setState, update]
-}
-
-/**
- * storage
- * This holds the editor state, using local storage.
- * It also provides helper methods to manipulate state.
- *
- * @params {object} init - Initial pattern settings
- * @return {array} return - And array with get, set, and update methods
- */
-export const useStorageEditorState = (Swizzled, init = {}, setEphemeralState) => {
- const [state, setState] = useLocalStorageState('fs-editor', { defaultValue: init })
- const update = useMemo(
- () => Swizzled.methods.stateUpdateFactory(setState, setEphemeralState),
- [setState]
- )
-
- return [state, setState, update]
-}
-
-/**
- * session
- * This holds the editor state, using session storage.
- * It also provides helper methods to manipulate state.
- *
- * @params {object} init - Initial pattern settings
- * @return {array} return - And array with get, set, and update methods
- */
-export const useSessionEditorState = (Swizzled, init = {}, setEphemeralState) => {
- const [state, setState] = useSessionStorageState('fs-editor', { defaultValue: init })
- const update = useMemo(
- () => Swizzled.methods.stateUpdateFactory(setState, setEphemeralState),
- [setState]
- )
-
- return [state, setState, update]
-}
-
-/**
- * url
- * This holds the editor state, using session storage.
- * It also provides helper methods to manipulate state.
- *
- * @params {object} init - Initial pattern settings
- * @return {array} return - And array with get, set, and update methods
- */
-export const useUrlEditorState = (Swizzled, init = {}, setEphemeralState) => {
- const [state, setState] = useQueryState('s', pojoParser)
- const update = useMemo(
- () => Swizzled.methods.stateUpdateFactory(setState, setEphemeralState),
- [setState]
- )
-
- /*
- * Set the initial state
- */
- useEffect(() => {
- // Handle state on a hard reload or cold start
- if (typeof URLSearchParams !== 'undefined') {
- let urlState = false
- try {
- const params = new URLSearchParams(document.location.search)
- const s = params.get('s')
- if (typeof s === 'string' && s.length > 0) urlState = JSON.parse(s)
- if (urlState) setState(urlState)
- else setState(init)
- } catch (err) {
- setState(init)
- }
- }
- }, [])
-
- return [state, setState, update]
-}
-
-/*
- * Our URL state library does not support storing Javascript objects out of the box.
- * But it allows us to pass a customer parser to handle them, so this is that parser
- */
-const pojoParser = createParser({
- parse: (v) => {
- let val
- try {
- val = JSON.parse(v)
- } catch (err) {
- val = null
- }
- return val
- },
- serialize: (v) => {
- let val
- try {
- val = JSON.stringify(v)
- } catch (err) {
- val = null
- }
- return val
- },
-})
diff --git a/packages/react-components/src/editor/swizzle/methods/core-settings.mjs b/packages/react-components/src/editor/swizzle/methods/core-settings.mjs
deleted file mode 100644
index d6a736be192..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/core-settings.mjs
+++ /dev/null
@@ -1,149 +0,0 @@
-export function defaultSa(Swizzled, units, inMm = true) {
- const dflt = units === 'imperial' ? 0.5 : 1
- return inMm ? Swizzled.methods.measurementAsMm(dflt, units) : dflt
-}
-export function defaultSamm(Swizzled, units, inMm = true) {
- const dflt = units === 'imperial' ? 0.5 : 1
- return inMm ? Swizzled.methods.measurementAsMm(dflt, units) : dflt
-}
-/** custom event handlers for inputs that need them */
-export function menuCoreSettingsOnlyHandler(Swizzled, { updateHandler, current }) {
- return function (path, part) {
- // Is this a reset?
- if (part === undefined || part === '__UNSET__') return updateHandler(path, part)
-
- // add or remove the part from the set
- let newParts = new Set(current || [])
- if (newParts.has(part)) newParts.delete(part)
- else newParts.add(part)
-
- // if the set is now empty, reset
- if (newParts.size < 1) newParts = undefined
- // otherwise use the new set
- else newParts = [...newParts]
-
- updateHandler(path, newParts)
- }
-}
-
-export function menuCoreSettingsSammHandler(Swizzled, { updateHandler, config }) {
- return function (_path, newCurrent) {
- // convert to millimeters if there's a value
- newCurrent = newCurrent === undefined ? config.dflt : newCurrent
- // update both values to match
- updateHandler(['samm'], newCurrent)
- updateHandler(['sa'], newCurrent)
- }
-}
-
-export function menuCoreSettingsSaboolHandler(Swizzled, { toggleSa }) {
- return toggleSa
-}
-export function menuCoreSettingsStructure(
- Swizzled,
- { units = 'metric', sabool = false, parts = [] }
-) {
- return {
- sabool: {
- ux: Swizzled.config.uxLevels.core.sa,
- list: [0, 1],
- choiceTitles: {
- 0: 'saNo',
- 1: 'saYes',
- },
- valueTitles: {
- 0: 'no',
- 1: 'yes',
- },
- dflt: 0,
- icon: Swizzled.components.SaIcon,
- },
- samm: sabool
- ? {
- ux: Swizzled.config.uxLevels.core.sa,
- min: 0,
- max: units === 'imperial' ? 2 : 2.5,
- dflt: Swizzled.methods.defaultSamm(units),
- icon: Swizzled.components.SaIcon,
- }
- : false,
- paperless: {
- ux: Swizzled.config.uxLevels.core.paperless,
- list: [0, 1],
- choiceTitles: {
- 0: 'paperlessNo',
- 1: 'paperlessYes',
- },
- valueTitles: {
- 0: 'no',
- 1: 'yes',
- },
- dflt: 0,
- icon: Swizzled.components.PaperlessIcon,
- },
- units: {
- ux: Swizzled.config.uxLevels.core.units,
- list: ['metric', 'imperial'],
- dflt: 'metric',
- choiceTitles: {
- metric: 'metric',
- imperial: 'imperial',
- },
- valueTitles: {
- metric: 'metric',
- imperial: 'imperial',
- },
- icon: Swizzled.components.UnitsIcon,
- },
- complete: {
- ux: Swizzled.config.uxLevels.core.complete,
- list: [1, 0],
- dflt: 1,
- choiceTitles: {
- 0: 'completeNo',
- 1: 'completeYes',
- },
- valueTitles: {
- 0: 'no',
- 1: 'yes',
- },
- icon: Swizzled.components.DetailIcon,
- },
- expand: {
- ux: Swizzled.config.uxLevels.core.expand,
- list: [1, 0],
- dflt: 1,
- choiceTitles: {
- 0: 'expandNo',
- 1: 'expandYes',
- },
- valueTitles: {
- 0: 'no',
- 1: 'yes',
- },
- icon: Swizzled.components.ExpandIcon,
- },
- only: {
- ux: Swizzled.config.uxLevels.core.only,
- dflt: false,
- list: parts,
- parts,
- icon: Swizzled.components.IncludeIcon,
- },
- scale: {
- ux: Swizzled.config.uxLevels.core.scale,
- min: 0.1,
- max: 5,
- dflt: 1,
- step: 0.1,
- icon: Swizzled.components.ScaleIcon,
- },
- margin: {
- ux: Swizzled.config.uxLevels.core.margin,
- min: 0,
- max: 2.5,
- dflt: Swizzled.methods.measurementAsMm(units === 'imperial' ? 0.125 : 0.2, units),
- icon: Swizzled.components.MarginIcon,
- },
- }
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/design-options.mjs b/packages/react-components/src/editor/swizzle/methods/design-options.mjs
deleted file mode 100644
index 43a9718d62a..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/design-options.mjs
+++ /dev/null
@@ -1,87 +0,0 @@
-export function designOptionType(Swizzled, option) {
- if (typeof option?.pct !== 'undefined') return 'pct'
- if (typeof option?.bool !== 'undefined') return 'bool'
- if (typeof option?.count !== 'undefined') return 'count'
- if (typeof option?.deg !== 'undefined') return 'deg'
- if (typeof option?.list !== 'undefined') return 'list'
- if (typeof option?.mm !== 'undefined') return 'mm'
-
- return 'constant'
-}
-import { mergeOptions } from '@freesewing/core'
-import set from 'lodash.set'
-import orderBy from 'lodash.orderby'
-
-export function menuDesignOptionsStructure(Swizzled, options, settings, asFullList = false) {
- if (!options) return options
- const sorted = {}
- for (const [name, option] of Object.entries(options)) {
- if (typeof option === 'object') sorted[name] = { ...option, name }
- }
-
- const menu = {}
- // Fixme: One day we should sort this based on the translation
- for (const option of orderBy(sorted, ['order', 'menu', 'name'], ['asc', 'asc', 'asc'])) {
- if (typeof option === 'object') {
- const oType = Swizzled.methods.designOptionType(option)
- option.dflt = option.dflt || option[oType]
- if (oType === 'pct') option.dflt /= 100
- if (typeof option.menu === 'function')
- option.menu = asFullList
- ? 'conditional'
- : option.menu(settings, mergeOptions(settings, options))
- if (option.menu) {
- // Handle nested groups that don't have any direct children
- if (option.menu.includes('.')) {
- let menuPath = []
- for (const chunk of option.menu.split('.')) {
- menuPath.push(chunk)
- set(menu, `${menuPath.join('.')}.isGroup`, true)
- }
- }
- set(menu, `${option.menu}.isGroup`, true)
- set(menu, `${option.menu}.${option.name}`, option)
- } else if (typeof option.menu === 'undefined') {
- console.log(
- `Warning: Option ${option.name} does not have a menu config. ` +
- 'Either configure it, or set it to false to hide this option.'
- )
- }
- }
- }
-
- // Always put advanced at the end
- if (menu.advanced) {
- const adv = menu.advanced
- delete menu.advanced
- menu.advanced = adv
- }
-
- return menu
-}
-/*
- * Helper method to grab an option from an Design options structure
- *
- * Since these structures can be nested with option groups, this needs some extra logic
- */
-export function getOptionStructure(Swizzled, option, Design, state) {
- const structure = Swizzled.methods.menuDesignOptionsStructure(
- Design.patternConfig.options,
- state.settings
- )
- console.log({ structure })
-
- return Swizzled.methods.findOption(structure, option)
-}
-
-export function findOption(Swizzled, structure, option) {
- for (const [key, val] of Object.entries(structure)) {
- if (key === option) return val
- if (val.isGroup) {
- const sub = findOption(val, option)
- if (sub) return sub
- }
- }
-
- return false
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/editor.mjs b/packages/react-components/src/editor/swizzle/methods/editor.mjs
deleted file mode 100644
index ddbd67d3b51..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/editor.mjs
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- * This method drafts the pattern
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {function} Design - The Design constructor
- * @param {object} settings - The settings for the pattern
- * @return {object} data - The drafted pattern, along with errors and failure data
- */
-export function draft(Swizzled, Design, settings) {
- const data = {
- // The pattern
- pattern: new Design(settings),
- // Any errors logged by the pattern
- errors: [],
- // If the pattern fails to draft, this will hold the error
- failure: false,
- }
- // Draft the pattern or die trying
- try {
- data.pattern.draft()
- data.errors.push(...data.pattern.store.logs.error)
- for (const store of data.pattern.setStores) data.errors.push(...store.logs.error)
- } catch (error) {
- data.failure = error
- }
-
- return data
-}
-export function flattenFlags(Swizzled, flags) {
- const all = {}
- for (const type of Swizzled.config.flagTypes) {
- let i = 0
- if (flags[type]) {
- for (const flag of Object.values(flags[type])) {
- i++
- all[`${type}-${i}`] = { ...flag, type }
- }
- }
- }
-
- return all
-}
-
-export function getUiPreferenceUndoStepData(Swizzled, { step }) {
- /*
- * We'll need these
- */
- const field = step.name === 'ui' ? step.path[1] : step.path[2]
- const structure = Swizzled.methods.menuUiPreferencesStructure()[field]
-
- /*
- * This we'll end up returning
- */
- const data = {
- icon: ,
- field,
- optCode: `${field}.t`,
- titleCode: 'uiPreferences.t',
- structure: Swizzled.methods.menuUiPreferencesStructure()[field],
- }
- const FieldIcon = data.structure.icon
- data.fieldIcon =
-
- /*
- * Add oldval and newVal if they exist, or fall back to default
- */
- for (const key of ['old', 'new'])
- data[key + 'Val'] = Swizzled.methods.t(
- structure.choiceTitles[
- structure.choiceTitles[String(step[key])] ? String(step[key]) : String(structure.dflt)
- ] + '.t'
- )
-
- return data
-}
-
-export function getCoreSettingUndoStepData(Swizzled, { step, state, Design }) {
- const field = step.path[1]
- const structure = Swizzled.methods.menuCoreSettingsStructure({
- language: state.language,
- units: state.settings.units,
- sabool: state.settings.sabool,
- parts: Design.patternConfig.draftOrder,
- })
-
- const data = {
- field,
- titleCode: 'coreSettings.t',
- optCode: `${field}.t`,
- icon: ,
- structure: structure[field],
- }
- if (!data.structure && field === 'sa') data.structure = structure.samm
- const FieldIcon = data.structure?.icon || Swizzled.components.FixmeIcon
- data.fieldIcon =
-
- /*
- * Save us some typing
- */
- const cord = Swizzled.methods.settingsValueCustomOrDefault
- const formatMm = Swizzled.methods.formatMm
- const Html = Swizzled.components.HtmlSpan
-
- /*
- * Need to allow HTML in some of these in case this is
- * formated as imperial which uses and
- */
- switch (data.field) {
- case 'margin':
- case 'sa':
- case 'samm':
- if (data.field !== 'margin') {
- data.optCode = `samm.t`
- }
- data.oldVal =
- data.newVal =
- return data
- case 'scale':
- data.oldVal = cord(step.old, data.structure.dflt)
- data.newVal = cord(step.new, data.structure.dflt)
- return data
- case 'units':
- data.oldVal = Swizzled.methods.t(
- step.new === 'imperial' ? 'pe:metricUnits' : 'pe:imperialUnits'
- )
- data.newVal = Swizzled.methods.t(
- step.new === 'imperial' ? 'pe:imperialUnits' : 'pe:metricUnits'
- )
- return data
- case 'only':
- data.oldVal = cord(step.old, data.structure.dflt) || Swizzled.methods.t('pe:includeAllParts')
- data.newVal = cord(step.new, data.structure.dflt) || Swizzled.methods.t('pe:includeAllParts')
- return data
- default:
- data.oldVal = Swizzled.methods.t(
- (data.structure.choiceTitles[String(step.old)]
- ? data.structure.choiceTitles[String(step.old)]
- : data.structure.choiceTitles[String(data.structure.dflt)]) + '.t'
- )
- data.newVal = Swizzled.methods.t(
- (data.structure.choiceTitles[String(step.new)]
- ? data.structure.choiceTitles[String(step.new)]
- : data.structure.choiceTitles[String(data.structure.dflt)]) + '.t'
- )
- return data
- }
-}
-
-export function getDesignOptionUndoStepData(Swizzled, { step, state, Design }) {
- const option = Design.patternConfig.options[step.path[2]]
- const data = {
- icon: ,
- field: step.path[2],
- optCode: `${state.design}:${step.path[2]}.t`,
- titleCode: `designOptions.t`,
- oldVal: Swizzled.methods.formatDesignOptionValue(option, step.old, state.units === 'imperial'),
- newVal: Swizzled.methods.formatDesignOptionValue(option, step.new, state.units === 'imperial'),
- }
-
- return data
-}
-
-export function getUndoStepData(Swizzled, props) {
- /*
- * UI Preferences
- */
- if ((props.step.name === 'settings' && props.step.path[1] === 'ui') || props.step.name === 'ui')
- return Swizzled.methods.getUiPreferenceUndoStepData(props)
-
- /*
- * Design options
- */
- if (props.step.name === 'settings' && props.step.path[1] === 'options')
- return Swizzled.methods.getDesignOptionUndoStepData(props)
-
- /*
- * Core Settings
- */
- if (
- props.step.name === 'settings' &&
- [
- 'sa',
- 'samm',
- 'margin',
- 'scale',
- 'only',
- 'complete',
- 'paperless',
- 'sabool',
- 'units',
- 'expand',
- ].includes(props.step.path[1])
- )
- return Swizzled.methods.getCoreSettingUndoStepData(props)
-
- /*
- * Measurements
- */
- if (props.step.name === 'settings' && props.step.path[1] === 'measurements') {
- const data = {
- icon: ,
- field: 'measurements',
- optCode: `measurements`,
- titleCode: 'measurements',
- }
- /*
- * Single measurements change?
- */
- if (props.step.path[2])
- return {
- ...data,
- field: props.step.path[2],
- oldVal: Swizzled.methods.formatMm(props.step.old, props.imperial),
- newVal: Swizzled.methods.formatMm(props.step.new, props.imperial),
- }
- let count = 0
- for (const m of Object.keys(props.step.new)) {
- if (props.step.new[m] !== props.step.old?.[m]) count++
- }
- return { ...data, msg: Swizzled.methods.t('pe:xMeasurementsChanged', { count }) }
- }
-
- /*
- * Bail out of the step fell throug
- */
- return false
-}
-/*
- * This helper method constructs the initial state object.
- *
- * If they are not present, it will fall back to the relevant defaults
- * @param {object} Swizzled - The swizzled data
- */
-export function initialEditorState(Swizzled) {
- /*
- * Create initial state object
- */
- const initial = { ...Swizzled.config.initialState }
-
- /*
- * FIXME: Add preload support, from URL or other sources, rather than just passing in an object
- */
-
- return initial
-}
-/**
- * round a value to the correct number of decimal places to display all supplied digits after multiplication
- * this is a workaround for floating point errors
- * examples:
- * roundPct(0.72, 100) === 72
- * roundPct(7.5, 0.01) === 0.075
- * roundPct(7.50, 0.01) === 0.0750
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {Number} num the number to be operated on
- * @param {Number} factor the number to multiply by
- * @return {Number} the given num multiplied by the factor, rounded appropriately
- */
-export function menuRoundPct(Swizzled, num, factor) {
- const { round } = Swizzled.methods
- // stringify
- const str = '' + num
- // get the index of the decimal point in the number
- const decimalIndex = str.indexOf('.')
- // get the number of places the factor moves the decimal point
- const factorPlaces = factor > 0 ? Math.ceil(Math.log10(factor)) : Math.floor(Math.log10(factor))
- // the number of places needed is the number of digits that exist after the decimal minus the number of places the decimal point is being moved
- const numPlaces = Math.max(0, str.length - (decimalIndex + factorPlaces))
- return round(num * factor, numPlaces)
-}
-
-const menuNumericInputMatcher = /^-?[0-9]*[.,eE]?[0-9]+$/ // match a single decimal separator
-const menuFractionInputMatcher = /^-?[0-9]*(\s?[0-9]+\/|[.,eE])?[0-9]+$/ // match a single decimal separator or fraction
-
-/**
- * Validate and parse a value that should be a number
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {any} val the value to validate
- * @param {Boolean} allowFractions should fractions be considered valid input?
- * @param {Number} min the minimum allowable value
- * @param {Number} max the maximum allowable value
- * @return {null|false|Number} null if the value is empty,
- * false if the value is invalid,
- * or the value parsed to a number if it is valid
- */
-export function menuValidateNumericValue(
- Swizzled,
- val,
- allowFractions = true,
- min = -Infinity,
- max = Infinity
-) {
- // if it's empty, we're neutral
- if (typeof val === 'undefined' || val === '') return null
-
- // make sure it's a string
- val = ('' + val).trim()
-
- // get the appropriate match pattern and check for a match
- const matchPattern = allowFractions ? menuFractionInputMatcher : menuNumericInputMatcher
- if (!val.match(matchPattern)) return false
-
- // replace comma with period
- const parsedVal = val.replace(',', '.')
- // if fractions are allowed, parse for fractions, otherwise use the number as a value
- const useVal = allowFractions ? Swizzled.methods.fractionToDecimal(parsedVal) : parsedVal
-
- // check that it's a number and it's in the range
- if (isNaN(useVal) || useVal > max || useVal < min) return false
-
- // all checks passed. return the parsed value
- return useVal
-}
-
-/**
- * Check to see if a value is different from its default
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {Number|String|Boolean} current the current value
- * @param {Object} config configuration containing a dflt key
- * @return {Boolean} was the value changed?
- */
-export function menuValueWasChanged(Swizzled, current, config) {
- if (typeof current === 'undefined') return false
- if (current == config.dflt) return false
-
- return true
-}
-import get from 'lodash.get'
-import set from 'lodash.set'
-import unset from 'lodash.unset'
-
-const UNSET = '__UNSET__'
-/*
- * Helper method to handle object updates
- *
- * @param {object} methods - An object holding possibly swizzled methods (unused here)
- * @param {object} obj - The object to update
- * @param {string|array} path - The path to the key to update, either as array or dot notation
- * @param {mixed} val - The new value to set or 'unset' to unset the value
- * @return {object} result - The updated object
- */
-export function objUpdate(Swizzled, obj = {}, path, val = '__UNSET__') {
- if (val === UNSET) unset(obj, path)
- else set(obj, path, val)
-
- return obj
-}
-
-/*
- * Helper method to handle object updates that also updates the undo history in ephemeral state
- *
- * @param {object} methods - An object holding possibly swizzled methods (unused here)
- * @param {object} obj - The object to update
- * @param {string|array} path - The path to the key to update, either as array or dot notation
- * @param {mixed} val - The new value to set or 'unset' to unset the value
- * @param {function} setEphemeralState - The ephemeral state setter
- * @return {object} result - The updated object
- */
-export function undoableObjUpdate(
- Swizzled,
- name,
- obj = {},
- path,
- val = '__UNSET__',
- setEphemeralState
-) {
- const current = get(obj, path)
- setEphemeralState((cur) => {
- if (!Array.isArray(cur.undos)) cur.undos = []
- return {
- ...cur,
- undos: [
- {
- name,
- time: Date.now(),
- path,
- old: current,
- new: val,
- restore: Swizzled.methods.cloneObject(obj),
- },
- ...cur.undos,
- ],
- }
- })
-
- return Swizzled.methods.objUpdate(obj, path, val)
-}
-
-/*
- * Helper method to add an undo step for which state updates are handles in another way
- *
- * This is typically used for SA changes as it requires changing 3 fields:
- * - sabool: Is sa on or off?
- * - sa: sa value for core
- * - samm: Holds the sa value in mm even when sa is off
- *
- * @param {object} Swizzled - An object holding possibly swizzled code (unused here)
- * @param {object} undo - The undo step to add
- * @param {object} restore - The state to restore for this step
- * @param {function} setEphemeralState - The ephemeral state setter
- */
-export function addUndoStep(Swizzled, undo, restore, setEphemeralState) {
- setEphemeralState((cur) => {
- if (!Array.isArray(cur.undos)) cur.undos = []
- return {
- ...cur,
- undos: [
- { time: Date.now(), ...undo, restore: Swizzled.methods.cloneObject(restore) },
- ...cur.undos,
- ],
- }
- })
-}
-
-/*
- * Helper method to clone an object
- */
-export function cloneObject(Swizzled, obj) {
- return JSON.parse(JSON.stringify(obj))
-}
-/**
- * Helper method to push a prefix to a set path
- *
- * By 'set path' we mean a path to be passed to the
- * objUpdate method, which uses lodash's set under the hood.
- *
- * @param {string} prefix - The prefix path to add
- * @param {string|array} path - The path to prefix either as array or a string in dot notation
- * @return {array} newPath - The prefixed path
- */
-export function statePrefixPath(Swizzled, prefix, path) {
- if (Array.isArray(path)) return [prefix, ...path]
- else return [prefix, ...path.split('.')]
-}
-/*
- * This creates the helper object for state updates
- */
-export function stateUpdateFactory(Swizzled, setState, setEphemeralState) {
- return {
- /*
- * This allows raw access to the entire state object
- */
- state: (path, val) => setState((cur) => Swizzled.methods.objUpdate({ ...cur }, path, val)),
- /*
- * These hold an object, so we take a path
- */
- settings: (path = null, val = null) => {
- /*
- * This check can be removed once all code is migrated to the new editor
- */
- if (Array.isArray(path) && Array.isArray(path[0]) && val === null) {
- throw new Error(
- 'Update.settings was called with an array of operations. This is no longer supported.'
- )
- }
- return setState((cur) =>
- Swizzled.methods.undoableObjUpdate(
- 'settings',
- { ...cur },
- Swizzled.methods.statePrefixPath('settings', path),
- val,
- setEphemeralState
- )
- )
- },
- /*
- * Helper to restore from undo state
- * Takes the index of the undo step in the array in ephemeral state
- */
- restore: async (i, ephemeralState) => {
- setState(ephemeralState.undos[i].restore)
- setEphemeralState((cur) => {
- cur.undos = cur.undos.slice(i + 1)
- return cur
- })
- },
- /*
- * Helper to toggle SA on or off as that requires managing sa, samm, and sabool
- */
- toggleSa: () =>
- setState((cur) => {
- const sa = cur.settings?.samm || (cur.settings?.units === 'imperial' ? 15.3125 : 10)
- const restore = Swizzled.methods.cloneObject(cur)
- // This requires 3 changes
- const update = cur.settings.sabool
- ? [
- ['sabool', 0],
- ['sa', 0],
- ['samm', sa],
- ]
- : [
- ['sabool', 1],
- ['sa', sa],
- ['samm', sa],
- ]
- for (const [key, val] of update) Swizzled.methods.objUpdate(cur, `settings.${key}`, val)
- // Which we'll group as 1 undo action
- Swizzled.methods.addUndoStep(
- {
- name: 'settings',
- path: ['settings', 'sa'],
- new: cur.settings.sabool ? 0 : sa,
- old: cur.settings.sabool ? sa : 0,
- },
- restore,
- setEphemeralState
- )
-
- return cur
- }),
- ui: (path, val) =>
- setState((cur) =>
- Swizzled.methods.undoableObjUpdate(
- 'ui',
- { ...cur },
- Swizzled.methods.statePrefixPath('ui', path),
- val,
- setEphemeralState
- )
- ),
- /*
- * These only hold a string, so we only take a value
- */
- design: (val) => setState((cur) => Swizzled.methods.objUpdate({ ...cur }, 'design', val)),
- view: (val) => {
- // Only take valid view names
- if (!Swizzled.config.views.includes(val)) return console.log('not a valid view:', val)
- setState((cur) => ({ ...cur, view: val }))
- // Also add it onto the views (history)
- setEphemeralState((cur) => {
- if (!Array.isArray(cur.views)) cur.views = []
- return { ...cur, views: [val, ...cur.views] }
- })
- },
- viewBack: () => {
- setEphemeralState((eph) => {
- if (Array.isArray(eph.views) && Swizzled.config.views.includes(eph.views[1])) {
- // Load view at the 1 position of the history
- setState((cur) => ({ ...cur, view: eph.views[1] }))
- return { ...eph, views: eph.views.slice(1) }
- }
-
- return eph
- })
- },
- ux: (val) => setState((cur) => Swizzled.methods.objUpdate({ ...cur }, 'ux', val)),
- clearPattern: () =>
- setState((cur) => {
- const newState = { ...cur }
- Swizzled.methods.objUpdate(newState, 'settings', {
- measurements: cur.settings.measurements,
- })
- /*
- * Let's also reset the renderer to React as that feels a bit like a pattern setting even though it's UI
- */
- Swizzled.methods.objUpdate(newState, 'ui', { ...newState.ui, renderer: 'react' })
- return newState
- }),
- clearAll: () => setState(Swizzled.config.initialState),
- /*
- * These are setters for the ephemeral state which is passed down as part of the
- * state object, but is not managed in the state backend because it's ephemeral
- */
- startLoading: (id, conf = {}) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- if (typeof newState.loading !== 'object') newState.loading = {}
- if (typeof conf.color === 'undefined') conf.color = 'info'
- newState.loading[id] = {
- msg: Swizzled.methods.t('pe:genericLoadingMsg'),
- ...conf,
- }
- return newState
- }),
- stopLoading: (id) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- if (typeof newState.loading[id] !== 'undefined') delete newState.loading[id]
- return newState
- }),
- clearLoading: () => setEphemeralState((cur) => ({ ...cur, loading: {} })),
- notify: (conf, id = false) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- /*
- * Passing in an id allows making sure the same notification is not repeated
- * So if the id is set, and we have a loading state with that id, we just return
- */
- if (id && cur.loading?.[id]) return newState
- if (typeof newState.loading !== 'object') newState.loading = {}
- if (id === false) id = Date.now()
- newState.loading[id] = { ...conf, id, fadeTimer: Swizzled.config.notifyTimeout }
- return newState
- }),
- notifySuccess: (msg, id = false) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- /*
- * Passing in an id allows making sure the same notification is not repeated
- * So if the id is set, and we have a loading state with that id, we just return
- */
- if (id && cur.loading?.[id]) return newState
- if (typeof newState.loading !== 'object') newState.loading = {}
- if (id === false) id = Date.now()
- newState.loading[id] = {
- msg,
- icon: 'success',
- color: 'success',
- id,
- fadeTimer: Swizzled.config.notifyTimeout,
- }
- return newState
- }),
- notifyFailure: (msg, id = false) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- /*
- * Passing in an id allows making sure the same notification is not repeated
- * So if the id is set, and we have a loading state with that id, we just return
- */
- if (id && cur.loading?.[id]) return newState
- if (typeof newState.loading !== 'object') newState.loading = {}
- if (id === false) id = Date.now()
- newState.loading[id] = {
- msg,
- icon: 'failure',
- color: 'error',
- id,
- fadeTimer: Swizzled.config.notifyTimeout,
- }
- return newState
- }),
- fadeNotify: (id) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- newState.loading[id] = { ...newState.loading[id], clearTimer: 600, id, fading: true }
- delete newState.loading[id].fadeTimer
- return newState
- }),
- clearNotify: (id) =>
- setEphemeralState((cur) => {
- const newState = { ...cur }
- if (typeof newState.loading[id] !== 'undefined') delete newState.loading[id]
- return newState
- }),
- }
-}
-/*
- * Returns the URL of a cloud-hosted image (cloudflare in this case) based on the ID and Variant
- * @param {object} Swizzled - Swizzled code, not used here
- */
-export function cloudImageUrl(Swizzled, { id = 'default-avatar', variant = 'public' }) {
- /*
- * Return something default so that people will actually change it
- */
- if (!id || id === 'default-avatar') return Swizzled.config.cloudImageDflt
-
- /*
- * If the variant is invalid, set it to the smallest thumbnail so
- * people don't load enourmous images by accident
- */
- if (!Swizzled.config.cloudImageVariants.includes(variant)) variant = 'sq100'
-
- return `${Swizzled.config.cloudImageUrl}${id}/${variant}`
-}
-/**
- * This method does nothing. It is used to disable certain methods
- * that need to be passed it to work
- *
- * @return {null} null - null
- */
-export function noop() {
- return null
-}
-/*
- * A method that check that a value is not empty
- */
-export function notEmpty(value) {
- return String(value).length > 0
-}
-/**
- * Helper method to merge arrays of translation namespaces
- *
- * Note that this method is variadic
- *
- * @param {object} methods - An object holding possibly swizzled methods (unused here)
- * @param {[string]} namespaces - A string or array of strings of namespaces
- * @return {[string]} namespaces - A merged array of all namespaces
- */
-export function nsMerge(Swizzled, ...args) {
- const ns = new Set()
- for (const arg of args) {
- if (typeof arg === 'string') ns.add(arg)
- else if (Array.isArray(arg)) {
- for (const el of nsMerge(...arg)) ns.add(el)
- }
- }
-
- return [...ns]
-}
-/*
- * A translation fallback method in case none is passed in
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {string} key - The input
- * @return {string} key - The input is returned
- */
-export function t(Swizzled, key) {
- /*
- * Make sure this works when Swizzled is not passed in
- */
- if (typeof Swizzled.components === 'undefined') key = Swizzled
- return Array.isArray(key) ? key[0] : key
-}
-export function settingsValueIsCustom(Swizzled, val, dflt) {
- return typeof val === 'undefined' || val === '__UNSET__' || val === dflt ? false : true
-}
-
-export function settingsValueCustomOrDefault(Swizzled, val, dflt) {
- return typeof val === 'undefined' || val === '__UNSET__' || val === dflt ? dflt : val
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/formatting.mjs b/packages/react-components/src/editor/swizzle/methods/formatting.mjs
deleted file mode 100644
index d46446bad07..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/formatting.mjs
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Method that capitalizes a string (make the first character uppercase)
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {string} string - The input string to capitalize
- * @return {string} String - The capitalized input string
- */
-export function capitalize(Swizzled, string) {
- return typeof string === 'string' ? string.charAt(0).toUpperCase() + string.slice(1) : ''
-}
-
-export function formatDesignOptionValue(Swizzled, option, value, imperial) {
- const oType = Swizzled.methods.designOptionType(option)
- if (oType === 'pct') return Swizzled.methods.formatPercentage(value ? value : option.pct / 100)
- if (oType === 'deg') return `${value ? value : option.deg}°`
- if (oType === 'bool')
- return typeof value === 'undefined' ? (
- option.bool
- ) : value ? (
-
- ) : (
-
- )
- if (oType === 'mm')
- return Swizzled.methods.formatMm(typeof value === 'undefined' ? option.mm : value, imperial)
- if (oType === 'list') return typeof value === 'undefined' ? option.dflt : value
-
- return value
-}
-
-/**
- * format a value to the nearest fraction with a denominator that is a power of 2
- * or a decimal if the value is between fractions
- * NOTE: this method does not convert mm to inches. It will turn any given value directly into its equivalent fractional representation
- *
- * fraction: the value to process
- * format: the type of formatting to apply. html, notags, or anything else which will only return numbers
- */
-export function formatFraction128(Swizzled, fraction, format = 'html') {
- let negative = ''
- let inches = ''
- let rest = ''
- if (fraction < 0) {
- fraction = fraction * -1
- negative = '-'
- }
- if (Math.abs(fraction) < 1) rest = fraction
- else {
- inches = Math.floor(fraction)
- rest = fraction - inches
- }
- let fraction128 = Math.round(rest * 128)
- if (fraction128 == 0)
- return Swizzled.methods.formatImperial(negative, inches || fraction128, false, false, format)
-
- for (let i = 1; i < 7; i++) {
- const numoFactor = Math.pow(2, 7 - i)
- if (fraction128 % numoFactor === 0)
- return Swizzled.methods.formatImperial(
- negative,
- inches,
- fraction128 / numoFactor,
- Math.pow(2, i),
- format
- )
- }
-
- return (
- negative +
- Math.round(fraction * 100) / 100 +
- (format === 'html' || format === 'notags' ? '"' : '')
- )
-}
-
-// Formatting for imperial values
-export function formatImperial(Swizzled, neg, inch, numo = false, deno = false, format = 'html') {
- if (format === 'html') {
- if (numo) return `${neg}${inch} ${numo} /${deno} "`
- else return `${neg}${inch}"`
- } else if (format === 'notags') {
- if (numo) return `${neg}${inch} ${numo}/${deno}"`
- else return `${neg}${inch}"`
- } else {
- if (numo) return `${neg}${inch} ${numo}/${deno}`
- else return `${neg}${inch}`
- }
-}
-
-// Format a value in mm based on the user's units
-// Format can be html, notags, or anything else which will only return numbers
-export function formatMm(Swizzled, val, units, format = 'html') {
- val = Swizzled.methods.roundMm(val)
- if (units === 'imperial' || units === true) {
- if (val == 0) return Swizzled.methods.formatImperial('', 0, false, false, format)
-
- let fraction = val / 25.4
- return Swizzled.methods.formatFraction128(fraction, format)
- } else {
- if (format === 'html' || format === 'notags') return Swizzled.methods.roundMm(val / 10) + 'cm'
- else return Swizzled.methods.roundMm(val / 10)
- }
-}
-
-// Format a percentage (as in, between 0 and 1)
-export function formatPercentage(Swizzled, val) {
- return Math.round(1000 * val) / 10 + '%'
-}
-
-/**
- * A generic rounding method
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {number} val - The input number to round
- * @param {number} decimals - The number of decimal points to use when rounding
- * @return {number} result - The rounded number
- */
-export function round(methods, val, decimals = 1) {
- return Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals)
-}
-
-// Rounds a value in mm
-export function roundMm(Swizzled, val, units) {
- if (units === 'imperial') return Math.round(val * 1000000) / 1000000
- else return Math.round(val * 10) / 10
-}
-
-/**
- * Converts a value that contain a fraction to a decimal
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {number} value - The input value
- * @return {number} result - The resulting decimal value
- */
-export function fractionToDecimal(Swizzled, value) {
- // if it's just a number, return it
- if (!isNaN(value)) return value
-
- // keep a running total
- let total = 0
-
- // split by spaces
- let chunks = String(value).split(' ')
- if (chunks.length > 2) return Number.NaN // too many spaces to parse
-
- // a whole number with a fraction
- if (chunks.length === 2) {
- // shift the whole number from the array
- const whole = Number(chunks.shift())
- // if it's not a number, return NaN
- if (isNaN(whole)) return Number.NaN
- // otherwise add it to the total
- total += whole
- }
-
- // now we have only one chunk to parse
- let fraction = chunks[0]
-
- // split it to get numerator and denominator
- let fChunks = fraction.trim().split('/')
- // not really a fraction. return NaN
- if (fChunks.length !== 2 || fChunks[1] === '') return Number.NaN
-
- // do the division
- let num = Number(fChunks[0])
- let denom = Number(fChunks[1])
- if (isNaN(num) || isNaN(denom)) return NaN
- return total + num / denom
-}
-
-/**
- * Helper method to turn a measurement in millimeter regardless of units
- *
- * @param {object} Swizzled - Swizzled code, including methods
- * @param {number} value - The input value
- * @param {string} units - One of 'metric' or 'imperial'
- * @return {number} result - Value in millimeter
- */
-export function measurementAsMm(Swizzled, value, units = 'metric') {
- if (typeof value === 'number') return value * (units === 'imperial' ? 25.4 : 10)
-
- if (String(value).endsWith('.')) return false
-
- if (units === 'metric') {
- value = Number(value)
- if (isNaN(value)) return false
- return value * 10
- } else {
- const decimal = Swizzled.methods.fractionToDecimal(value)
- if (isNaN(decimal)) return false
- return decimal * 24.5
- }
-}
-
-/**
- * Converts a millimeter value to a Number value in the given units
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {number} mmValue - The input value in millimeter
- * @param {string} units - One of 'metric' or 'imperial'
- * @result {number} result - The result in millimeter
- */
-export function measurementAsUnits(Swizzled, mmValue, units = 'metric') {
- return Swizzled.methods.round(mmValue / (units === 'imperial' ? 25.4 : 10), 3)
-}
-export function shortDate(locale = 'en', timestamp = false, withTime = true) {
- const options = {
- year: 'numeric',
- month: 'short',
- day: 'numeric',
- }
- if (withTime) {
- options.hour = '2-digit'
- options.minute = '2-digit'
- options.hour12 = false
- }
- const ts = timestamp ? new Date(timestamp) : new Date()
-
- return ts.toLocaleDateString(locale, options)
-}
-/*
- * Parses value that should be a distance (cm or inch)
- *
- * @param {object} Swizzled - Swizzled code, including methods
- * @param {number} val - The input value
- * @param {bool} imperial - True if the units are imperial, false for metric
- * @return {number} result - The distance in the relevant units
- */
-export function parseDistanceInput(Swizzled, val = false, imperial = false) {
- // No input is not valid
- if (!val) return false
-
- // Cast to string, and replace comma with period
- val = val.toString().trim().replace(',', '.')
-
- // Regex pattern for regular numbers with decimal seperator or fractions
- const regex = imperial
- ? /^-?[0-9]*(\s?[0-9]+\/|[.])?[0-9]+$/ // imperial (fractions)
- : /^-?[0-9]*[.]?[0-9]+$/ // metric (no fractions)
- if (!val.match(regex)) return false
-
- // if fractions are allowed, parse for fractions, otherwise use the number as a value
- if (imperial) val = Swizzled.methods.fractionToDecimal(val)
-
- return isNaN(val) ? false : Number(val)
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/index.mjs b/packages/react-components/src/editor/swizzle/methods/index.mjs
deleted file mode 100644
index d3b9ed47f82..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/index.mjs
+++ /dev/null
@@ -1,240 +0,0 @@
-/*************************************************************************
- * *
- * FreeSewing's pattern editor allows swizzling methods *
- * *
- * To 'swizzle' means to replace the default implementation of a *
- * method with a custom one. It allows one to customize *
- * the pattern editor. *
- * *
- * This file holds the 'swizzleMethods' method that will return *
- * the various methods that can be swizzled, or their default *
- * implementation. *
- * *
- * To use a custom version, simply pas it as a prop into the editor *
- * under the 'methods' key. So to pass a custom 't' method (used for *
- * translation(, you do: *
- * *
- * *
- * *
- *************************************************************************/
-
-/*
- * Import of methods that can be swizzled
- */
-import {
- defaultSa,
- defaultSamm,
- menuCoreSettingsOnlyHandler,
- menuCoreSettingsSaboolHandler,
- menuCoreSettingsSammHandler,
- menuCoreSettingsStructure,
-} from './core-settings.mjs'
-import {
- designOptionType,
- findOption,
- getOptionStructure,
- menuDesignOptionsStructure,
-} from './design-options.mjs'
-import {
- addUndoStep,
- cloneObject,
- cloudImageUrl,
- draft,
- flattenFlags,
- getCoreSettingUndoStepData,
- getDesignOptionUndoStepData,
- getUiPreferenceUndoStepData,
- getUndoStepData,
- initialEditorState,
- menuRoundPct,
- menuValidateNumericValue,
- menuValueWasChanged,
- noop,
- notEmpty,
- nsMerge,
- objUpdate,
- settingsValueIsCustom,
- settingsValueCustomOrDefault,
- statePrefixPath,
- stateUpdateFactory,
- t,
- undoableObjUpdate,
-} from './editor.mjs'
-import {
- capitalize,
- formatDesignOptionValue,
- formatFraction128,
- formatImperial,
- formatMm,
- formatPercentage,
- round,
- roundMm,
- fractionToDecimal,
- measurementAsMm,
- measurementAsUnits,
- shortDate,
- parseDistanceInput,
-} from './formatting.mjs'
-import {
- designMeasurements,
- hasRequiredMeasurements,
- isDegreeMeasurement,
- missingMeasurements,
- structureMeasurementsAsDesign,
-} from './measurements.mjs'
-import { menuUiPreferencesStructure } from './ui-preferences.mjs'
-
-/**
- * This object holds all methods that can be swizzled
- */
-const defaultMethods = {
- // core-settings.mjs
- defaultSa,
- defaultSamm,
- menuCoreSettingsOnlyHandler,
- menuCoreSettingsSaboolHandler,
- menuCoreSettingsSammHandler,
- menuCoreSettingsStructure,
- // design-options.mjs
- designOptionType,
- findOption,
- getOptionStructure,
- menuDesignOptionsStructure,
- // editor.mjs
- addUndoStep,
- cloneObject,
- cloudImageUrl,
- draft,
- flattenFlags,
- getCoreSettingUndoStepData,
- getDesignOptionUndoStepData,
- getUiPreferenceUndoStepData,
- getUndoStepData,
- initialEditorState,
- menuRoundPct,
- menuValidateNumericValue,
- menuValueWasChanged,
- noop,
- notEmpty,
- nsMerge,
- objUpdate,
- settingsValueIsCustom,
- settingsValueCustomOrDefault,
- statePrefixPath,
- stateUpdateFactory,
- t,
- undoableObjUpdate,
- // formatting.mjs
- capitalize,
- formatDesignOptionValue,
- formatFraction128,
- formatImperial,
- formatMm,
- formatPercentage,
- round,
- roundMm,
- fractionToDecimal,
- measurementAsMm,
- measurementAsUnits,
- shortDate,
- parseDistanceInput,
- // measurements.mjs
- designMeasurements,
- hasRequiredMeasurements,
- isDegreeMeasurement,
- missingMeasurements,
- structureMeasurementsAsDesign,
- // ui-preferences.mjs
- menuUiPreferencesStructure,
-}
-
-/*
- * This method returns methods that can be swizzled
- * So either the passed-in methods, or the default ones
- */
-const swizzleMethods = (methods, Swizzled) => {
- /*
- * We need to pass down the resulting methods, swizzled or not
- * because some methods rely on other (possibly swizzled) methods.
- * So we put this in this object so we can pass that down
- */
- const all = {}
- for (const [name, method] of Object.entries(defaultMethods)) {
- if (typeof method !== 'function')
- console.warn(`${name} is not defined as default method in swizzleMethods`)
- all[name] = methods[name]
- ? (...params) => methods[name](all, ...params)
- : (...params) => method(Swizzled, ...params)
- }
-
- /*
- * Return all methods
- */
- return all
-}
-
-/*
- * Named exports
- */
-export {
- swizzleMethods,
- // Re-export all methods for specific imports
- // core-settings.mjs
- defaultSa,
- defaultSamm,
- menuCoreSettingsOnlyHandler,
- menuCoreSettingsSaboolHandler,
- menuCoreSettingsSammHandler,
- menuCoreSettingsStructure,
- // design-options.mjs
- designOptionType,
- findOption,
- getOptionStructure,
- menuDesignOptionsStructure,
- // editor.mjs
- addUndoStep,
- cloneObject,
- cloudImageUrl,
- draft,
- flattenFlags,
- getCoreSettingUndoStepData,
- getDesignOptionUndoStepData,
- getUiPreferenceUndoStepData,
- getUndoStepData,
- initialEditorState,
- menuRoundPct,
- menuValidateNumericValue,
- menuValueWasChanged,
- noop,
- notEmpty,
- nsMerge,
- objUpdate,
- settingsValueIsCustom,
- settingsValueCustomOrDefault,
- statePrefixPath,
- stateUpdateFactory,
- t,
- undoableObjUpdate,
- // formatting.mjs
- capitalize,
- formatDesignOptionValue,
- formatFraction128,
- formatImperial,
- formatMm,
- formatPercentage,
- round,
- roundMm,
- fractionToDecimal,
- measurementAsMm,
- measurementAsUnits,
- shortDate,
- parseDistanceInput,
- // measurements.mjs
- designMeasurements,
- hasRequiredMeasurements,
- isDegreeMeasurement,
- missingMeasurements,
- structureMeasurementsAsDesign,
- // ui-preferences.mjs
- menuUiPreferencesStructure,
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/measurements.mjs b/packages/react-components/src/editor/swizzle/methods/measurements.mjs
deleted file mode 100644
index e75b1cf22bd..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/measurements.mjs
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Returns a list of measurements for a design
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {object} Design - The Design object
- * @param {object} measies - The current set of measurements
- * @return {object} measurements - Object holding measurements that are relevant for this design
- */
-export function designMeasurements(Swizzled, Design, measies = {}) {
- const measurements = {}
- for (const m of Design.patternConfig?.measurements || []) measurements[m] = measies[m]
- for (const m of Design.patternConfig?.optionalMeasurements || []) measurements[m] = measies[m]
-
- return measurements
-}
-/**
- * Helper method to determine whether all required measurements for a design are present
- *
- * @param {object} Swizzled - Swizzled code, including methods
- * @param {object} Design - The FreeSewing design (or a plain object holding measurements)
- * @param {object} measurements - An object holding the user's measurements
- * @return {array} result - An array where the first element is true when we
- * have all measurements, and false if not. The second element is a list of
- * missing measurements.
- */
-export function hasRequiredMeasurements(Swizzled, Design, measurements = {}) {
- /*
- * If design is just a plain object holding measurements, we restructure it as a Design
- * AS it happens, this method is smart enough to test for this, so we call it always
- */
- Design = Swizzled.methods.structureMeasurementsAsDesign(Design)
-
- /*
- * Walk required measuremnets, and keep track of what's missing
- */
- const missing = []
- for (const m of Design.patternConfig?.measurements || []) {
- if (typeof measurements[m] === 'undefined') missing.push(m)
- }
-
- /*
- * Return true or false, plus a list of missing measurements
- */
- return [missing.length === 0, missing]
-}
-/**
- * Helper method to determine whether a measurement uses degrees
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {string} name - The name of the measurement
- * @return {bool} isDegree - True if the measurment is a degree measurement
- */
-export function isDegreeMeasurement(Swizzled, name) {
- return Swizzled.config.degreeMeasurements.indexOf(name) !== -1
-}
-/*
- * Helper method to check whether measururements are missing
- *
- * Note that this does not actually check the settings against
- * the chose design, but rather relies on the missing measurements
- * being set in state. That's because checking is more expensive,
- * so we do it only once in the non-Swizzled ViewWrapper components
- *
- * @param {object} Swizzled - Object holding Swizzled code
- * @param {object } state - The Editor state
- * @return {bool} missing - True if there are missing measurments, false if not
- */
-export function missingMeasurements(Swizzled, state) {
- return (
- !Swizzled.config.measurementsFreeViews.includes(state.view) &&
- state._.missingMeasurements &&
- state._.missingMeasurements.length > 0
- )
-}
-/*
- * This takes a POJO of measurements, and turns it into a structure that matches a design object
- *
- * @param {object} Swizzled - Swizzled code, not used here
- * @param {object} measurements - The POJO of measurments
- * @return {object} design - The measurements structured as a design object
- */
-export function structureMeasurementsAsDesign(Swizzled, measurements) {
- return measurements.patternConfig ? measurements : { patternConfig: { measurements } }
-}
diff --git a/packages/react-components/src/editor/swizzle/methods/ui-preferences.mjs b/packages/react-components/src/editor/swizzle/methods/ui-preferences.mjs
deleted file mode 100644
index 39c61b157fd..00000000000
--- a/packages/react-components/src/editor/swizzle/methods/ui-preferences.mjs
+++ /dev/null
@@ -1,60 +0,0 @@
-export function menuUiPreferencesStructure(Swizzled) {
- const uiUx = Swizzled.config.uxLevels.ui
- const uiPreferences = {
- ux: {
- ux: uiUx.ux,
- emoji: '🖥️',
- list: [1, 2, 3, 4, 5],
- choiceTitles: {},
- icon: Swizzled.components.UxIcon,
- dflt: Swizzled.config.defaultUx,
- },
- aside: {
- ux: uiUx.aside,
- list: [0, 1],
- choiceTitles: {
- 0: 'pe:noAside',
- 1: 'pe:withAside',
- },
- dflt: 1,
- icon: Swizzled.components.MenuIcon,
- },
- kiosk: {
- ux: uiUx.kiosk,
- list: [0, 1],
- choiceTitles: {
- 0: 'pe:websiteMode',
- 1: 'pe:kioskMode',
- },
- dflt: 0,
- icon: Swizzled.components.KioskIcon,
- },
- rotate: {
- ux: uiUx.rotate,
- list: [0, 1],
- choiceTitles: {
- 0: 'pe:rotateNo',
- 1: 'pe:rotateYes',
- },
- dflt: 0,
- icon: Swizzled.components.RotateIcon,
- },
- renderer: {
- ux: uiUx.renderer,
- list: ['react', 'svg'],
- choiceTitles: {
- react: 'pe:renderWithReact',
- svg: 'pe:renderWithCore',
- },
- valueTitles: {
- react: 'React',
- svg: 'SVG',
- },
- dflt: 'react',
- icon: Swizzled.components.RocketIcon,
- },
- }
-
- uiPreferences.ux.list.forEach((i) => (uiPreferences.ux.choiceTitles[i] = 'pe:ux' + i))
- return uiPreferences
-}
diff --git a/packages/react-components/src/editor/utils.mjs b/packages/react-components/src/editor/utils.mjs
deleted file mode 100644
index 432989daaa1..00000000000
--- a/packages/react-components/src/editor/utils.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-/*
- * To spread icon + text horizontal
- */
-export const horFlexClasses = 'flex flex-row items-center justify-between gap-4 w-full'
diff --git a/packages/react-components/src/index.mjs b/packages/react-components/src/index.mjs
deleted file mode 100644
index bec8beed9fa..00000000000
--- a/packages/react-components/src/index.mjs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Pattern components
-import { Defs } from './pattern/defs.mjs'
-import { Grid } from './pattern/grid.mjs'
-import { Group } from './pattern/group.mjs'
-import { Part } from './pattern/part.mjs'
-import { Path } from './pattern/path.mjs'
-import { Pattern } from './pattern/index.mjs'
-import { PatternXray } from './pattern-xray/index.mjs'
-import { Point } from './pattern/point.mjs'
-import { Stack } from './pattern/stack.mjs'
-import { Snippet } from './pattern/snippet.mjs'
-import { Svg } from './pattern/svg.mjs'
-import { Text, TextOnPath } from './pattern/text.mjs'
-// Pattern Utils
-import { getId, getProps, translateStrings, withinPartBounds } from './pattern/utils.mjs'
-// Stand alone components
-import { Popout } from './popout.mjs'
-
-/**
- * Translation namespaces used by these components
- */
-const ns = ['editor']
-
-/*
- * Export all components as named exports
- */
-export {
- // Pattern components
- Pattern,
- Svg,
- Defs,
- Group,
- Stack,
- Part,
- Point,
- Path,
- Snippet,
- Grid,
- Text,
- TextOnPath,
- PatternXray,
- // These are not React components but pattern helpers
- getId,
- getProps,
- translateStrings,
- withinPartBounds,
- // These are not React components but various helpers
- ns,
- // Stand along components
- Popout,
-}
diff --git a/packages/react-components/src/linedrawings/aaron.mjs b/packages/react-components/src/linedrawings/aaron.mjs
deleted file mode 100644
index 3bf81e6cf8a..00000000000
--- a/packages/react-components/src/linedrawings/aaron.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Aaron = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const AaronFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const AaronBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/albert.mjs b/packages/react-components/src/linedrawings/albert.mjs
deleted file mode 100644
index 4961d86af4f..00000000000
--- a/packages/react-components/src/linedrawings/albert.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Albert = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const AlbertFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const AlbertBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the front
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bee.mjs b/packages/react-components/src/linedrawings/bee.mjs
deleted file mode 100644
index 995306e8a27..00000000000
--- a/packages/react-components/src/linedrawings/bee.mjs
+++ /dev/null
@@ -1,58 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Bee = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BeeFront = ({
- className = 'h-full max-w-full m-auto text-base-content linedrawing', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bella.mjs b/packages/react-components/src/linedrawings/bella.mjs
deleted file mode 100644
index 3b5321c44bf..00000000000
--- a/packages/react-components/src/linedrawings/bella.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Bella = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BellaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BellaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the front
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/benjamin.mjs b/packages/react-components/src/linedrawings/benjamin.mjs
deleted file mode 100644
index f9d6f8c79d9..00000000000
--- a/packages/react-components/src/linedrawings/benjamin.mjs
+++ /dev/null
@@ -1,54 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, regular, thin } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Benjamin = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BenjaminFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bent.mjs b/packages/react-components/src/linedrawings/bent.mjs
deleted file mode 100644
index cdba8c3b5f6..00000000000
--- a/packages/react-components/src/linedrawings/bent.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Bent = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BentFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BentBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bibi.mjs b/packages/react-components/src/linedrawings/bibi.mjs
deleted file mode 100644
index 2f81c8f2aa6..00000000000
--- a/packages/react-components/src/linedrawings/bibi.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Bibi = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BibiFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BibiBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bob.mjs b/packages/react-components/src/linedrawings/bob.mjs
deleted file mode 100644
index bfdc0533853..00000000000
--- a/packages/react-components/src/linedrawings/bob.mjs
+++ /dev/null
@@ -1,89 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Bob = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BobFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BobBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/breanna.mjs b/packages/react-components/src/linedrawings/breanna.mjs
deleted file mode 100644
index cce23f46e41..00000000000
--- a/packages/react-components/src/linedrawings/breanna.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Breanna = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BreannaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BreannaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/brian.mjs b/packages/react-components/src/linedrawings/brian.mjs
deleted file mode 100644
index 878cfb0b85d..00000000000
--- a/packages/react-components/src/linedrawings/brian.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Brian = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BrianFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BrianBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/bruce.mjs b/packages/react-components/src/linedrawings/bruce.mjs
deleted file mode 100644
index 3a2c4d11f30..00000000000
--- a/packages/react-components/src/linedrawings/bruce.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Bruce = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const BruceFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const BruceBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/carlita.mjs b/packages/react-components/src/linedrawings/carlita.mjs
deleted file mode 100644
index 53bf94ffed7..00000000000
--- a/packages/react-components/src/linedrawings/carlita.mjs
+++ /dev/null
@@ -1,375 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Carlita = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const CarlitaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const CarlitaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/carlton.mjs b/packages/react-components/src/linedrawings/carlton.mjs
deleted file mode 100644
index 71a322dd17b..00000000000
--- a/packages/react-components/src/linedrawings/carlton.mjs
+++ /dev/null
@@ -1,357 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Carlton = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const CarltonFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const CarltonBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/cathrin.mjs b/packages/react-components/src/linedrawings/cathrin.mjs
deleted file mode 100644
index 577116f16f5..00000000000
--- a/packages/react-components/src/linedrawings/cathrin.mjs
+++ /dev/null
@@ -1,752 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Cathrin = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const CathrinFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const CathrinBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/charlie.mjs b/packages/react-components/src/linedrawings/charlie.mjs
deleted file mode 100644
index 857773c3f22..00000000000
--- a/packages/react-components/src/linedrawings/charlie.mjs
+++ /dev/null
@@ -1,285 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Charlie = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const CharlieFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const CharlieBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/cornelius.mjs b/packages/react-components/src/linedrawings/cornelius.mjs
deleted file mode 100644
index 9c1d5c7e70b..00000000000
--- a/packages/react-components/src/linedrawings/cornelius.mjs
+++ /dev/null
@@ -1,480 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, regular, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Cornelius = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const CorneliusFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const CorneliusBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/diana.mjs b/packages/react-components/src/linedrawings/diana.mjs
deleted file mode 100644
index 7938f25e168..00000000000
--- a/packages/react-components/src/linedrawings/diana.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Diana = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const DianaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const DianaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/florence.mjs b/packages/react-components/src/linedrawings/florence.mjs
deleted file mode 100644
index 50bcdd302ad..00000000000
--- a/packages/react-components/src/linedrawings/florence.mjs
+++ /dev/null
@@ -1,58 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Florence = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const FlorenceFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/florent.mjs b/packages/react-components/src/linedrawings/florent.mjs
deleted file mode 100644
index 2f0a22d5bca..00000000000
--- a/packages/react-components/src/linedrawings/florent.mjs
+++ /dev/null
@@ -1,103 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Florent = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const FlorentFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/gozer.mjs b/packages/react-components/src/linedrawings/gozer.mjs
deleted file mode 100644
index d541a9b10cd..00000000000
--- a/packages/react-components/src/linedrawings/gozer.mjs
+++ /dev/null
@@ -1,181 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, regular } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Gozer = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const GozerFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const GozerBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/hi.mjs b/packages/react-components/src/linedrawings/hi.mjs
deleted file mode 100644
index b6db0aa0847..00000000000
--- a/packages/react-components/src/linedrawings/hi.mjs
+++ /dev/null
@@ -1,122 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, regular } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Hi = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const HiFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/holmes.mjs b/packages/react-components/src/linedrawings/holmes.mjs
deleted file mode 100644
index d84c45891bb..00000000000
--- a/packages/react-components/src/linedrawings/holmes.mjs
+++ /dev/null
@@ -1,157 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Holmes = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const HolmesFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/hortensia.mjs b/packages/react-components/src/linedrawings/hortensia.mjs
deleted file mode 100644
index e3eba6a5c0f..00000000000
--- a/packages/react-components/src/linedrawings/hortensia.mjs
+++ /dev/null
@@ -1,53 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Hortensia = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const HortensiaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/huey.mjs b/packages/react-components/src/linedrawings/huey.mjs
deleted file mode 100644
index bc3954cb092..00000000000
--- a/packages/react-components/src/linedrawings/huey.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Huey = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const HueyFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const HueyBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/hugo.mjs b/packages/react-components/src/linedrawings/hugo.mjs
deleted file mode 100644
index fa1d1f5bf34..00000000000
--- a/packages/react-components/src/linedrawings/hugo.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Hugo = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const HugoFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const HugoBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/index.mjs b/packages/react-components/src/linedrawings/index.mjs
deleted file mode 100644
index 3b8ff671ab9..00000000000
--- a/packages/react-components/src/linedrawings/index.mjs
+++ /dev/null
@@ -1,143 +0,0 @@
-import { Aaron, AaronFront, AaronBack } from './aaron.mjs'
-import { Albert, AlbertFront } from './albert.mjs'
-import { Bee, BeeFront } from './bee.mjs'
-import { Bella, BellaFront, BellaBack } from './bella.mjs'
-import { Benjamin, BenjaminFront } from './benjamin.mjs'
-import { Bent, BentFront, BentBack } from './bent.mjs'
-import { Bibi, BibiFront, BibiBack } from './bibi.mjs'
-import { Bob, BobFront, BobBack } from './bob.mjs'
-import { Breanna, BreannaFront, BreannaBack } from './breanna.mjs'
-import { Brian, BrianFront, BrianBack } from './brian.mjs'
-import { Bruce, BruceFront, BruceBack } from './bruce.mjs'
-import { Carlita, CarlitaFront, CarlitaBack } from './carlita.mjs'
-import { Carlton, CarltonFront, CarltonBack } from './carlton.mjs'
-import { Cathrin, CathrinFront, CathrinBack } from './cathrin.mjs'
-import { Charlie, CharlieFront, CharlieBack } from './charlie.mjs'
-import { Cornelius, CorneliusFront, CorneliusBack } from './cornelius.mjs'
-import { Diana, DianaFront, DianaBack } from './diana.mjs'
-import { Florence, FlorenceFront } from './florence.mjs'
-import { Florent, FlorentFront } from './florent.mjs'
-import { Gozer, GozerFront, GozerBack } from './gozer.mjs'
-import { Hi, HiFront } from './hi.mjs'
-import { Holmes, HolmesFront } from './holmes.mjs'
-import { Hortensia, HortensiaFront } from './hortensia.mjs'
-import { Huey, HueyFront, HueyBack } from './huey.mjs'
-import { Hugo, HugoFront, HugoBack } from './hugo.mjs'
-import { Lucy, LucyFront } from './lucy.mjs'
-import { Lumina, LuminaFront, LuminaBack } from './lumina.mjs'
-import { Lumira, LumiraFront, LumiraBack } from './lumira.mjs'
-import { Lunetius, LunetiusFront } from './lunetius.mjs'
-import { Noble, NobleFront, NobleBack } from './noble.mjs'
-import { Simon, SimonFront, SimonBack } from './simon.mjs'
-import { Teagan, TeaganFront, TeaganBack } from './teagan.mjs'
-import { Tristan, TristanFront, TristanBack } from './tristan.mjs'
-import { Uma, UmaFront, UmaBack } from './uma.mjs'
-import { Umbra, UmbraFront, UmbraBack } from './umbra.mjs'
-import { Wahid, WahidFront, WahidBack } from './wahid.mjs'
-
-export const lineDrawingsFront = {
- aaron: AaronFront,
- albert: AlbertFront,
- bee: BeeFront,
- bella: BellaFront,
- benjamin: BenjaminFront,
- bent: BentFront,
- bibi: BibiFront,
- bob: BobFront,
- breanna: BreannaFront,
- brian: BrianFront,
- bruce: BruceFront,
- carlita: CarlitaFront,
- carlton: CarltonFront,
- cathrin: CathrinFront,
- charlie: CharlieFront,
- cornelius: CorneliusFront,
- diana: DianaFront,
- florence: FlorenceFront,
- florent: FlorentFront,
- gozer: GozerFront,
- hi: HiFront,
- holmes: HolmesFront,
- huey: HueyFront,
- hugo: HugoFront,
- lucy: LucyFront,
- lumina: LuminaFront,
- lumira: LumiraFront,
- lunetius: LunetiusFront,
- noble: NobleFront,
- hortensia: HortensiaFront,
- simon: SimonFront,
- teagan: TeaganFront,
- tristan: TristanFront,
- uma: UmaFront,
- umbra: UmbraFront,
- wahid: WahidFront,
-}
-
-export const lineDrawingsBack = {
- aaron: AaronBack,
- bella: BellaBack,
- bent: BentBack,
- bibi: BibiBack,
- bob: BobBack,
- breanna: BreannaBack,
- brian: BrianBack,
- bruce: BruceBack,
- carlita: CarlitaBack,
- carlton: CarltonBack,
- cathrin: CathrinBack,
- charlie: CharlieBack,
- cornelius: CorneliusBack,
- diana: DianaBack,
- gozer: GozerBack,
- huey: HueyBack,
- hugo: HugoBack,
- lumina: LuminaBack,
- lumira: LumiraBack,
- noble: NobleBack,
- simon: SimonBack,
- teagan: TeaganBack,
- tristan: TristanBack,
- uma: UmaBack,
- umbra: UmbraBack,
- wahid: WahidBack,
-}
-
-export const lineDrawings = {
- aaron: Aaron,
- albert: Albert,
- bee: Bee,
- bella: Bella,
- benjamin: Benjamin,
- bent: Bent,
- bibi: Bibi,
- bob: Bob,
- breanna: Breanna,
- brian: Brian,
- bruce: Bruce,
- carlita: Carlita,
- carlton: Carlton,
- cathrin: Cathrin,
- charlie: Charlie,
- cornelius: Cornelius,
- diana: Diana,
- florence: Florence,
- florent: Florent,
- gozer: Gozer,
- hi: Hi,
- holmes: Holmes,
- huey: Huey,
- hugo: Hugo,
- lucy: Lucy,
- lumina: Lumina,
- lumira: Lumira,
- lunetius: Lunetius,
- noble: Noble,
- hortensia: Hortensia,
- simon: Simon,
- teagan: Teagan,
- tristan: Tristan,
- uma: Uma,
- umbra: Umbra,
- wahid: Wahid,
-}
diff --git a/packages/react-components/src/linedrawings/lucy.mjs b/packages/react-components/src/linedrawings/lucy.mjs
deleted file mode 100644
index 389adeb29ce..00000000000
--- a/packages/react-components/src/linedrawings/lucy.mjs
+++ /dev/null
@@ -1,80 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, regular } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Lucy = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const LucyFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/lumina.mjs b/packages/react-components/src/linedrawings/lumina.mjs
deleted file mode 100644
index 7548e00029a..00000000000
--- a/packages/react-components/src/linedrawings/lumina.mjs
+++ /dev/null
@@ -1,161 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Lumina = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const LuminaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const LuminaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/lumira.mjs b/packages/react-components/src/linedrawings/lumira.mjs
deleted file mode 100644
index 0f8555dabf7..00000000000
--- a/packages/react-components/src/linedrawings/lumira.mjs
+++ /dev/null
@@ -1,179 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Lumira = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const LumiraFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const LumiraBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/lunetius.mjs b/packages/react-components/src/linedrawings/lunetius.mjs
deleted file mode 100644
index c0aa3562c78..00000000000
--- a/packages/react-components/src/linedrawings/lunetius.mjs
+++ /dev/null
@@ -1,58 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.6
-
-export const Lunetius = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const LunetiusFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/noble.mjs b/packages/react-components/src/linedrawings/noble.mjs
deleted file mode 100644
index 38e9427779c..00000000000
--- a/packages/react-components/src/linedrawings/noble.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Noble = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const NobleFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const NobleBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the front
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/shared.mjs b/packages/react-components/src/linedrawings/shared.mjs
deleted file mode 100644
index 6db43f1a571..00000000000
--- a/packages/react-components/src/linedrawings/shared.mjs
+++ /dev/null
@@ -1,51 +0,0 @@
-import React from 'react'
-
-/*
- * A React component to wrap SVG linedrawings for FreeSewing designs
- *
- * @param design {string} - The (lowercase) name of a FreeSewing design
- * @param className {string} - CSS classes to set on the svg tag
- *
- * @return LineDrawing as JSX
- */
-export const LineDrawingWrapper = ({
- className = 'w-64', // CSS classes to apply
- viewBox = '0 0 100 100', // SVG viewBox
- stroke = 1, // Stroke to use
- children = [], // The actual linedrawing
- style = { maxHeight: 'inherit' },
-}) => (
-
- {children}
-
-)
-
-/*
- * Regular stroke-width helper to ensure consistency across linedrawings
- */
-export const regular = (stroke = 1) => ({ strokeWidth: stroke })
-
-/*
- * Thin stroke-width helper to ensure consistency across linedrawings
- */
-export const thin = (stroke = 1) => ({ strokeWidth: stroke / 2 })
-
-/*
- * Very thin stroke-width helper to ensure consistency across linedrawings
- */
-export const veryThin = (stroke = 1) => ({ strokeWidth: stroke / 3 })
-
-/*
- * Dashed stroke-dasharray helper to ensure consistency across linedrawings
- */
-export const dashed = (stroke = 1) => ({ strokeDasharray: `${stroke * 1.2},${stroke * 0.8}` })
diff --git a/packages/react-components/src/linedrawings/simon.mjs b/packages/react-components/src/linedrawings/simon.mjs
deleted file mode 100644
index 1899d395367..00000000000
--- a/packages/react-components/src/linedrawings/simon.mjs
+++ /dev/null
@@ -1,140 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.35
-
-export const Simon = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const SimonFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const SimonBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * Always use an id for defs that is unique to the design because if we have
- * multiple linedrawings on the page, they share the same namespace and thus
- * IDs will collide
- */
-const defs = (
-
-
-
-
-
-
-
-
-
-)
-
-/*
- * SVG elements for the back
- */
-const Front = ({ stroke }) => (
- <>
- {defs}
-
-
-
-
-
-
-
-
-
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/teagan.mjs b/packages/react-components/src/linedrawings/teagan.mjs
deleted file mode 100644
index 98ee99cac58..00000000000
--- a/packages/react-components/src/linedrawings/teagan.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Teagan = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const TeaganFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const TeaganBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/tristan.mjs b/packages/react-components/src/linedrawings/tristan.mjs
deleted file mode 100644
index cabc6e4952f..00000000000
--- a/packages/react-components/src/linedrawings/tristan.mjs
+++ /dev/null
@@ -1,89 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, regular } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Tristan = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const TristanFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const TristanBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/uma.mjs b/packages/react-components/src/linedrawings/uma.mjs
deleted file mode 100644
index d685c64ad8d..00000000000
--- a/packages/react-components/src/linedrawings/uma.mjs
+++ /dev/null
@@ -1,89 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Uma = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const UmaFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const UmaBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/umbra.mjs b/packages/react-components/src/linedrawings/umbra.mjs
deleted file mode 100644
index 601f7d95208..00000000000
--- a/packages/react-components/src/linedrawings/umbra.mjs
+++ /dev/null
@@ -1,170 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.5
-
-export const Umbra = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-/*
- * React component for the front
- */
-export const UmbraFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * React component for the back
- */
-export const UmbraBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * SVG elements for the front
- */
-export const Front = ({ stroke }) => (
- <>
-
-
- >
-)
-
-/*
- * SVG elements for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/linedrawings/wahid.mjs b/packages/react-components/src/linedrawings/wahid.mjs
deleted file mode 100644
index c8db87d0d5f..00000000000
--- a/packages/react-components/src/linedrawings/wahid.mjs
+++ /dev/null
@@ -1,117 +0,0 @@
-import React from 'react'
-import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
-
-const strokeScale = 0.4
-
-export const Wahid = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
-
- )
-}
-
-export const WahidFront = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-export const WahidBack = ({
- className = 'w-64', // CSS classes to apply
- stroke = 1, // Stroke width to use
-}) => {
- // Normalize stroke across designs
- stroke = stroke * strokeScale
-
- return (
-
-
-
- )
-}
-
-/*
- * Always use an id for defs that is unique to the design because if we have
- * multiple linedrawings on the page, they share the same namespace and thus
- * IDs will collide
- */
-const defs = (
-
-
-
-
-
-
-
-
-
-)
-
-/*
- * React component for the front
- */
-export const Front = ({ stroke }) => (
- <>
- {defs}
-
-
-
-
-
-
-
-
-
- >
-)
-
-/*
- * React component for the back
- */
-const Back = ({ stroke }) => (
- <>
-
-
-
- >
-)
diff --git a/packages/react-components/src/pattern-xray/index.mjs b/packages/react-components/src/pattern-xray/index.mjs
deleted file mode 100644
index a4f73b11791..00000000000
--- a/packages/react-components/src/pattern-xray/index.mjs
+++ /dev/null
@@ -1,72 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React, { forwardRef } from 'react'
-import { defaultPatternComponents } from '../pattern/index.mjs'
-// Components that can be swizzled
-import { PointXray } from './point.mjs'
-import { PathXray } from './path.mjs'
-/*
- * Allow people to swizzle these components
- */
-export const defaultPatternXrayComponents = {
- ...defaultPatternComponents,
- Point: PointXray,
- Path: PathXray,
-}
-
-export const PatternXray = forwardRef(
- (
- {
- renderProps = false,
- t = (string) => string,
- components = {},
- children = false,
- className = 'freesewing pattern',
- },
- ref
- ) => {
- if (!renderProps) return null
-
- // Merge default and swizzled components
- components = {
- ...defaultPatternXrayComponents,
- ...components,
- }
-
- const { Svg, Defs, Stack, Group } = components
-
- const optionalProps = {}
- if (className) optionalProps.className = className
-
- return (
-
-
-
-
- {children
- ? children
- : Object.keys(renderProps.stacks).map((stackName) => (
-
- ))}
-
-
- )
- }
-)
-
-PatternXray.displayName = 'PatternXray'
diff --git a/packages/react-components/src/pattern-xray/path.mjs b/packages/react-components/src/pattern-xray/path.mjs
deleted file mode 100644
index 69193310fab..00000000000
--- a/packages/react-components/src/pattern-xray/path.mjs
+++ /dev/null
@@ -1,46 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-import React from 'react'
-// Components
-import { Path } from '../pattern/path.mjs'
-import { getProps } from '../pattern/utils.mjs'
-
-const coords = (point) => `${point.x},${point.y}`
-
-const Cp = ({ at }) => (
-
-)
-
-const Xray = ({ path }) => {
- const output = []
- let prev
- let i = 0
- for (const op of path.ops) {
- if (op.type === 'curve') {
- output.push(
- ,
- ,
-
- )
- }
- prev = op
- i++
- }
- output.push(
-
- )
-
- return output
-}
-
-export const PathXray = ({ stackName, pathName, part, path, settings, components, t }) => (
- <>
-
-
- >
-)
diff --git a/packages/react-components/src/pattern-xray/point.mjs b/packages/react-components/src/pattern-xray/point.mjs
deleted file mode 100644
index 4d92370c99f..00000000000
--- a/packages/react-components/src/pattern-xray/point.mjs
+++ /dev/null
@@ -1,21 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-import React from 'react'
-// Components
-import { Point } from '../pattern/point.mjs'
-import { withinPartBounds } from '../pattern/utils.mjs'
-
-export const PointXray = ({ stackName, pointName, part, point, settings, components, t }) => {
- // Don't include parts outside the part bounding box
- if (!withinPartBounds(point, part)) return null
- return (
- <>
-
-
- >
- )
-}
diff --git a/packages/react-components/src/pattern/index.mjs b/packages/react-components/src/pattern/index.mjs
deleted file mode 100644
index 675248d6e9d..00000000000
--- a/packages/react-components/src/pattern/index.mjs
+++ /dev/null
@@ -1,90 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React, { forwardRef } from 'react'
-// Components that can be swizzled
-import { Svg as DefaultSvg } from './svg.mjs'
-import { Defs as DefaultDefs } from './defs.mjs'
-import { Group as DefaultGroup } from './group.mjs'
-import { Stack as DefaultStack } from './stack.mjs'
-import { Part as DefaultPart } from './part.mjs'
-import { Point as DefaultPoint } from './point.mjs'
-import { Snippet as DefaultSnippet } from './snippet.mjs'
-import { Path as DefaultPath } from './path.mjs'
-import { Grid as DefaultGrid } from './grid.mjs'
-import { Text as DefaultText, TextOnPath as DefaultTextOnPath } from './text.mjs'
-import { Circle as DefaultCircle } from './circle.mjs'
-
-/*
- * Allow people to swizzle these components
- */
-export const defaultPatternComponents = {
- Svg: DefaultSvg,
- Defs: DefaultDefs,
- Group: DefaultGroup,
- Stack: DefaultStack,
- Part: DefaultPart,
- Point: DefaultPoint,
- Path: DefaultPath,
- Snippet: DefaultSnippet,
- Grid: DefaultGrid,
- Text: DefaultText,
- TextOnPath: DefaultTextOnPath,
- Circle: DefaultCircle,
-}
-
-export const Pattern = forwardRef(
- (
- {
- renderProps = false,
- t = (string) => string,
- components = {},
- children = false,
- className = 'freesewing pattern',
- },
- ref
- ) => {
- if (!renderProps) return null
-
- // Merge default and swizzled components
- components = {
- ...defaultPatternComponents,
- ...components,
- }
-
- const { Svg, Defs, Stack, Group } = components
-
- const optionalProps = {}
- if (className) optionalProps.className = className
-
- return (
-
-
-
-
- {children
- ? children
- : Object.keys(renderProps.stacks).map((stackName) => (
-
- ))}
-
-
- )
- }
-)
-
-Pattern.displayName = 'Pattern'
diff --git a/packages/react-components/src/pattern/path.mjs b/packages/react-components/src/pattern/path.mjs
deleted file mode 100644
index fe491520ef1..00000000000
--- a/packages/react-components/src/pattern/path.mjs
+++ /dev/null
@@ -1,23 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React from 'react'
-import { getId, getProps } from './utils.mjs'
-
-export const Path = ({ stackName, pathName, path, partName, settings, components, t }) => {
- // Don't render hidden paths
- if (path.hidden) return null
-
- // Get potentially swizzled components
- const { TextOnPath } = components
-
- const pathId = getId({ settings, stackName, partName, pathName })
-
- return (
- <>
-
- {path.attributes.text && path.attributes.text.length > 0 ? (
-
- ) : null}
- >
- )
-}
diff --git a/packages/react-components/src/pattern/point.mjs b/packages/react-components/src/pattern/point.mjs
deleted file mode 100644
index a2aa236cc4d..00000000000
--- a/packages/react-components/src/pattern/point.mjs
+++ /dev/null
@@ -1,22 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React from 'react'
-import { withinPartBounds } from './utils.mjs'
-
-export const Point = ({ stackName, partName, pointName, part, point, components, t }) => {
- /*
- * Don't include points outside the part bounding box
- * Unless the `data-render-always` attribute is set
- */
- if (!withinPartBounds(point, part) && !point.attributes.list['data-render-always']) return null
-
- // Get potentially swizzled components
- const { Circle, Text } = components
-
- return point.attributes ? (
- <>
- {point.attributes.text ? : null}
- {point.attributes.circle ? : null}
- >
- ) : null
-}
diff --git a/packages/react-components/src/pattern/stack.mjs b/packages/react-components/src/pattern/stack.mjs
deleted file mode 100644
index 619f22ba9f7..00000000000
--- a/packages/react-components/src/pattern/stack.mjs
+++ /dev/null
@@ -1,17 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React from 'react'
-import { getProps } from './utils.mjs'
-
-export const Stack = ({ stackName, stack, settings, components, t }) => {
- const { Group, Part, Grid } = components
-
- return (
-
- {settings[0].paperless ? : null}
- {[...stack.parts].map((part, key) => (
-
- ))}
-
- )
-}
diff --git a/packages/react-components/src/pattern/text.mjs b/packages/react-components/src/pattern/text.mjs
deleted file mode 100644
index 8990aff0066..00000000000
--- a/packages/react-components/src/pattern/text.mjs
+++ /dev/null
@@ -1,56 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React from 'react'
-import { translateStrings } from './utils.mjs'
-
-export const TextSpans = ({ point, t }) => {
- const translated = translateStrings(t, point.attributes.list['data-text'])
- const text = []
- if (translated.indexOf('\n') !== -1) {
- // Handle muti-line text
- let key = 0
- let lines = translated.split('\n')
- text.push({lines.shift()} )
- for (let line of lines) {
- key++
- text.push(
-
- {line.toString().replace(/"/g, '"')}
-
- )
- }
- } else text.push({translated} )
-
- return text
-}
-
-export const Text = ({ point, t }) => (
-
-
-
-)
-
-export const TextOnPath = ({ path, pathId, t }) => {
- const textPathProps = {
- xlinkHref: '#' + pathId,
- startOffset: '0%',
- }
- const translated = translateStrings(t, path.attributes.text)
- const align = path.attributes.list['data-text-class']
- ? path.attributes.list['data-text-class'].join(' ')
- : false
- if (align && align.indexOf('center') > -1) textPathProps.startOffset = '50%'
- else if (align && align.indexOf('right') > -1) textPathProps.startOffset = '100%'
-
- return (
-
-
-
-
-
- )
-}
diff --git a/packages/react-components/src/pattern/utils.mjs b/packages/react-components/src/pattern/utils.mjs
deleted file mode 100644
index fde6a025584..00000000000
--- a/packages/react-components/src/pattern/utils.mjs
+++ /dev/null
@@ -1,79 +0,0 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
-import React from 'react'
-
-export const getProps = (obj) => {
- /** I can't believe it but there seems to be no method on NPM todo this */
- const cssKey = (key) => {
- let chunks = key.split('-')
- if (chunks.length > 1) {
- key = chunks.shift()
- for (let s of chunks) key += s.charAt(0).toUpperCase() + s.slice(1)
- }
-
- return key
- }
-
- const convert = (css) => {
- let style = {}
- let rules = css.split(';')
- for (let rule of rules) {
- let chunks = rule.split(':')
- if (chunks.length === 2) style[cssKey(chunks[0].trim())] = chunks[1].trim()
- }
- return style
- }
-
- let rename = {
- class: 'className',
- 'marker-start': 'markerStart',
- 'marker-end': 'markerEnd',
- }
- let props = {}
- for (let key in obj.attributes.list) {
- if (key === 'style') props[key] = convert(obj.attributes.list[key].join(' '))
- if (Object.keys(rename).indexOf(key) !== -1)
- props[rename[key]] = obj.attributes.list[key].join(' ')
- else if (key !== 'style') props[key] = obj.attributes.list[key].join(' ')
- }
-
- return props
-}
-
-export const withinPartBounds = (point, part) =>
- point.x >= part.topLeft.x &&
- point.x <= part.bottomRight.x &&
- point.y >= part.topLeft.y &&
- point.y <= part.bottomRight.y
- ? true
- : false
-
-export const getId = ({
- settings = {},
- stackName = false,
- partName = false,
- pathName = false,
- pointName = false,
- snippetName = false,
- name = false,
-}) => {
- let id = settings.idPrefix || ''
- if (stackName) id += `${stackName}-`
- if (partName) id += `${partName}-`
- if (pathName) id += `${pathName}-`
- if (pointName) id += `${pointName}-`
- if (snippetName) id += `${snippetName}-`
- if (name) id += name
-
- return id
-}
-
-export const translateStrings = (t, list) => {
- let translated = ''
- for (const string of list) {
- if (Array.isArray(string)) translated += translateStrings(t, string)
- else if (string) translated += t(string.toString()).replace(/"/g, '"') + ' '
- }
-
- return translated
-}
diff --git a/packages/react-components/src/popout.mjs b/packages/react-components/src/popout.mjs
deleted file mode 100644
index 6b77e45eb5c..00000000000
--- a/packages/react-components/src/popout.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-import React from 'react'
-import { mergeProps } from './utils.mjs'
-import { Popout as SwizzledPopout } from './editor/swizzle/components/popout.mjs'
-import { CloseIcon } from './editor/swizzle/components/icons.mjs'
-
-const t = (id) => id
-
-export const Popout = (props) =>
diff --git a/packages/react-components/src/utils.mjs b/packages/react-components/src/utils.mjs
deleted file mode 100644
index 0f06f2953ce..00000000000
--- a/packages/react-components/src/utils.mjs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Helper method to save us having to type typeof checks all the time
- *
- * @param {mixed} obj - The value to check
- * @return {bool} result - True of obj is of type object
- */
-export function isObject (obj) {
- return (typeof obj === 'object' && !Array.isArray(obj))
-}
-
-/*
- * Helper method to inject props into a component made for Swizzling
- *
- * @param {object} props - The props to merge
- * @param {object} components - Any swizzled components to add
- * @param {object} methods - Any swizzled methods to add
- * @return {object} props - The merged props object
- */
-export function mergeProps (props, components=false, methods=false) {
- const Swizzled = isObject(props.Swizzled)
- ? props.Swizzled
- : { components: {}, methods: {} }
-
- if (components) {
- if (isObject(Swizzled.components)) Swizzled.components = { ...components, ...Swizzled.components }
- else Swizzled.components = components
- }
-
- if (methods) {
- if (isObject(Swizzled.methods)) Swizzled.methods = { ...methods, ...Swizzled.methods }
- else Swizzled.methods = methods
- }
-
- return { ...props, Swizzled }
-}
-
-
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
new file mode 100644
index 00000000000..16cabdddc1e
--- /dev/null
+++ b/packages/react/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Change log for: @freesewing/react
+
+
+## 4.0.0 (2024-04-01)
+
+### Added
+
+ - The `@freesewing/react` package holds shared components, hooks, and context for our React-based frontends
+
+## 3.0.0 (2023-09-30)
+
+### Changed
+
+ - All FreeSewing packages are now ESM only.
+ - All FreeSewing packages now use named exports.
+ - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
+
+
+This is the **initial release**, and the start of this change log.
+
+> Prior to version 2, FreeSewing was not a JavaScript project.
+> As such, that history is out of scope for this change log.
+
diff --git a/packages/react/README.md b/packages/react/README.md
new file mode 100644
index 00000000000..769ee0f78a6
--- /dev/null
+++ b/packages/react/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+# @freesewing/react
+
+React components, hooks and context by/for FreeSewing
+
+
+
+# FreeSewing
+
+> [!TIP]
+>#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
+>
+> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
+>
+> If you feel FreeSewing is worthwhile, and you can spend a few coins without
+hardship, then you should [join us and become a patron](https://freesewing.eu/patrons/join).
+
+## What am I looking at? 🤔
+
+This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
+
+This folder holds: @freesewing/react
+
+If you're not entirely sure what to do or how to start, type this command:
+
+```
+npm run tips
+```
+
+> [!NOTE]
+> If you don't want to set up a dev environment, you can run it in your browser:
+>
+> [](https://gitpod.io/#https://codeberg.org/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.eu](https://freesewing.eu/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx @freesewing/studio
+```
+
+Getting started guides are available for:
+- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
+- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
+- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
+
+The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
+show you how to create your first parametric design.
+
+## Getting started ⚡
+
+To get started with FreeSewing, you can spin up our development environment with:
+
+```bash
+npx @freesewing/studio
+```
+
+To work with FreeSewing's monorepo, you'll need [NodeJS v20](https://nodejs.org) on your system.
+Once you have that, clone (or fork) this repo and run `npm run kickstart`:
+
+```bash
+git clone git@codeberg.org:freesewing/freesewing.git
+cd freesewing
+npm run kickstart
+```
+
+## Links 👩💻
+
+**Official channels**
+
+ - 💻 Makers website: [FreeSewing.eu](https://freesewing.eu/)
+ - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev/)
+ - ✅ [Support](https://forum.freesewing.eu/),
+ [Issues](https://codeberg.org/freesewing/freesewing/issues) &
+ [Codeberg](https://codeberg.org/freesewing/freesewing)
+
+**Social media**
+
+ - 🐘 Mastodon: [@freesewing](https://freesewing.social/@freesewing) on [FreeSewing.social](https://freesewing.social/)
+ - 🐘 Mastodon: [@joost](https://freesewing.social/@joost) on [FreeSewing.social](https://freesewing.social/)
+
+**Places the FreeSewing community hangs out**
+
+ - 💬 [Forum](https://forum.freesewing.eu/)
+ - 💬 [Discord](https://discord.freesewing.org/)
+ - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
+
+## License: MIT 🤓
+
+© [Joost De Cock](https://codeberg.org/joostdecock).
+See [the license file](https://codeberg.org/freesewing/freesewing/blob/develop/LICENSE) for details.
+
+## Where to get help 🤯
+
+For [Support](https://freesewing.eu/support), please use the [forum](https://forum.freesewing.eu).
+
diff --git a/packages/react/components/Account/Apikeys.mjs b/packages/react/components/Account/Apikeys.mjs
new file mode 100644
index 00000000000..f95c17fc491
--- /dev/null
+++ b/packages/react/components/Account/Apikeys.mjs
@@ -0,0 +1,350 @@
+// Dependencies
+import { DateTime } from 'luxon'
+import orderBy from 'lodash/orderBy.js'
+import { capitalize, shortDate } from '@freesewing/utils'
+import { apikeyLevels } from '@freesewing/config'
+// Context
+import { ModalContext } from '@freesewing/react/context/Modal'
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+import { useSelection } from '@freesewing/react/hooks/useSelection'
+
+// Components
+import { TableWrapper } from '@freesewing/react/components/Table'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import {
+ BoolNoIcon,
+ BoolYesIcon,
+ PlusIcon,
+ RightIcon,
+ TrashIcon,
+} from '@freesewing/react/components/Icon'
+import { Uuid } from '@freesewing/react/components/Uuid'
+import { Popout } from '@freesewing/react/components/Popout'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { NumberCircle } from '@freesewing/react/components/Number'
+import { StringInput, FormControl, ListInput } from '@freesewing/react/components/Input'
+import { DisplayRow } from './shared.mjs'
+import { CopyToClipboardButton } from '@freesewing/react/components/CopyToClipboardButton'
+import { TimeAgo, TimeToGo } from '@freesewing/react/components/Time'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+
+const t = (input) => {
+ console.log('t called', input)
+ return input
+}
+
+const fields = {
+ id: 'Key',
+ name: 'Name',
+ calls: 'Calls',
+ level: 'Level',
+ level: 'Level',
+ createdAt: 'Created',
+ expiresAt: 'Expires',
+}
+
+/*
+ * Component for the account/apikeys page
+ *
+ * @params {object} props - All React props
+ * @params {function} Link - A framework specific Link component for client-side routing
+ */
+export const Apikeys = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // State
+ const [apikeys, setApikeys] = useState([])
+ const [refresh, setRefresh] = useState(0)
+ const [order, setOrder] = useState('id')
+ const [desc, setDesc] = useState(false)
+
+ // Hooks
+ const backend = useBackend()
+ const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext)
+ const { count, selection, setSelection, toggle, toggleAll } = useSelection(apikeys)
+
+ // Context
+ const { setModal } = useContext(ModalContext)
+
+ // Effects
+ useEffect(() => {
+ const getApikeys = async () => {
+ setLoadingStatus([true, 'Loading API keys from backend'])
+ const [status, body] = await backend.getApikeys()
+ if (status === 200) {
+ setApikeys(body.apikeys)
+ setLoadingStatus([true, 'API keys loaded', true, true])
+ } else setLoadingStatus([false, 'Failed to load API keys from backend', true, true])
+ }
+ getApikeys()
+ }, [refresh])
+
+ // Helper to delete one or more patterns
+ const removeSelectedApikeys = async () => {
+ let i = 0
+ for (const key in selection) {
+ i++
+ await backend.removeApikey(key)
+ setLoadingStatus([
+ true,
+ ,
+ ])
+ }
+ setSelection({})
+ setRefresh(refresh + 1)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ }
+
+ return (
+ <>
+
+
+ {count} API Keys
+
+
+ setModal(
+
+ setRefresh(refresh + 1)} />
+
+ )
+ }
+ >
+
+ Create a new API key
+
+
+
+
+
+ >
+ )
+}
+
+const ApiKey = ({ apikey }) => (
+ <>
+
+ API Key
+
+
+ {Object.entries(fields).map(([key, label]) => (
+
+ {label}: {apikey[key]}
+
+ ))}
+
+ >
+)
+
+const NewApikey = ({ onCreate = false }) => {
+ // State
+ const [name, setName] = useState('')
+ const [level, setLevel] = useState(1)
+ const [expires, setExpires] = useState(Date.now())
+ const [apikey, setApikey] = useState(false)
+
+ // Hooks
+ const { account } = useAccount()
+ const backend = useBackend()
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ const levels = account.role === 'admin' ? [0, 1, 2, 3, 4, 5, 6, 7, 8] : [0, 1, 2, 3, 4]
+
+ const createKey = async () => {
+ setLoadingStatus([true, 'Creating new API key'])
+ const [status, body] = await backend.createApikey({
+ name,
+ level,
+ expiresIn: Math.floor((expires.valueOf() - Date.now().valueOf()) / 1000),
+ })
+ if (status === 201 && body.result === 'created') {
+ setLoadingStatus([true, 'API key created', true, true])
+ setApikey(body.apikey)
+ if (typeof onCreate === 'function') onCreate(body.apikey)
+ } else setLoadingStatus([true, 'An error occured. Please report this', true, false])
+ }
+
+ const clear = () => {
+ setApikey(false)
+ setGenerate(false)
+ setName('')
+ setLevel(1)
+ }
+
+ return (
+
+
New API key {apikey ? `: ${apikey.name}` : ''}
+ {apikey ? (
+
+ ) : (
+ <>
+
val.length > 0}
+ placeholder={'Alicia Key'}
+ />
+
+ ({
+ val: l,
+ label: (
+
+ {apikeyLevels[l]}
+
+
+ ),
+ }))}
+ current={level}
+ update={setLevel}
+ />
+
+
+ New API key
+
+
+ >
+ )}
+
+ )
+}
+
+const ShowNewApikey = ({ apikey }) => (
+
+
+
+
+ } color="secondary" />
+ } color="secondary" />
+
+
+ Key
+
+
+
{apikey.key}
+
+ Secret
+
+
+
{apikey.secret}
+
+ This is the only time you can see the key secret, make sure to copy it.
+
+
+)
+
+const ExpiryPicker = ({ expires, setExpires }) => {
+ const [days, setDays] = useState(1)
+
+ // Run update when component mounts
+ useEffect(() => update(days), [])
+
+ const update = (evt) => {
+ const value = typeof evt === 'number' ? evt : evt.target.value
+ setExpires(DateTime.now().plus({ days: value }))
+ setDays(value)
+ }
+
+ return (
+
+ }
+ >
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Avatar.mjs b/packages/react/components/Account/Avatar.mjs
new file mode 100644
index 00000000000..0715084e869
--- /dev/null
+++ b/packages/react/components/Account/Avatar.mjs
@@ -0,0 +1,111 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { cloudflareImageUrl } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { PassiveImageInput } from '@freesewing/react/components/Input'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+/*
+ * Component for the account/bio page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const Avatar = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+
+ // State
+ const [img, setImg] = useState('')
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Save handler
+ const save = async () => {
+ setLoadingStatus([true, 'Uploading image'])
+ const [status, body] = await backend.updateAccount({ img })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'Avatar saved', true, true])
+ } else setLoadingStatus([true, 'Failed to save avatar image. Please report this', true, false])
+ }
+
+ // Next page in welcome flow
+ const nextHref = '/docs/about/guide'
+
+ return (
+
+ {!welcome || img !== false ? (
+
+ ) : null}
+
val.length > 0}
+ />
+ {welcome ? (
+ <>
+
+
+ Save
+
+
+ Continue
+
+ {welcomeSteps[account.control].length > 0 ? (
+ <>
+
+
+ 7 / {welcomeSteps[account.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : (
+ <>
+
+
+ Save Avatar
+
+
+ >
+ )}
+
+ )
+}
diff --git a/packages/react/components/Account/Bio.mjs b/packages/react/components/Account/Bio.mjs
new file mode 100644
index 00000000000..6431d6b64cd
--- /dev/null
+++ b/packages/react/components/Account/Bio.mjs
@@ -0,0 +1,92 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { MarkdownInput } from '@freesewing/react/components/Input'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+/*
+ * Component for the account/bio page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const Bio = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [bio, setBio] = useState(account.bio)
+
+ // Helper method to save bio
+ const save = async () => {
+ setLoadingStatus([true, 'Saving bio'])
+ const [status, body] = await backend.updateAccount({ bio })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'Bio updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ // Next step in the onboarding
+ const nextHref =
+ welcomeSteps[account.control].length > 5
+ ? '/welcome/' + welcomeSteps[account.control][6]
+ : '/docs/about/guide'
+
+ return (
+
+
Tell people a little bit about yourself.
+
+
+
+ Save Bio
+
+
+
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[account.control].length > 0 ? (
+ <>
+
+
+ 6 / {welcomeSteps[account.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Account/Bookmarks.mjs b/packages/react/components/Account/Bookmarks.mjs
new file mode 100644
index 00000000000..96804ae25c1
--- /dev/null
+++ b/packages/react/components/Account/Bookmarks.mjs
@@ -0,0 +1,316 @@
+// Dependencies
+import { horFlexClasses, notEmpty } from '@freesewing/utils'
+// Hooks
+import React, { useState, useEffect, Fragment, useContext } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Components
+import { BookmarkIcon, LeftIcon, PlusIcon, TrashIcon } from '@freesewing/react/components/Icon'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { StringInput } from '@freesewing/react/components/Input'
+
+/*
+ * Various bookmark types
+ */
+const types = {
+ design: 'Designs',
+ pattern: 'Patterns',
+ set: 'Measurements Sets',
+ cset: 'Curated Measurements Sets',
+ doc: 'Documentation',
+ custom: 'Custom Bookmarks',
+}
+
+/**
+ * Component for the account/bookmarks page
+ */
+export const Bookmarks = () => {
+ // Hooks & Context
+ const backend = useBackend()
+ const { setModal, clearModal } = useContext(ModalContext)
+ const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext)
+
+ // State
+ const [bookmarks, setBookmarks] = useState([])
+ const [selected, setSelected] = useState({})
+ const [refresh, setRefresh] = useState(0)
+
+ // Helper var to see how many are selected
+ const selCount = Object.keys(selected).length
+
+ // Effects
+ useEffect(() => {
+ const getBookmarks = async () => {
+ const [status, body] = await backend.getBookmarks()
+ if (status === 200 && body.result === 'success') setBookmarks(body.bookmarks)
+ }
+ getBookmarks()
+ }, [refresh])
+
+ // Helper method to toggle single selection
+ const toggleSelect = (id) => {
+ const newSelected = { ...selected }
+ if (newSelected[id]) delete newSelected[id]
+ else newSelected[id] = 1
+ setSelected(newSelected)
+ }
+
+ // Helper method to toggle select all
+ const toggleSelectAll = () => {
+ if (selCount === bookmarks.length) setSelected({})
+ else {
+ const newSelected = {}
+ for (const bookmark of bookmarks) newSelected[bookmark.id] = 1
+ setSelected(newSelected)
+ }
+ }
+
+ // Helper to delete one or more bookmarks
+ const removeSelectedBookmarks = async () => {
+ let i = 0
+ for (const id in selected) {
+ i++
+ await backend.removeBookmark(id)
+ setLoadingStatus([
+ true,
+ ,
+ ])
+ }
+ setSelected({})
+ setRefresh(refresh + 1)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ }
+
+ const perType = {}
+ for (const type in types) perType[type] = bookmarks.filter((b) => b.type === type)
+
+ return (
+
+
+
+ setModal(
+
+
+
New Bookmark
+ setRefresh(refresh + 1)} />
+
+
+ )
+ }
+ >
+
+ New Bookmark
+
+
+ {bookmarks.length > 0 ? (
+
+ {selCount} Bookmarks
+
+ ) : null}
+ {Object.entries(types).map(([type, title]) =>
+ perType[type].length > 0 ? (
+
+ {title}
+
+
+ ) : null
+ )}
+
+ )
+}
+
+/*
+ * Component to create a new bookmark
+ *
+ * @param {object} props - All the React props
+ * @param {function} onCreated - An optional method to call when the bookmark is created
+ */
+export const NewBookmark = ({ onCreated = false }) => {
+ // Hooks
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { clearModal } = useContext(ModalContext)
+ const backend = useBackend()
+
+ // State
+ const [title, setTitle] = useState('')
+ const [url, setUrl] = useState('')
+
+ // This method will create the bookmark
+ const createBookmark = async () => {
+ setLoadingStatus([true, 'Processing update'])
+ const [status, body] = await backend.createBookmark({
+ title,
+ url,
+ type: 'custom',
+ })
+ if (status === 201) setLoadingStatus([true, 'Bookmark created', true, true])
+ else
+ setLoadingStatus([
+ true,
+ 'An error occured, the bookmark was not created. Please report this.',
+ true,
+ false,
+ ])
+ if (typeof onCreated === 'function') onCreated()
+ clearModal()
+ }
+
+ // Render the form
+ return (
+
+
val.length > 0}
+ placeholder="Bookmark title"
+ />
+ val.length > 0}
+ placeholder={'https://freesewing.org/account'}
+ />
+
+ 0 && url.length > 0)}
+ onClick={createBookmark}
+ >
+ New bookmark
+
+
+
+ )
+}
+
+/*
+ * A component to add a bookmark from wherever
+ *
+ * @params {object} props - All React props
+ * @params {string} props.href - The bookmark href
+ * @params {string} props.title - The bookmark title
+ * @params {string} props.type - The bookmark type
+ */
+export const BookmarkButton = ({ slug, type, title }) => {
+ const { setModal } = useContext(ModalContext)
+ const typeTitles = { docs: 'page' }
+
+ return (
+
+ setModal(
+
+
+
+ )
+ }
+ >
+
+ Bookmark this {typeTitles[type] ? typeTitles[type] : type}
+
+ )
+}
+
+/*
+ * A component to create a bookmark, preloaded with props
+ *
+ * @params {object} props - All React props
+ * @params {string} props.href - The bookmark href
+ * @params {string} props.title - The bookmark title
+ * @params {string} props.type - The bookmark type
+ *
+ */
+export const CreateBookmark = ({ type, title, slug }) => {
+ const backend = useBackend()
+ const [name, setName] = useState(title)
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { setModal } = useContext(ModalContext)
+
+ const url = `/${slug}`
+
+ const bookmark = async (evt) => {
+ evt.stopPropagation()
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status] = await backend.createBookmark({ type, title, url })
+ if (status === 201) {
+ setLoadingStatus([true, 'Bookmark created', true, true])
+ setModal(false)
+ } else
+ setLoadingStatus([
+ true,
+ 'Something unexpected happened, failed to create a bookmark',
+ true,
+ false,
+ ])
+ }
+
+ return (
+
+
New bookmark
+
+
+ Create bookmark
+
+
+ )
+}
diff --git a/packages/react/components/Account/Compare.mjs b/packages/react/components/Account/Compare.mjs
new file mode 100644
index 00000000000..97d2ab258d6
--- /dev/null
+++ b/packages/react/components/Account/Compare.mjs
@@ -0,0 +1,120 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { ListInput } from '@freesewing/react/components/Input'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+const strings = {
+ yes: {
+ title: 'Yes, in case it may help me',
+ desc:
+ 'Allowing us to compare your measurments to a baseline or others measurements sets ' +
+ 'allows us to detect potential problems in your measurements or patterns.',
+ },
+ no: {
+ title: 'No, never compare',
+ desc:
+ 'We get it, comparison is the thief of joy. Just be aware that this limits our ability ' +
+ 'to warn you about potential problems in your measurements sets or patterns.',
+ },
+}
+
+/*
+ * Component for the account/preferences/compare page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ */
+export const Compare = ({ welcome = false }) => {
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+
+ // State
+ const [selection, setSelection] = useState(account?.compare ? 'yes' : 'no')
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Helper method to update the account
+ const update = async (val) => {
+ if (val !== selection) {
+ setLoadingStatus([true, 'Saving preferences'])
+ const [status, body] = await backend.updateAccount({
+ compare: val === 'yes' ? true : false,
+ })
+ if (status === 200) {
+ setLoadingStatus([true, 'Preferences saved', true, true])
+ setAccount(body.account)
+ setSelection(val)
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, true])
+ }
+ }
+
+ // Link to the next onboarding step
+ const nextHref =
+ welcomeSteps[account?.control].length > 3
+ ? '/welcome/' + welcomeSteps[account?.control][4]
+ : '/docs/about/guide'
+
+ return (
+
+
({
+ val,
+ label: (
+
+ {strings[val].title}
+ {val === 'yes' ? (
+
+ ) : (
+
+ )}
+
+ ),
+ desc: strings[val].desc,
+ }))}
+ current={selection}
+ update={update}
+ />
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[account?.control].length > 0 ? (
+ <>
+
+
+ 4 / {welcomeSteps[account?.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Account/Consent.mjs b/packages/react/components/Account/Consent.mjs
new file mode 100644
index 00000000000..0d7cdfb735d
--- /dev/null
+++ b/packages/react/components/Account/Consent.mjs
@@ -0,0 +1,206 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { linkClasses, navigate } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon } from '@freesewing/react/components/Icon'
+import { ListInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+
+const strings = {
+ yes: {
+ title: 'Yes, in case it may help me',
+ desc:
+ 'Allowing us to compare your measurments to a baseline or others measurements sets ' +
+ 'allows us to detect potential problems in your measurements or patterns.',
+ },
+ no: {
+ title: 'No, never compare',
+ desc:
+ 'We get it, comparison is the thief of joy. Just be aware that this limits our ability ' +
+ 'to warn you about potential problems in your measurements sets or patterns.',
+ },
+}
+
+/*
+ * Component for the account/preferences/consent page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.signUp - Set to true to use this component on the initial signUp
+ * @param {function} props.Link - An optional framework-specific Link component
+ */
+export const Consent = ({ signUp = false, Link = false, title = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const backend = useBackend()
+ const { account, setAccount, setToken } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [consent1, setConsent1] = useState(account?.consent > 0)
+ const [consent2, setConsent2] = useState(account?.consent > 1)
+
+ // Helper method to update the account
+ const update = async () => {
+ let newConsent = 0
+ if (consent1) newConsent = 1
+ if (consent1 && consent2) newConsent = 2
+ if (newConsent > 0 && signUp) {
+ setLoadingStatus([true, 'Creating your account'])
+ const [status, body] = await backend.confirmSignup({ id: signUp, consent: newConsent })
+ if (status === 200) {
+ setLoadingStatus([true, 'Account created', true, true])
+ if (body?.token) setToken(body.token)
+ if (body?.account) setAccount(body.account)
+ navigate('/welcome')
+ } else setLoadingStatus([true, 'An error occured, please report this', true, true])
+ } else if (newConsent !== account.consent) {
+ setLoadingStatus([true, 'Updating your account'])
+ const [status, body] = await backend.updateAccount({ consent: newConsent })
+ if (status === 200) {
+ setLoadingStatus([true, 'Account updated', true, true])
+ setAccount(body.account)
+ } else setLoadingStatus([true, 'An error occured, please report this', true, true])
+ }
+ }
+
+ // Helper method to remove the account
+ const removeAccount = async () => {
+ setLoadingStatus([true, 'One moment please'])
+ const [status, body] = await backend.removeAccount()
+ if (status === 200) {
+ setLoadingStatus([true, 'All done, farewell', true, true])
+ setToken(null)
+ setAccount({ username: false })
+ } else setLoadingStatus([true, 'Something went wrong. Please report this.', true, true])
+ }
+
+ return (
+
+ {title ?
Privacy Matters : null}
+ {text.intro}
+
Do you give your consent to process your account data?
+ {text.account}
+ {consent1 ? (
+
+ ) : (
+
setConsent1(!consent1)}
+ >
+ Click here to give your consent
+
+ )}
+ {consent1 ? (
+ <>
+
+ Do you give your consent to share your anonymized measurements
+
+
+ {!consent2 ?
{text.opendata} : null}
+ >
+ ) : null}
+ {!consent1 &&
This consent is required for a FreeSewing account. }
+ {consent1 ? (
+
+ {signUp ? 'Create Account' : 'Save'}
+
+ ) : signUp ? null : (
+
+ Remove your account
+
+ )}
+
+
+ FreeSewing Privacy Notice
+
+
+
+ )
+}
+
+const Checkbox = ({ value, setter, label, children = null }) => (
+ setter(value ? false : true)}
+ >
+
+ setter(value ? false : true)}
+ />
+ {label}
+
+ {children}
+
+)
+
+const text = {
+ intro: (
+ <>
+
+ FreeSewing respects your privacy and your rights. We adhere to the toughest privacy and
+ security law in the world: the{' '}
+
+ General Data Protection Regulation
+ {' '}
+ (GDPR) of the European Union (EU).
+
+
+ Under the GDPR, processing of your personal data requires granular consent — in other words,{' '}
+ we need your permission for the various ways we handle your data .
+
+ >
+ ),
+ account: (
+
+
What is account data?
+
+ Your email address , username , and password , and any measurements {' '}
+ you add to your account.
+
+
Why do we need it?
+
+ To authenticate you, contact you when needed, and generate bespoke {' '}
+ sewing patterns.
+
+
How long do we keep it?
+
+ 12 months after the last time your connected to our backend, or until you{' '}
+ remove your account or revoke this consent.
+
+
Do we share it with others?
+
+ No , never.
+
+
+ Note: Freesewing publishes anonymized measurements as open data for scientific research. You
+ have the right to object to this.
+
+
+ ),
+ opendata: `This data is used to study and understand the human form in all its shapes,
+ so we can get better sewing patterns, and better fitting garments.
+ Even though this data is anonymized, you have the right to object to this.`,
+}
diff --git a/packages/react/components/Account/Control.mjs b/packages/react/components/Account/Control.mjs
new file mode 100644
index 00000000000..a83764d99b2
--- /dev/null
+++ b/packages/react/components/Account/Control.mjs
@@ -0,0 +1,94 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { controlDesc } from '@freesewing/config'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+import { useControl } from '@freesewing/react/hooks/useControl'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { RightIcon, NoIcon, OkIcon, SaveIcon } from '@freesewing/react/components/Icon'
+import { ListInput } from '@freesewing/react/components/Input'
+import { ControlScore } from '@freesewing/react/components/Control'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+const strings = {
+ 1: {
+ title: 'Keep it as simple as possible',
+ desc:
+ 'Allowing us to compare your measurments to a baseline or others measurements sets ' +
+ 'allows us to detect potential problems in your measurements or patterns.',
+ },
+ 2: {
+ title: 'No, never compare',
+ desc:
+ 'We get it, comparison is the thief of joy. Just be aware that this limits our ability ' +
+ 'to warn you about potential problems in your measurements sets or patterns.',
+ },
+}
+
+/*
+ * Component for the account/preferences/control page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ */
+export const Control = ({ welcome = false }) => {
+ // Hooks
+ const { control, updateControl } = useControl()
+
+ // Helper to get the link to the next onboarding step
+ const nextHref = welcome
+ ? welcomeSteps[control].length > 1
+ ? '/welcome/' + welcomeSteps[control][1]
+ : '/docs/about/guide'
+ : false
+
+ return (
+
+
({
+ val,
+ label: (
+
+ {controlDesc[val].title}
+
+
+ ),
+ desc: controlDesc[val].desc,
+ }))}
+ current={control}
+ update={updateControl}
+ />
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[control].length > 1 ? (
+ <>
+
+
+ 1 / {welcomeSteps[control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Account/Email.mjs b/packages/react/components/Account/Email.mjs
new file mode 100644
index 00000000000..83aca1bf506
--- /dev/null
+++ b/packages/react/components/Account/Email.mjs
@@ -0,0 +1,159 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { validateEmail, validateTld, getSearchParam } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext, useEffect } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SaveIcon } from '@freesewing/react/components/Icon'
+import { EmailInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { Spinner } from '@freesewing/react/components/Spinner'
+
+/*
+ * Component for the account/bio page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const Email = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [email, setEmail] = useState(account.email)
+ const [changed, setChanged] = useState(false)
+
+ // Helper method to update account
+ const save = async () => {
+ setLoadingStatus([true, 'Updating email address'])
+ const [status, body] = await backend.updateAccount({ email })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setChanged(true)
+ setLoadingStatus([true, 'Email change initiated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ // Is email valid?
+ const valid = (validateEmail(email) && validateTld(email)) || false
+
+ return (
+
+ {changed ? (
+
+ Please confirm this change
+
+ We have sent an E-mail to your new address to confirm this change. Please click the link
+ in that message to finalize this change.
+
+
+ ) : (
+ <>
+
valid}
+ />
+
+
+ Update Email Address
+
+
+ >
+ )}
+
+ )
+}
+
+export const EmailChangeConfirmation = ({ onSuccess = false }) => {
+ // State
+ const [error, setError] = useState(false)
+ const [id, setId] = useState()
+ const [check, setCheck] = useState()
+
+ // Hooks
+ const { setAccount, setToken } = useAccount()
+ const backend = useBackend()
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Effects
+ useEffect(() => {
+ const newId = getSearchParam('id')
+ const newCheck = getSearchParam('check')
+ if (newId !== id) setId(newId)
+ if (newCheck !== check) setCheck(newCheck)
+ }, [id, check])
+
+ useEffect(() => {
+ // Call async method
+ if (id) getConfirmation()
+ }, [id])
+
+ // Gets the confirmation
+ const getConfirmation = async () => {
+ setLoadingStatus([true, 'Contacting the backend', true, true])
+ // Reach out to backend
+ const [status, body] = await backend.updateAccount({
+ confirm: 'emailchange',
+ confirmation: id,
+ check,
+ })
+
+ // If it works, store account, which runs the onSuccess handler
+ if (body.result === 'success' && body.account) return storeAccount(body)
+ // If we get here, we're not sure what's wrong
+ if (body.error) return setError(body.error)
+ return setError(true)
+ }
+
+ // Updates the (local) account data
+ const storeAccount = async (data) => {
+ if (data?.account) {
+ setAccount(data.account)
+ setLoadingStatus([true, 'Email change completed', true, true])
+ if (typeof onSuccess === 'function') onSuccess(data)
+ else navigate('/account', true)
+ } else {
+ setError(data)
+ setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+ }
+
+ // Short-circuit errors
+ if (error) return This error is unexpected. Please report this.
+
+ // If we do not (yet) have the data, show a loader
+ if (!id || !check)
+ return (
+ <>
+ One moment pleae
+
+ >
+ )
+
+ return One moment please
+}
diff --git a/packages/react/components/Account/Export.mjs b/packages/react/components/Account/Export.mjs
new file mode 100644
index 00000000000..a5c24b9d41e
--- /dev/null
+++ b/packages/react/components/Account/Export.mjs
@@ -0,0 +1,53 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { DownloadIcon } from '@freesewing/react/components/Icon'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+
+/*
+ * Component for the account/actions/export page
+ */
+export const Export = () => {
+ // Hooks
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [link, setLink] = useState()
+
+ // Helper method to export account
+ const exportData = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.exportAccount()
+ if (status === 200) {
+ setLink(body.data)
+ setLoadingStatus([true, 'All done', true, true])
+ } else setLoadingStatus([true, 'Something went wrong, please report this', true, false])
+ }
+
+ return (
+
+ {link ? (
+
+ Your data was exported and is available for download at the following location:
+
+ {link}
+
+
+ ) : null}
+
Click below to export your personal FreeSewing data
+
+
+ Export Your Data
+
+
+ )
+}
diff --git a/packages/react/components/Account/Github.mjs b/packages/react/components/Account/Github.mjs
new file mode 100644
index 00000000000..da2885f2ec7
--- /dev/null
+++ b/packages/react/components/Account/Github.mjs
@@ -0,0 +1,64 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { SaveIcon } from '@freesewing/react/components/Icon'
+import { StringInput } from '@freesewing/react/components/Input'
+
+/*
+ * Component for the account/social/github page
+ */
+export const Github = () => {
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [githubUsername, setGithubUsername] = useState(account.data.githubUsername || '')
+ const [githubEmail, setGithubEmail] = useState(account.data.githubEmail || '')
+
+ // Helper method to save changes
+ const save = async () => {
+ setLoadingStatus([true, 'Saving bio'])
+ const [status, body] = await backend.updateAccount({ data: { githubUsername, githubEmail } })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'GitHub info updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ return (
+
+
val.length > 0}
+ placeholder={'joost@joost.at'}
+ />
+ val.length > 0}
+ placeholder={'joostdecock'}
+ />
+
+
+ Save
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Id.mjs b/packages/react/components/Account/Id.mjs
new file mode 100644
index 00000000000..6e4c26e9063
--- /dev/null
+++ b/packages/react/components/Account/Id.mjs
@@ -0,0 +1,22 @@
+// Hooks
+import React, { useState } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+
+/*
+ * Component to display a user ID
+ *
+ * @params {object} props - All React props
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const UserId = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account } = useAccount()
+ const [id, setId] = useState(account.id)
+
+ return id || null
+}
diff --git a/packages/react/components/Account/Import.mjs b/packages/react/components/Account/Import.mjs
new file mode 100644
index 00000000000..fbe252328cc
--- /dev/null
+++ b/packages/react/components/Account/Import.mjs
@@ -0,0 +1,101 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SaveIcon } from '@freesewing/react/components/Icon'
+import { FileInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { Yaml } from '@freesewing/react/components/Yaml'
+
+/*
+ * Component for the account/bio page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const ImportSet = () => {
+ // Hooks
+ const backend = useBackend()
+ const { account } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Helper method to upload/save a set
+ const uploadSet = async (upload) => {
+ setLoadingStatus([true, 'Uploading data'])
+ let data
+ try {
+ const chunks = upload.split(',')
+ if (chunks[0].includes('json')) data = JSON.parse(atob(chunks[1]))
+ else data = yaml.parse(atob(chunks[1]))
+ if (!Array.isArray(data)) data = [data]
+ /*
+ * Treat each set
+ */
+ for (const set of data) {
+ if (set.measurements || set.measies) {
+ const name = set.name || 'J. Doe'
+ setLoadingStatus([true, `Importing ${name}`])
+ const [status, body] = await backend.createSet({
+ name: set.name || 'J. Doe',
+ units: set.units || 'metric',
+ notes: set.notes || '',
+ measies: set.measurements || set.measies,
+ userId: account.id,
+ })
+ if (status === 200) setLoadingStatus([true, `Imported ${name}`, true, true])
+ else setLoadingStatus([true, `Import of ${name} failed`, true, false])
+ } else {
+ setLoadingStatus([true, `Invalid format`, true, false])
+ }
+ }
+ } catch (err) {
+ console.log(err)
+ setLoadingStatus([true, `Import of ${name || 'file'} failed`, true, false])
+ }
+ }
+
+ return (
+
+
+
+
+ To import a measurement set, you should have a JSON or YAML file that has the following
+ structure:
+
+
+
+ Your file can either contain a single measurements set, or an array/list of multiple
+ measurements sets.
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Instagram.mjs b/packages/react/components/Account/Instagram.mjs
new file mode 100644
index 00000000000..974a130714c
--- /dev/null
+++ b/packages/react/components/Account/Instagram.mjs
@@ -0,0 +1,64 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { SaveIcon } from '@freesewing/react/components/Icon'
+import { StringInput } from '@freesewing/react/components/Input'
+
+/*
+ * Component for the account/social/github page
+ */
+export const Instagram = () => {
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [githubUsername, setGithubUsername] = useState(account.data.githubUsername || '')
+ const [githubEmail, setGithubEmail] = useState(account.data.githubEmail || '')
+
+ // Helper method to save changes
+ const save = async () => {
+ setLoadingStatus([true, 'Saving bio'])
+ const [status, body] = await backend.updateAccount({ data: { githubUsername, githubEmail } })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'GitHub info updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ return (
+
+
val.length > 0}
+ placeholder={'joost@joost.at'}
+ />
+ val.length > 0}
+ placeholder={'joostdecock'}
+ />
+
+
+ Save
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Links.mjs b/packages/react/components/Account/Links.mjs
new file mode 100644
index 00000000000..195cfcf96f9
--- /dev/null
+++ b/packages/react/components/Account/Links.mjs
@@ -0,0 +1,365 @@
+// Config
+import { cloudflareImageUrl, capitalize } from '@freesewing/utils'
+import { control as controlConfig } from '@freesewing/config'
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as DefautLink } from '@freesewing/react/components/Link'
+import { ControlScore } from '@freesewing/react/components/Control'
+import {
+ MeasurementsSetIcon,
+ SignoutIcon,
+ UserIcon,
+ UnitsIcon,
+ ShowcaseIcon,
+ ChatIcon,
+ EmailIcon,
+ KeyIcon,
+ BookmarkIcon,
+ CompareIcon,
+ PrivacyIcon,
+ ControlIcon,
+ LockIcon,
+ NewsletterIcon,
+ ShieldIcon,
+ FingerprintIcon,
+ GitHubIcon,
+ InstagramIcon,
+ MastodonIcon,
+ TwitchIcon,
+ TikTokIcon,
+ LinkIcon,
+ TrashIcon,
+ RedditIcon,
+ CloseIcon,
+ ReloadIcon,
+ NoIcon,
+ PatternIcon,
+ BoolYesIcon,
+ BoolNoIcon,
+ OkIcon,
+ WrenchIcon,
+ UploadIcon,
+ DownloadIcon,
+} from '@freesewing/react/components/Icon'
+
+const itemIcons = {
+ bookmarks: ,
+ sets: ,
+ patterns: ,
+ apikeys: ,
+ username: ,
+ email: ,
+ bio: ,
+ img: ,
+ language: ,
+ units: ,
+ compare: ,
+ consent: ,
+ control: ,
+ mfa: ,
+ newsletter: ,
+ password: ,
+ github: ,
+ instagram: ,
+ mastodon: ,
+ twitter: ,
+ twitch: ,
+ tiktok: ,
+ website: ,
+ reddit: ,
+}
+
+const btnClasses = 'tw-daisy-btn tw-capitalize tw-flex tw-flex-row tw-justify-between'
+const itemClasses =
+ 'tw-flex tw-flex-row tw-items-center tw-justify-between tw-bg-opacity-10 tw-p-2 tw-px-4 tw-rounded tw-mb-1'
+const linkClasses = `hover:tw-bg-secondary hover:tw-bg-opacity-10 tw-max-w-md hover:tw-no-underline`
+
+const titles = {
+ apikeys: 'API Keys',
+ sets: 'Measurements Sets',
+ patterns: 'Patterns',
+ img: 'Avatar',
+ email: 'E-mail Address',
+ newsletter: 'Newsletter Subscription',
+ compare: 'Measurements Comparison',
+ consent: 'Consent & Privacy',
+ control: 'User Experience',
+ github: 'GitHub',
+ mfa: 'Multi-Factor Authentication',
+}
+
+const YesNo = ({ check }) => (check ? : )
+
+const t = (input) => input
+
+/**
+ * The Links component shows all of the links to manage your account
+ *
+ * @param {object} props - All the React props
+ * @param {function} Link - A custom Link component, typically the Docusaurus one, but it's optional
+ */
+export const Links = ({ Link = false }) => {
+ // Use custom Link component if available
+ if (!Link) Link = DefaultLink
+
+ // Hooks
+ const { account, signOut, control } = useAccount()
+ const backend = useBackend()
+
+ // State
+ const [bookmarks, setBookmarks] = useState([])
+ const [sets, setSets] = useState([])
+ const [patterns, setPatterns] = useState([])
+ const [apikeys, setApikeys] = useState([])
+
+ // Effects
+ useEffect(() => {
+ const getUserData = async () => {
+ const [status, body] = await backend.getUserData(account.id)
+ if (status === 200 && body.result === 'success') {
+ setApikeys(body.data.apikeys)
+ setBookmarks(body.data.bookmarks)
+ setPatterns(body.data.patterns)
+ setSets(body.data.sets)
+ }
+ }
+ getUserData()
+ }, [account.id])
+
+ if (!account.username) return null
+
+ const itemPreviews = {
+ apikeys: apikeys?.length || 0,
+ bookmarks: bookmarks?.length || 0,
+ sets: sets?.length || 0,
+ patterns: patterns?.length || 0,
+ username: account.username,
+ email: account.email,
+ bio: account.bio ? {account.bio.slice(0, 15)}… : '',
+ img: (
+
+ ),
+ units: account.imperial ? 'Imperial' : 'Metric',
+ newsletter: ,
+ compare: ,
+ consent: ,
+ control: ,
+ github: account.data.githubUsername || account.data.githubEmail || ,
+ password: account.passwordType === 'v3' ? : ,
+ mfa: ,
+ }
+ for (const social of Object.keys(controlConfig.account.fields.identities).filter(
+ (i) => i !== 'github'
+ ))
+ itemPreviews[social] = account.data[social] || (
+
+ )
+
+ return (
+
+
+
+
Your Data
+ {Object.keys(controlConfig.account.fields.data).map((item) =>
+ controlConfig.flat[item] > control ? null : (
+
+
+ {itemIcons[item]}
+ {titles[item] ? titles[item] : capitalize(item)}
+
+
{itemPreviews[item]}
+
+ )
+ )}
+
+
+ {control > 1 && (
+
+
About You
+ {Object.keys(controlConfig.account.fields.info).map((item) =>
+ controlConfig.flat[item] > control ? null : (
+
+
+ {itemIcons[item]}
+ {titles[item] ? titles[item] : capitalize(item)}
+
+
{itemPreviews[item]}
+
+ )
+ )}
+
+
+
+ Role
+
+
{account.role}
+
+
+
+
+ ID
+
+
{account.id}
+
+
+ )}
+
+
+
Preferences
+ {Object.keys(controlConfig.account.fields.settings).map((item) =>
+ controlConfig.flat[item] > control ? null : (
+
+
+ {itemIcons[item]}
+ {titles[item] ? titles[item] : capitalize(item)}
+
+
{itemPreviews[item]}
+
+ )
+ )}
+
+
+ {control > 2 && (
+
+
Linked Identities
+ {Object.keys(controlConfig.account.fields.identities).map((item) =>
+ controlConfig.flat[item] > control ? null : (
+
+
+ {itemIcons[item]}
+ {titles[item] ? titles[item] : capitalize(item)}
+
+
{itemPreviews[item]}
+
+ )
+ )}
+
+ )}
+
+ {control > 1 && (
+
+
Security
+ {Object.keys(controlConfig.account.fields.security).map((item) =>
+ controlConfig.flat[item] > control ? null : (
+
+
+ {itemIcons[item]}
+ {titles[item] ? titles[item] : capitalize(item)}
+
+
{itemPreviews[item]}
+
+ )
+ )}
+
+ )}
+
+ {control > 1 && (
+
+
Actions
+ {control > 2 && (
+
+
+ Import data
+
+ )}
+ {control > 2 && (
+
+
+ Export your data
+
+ )}
+ {control > 2 && (
+
+
+ Reload account data
+
+ )}
+ {control > 3 && (
+
+
+ Restrict processing of your data
+
+ )}
+
+
+ Remove your account
+
+
+ )}
+
+
+
+ {account.role === 'admin' && (
+
+
+ Administration
+
+ )}
+ {control > 1 && (
+
+
+ Your Profile
+
+ )}
+ signOut()}
+ >
+
+ Sign Out
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Mfa.mjs b/packages/react/components/Account/Mfa.mjs
new file mode 100644
index 00000000000..f22d7ecf9c1
--- /dev/null
+++ b/packages/react/components/Account/Mfa.mjs
@@ -0,0 +1,224 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { horFlexClasses } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, LockIcon } from '@freesewing/react/components/Icon'
+import { PasswordInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { NumberCircle } from '@freesewing/react/components/Number'
+import { CopyToClipboardButton } from '@freesewing/react/components/CopyToClipboardButton'
+
+/*
+ * Component for the account/security/password page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ */
+export const Mfa = ({ welcome = false, title = true }) => {
+ // Hooks
+ const backend = useBackend()
+ const { account, setAccount } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [enable, setEnable] = useState(false)
+ const [disable, setDisable] = useState(false)
+ const [code, setCode] = useState('')
+ const [password, setPassword] = useState('')
+ const [scratchCodes, setScratchCodes] = useState(false)
+
+ // Helper method to enable MFA
+ const enableMfa = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.enableMfa()
+ if (status === 200) {
+ setEnable(body.mfa)
+ setLoadingStatus([true, 'Settings saved', true, true])
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, false])
+ }
+
+ // Helper method to disable MFA
+ const disableMfa = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.disableMfa({
+ mfa: false,
+ password,
+ token: code,
+ })
+ if (status === 200) {
+ if (body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'Settings saved', true, true])
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, false])
+ setDisable(false)
+ setEnable(false)
+ setCode('')
+ setPassword('')
+ }
+ }
+
+ // Helper method to confirm MFA
+ const confirmMfa = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.confirmMfa({
+ mfa: true,
+ secret: enable.secret,
+ token: code,
+ })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setScratchCodes(body.scratchCodes)
+ setLoadingStatus([true, 'Settings saved', true, true])
+ } else setLoadingStatus([true, 'An error occured, please repor this', true, false])
+ setEnable(false)
+ setCode('')
+ }
+
+ // Figure out what title to use
+ let titleText = `Mult-Factor Authentication is ${account.mfaEnabled ? 'enabled' : 'disabled'}`
+ if (enable) titleText = 'Set up Multi-Factor Authentication'
+
+ return (
+
+ {title ?
{titleText} : null}
+ {enable ? (
+ <>
+
+
{enable.secret}
+
+ Add FreeSewing to your Authenticator App by scanning the QR code above. If you cannot
+ scan the QR code, you can manually enter the secret below it.
+
+
+ lease enter a code from your Authenticator App to confirm this action
+
+
setCode(evt.target.value)}
+ className="tw-daisy-input tw-w-64 tw-m-auto tw-text-4xl tw-daisy-input-bordered tw-daisy-input-lg tw-flex tw-flex-row tw-text-center tw-mb-8 tw-tracking-widest"
+ type="text"
+ inputMode="numeric"
+ pattern="[0-9]{6}"
+ placeholder="000000"
+ />
+
+
+ Enable Multi-Factor Authentication
+
+ >
+ ) : null}
+ {disable ? (
+
+
+ Please enter your password to confirm this action
+ true}
+ />
+
+
+ Please enter a code from your Authenticator App to confirm this action
+ setCode(evt.target.value)}
+ className="tw-input tw-w-full tw-text-4xl tw-input-bordered tw-input-lg tw-flex tw-flex-row tw-text-center tw-mb-8 tw-tracking-widest"
+ type="text"
+ placeholder={'000000'}
+ />
+
+
+ Disable Mult-Factor Authentication
+
+
+ ) : null}
+ {scratchCodes ? (
+ <>
+
MFA Scratch Codes
+
+ You can use any of these scratch codes as a one-time MFA code when you do not have
+ access to your code-generating app (for example, when you have lost your phone.
+
+
+ You can use each of these codes only once. Write them down, because this is the only
+ time you will get to see them.
+
+
+
+ MFA Scratch Codes
+ code + '\n').join('')
+ }
+ />
+
+
+ {scratchCodes.map((code) => code + '\n')}
+
+
+ >
+ ) : (
+
+ {account.mfaEnabled ? (
+ disable ? null : (
+
setDisable(true)}
+ >
+
+ Disable Mult-Factor Authentication
+
+ )
+ ) : enable ? null : (
+
+
+
+ Set up Mult-Factor Authentication
+
+
+ Please consider enabling Two-Factor Authentication
+
+ We do not enforce a password policy, but we do recommend you enable Multi-Factor
+ Authentication to keep your FreeSewing account safe.
+
+
+
+ )}
+
+ )}
+
+ )
+}
+
+const Bullet = ({ num, children }) => (
+
+
+ {num}
+
+
{children}
+
+)
diff --git a/packages/react/components/Account/Newsletter.mjs b/packages/react/components/Account/Newsletter.mjs
new file mode 100644
index 00000000000..7b2218e0185
--- /dev/null
+++ b/packages/react/components/Account/Newsletter.mjs
@@ -0,0 +1,130 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { linkClasses } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { ListInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+/*
+ * Component for the account/preferences/newsletter page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @param {function} props.Link - An optional framework-specific Link component
+ */
+export const Newsletter = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [selection, setSelection] = useState(account?.newsletter ? 'yes' : 'no')
+
+ // Helper method to update account
+ const update = async (val) => {
+ if (val !== selection) {
+ setLoadingStatus([true, 'Saving preferences'])
+ const [status, body] = await backend.updateAccount({
+ newsletter: val === 'yes' ? true : false,
+ })
+ if (status === 200) {
+ setLoadingStatus([true, 'Preferences saved', true, true])
+ setAccount(body.account)
+ setSelection(val)
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, true])
+ }
+ }
+
+ // Next step for onboarding
+ const nextHref =
+ welcomeSteps[account?.control].length > 2
+ ? '/welcome/' + welcomeSteps[account?.control][2]
+ : '/docs/about/guide'
+
+ return (
+
+
({
+ val,
+ label: (
+
+
+ {val === 'yes' ? 'Yes, I would like to receive the newsletter' : 'No thanks'}
+
+ {val === 'yes' ? (
+
+ ) : (
+
+ )}
+
+ ),
+ desc:
+ val === 'yes'
+ ? `Once every 3 months you'll receive an email from us with honest wholesome content. No tracking, no ads, no nonsense.`
+ : `You can always change your mind later. But until you do, we will not send you any newsletters.`,
+ }))}
+ current={selection}
+ update={update}
+ />
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[account?.control].length > 0 ? (
+ <>
+
+
+ 2 / {welcomeSteps[account?.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+ {welcome ? null : (
+
+ You can unsubscribe at any time with the link below
+
+ This unsubscribe link will also be included at the bottom of every newsletter we send
+ you, so you do not need to bookmark it, but you can if you want to.
+
+
+
+ Unsubscribe link
+
+
+
+ This link is to unsubscribe you specifically, do not share it with other subscribers.
+
+
+ )}
+
+ )
+}
diff --git a/packages/react/components/Account/Password.mjs b/packages/react/components/Account/Password.mjs
new file mode 100644
index 00000000000..a68f8613f45
--- /dev/null
+++ b/packages/react/components/Account/Password.mjs
@@ -0,0 +1,78 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+import { horFlexClasses } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { RightIcon, SaveIcon } from '@freesewing/react/components/Icon'
+import { PasswordInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+
+/*
+ * Component for the account/security/password page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ */
+export const Password = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+ // Hooks
+ const backend = useBackend()
+ const { account, setAccount } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [password, setPassword] = useState('')
+
+ // Helper method to save password to account
+ const save = async () => {
+ setLoadingStatus([true, 'Updating password'])
+ const [status, body] = await backend.updateAccount({ password })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'Password updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ return (
+
+
val.length > 0}
+ placeholder="Tip: use a password manager"
+ />
+
+ Save
+
+ {!account.mfaEnabled && (
+
+ Please consider enabling Two-Factor Authentication
+
+ We do not enforce a password policy, but we do recommend you enable Two-Factor
+ Authentication to keep your FreeSewing account safe.
+
+
+
+ Two-Factor Authentication
+
+
+
+ )}
+
+ )
+}
diff --git a/packages/react/components/Account/Pattern.mjs b/packages/react/components/Account/Pattern.mjs
new file mode 100644
index 00000000000..d221eccd5ed
--- /dev/null
+++ b/packages/react/components/Account/Pattern.mjs
@@ -0,0 +1,404 @@
+// Dependencies
+import orderBy from 'lodash/orderBy.js'
+import {
+ cloudflareImageUrl,
+ capitalize,
+ shortDate,
+ horFlexClasses,
+ newPatternUrl,
+} from '@freesewing/utils'
+import { urls, control as controlConfig } from '@freesewing/config'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Hooks
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+import { useSelection } from '@freesewing/react/hooks/useSelection'
+
+// Components
+import Markdown from 'react-markdown'
+import {
+ StringInput,
+ MarkdownInput,
+ PassiveImageInput,
+ ListInput,
+} from '@freesewing/react/components/Input'
+import { Link as WebLink, AnchorLink } from '@freesewing/react/components/Link'
+import {
+ BoolNoIcon,
+ BoolYesIcon,
+ CloneIcon,
+ EditIcon,
+ FreeSewingIcon,
+ OkIcon,
+ NoIcon,
+ PatternIcon,
+ ShowcaseIcon,
+ ResetIcon,
+ UploadIcon,
+} from '@freesewing/react/components/Icon'
+import { DisplayRow } from './shared.mjs'
+import { TimeAgo } from '@freesewing/react/components/Time'
+import { Popout } from '@freesewing/react/components/Popout'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+
+export const Pattern = ({ id, Link }) => {
+ if (!Link) Link = WebLink
+ // Hooks
+ const { account, control } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const backend = useBackend()
+
+ // Context
+ const { setModal } = useContext(ModalContext)
+
+ const [edit, setEdit] = useState(false)
+ const [pattern, setPattern] = useState()
+ // Set fields for editing
+ const [name, setName] = useState(pattern?.name)
+ const [image, setImage] = useState(pattern?.image)
+ const [isPublic, setIsPublic] = useState(pattern?.public ? true : false)
+ const [notes, setNotes] = useState(pattern?.notes || '')
+
+ // Effect
+ useEffect(() => {
+ const getPattern = async () => {
+ setLoadingStatus([true, 'Loading pattern from backend'])
+ const [status, body] = await backend.getPattern(id)
+ if (status === 200) {
+ setPattern(body.pattern)
+ setName(body.pattern.name)
+ setImage(body.pattern.image)
+ setIsPublic(body.pattern.public ? true : false)
+ setNotes(body.pattern.notes)
+ setLoadingStatus([true, 'Loaded pattern', true, true])
+ } else setLoadingStatus([true, 'An error occured. Please report this', true, false])
+ }
+ if (id) getPattern()
+ }, [id])
+
+ const save = async () => {
+ setLoadingStatus([true, 'Gathering info'])
+ // Compile data
+ const data = {}
+ if (name || name !== pattern.name) data.name = name
+ if (image || image !== pattern.image) data.img = image
+ if (notes || notes !== pattern.notes) data.notes = notes
+ if ([true, false].includes(isPublic) && isPublic !== pattern.public) data.public = isPublic
+ setLoadingStatus([true, 'Saving pattern'])
+ const [status, body] = await backend.updatePattern(pattern.id, data)
+ if (status === 200 && body.result === 'success') {
+ setPattern(body.pattern)
+ setEdit(false)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, false])
+ }
+
+ const clone = async () => {
+ setLoadingStatus([true, 'Cloning pattern'])
+ // Compile data
+ const data = { ...pattern }
+ delete data.id
+ delete data.createdAt
+ delete data.data
+ delete data.userId
+ delete data.img
+ data.settings = JSON.parse(data.settings)
+ const [status, body] = await backend.createPattern(data)
+ if (status === 201 && body.result === 'created') {
+ setLoadingStatus([true, 'Loading newly created pattern', true, true])
+ window.location = `/account/data/patterns/pattern?id=${body.pattern.id}`
+ } else setLoadingStatus([true, 'We failed to create this pattern', true, false])
+ }
+
+ const togglePublic = async () => {
+ setLoadingStatus([true, 'Updating pattern'])
+ // Compile data
+ const data = { public: !pattern.public }
+ const [status, body] = await backend.updatePattern(pattern.id, data)
+ if (status === 200 && body.result === 'success') {
+ setPattern(body.pattern)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, false])
+ }
+ if (!pattern) return null
+
+ const header = (
+
+ )
+
+ if (!edit)
+ return (
+
+ {pattern.public ? (
+
+ This is the private view of your pattern
+
+ Everyone can access the public view since this is a public pattern.
+
+ But only you can access this private view.
+
+
+
+
+ Public View
+
+
+
+ ) : null}
+ {header}
+ {control >= controlConfig.account.patterns.notes && (
+ <>
+
Notes
+
{pattern.notes}
+ >
+ )}
+
+ )
+
+ return (
+
+
Edit pattern {pattern.name}
+
+ {/* Name is always shown */}
+
+
val && val.length > 0}
+ />
+
+ {/* img: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.sets.img ? (
+ val.length > 0}
+ />
+ ) : null}
+
+ {/* public: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.patterns.public ? (
+
+ Public Pattern
+
+
+ ),
+ desc: 'Public patterns can be shared with other FreeSewing users',
+ },
+ {
+ val: false,
+ label: (
+
+ Private Pattern
+
+
+ ),
+ desc: 'Private patterns are yours and yours alone',
+ },
+ ]}
+ current={isPublic}
+ />
+ ) : null}
+
+ {/* notes: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.patterns.notes ? (
+
+ ) : null}
+
+ setEdit(false)}
+ className={`tw-daisy-btn tw-daisy-btn-primary tw-daisy-btn-outline`}
+ >
+
+ Cancel
+
+
+
+ Save Pattern
+
+
+
+ )
+}
+
+export const PatternCard = ({
+ pattern,
+ href = false,
+ onClick = false,
+ useA = false,
+ size = 'md',
+ Link = false,
+}) => {
+ if (!Link) Link = WebLink
+ const sizes = {
+ lg: 96,
+ md: 52,
+ sm: 36,
+ xs: 20,
+ }
+ const s = sizes[size]
+
+ const wrapperProps = {
+ className: `tw-bg-base-300 tw-w-full tw-mb-2 tw-mx-auto tw-flex tw-flex-col tw-items-start tw-text-center tw-justify-center tw-rounded tw-shadow tw-py-4 tw-w-${s} tw-aspect-square`,
+ style: {
+ backgroundImage: `url(${cloudflareImageUrl({ type: 'w1000', id: pattern.img })})`,
+ backgroundSize: 'cover',
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: '50%',
+ },
+ }
+ if (pattern.img === 'default-avatar') wrapperProps.style.backgroundPosition = 'bottom right'
+
+ const inner = null
+
+ // Is it a button with an onClick handler?
+ if (onClick)
+ return (
+
+ {inner}
+
+ )
+
+ // Returns a link to an internal page
+ if (href && !useA)
+ return (
+
+ {inner}
+
+ )
+
+ // Returns a link to an external page
+ if (href && useA)
+ return (
+
+ {inner}
+
+ )
+
+ // Returns a div
+ return {inner}
+}
+
+const BadgeLink = ({ label, href }) => (
+
+ {label}
+
+)
+
+/**
+ * Helper component to show the pattern title, image, and various buttons
+ */
+const PatternHeader = ({
+ pattern,
+ Link,
+ account,
+ setModal,
+ setEdit,
+ togglePublic,
+ save,
+ clone,
+}) => (
+ <>
+ {pattern.name}
+
+
+ } color="secondary" />
+ } color="secondary" />
+
+
+
+
+
+ {account.control > 3 && (pattern?.public || pattern.userId === account.id) ? (
+
+
+
+
+ ) : (
+
+ )}
+
+ setModal(
+
+
+
+ )
+ }
+ className={`tw-daisy-btn tw-daisy-btn-secondary tw-daisy-btn-outline ${horFlexClasses}`}
+ >
+
+ Show Image
+
+ {account.control > 3 ? (
+
togglePublic()}
+ className={`tw-daisy-btn tw-daisy-btn-${pattern.public ? 'error' : 'success'} tw-daisy-btn-outline ${horFlexClasses} hover:tw-text-${pattern.public ? 'error' : 'success'}-content`}
+ >
+ {pattern.public ? : }
+ Make pattern {pattern.public ? 'private' : 'public'}
+
+ ) : null}
+ {pattern.userId === account.id && (
+ <>
+
+
Update Pattern
+
+
+ Clone Pattern
+
+
setEdit(true)}
+ className={`tw-daisy-btn tw-daisy-btn-primary ${horFlexClasses}`}
+ >
+ Edit Pattern Metadata
+
+ >
+ )}
+
+
+ >
+)
diff --git a/packages/react/components/Account/Patterns.mjs b/packages/react/components/Account/Patterns.mjs
new file mode 100644
index 00000000000..fde65ec2ca1
--- /dev/null
+++ b/packages/react/components/Account/Patterns.mjs
@@ -0,0 +1,183 @@
+// Dependencies
+import orderBy from 'lodash/orderBy.js'
+import { capitalize, shortDate } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+import { useSelection } from '@freesewing/react/hooks/useSelection'
+
+// Components
+import { TableWrapper } from '@freesewing/react/components/Table'
+import { PatternCard } from '@freesewing/react/components/Account'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import {
+ BoolNoIcon,
+ BoolYesIcon,
+ PlusIcon,
+ RightIcon,
+ TrashIcon,
+} from '@freesewing/react/components/Icon'
+
+const t = (input) => {
+ console.log('t called', input)
+ return input
+}
+
+/*
+ * Component for the account/patterns page
+ *
+ * @params {object} props - All React props
+ * @params {function} Link - A framework specific Link component for client-side routing
+ */
+export const Patterns = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // State
+ const [patterns, setPatterns] = useState([])
+ const [refresh, setRefresh] = useState(0)
+ const [order, setOrder] = useState('id')
+ const [desc, setDesc] = useState(false)
+
+ // Hooks
+ const backend = useBackend()
+ const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext)
+ const { count, selection, setSelection, toggle, toggleAll } = useSelection(patterns)
+
+ // Effects
+ useEffect(() => {
+ const getPatterns = async () => {
+ setLoadingStatus([true, 'Loading patterns from backend'])
+ const [status, body] = await backend.getPatterns()
+ console.log({ status, body })
+ if (status === 200) {
+ setPatterns(body.patterns)
+ setLoadingStatus([true, 'Patterns loaded', true, true])
+ } else setLoadingStatus([false, 'Failed to load patterns from backend', true, true])
+ }
+ getPatterns()
+ }, [refresh])
+
+ // Helper to delete one or more patterns
+ const removeSelectedPatterns = async () => {
+ let i = 0
+ for (const pattern in selection) {
+ i++
+ await backend.removePattern(pattern)
+ setLoadingStatus([
+ true,
+ ,
+ ])
+ }
+ setSelection({})
+ setRefresh(refresh + 1)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ }
+
+ const fields = {
+ id: '#',
+ img: 'Image',
+ name: 'Name',
+ design: 'Design',
+ createdAt: 'Date',
+ public: 'Public',
+ }
+
+ return (
+ <>
+
+
+ {count} {t('patterns')}
+
+
+
+ Create a new pattern
+
+
+
+
+
+ >
+ )
+}
diff --git a/packages/react/components/Account/Platform.mjs b/packages/react/components/Account/Platform.mjs
new file mode 100644
index 00000000000..3e4c692647f
--- /dev/null
+++ b/packages/react/components/Account/Platform.mjs
@@ -0,0 +1,78 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { SaveIcon } from '@freesewing/react/components/Icon'
+import { StringInput } from '@freesewing/react/components/Input'
+
+const labels = {
+ instagram: 'Instagram',
+ mastodon: 'Mastodon',
+ reddit: 'Reddit',
+ twitch: 'Twitch',
+ tiktok: 'TikTok',
+ website: 'Website',
+}
+
+export const Instagram = () =>
+export const Mastodon = () =>
+export const Reddit = () =>
+export const Twitch = () =>
+export const Tiktok = () =>
+export const Website = () =>
+
+/*
+ * Component for the account/social/[platform] page
+ *
+ * @param {object} props - All React props
+ * @param {string} platform - One of the keys in the labels object above
+ */
+const Platform = ({ platform = false }) => {
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [platformId, setPlatformId] = useState(account.data[platform] || '')
+
+ if (!labels || !labels[platform]) return Not a supported platform
+
+ // Helper method to save changes
+ const save = async () => {
+ setLoadingStatus([true, 'Saving linked identity'])
+ const data = { data: {} }
+ data.data[platform] = platformId
+ const [status, body] = await backend.updateAccount(data)
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, `Saved your ${labels[platform]} info`, true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ return (
+
+
val.length > 0}
+ placeholder={'joostdecock'}
+ />
+
+
+ Save
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Reload.mjs b/packages/react/components/Account/Reload.mjs
new file mode 100644
index 00000000000..877d6ed7ab3
--- /dev/null
+++ b/packages/react/components/Account/Reload.mjs
@@ -0,0 +1,50 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { ReloadIcon } from '@freesewing/react/components/Icon'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+
+/*
+ * Component for the account/actions/export page
+ */
+export const Reload = () => {
+ // Hooks
+ const backend = useBackend()
+ const { setAccount } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Helper method to reload account
+ const reload = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.reloadAccount()
+ if (status === 200) {
+ setAccount(body.account)
+ setLoadingStatus([true, 'All done', true, true])
+ } else setLoadingStatus([true, 'This did not go as planned. Please report this.', true, false])
+ }
+
+ return (
+
+
+ The data stored in your browser can sometimes get out of sync with the data stored in our
+ backend.
+
+
+ This lets you reload your account data from the backend. It has the same effect as signing
+ out, and then signing in again.
+
+
+
+ Reload Account Data
+
+
+ )
+}
diff --git a/packages/react/components/Account/Remove.mjs b/packages/react/components/Account/Remove.mjs
new file mode 100644
index 00000000000..92d2c124740
--- /dev/null
+++ b/packages/react/components/Account/Remove.mjs
@@ -0,0 +1,81 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { BackIcon as ExitIcon, TrashIcon } from '@freesewing/react/components/Icon'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+
+/*
+ * Component for the account/actions/remove page
+ */
+export const Remove = () => {
+ // Hooks
+ const backend = useBackend()
+ const { signOut, account } = useAccount()
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { setModal, clearModal } = useContext(ModalContext)
+
+ // Helper method to remove the account
+ const removeAccount = async () => {
+ setLoadingStatus([true, 'Talking to the backend'])
+ const result = await backend.removeAccount()
+ if (result.success) {
+ setLoadingStatus([true, 'Done. Or rather, gone.', true, true])
+ signOut()
+ } else setLoadingStatus([true, 'An error occured. Please report this', true, false])
+ }
+
+ if (account.control === 5)
+ return (
+ <>
+ This button is red for a reason.
+
+
+ Remove your FreeSewing account
+
+ >
+ )
+
+ return (
+
+
+ setModal(
+
+
+
There is no way back from this
+
If this is what you want, then go ahead.
+
+
+ Remove your FreeSewing account
+
+
+
+ Back to safety
+
+
+
+ )
+ }
+ >
+
+ Remove your FreeSewing account
+
+
+ )
+}
diff --git a/packages/react/components/Account/Restrict.mjs b/packages/react/components/Account/Restrict.mjs
new file mode 100644
index 00000000000..a469b313399
--- /dev/null
+++ b/packages/react/components/Account/Restrict.mjs
@@ -0,0 +1,98 @@
+// Dependencies
+import { linkClasses } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { BackIcon, NoIcon } from '@freesewing/react/components/Icon'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+
+/*
+ * Component for the account/actions/restrict page
+ */
+export const Restrict = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const backend = useBackend()
+ const { signOut, account } = useAccount()
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { setModal, clearModal } = useContext(ModalContext)
+
+ // Helper method to restrict the account
+ const restrictAccount = async () => {
+ setLoadingStatus([true, 'Talking to the backend'])
+ const [status, body] = await backend.restrictAccount()
+ if (status === 200) {
+ setLoadingStatus([true, 'Done. Consider yourself restrcited.', true, true])
+ signOut()
+ } else setLoadingStatus([true, 'An error occured. Please report this', true, false])
+ }
+
+ if (account.control === 5)
+ return (
+ <>
+ This button is red for a reason.
+
+
+ Remove your FreeSewing account
+
+ >
+ )
+
+ return (
+
+
+ The GDPR guarantees{' '}
+
+ your right to restrict processing
+ {' '}
+ of your personal data.
+
+
This will disable your account, but not remove any data.
+
+ setModal(
+
+
+
Proceed with caution
+
+ While no data will be removed, this will disable your account. Furthermore, you
+ can not undo this on your own, but will have to contact support when you want to
+ restore access to your account.
+
+
+
+ Restrict processing of your FreeSewing data
+
+
+
+ Back to safety
+
+
+
+ )
+ }
+ >
+
+ Restrict processing of your FreeSewing data
+
+
+ )
+}
diff --git a/packages/react/components/Account/Role.mjs b/packages/react/components/Account/Role.mjs
new file mode 100644
index 00000000000..924821de8bb
--- /dev/null
+++ b/packages/react/components/Account/Role.mjs
@@ -0,0 +1,12 @@
+import React from 'react'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+
+export const UserRole = ({ role }) => {
+ if (role === 'user') return
+ if (role === 'admin') return
+
+ return fixme
+}
+
+const RoleUser = () =>
+const RoleAdmin = () =>
diff --git a/packages/react/components/Account/Set.mjs b/packages/react/components/Account/Set.mjs
new file mode 100644
index 00000000000..fad22c1e21b
--- /dev/null
+++ b/packages/react/components/Account/Set.mjs
@@ -0,0 +1,921 @@
+// Dependencies
+import {
+ control as controlConfig,
+ isDegreeMeasurement,
+ measurements,
+ urls,
+} from '@freesewing/config'
+import { measurements as measurementTranslations } from '@freesewing/i18n'
+import { i18n, measurements as designMeasurements } from '@freesewing/collection'
+import {
+ cloudflareImageUrl,
+ formatMm,
+ horFlexClasses,
+ linkClasses,
+ shortDate,
+ timeAgo,
+} from '@freesewing/utils'
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Hooks
+import React, { Fragment, useContext, useEffect, useState } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import {
+ BoolNoIcon,
+ BoolYesIcon,
+ CloneIcon,
+ CompareIcon,
+ CuratedMeasurementsSetIcon,
+ EditIcon,
+ FlagIcon,
+ MeasurementsSetIcon,
+ NoIcon,
+ OkIcon,
+ ResetIcon,
+ ShowcaseIcon,
+ UploadIcon,
+} from '@freesewing/react/components/Icon'
+import { BookmarkButton, MsetCard } from '@freesewing/react/components/Account'
+import {
+ DesignInput,
+ ListInput,
+ MarkdownInput,
+ MeasurementInput,
+ PassiveImageInput,
+ StringInput,
+ ToggleInput,
+} from '@freesewing/react/components/Input'
+import { Pattern } from '../Pattern/index.mjs'
+import { DisplayRow } from './shared.mjs'
+import Markdown from 'react-markdown'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { Json } from '@freesewing/react/components/Json'
+import { Yaml } from '@freesewing/react/components/Yaml'
+import { Popout } from '@freesewing/react/components/Popout'
+import { bundlePatternTranslations, draft, flattenFlags } from '../Editor/lib/index.mjs'
+import { Bonny } from '@freesewing/bonny'
+import { ZoomablePattern } from '../Editor/components/ZoomablePattern.mjs'
+import { HeaderMenuDraftViewFlags } from '../Editor/components/HeaderMenu.mjs'
+import { Flag, FlagsAccordionEntries } from '../Editor/components/Flag.mjs'
+import { i18n as pluginI18n } from '@freesewing/core-plugins'
+import { MiniNote, MiniTip } from '../Mini/index.mjs'
+
+const t = (input) => {
+ console.log('t called', input)
+ return input
+}
+
+/*
+ * Component to show an individual measurements set
+ *
+ * @param {object} props - All React props
+ * @param {number} id - The ID of the measurements set to load
+ * @param {bool} publicOnly - FIXME
+ * @param {function} Link - An optional framework-specific Link component to use for client-side routing
+ */
+export const Set = ({ id, publicOnly = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, control } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const backend = useBackend()
+
+ // Context
+ const { setModal } = useContext(ModalContext)
+
+ const [filter, setFilter] = useState(false)
+ const [edit, setEdit] = useState(false)
+ const [suggest, setSuggest] = useState(false)
+ const [render, setRender] = useState(false)
+ const [mset, setMset] = useState()
+ // Set fields for editing
+ const [name, setName] = useState(mset?.name)
+ const [image, setImage] = useState(mset?.image)
+ const [isPublic, setIsPublic] = useState(mset?.public ? true : false)
+ const [imperial, setImperial] = useState(mset?.imperial ? true : false)
+ const [notes, setNotes] = useState(mset?.notes || '')
+ const [measies, setMeasies] = useState({})
+ const [displayAsMetric, setDisplayAsMetric] = useState(mset?.imperial ? false : true)
+
+ // Effect
+ useEffect(() => {
+ const getSet = async () => {
+ setLoadingStatus([true, 'Contacting the backend'])
+ const [status, body] = await backend.getSet(id)
+ if (status === 200 && body.result === 'success') {
+ setMset(body.set)
+ setName(body.set.name)
+ setImage(body.set.image)
+ setIsPublic(body.set.public ? true : false)
+ setImperial(body.set.imperial ? true : false)
+ setNotes(body.set.notes)
+ setMeasies(body.set.measies)
+ setLoadingStatus([true, 'Measurements set loaded', true, true])
+ } else setLoadingStatus([true, 'An error occured while contacting the backend', true, false])
+ }
+ const getPublicSet = async () => {
+ setLoadingStatus([true, 'Contacting the backend'])
+ const [status, body] = await backend.getPublicSet(id)
+ if (status === 200 && body.result === 'success') {
+ setMset({
+ ...body.data,
+ public: true,
+ measies: body.data.measurements,
+ })
+ setName(body.data.name)
+ setImage(body.data.image)
+ setIsPublic(body.data.public ? true : false)
+ setImperial(body.data.imperial ? true : false)
+ setNotes(body.data.notes)
+ setMeasies(body.data.measurements)
+ setLoadingStatus([true, 'Measurements set loaded', true, true])
+ } else
+ setLoadingStatus([
+ true,
+ 'An error occured while loading this measurements set',
+ true,
+ false,
+ ])
+ }
+ if (id) {
+ if (publicOnly) getPublicSet()
+ else getSet()
+ }
+ }, [id, publicOnly])
+
+ const filterMeasurements = () =>
+ filter ? designMeasurements[filter].sort() : measurements.sort()
+
+ if (!id || !mset) return null
+
+ const updateMeasies = (m, val) => {
+ const newMeasies = { ...measies }
+ newMeasies[m] = val
+ setMeasies(newMeasies)
+ }
+
+ const save = async () => {
+ setLoadingStatus([true, 'Gathering info'])
+ // Compile data
+ const data = { measies: {} }
+ if (name || name !== mset.name) data.name = name
+ if (image || image !== mset.image) data.img = image
+ if ([true, false].includes(isPublic) && isPublic !== mset.public) data.public = isPublic
+ if ([true, false].includes(imperial) && imperial !== mset.imperial) data.imperial = imperial
+ if (notes || notes !== mset.notes) data.notes = notes
+ // Add measurements
+ for (const m of measurements) {
+ if (measies[m] || measies[m] !== mset.measies[m]) data.measies[m] = measies[m]
+ }
+ setLoadingStatus([true, 'Saving measurements set'])
+ const [status, body] = await backend.updateSet(mset.id, data)
+ if (status === 200 && body.result === 'success') {
+ setMset(body.set)
+ setEdit(false)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ } else
+ setLoadingStatus([true, 'That did not go as planned. Saving the set failed.', true, false])
+ }
+
+ const togglePublic = async () => {
+ setLoadingStatus([true, 'Getting ready'])
+ const [status, body] = await backend.updateSet(mset.id, { public: !mset.public })
+ if (status === 200 && body.result === 'success') {
+ setMset(body.set)
+ setLoadingStatus([true, 'Alright, done!', true, true])
+ } else setLoadingStatus([true, 'Backend says no :(', true, false])
+ }
+
+ const importSet = async () => {
+ setLoadingStatus([true, 'Importing data'])
+ // Compile data
+ const data = {
+ ...mset,
+ userId: account.id,
+ measies: { ...mset.measies },
+ }
+ delete data.img
+ const [status, body] = await backend.createSet(data)
+ if (status === 201 && body.result === 'created') {
+ setLoadingStatus([true, 'Loading newly created set', true, true])
+ window.location = `/account/data/sets/set?id=${body.set.id}`
+ } else setLoadingStatus([true, 'We failed to create this measurements set', true, false])
+ }
+
+ const heading = (
+ <>
+
+
+
+
+
+ {account.control > 2 && mset.public && mset.userId !== account.id ? (
+
+ ) : (
+
+ )}
+ {account.control > 3 && mset.userId === account.id ? (
+
+
+ setModal(
+
+
+
+ )
+ }
+ >
+ JSON
+
+
+ setModal(
+
+
+
+ )
+ }
+ >
+ YAML
+
+
+ ) : (
+
+ )}
+ {account.id && account.control > 2 && mset.public && mset.userId !== account.id ? (
+
+
+
+ Import measurements set
+
+
+ ) : null}
+ {account.control > 2 ? (
+
+ ) : null}
+
+ setModal(
+
+
+
+ )
+ }
+ className={`tw-daisy-btn tw-daisy-btn-secondary tw-btn-outline ${horFlexClasses}`}
+ >
+
+ Show Image
+
+ {!publicOnly && (
+ <>
+ {account.control > 2 ? (
+
{
+ setSuggest(!suggest)
+ setEdit(false)
+ }}
+ className={`tw-daisy-btn ${
+ suggest ? 'tw-daisy-btn-neutral' : 'tw-daisy-btn-primary'
+ } tw-daisy-btn-outline ${horFlexClasses}`}
+ >
+ {suggest ? : }
+ {suggest ? 'Cancel' : 'Suggest for curation'}
+
+ ) : null}
+ {edit ? (
+ <>
+
{
+ setEdit(false)
+ setSuggest(false)
+ }}
+ className={`tw-daisy-btn tw-daisy-btn-neutral tw-daisy-btn-outline ${horFlexClasses}`}
+ >
+
+ Cancel
+
+
+
+ Save measurements set
+
+ >
+ ) : (
+
{
+ setEdit(true)
+ setSuggest(false)
+ }}
+ className={`tw-daisy-btn tw-daisy-btn-primary ${horFlexClasses}`}
+ >
+ Edit measurements set
+
+ )}
+ >
+ )}
+ {account.control > 1 && account?.compare ? (
+
{
+ setRender(!render)
+ setEdit(false)
+ }}
+ >
+
+
+ Validate measurements
+
+
+ ) : null}
+ {account.control > 2 && mset.userId === account.id ? (
+
+
+
+ Clone measurements set
+
+
+ ) : null}
+
+
+
+ >
+ )
+
+ if (suggest)
+ return (
+
+ {heading}
+
+
+ )
+
+ if (!edit) {
+ if (render)
+ return (
+
+ {heading}
+
+
+ )
+
+ return (
+
+ {heading}
+
+
Data
+
{mset.name}
+
{mset.imperial ? 'Imperial' : 'Metric'}
+ {control >= controlConfig.account.sets.notes && (
+
+ {mset.notes}
+
+ )}
+ {control >= controlConfig.account.sets.public && (
+ <>
+ {mset.userId === account.id && (
+
+
+ {mset.public ? (
+
+ ) : (
+
+ )}
+
+ Make {mset.public ? 'Private' : 'Public'}
+
+
+
+ )}
+ {mset.public && (
+
+ {`/set?id=${mset.id}`}
+
+ )}
+ >
+ )}
+ {control >= controlConfig.account.sets.createdAt && (
+
+ {timeAgo(mset.createdAt, false)}
+ ({shortDate(mset.createdAt, false)})
+
+ )}
+ {control >= controlConfig.account.sets.updatedAt && (
+
+ {timeAgo(mset.updatedAt, false)}
+ ({shortDate(mset.updatedAt, false)})
+
+ )}
+ {control >= controlConfig.account.sets.id &&
{mset.id} }
+
+ {Object.keys(mset.measies).length > 0 && (
+ <>
+
Measurements
+
setDisplayAsMetric(!displayAsMetric)}
+ current={displayAsMetric}
+ />
+ {Object.entries(mset.measies).map(([m, val]) =>
+ val > 0 ? (
+ }
+ key={m}
+ >
+ {m}
+
+ ) : null
+ )}
+ >
+ )}
+
+ )
+ }
+
+ return (
+
+ {heading}
+
Measurements
+
+ Clear filter}
+ />
+
+ {filterMeasurements().map((m) => (
+
+ ))}
+
+
Data
+
+ {/* Name is always shown */}
+
+
val && val.length > 0}
+ />
+
+ {/* img: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.sets.img ? (
+ val.length > 0}
+ />
+ ) : null}
+
+ {/* public: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.sets.public ? (
+
+ Public measurements set
+
+
+ ),
+ desc: 'Others are allowed to use these measurements to generate or test patterns',
+ },
+ {
+ val: false,
+ label: (
+
+ Private measurements set
+
+
+ ),
+ desc: 'These measurements cannot be used by other users or visitors',
+ },
+ ]}
+ current={isPublic}
+ />
+ ) : null}
+
+ {/* units: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.sets.units ? (
+ <>
+
+ Metric units (cm)
+ cm
+
+ ),
+ desc: 'Pick this if you prefer cm over inches',
+ },
+ {
+ val: true,
+ label: (
+
+ Imperial units (inch)
+ ″
+
+ ),
+ desc: 'Pick this if you prefer inches over cm',
+ },
+ ]}
+ current={imperial}
+ />
+
+ Note: You must save after changing Units to have the change take effect on this page.
+
+ >
+ ) : null}
+
+ {/* notes: Control level determines whether or not to show this */}
+
+ {account.control >= controlConfig.account.sets.notes ? (
+
+ ) : null}
+
+
+ Save Measurements Set
+
+
+ )
+}
+
+/**
+ * A (helper) component to display a measurements value
+ *
+ * @param {object} props - All React props
+ * @param {string} val - The value
+ * @param {string} m - The measurement name
+ * @param {bool} imperial - True for imperial measurements, or metric by default
+ */
+export const MeasurementValue = ({ val, m, imperial = false }) =>
+ isDegreeMeasurement(m) ? (
+ {val}°
+ ) : (
+
+ )
+
+/**
+ * React component to suggest a measurements set for curation
+ *
+ * @param {object} props - All React props
+ * @param {string} mset - The measurements set
+ */
+export const SuggestCset = ({ mset, Link }) => {
+ // State
+ const [height, setHeight] = useState('')
+ const [img, setImg] = useState('')
+ const [name, setName] = useState('')
+ const [notes, setNotes] = useState('')
+ const [submission, setSubmission] = useState(false)
+
+ console.log(mset)
+
+ // Hooks
+ const backend = useBackend()
+
+ // Method to submit the form
+ const suggestSet = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const result = await backend.suggestCset({ set: mset.id, height, img, name, notes })
+ if (result.success && result.data.submission) {
+ setSubmission(result.data.submission)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ } else setLoadingStatus([true, 'An unexpected error occured. Please report this.', true, false])
+ }
+
+ const missing = []
+ for (const m of measurements) {
+ if (typeof mset.measies[m] === 'undefined') missing.push(m)
+ }
+
+ if (submission) {
+ const url = `/curate/sets/suggested/${submission.id}`
+
+ return (
+ <>
+ Thank you
+ Your submission has been registered and will be processed by one of our curators.
+
+ It is available at: {url}
+
+ >
+ )
+ }
+
+ return (
+ <>
+ Suggest a measurements set for curation
+
+ {missing.length > 0 ? : }
+ Measurements
+
+ {missing.length > 0 ? (
+ <>
+
+ To ensure curated measurements sets work for all designs, you need to provide a full set
+ of measurements.
+
+ Your measurements set is missing the following measurements:
+
+ {missing.map((m) => (
+ {m}
+ ))}
+
+ >
+ ) : (
+ All measurements are available.
+ )}
+
+ {name.length > 1 ? : }
+ Name
+
+ Each curated set has a name. You can suggest your own name or a pseudonym.
+ val.length > 1} />
+
+ {height.length > 1 ? : }
+ Height
+
+
+ To allow organizing and presenting our curated sets in a structured way, we organize them by
+ height.
+
+ val.length > 1}
+ />
+
+ {img.length > 0 ? : }
+ Image
+
+
+ Finally, we need a picture. Please refer to the documentation to see what makes a good
+ picture for a curated measurements set.
+ Documentation
+
+ val.length > 1}
+ />
+
+
+ Notes
+
+ If you would like to add any notes, you can do so here.
+
+ This field supports markdown
+
+ true} />
+ 1 && img.length > 0)}
+ onClick={suggestSet}
+ >
+ Suggest for curation
+
+ >
+ )
+}
+
+/**
+ * React component to render a preview of a measurement set using the bonny pattern
+ *
+ * @param {object} props - All React props
+ * @param {string} mset - The measurements set
+ */
+export const RenderedCSet = ({ mset, imperial }) => {
+ const [previewVisible, setPreviewVisible] = useState(false)
+
+ const missing = []
+ for (const m of measurements) {
+ if (typeof mset.measies[m] === 'undefined') missing.push(m)
+ }
+ if (missing.length > 0)
+ return (
+ <>
+ Validation messages
+ To validate and preview a measurement set, all measurements need to be entered.
+ Your measurements set is missing the following measurements:
+
+ {missing.map((m) => (
+ {m}
+ ))}
+
+ >
+ )
+ const strings = bundlePatternTranslations('bonny')
+
+ const { pattern } = draft(Bonny, { measurements: mset.measies })
+ const flags = pattern.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
+ console.log('flags', pattern, flags, strings)
+ return (
+ <>
+ Measurement analysis
+
+ Based on your measurements, we estimate your body to be about{' '}
+ {formatMm(pattern.parts[0].front.points.head.y * -1, imperial)} high.
+
+ Here is what the automated analysis found:
+ {Object.entries(flattenFlags(flags)).map(([key, flag], i) => {
+ const desc = strings[flag.desc] || flag.desc
+
+ return (
+
+ {flag.type === 'warn' ? (
+
+ {desc}
+
+ ) : (
+
+ {desc}
+
+ )}
+
+ )
+ })}
+
+ Preview
+ {previewVisible ? (
+
+ ) : (
+ <>
+ This feature creates a visual preview of your body based on your measurements.
+
+ It’s meant to help you spot possible mistakes and better understand how the software
+ sees your measurements, but keep in mind:
+
+
+
+ The preview is a simple line drawing, but it does include features like chest shape
+ and crotch placement. If that feels uncomfortable, you may prefer to skip using this
+ tool.
+
+
+ This preview is an approximation , not an exact representation. Bodies
+ have many variations that can't be captured with just a few measurements. We are
+ missing some information, like how weight is distributed or your posture.
+
+
+ If something looks off, it{' '}
+ doesn’t necessarily mean your measurements are wrong , but it might be
+ worth double-checking. Sometimes, differences come from how the preview is generated
+ rather than an error in measuring.
+
+
+ Just like this preview, some sewing patterns may need to assume certain body
+ proportions. If this preview looks different from what you expect, some patterns may
+ also need adjustment, to get a perfect fit.
+
+
+ setPreviewVisible(true)}
+ >
+ I understand, render body preview
+
+ >
+ )}
+ >
+ )
+}
+
+export const NewSet = () => {
+ // Hooks
+ const backend = useBackend()
+ const { account } = useAccount()
+ const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext)
+
+ // State
+ const [name, setName] = useState('')
+
+ // Use account setting for imperial
+ const imperial = account.imperial
+
+ // Helper method to create a new set
+ const createSet = async () => {
+ setLoadingStatus([true, 'Storing new measurements set'])
+ const [status, body] = await backend.createSet({ name, imperial })
+ if (status === 201 && body.result === 'created') {
+ setLoadingStatus([true, 'Nailed it', true, true])
+ window.location = `/account/data/sets/set?id=${body.set.id}`
+ } else
+ setLoadingStatus([
+ true,
+ 'Failed to save the measurments set. Please report this.',
+ true,
+ false,
+ ])
+ }
+
+ return (
+
+
Name
+
Give this set of measurements a name. That will help tell them apart.
+
val && val.length > 0}
+ placeholder={'Georg Cantor'}
+ />
+
+
+ New Measurements Set
+
+
+
+ )
+}
diff --git a/packages/react/components/Account/Sets.mjs b/packages/react/components/Account/Sets.mjs
new file mode 100644
index 00000000000..83c0eff9e88
--- /dev/null
+++ b/packages/react/components/Account/Sets.mjs
@@ -0,0 +1,285 @@
+// Dependencies
+import { measurements } from '@freesewing/config'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+import { requiredMeasurements as designMeasurements } from '@freesewing/collection'
+import { cloudflareImageUrl, capitalize, hasRequiredMeasurements } from '@freesewing/utils'
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Hooks
+import React, { useState, useEffect, Fragment, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, PlusIcon, TrashIcon, UploadIcon } from '@freesewing/react/components/Icon'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { NewSet } from './Set.mjs'
+
+/*
+ * The component for the an account/sets page
+ *
+ * @param {object} props - All React props
+ * @param {function} Link - An optional framework-specific Link component
+ */
+export const Sets = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { control } = useAccount()
+ const backend = useBackend()
+
+ // State
+ const [sets, setSets] = useState([])
+ const [selected, setSelected] = useState({})
+ const [refresh, setRefresh] = useState(0)
+
+ // Context
+ const { setLoadingStatus, LoadingProgress } = useContext(LoadingStatusContext)
+ const { setModal } = useContext(ModalContext)
+
+ // Effects
+ useEffect(() => {
+ const getSets = async () => {
+ const [status, body] = await backend.getSets()
+ if (status === 200 && body.result === 'success') setSets(body.sets)
+ }
+ getSets()
+ }, [refresh])
+
+ // Helper var to see how many are selected
+ const selCount = Object.keys(selected).length
+
+ // Helper method to toggle single selection
+ const toggleSelect = (id) => {
+ const newSelected = { ...selected }
+ if (newSelected[id]) delete newSelected[id]
+ else newSelected[id] = 1
+ setSelected(newSelected)
+ }
+
+ // Helper method to toggle select all
+ const toggleSelectAll = () => {
+ if (selCount === sets.length) setSelected({})
+ else {
+ const newSelected = {}
+ for (const set of sets) newSelected[set.id] = 1
+ setSelected(newSelected)
+ }
+ }
+
+ // Helper to delete one or more measurements sets
+ const removeSelectedSets = async () => {
+ let i = 0
+ for (const id in selected) {
+ i++
+ await backend.removeSet(id)
+ setLoadingStatus([
+ true,
+ ,
+ ])
+ }
+ setSelected({})
+ setRefresh(refresh + 1)
+ setLoadingStatus([true, 'Nailed it', true, true])
+ }
+
+ return (
+
+ {sets.length > 0 ? (
+ <>
+
+
+
+ Import Measurements Sets
+
+
+ setModal(
+
+
+
+ )
+ }
+ >
+
+ Create a new Measurements Set
+
+
+
+
+
+ {selCount} Measurements Sets
+
+
+ >
+ ) : (
+
+
+ Create a new Measurements Set
+
+ )}
+
+ {sets.map((set, i) => (
+
+
+ toggleSelect(set.id)}
+ />
+
+
+
+
+
+ ))}
+
+
+ )
+}
+
+/**
+ * React component to display a (card of a) single measurements set
+ *
+ * @param {object} props - All React props
+ * @param {function} Link - An optional framework-specific Link component
+ * @param {string} design - The designs for which to check required measurements
+ * @param {test} href - Where the set should link to
+ * @param {function} onClick - What to do when clicking on a set
+ * @param {object} set - The (data of the) measurements set
+ * @param {string} size - Size of the card
+ * @param {bool} useA - Whether to use an A tag or not
+ */
+export const MsetCard = ({
+ Link = false,
+ design = false,
+ href = false,
+ onClick = false,
+ set,
+ size = 'lg',
+ useA = false,
+}) => {
+ if (!Link) Link = WebLink
+ const sizes = {
+ lg: 96,
+ md: 52,
+ sm: 36,
+ }
+ const s = sizes[size]
+
+ const wrapperProps = {
+ className: `tw-bg-base-300 tw-aspect-square tw-h-${s} tw-w-${s} tw-mb-2 tw-grow tw-w-full
+ hover:tw-cursor-pointer tw-border-0 tw-opacity-80 hover:tw-opacity-100
+ tw-mx-auto tw-flex tw-flex-col tw-items-start tw-text-center tw-justify-between tw-rounded-none md:tw-rounded shadow`,
+ style: {
+ backgroundImage: `url(${cloudflareImageUrl({ type: 'w500', id: set.img })})`,
+ backgroundSize: 'cover',
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: '50%',
+ },
+ }
+ if (!set.img || set.img === 'default-avatar')
+ wrapperProps.style.backgroundPosition = 'bottom right'
+
+ let icon =
+ let missingMeasies = ''
+ let linebreak = ''
+ const maxLength = 75
+ if (design) {
+ const [hasMeasies, missing] = hasRequiredMeasurements(
+ designMeasurements[design],
+ set.measies,
+ true
+ )
+ const iconClasses = 'tw-w-8 tw-h-8 tw-p-1 tw-rounded-full tw--mt-2 tw--ml-2 tw-shadow'
+ icon = hasMeasies ? (
+
+ ) : (
+
+ )
+ if (missing.length > 0) {
+ const translated = missing.map((m) => measurementsTranslations[m])
+ let missingString = 'Missing:' + translated.join(', ')
+ if (missingString.length > maxLength) {
+ const lastSpace = missingString.lastIndexOf(', ', maxLength)
+ missingString = missingString.substring(0, lastSpace) + ', and more...'
+ }
+ const measieClasses = 'tw-font-normal tw-text-xs'
+ missingMeasies = {missingString}
+ linebreak =
+ }
+ }
+
+ const inner = (
+ <>
+ {icon}
+
+ {set.name}
+ {linebreak}
+ {missingMeasies}
+
+ >
+ )
+
+ // Is it a button with an onClick handler?
+ if (onClick)
+ return (
+ onClick(set)}>
+ {inner}
+
+ )
+
+ // Returns a link to an internal page
+ if (href && !useA)
+ return (
+
+ {inner}
+
+ )
+
+ // Returns a link to an external page
+ if (href && useA)
+ return (
+
+ {inner}
+
+ )
+
+ // Returns a div
+ return {inner}
+}
diff --git a/packages/react/components/Account/Status.mjs b/packages/react/components/Account/Status.mjs
new file mode 100644
index 00000000000..8eb08425a10
--- /dev/null
+++ b/packages/react/components/Account/Status.mjs
@@ -0,0 +1,16 @@
+import React from 'react'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+
+export const AccountStatus = ({ status }) => {
+ if (status === 0) return
+ if (status === 1) return
+ if (status === -1) return
+ if (status === -2) return
+
+ return Invalid status: {status}
+}
+
+const AccountInactive = () =>
+const AccountActive = () =>
+const AccountFrozen = () =>
+const AccountBlocked = () =>
diff --git a/packages/react/components/Account/Units.mjs b/packages/react/components/Account/Units.mjs
new file mode 100644
index 00000000000..1fe08d5a3fb
--- /dev/null
+++ b/packages/react/components/Account/Units.mjs
@@ -0,0 +1,103 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { ListInput } from '@freesewing/react/components/Input'
+import { NumberCircle } from '@freesewing/react/components/Number'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+/*
+ * Component for the account/preferences/units page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ */
+export const Units = ({ welcome = false }) => {
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const backend = useBackend()
+
+ // State
+ const [selection, setSelection] = useState(account?.imperial === true ? 'imperial' : 'metric')
+
+ // Helper method to update account
+ const update = async (val) => {
+ if (val !== selection) {
+ setLoadingStatus([true, 'Saving units'])
+ const [status, body] = await backend.updateAccount({
+ imperial: val === 'imperial' ? true : false,
+ })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setSelection(body.account.imperial ? 'imperial' : 'metric')
+ setLoadingStatus([true, 'Units updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+ }
+
+ // Next step in the onboarding
+ const nextHref =
+ welcomeSteps[account?.control].length > 3
+ ? '/welcome/' + welcomeSteps[account?.control][3]
+ : '/docs/about/guide'
+
+ return (
+
+
({
+ val,
+ label: (
+
+ {val === 'metric' ? 'Metric units (cm)' : 'Imperial units (inch)'}
+
+
+ ),
+ desc:
+ val === 'metric'
+ ? 'Pick this if you prefere centimeters over inches'
+ : 'Pick this if you prefer inches over centimeters',
+ }))}
+ current={selection}
+ update={update}
+ />
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[account?.control].length > 0 ? (
+ <>
+
+
+ 3 / {welcomeSteps[account?.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Account/Username.mjs b/packages/react/components/Account/Username.mjs
new file mode 100644
index 00000000000..c6a5cab647b
--- /dev/null
+++ b/packages/react/components/Account/Username.mjs
@@ -0,0 +1,122 @@
+// Dependencies
+import { welcomeSteps } from './shared.mjs'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon, RightIcon } from '@freesewing/react/components/Icon'
+import { StringInput } from '@freesewing/react/components/Input'
+import { IconButton } from '@freesewing/react/components/Button'
+import { WelcomeIcons } from './shared.mjs'
+
+/*
+ * Component for the account/username page
+ *
+ * @params {object} props - All React props
+ * @params {bool} props.welcome - Set to true to use this component on the welcome page
+ * @params {function} props.Link - A framework specific Link component for client-side routing
+ */
+export const Username = ({ welcome = false, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const [username, setUsername] = useState(account.username)
+ const [available, setAvailable] = useState(true)
+
+ const update = async (value) => {
+ if (value !== username) {
+ setUsername(value)
+ const result = await backend.isUsernameAvailable(value)
+ setAvailable(result.available ? true : false)
+ }
+ }
+
+ const save = async () => {
+ setLoadingStatus([true, 'Saving username'])
+ const [status, body] = await backend.updateAccount({ username })
+ if (status === 200 && body.result === 'success') {
+ setAccount(body.account)
+ setLoadingStatus([true, 'Username updated', true, true])
+ } else setLoadingStatus([true, 'Something went wrong. Please report this', true, true])
+ }
+
+ const nextHref =
+ welcomeSteps[account.control].length > 5
+ ? '/welcome/' + welcomeSteps[account.control][5]
+ : '/docs/about/guide'
+
+ let btnClasses = 'daisy-btn mt-4 capitalize '
+ if (welcome) btnClasses += 'w-64 daisy-btn-secondary'
+ else btnClasses += 'w-full daisy-btn-primary'
+
+ return (
+
+
available}
+ placeholder={'Sorcha Ni Dhubghaill'}
+ labelBL={
+
+ {available ? (
+ <>
+ Username is
+ available
+ >
+ ) : (
+ <>
+ This username is taken
+ >
+ )}
+
+ }
+ />
+
+
+ Save Username
+
+
+
+ {welcome ? (
+ <>
+
+ Continue
+
+ {welcomeSteps[account.control].length > 0 ? (
+ <>
+
+
+ 5 / {welcomeSteps[account.control].length}
+
+
+ >
+ ) : null}
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Account/index.mjs b/packages/react/components/Account/index.mjs
new file mode 100644
index 00000000000..934e3b160ed
--- /dev/null
+++ b/packages/react/components/Account/index.mjs
@@ -0,0 +1,71 @@
+import React from 'react'
+
+import { AccountStatus } from './Status.mjs'
+import { Bookmarks, BookmarkButton } from './Bookmarks.mjs'
+import { Links } from './Links.mjs'
+import { Set, NewSet } from './Set.mjs'
+import { Sets, MsetCard } from './Sets.mjs'
+import { Patterns } from './Patterns.mjs'
+import { Pattern, PatternCard } from './Pattern.mjs'
+import { Apikeys } from './Apikeys.mjs'
+import { Username } from './Username.mjs'
+import { Bio } from './Bio.mjs'
+import { Avatar } from './Avatar.mjs'
+import { Email, EmailChangeConfirmation } from './Email.mjs'
+import { Github } from './Github.mjs'
+import { Instagram, Mastodon, Reddit, Twitch, Tiktok, Website } from './Platform.mjs'
+import { Compare } from './Compare.mjs'
+import { Control } from './Control.mjs'
+import { Units } from './Units.mjs'
+import { Newsletter } from './Newsletter.mjs'
+import { Consent } from './Consent.mjs'
+import { Password } from './Password.mjs'
+import { Mfa } from './Mfa.mjs'
+import { ImportSet } from './Import.mjs'
+import { Export } from './Export.mjs'
+import { Reload } from './Reload.mjs'
+import { Remove } from './Remove.mjs'
+import { Restrict } from './Restrict.mjs'
+import { UserId } from './Id.mjs'
+import { UserRole } from './Role.mjs'
+
+export {
+ AccountStatus,
+ Bookmarks,
+ BookmarkButton,
+ Links,
+ Set,
+ NewSet,
+ Sets,
+ MsetCard,
+ Patterns,
+ Pattern,
+ PatternCard,
+ Apikeys,
+ Username,
+ Bio,
+ Avatar,
+ Email,
+ EmailChangeConfirmation,
+ Github,
+ Instagram,
+ Mastodon,
+ Reddit,
+ Twitch,
+ Tiktok,
+ Website,
+ Compare,
+ Control,
+ Units,
+ Newsletter,
+ Consent,
+ Password,
+ Mfa,
+ ImportSet,
+ Export,
+ Reload,
+ Remove,
+ Restrict,
+ UserId,
+ UserRole,
+}
diff --git a/packages/react/components/Account/shared.mjs b/packages/react/components/Account/shared.mjs
new file mode 100644
index 00000000000..d47fc7ca782
--- /dev/null
+++ b/packages/react/components/Account/shared.mjs
@@ -0,0 +1,87 @@
+import React from 'react'
+import { Link } from '@freesewing/react/components/Link'
+import {
+ SettingsIcon,
+ ControlIcon,
+ NewsletterIcon,
+ UnitsIcon,
+ CompareIcon,
+ DocsIcon,
+ UserIcon,
+ LeftIcon,
+ OkIcon,
+ NoIcon,
+ ShowcaseIcon,
+} from '@freesewing/react/components/Icon'
+
+/*
+ * A component to display a row of data
+ */
+export const DisplayRow = ({ title, children, keyWidth = 'w-24' }) => (
+
+
+ {title}
+
+
{children}
+
+)
+
+export const welcomeSteps = {
+ 1: [''],
+ 2: ['', 'newsletter', 'units'],
+ 3: ['', 'newsletter', 'units', 'compare', 'username'],
+ 4: ['', 'newsletter', 'units', 'compare', 'username', 'bio', 'img'],
+ 5: [''],
+}
+
+export const WelcomeDoneIcon = ({ href }) => (
+
+
+
+)
+export const WelcomeTodoIcon = ({ href }) => (
+
+
+
+)
+
+const WelcomeTopicIcon = (props) => {
+ const Icon =
+ props.href === '' || props.href === 'control'
+ ? ControlIcon
+ : icons[props.href]
+ ? icons[props.href]
+ : SettingsIcon
+
+ return
+}
+
+const WelcomeDoingIcon = ({ href }) => (
+
+)
+
+export const WelcomeIcons = ({ done = [], todo = [], current = '' }) => (
+
+ {done.map((href) => (
+
+ ))}
+
+ {todo.map((href) => (
+
+ ))}
+
+)
+
+const icons = {
+ newsletter: NewsletterIcon,
+ units: UnitsIcon,
+ compare: CompareIcon,
+ username: UserIcon,
+ bio: DocsIcon,
+ img: ShowcaseIcon,
+}
diff --git a/packages/react/components/Admin/index.mjs b/packages/react/components/Admin/index.mjs
new file mode 100644
index 00000000000..4f4cfc90e4e
--- /dev/null
+++ b/packages/react/components/Admin/index.mjs
@@ -0,0 +1,347 @@
+// Dependencies
+import { uiRoles as roles } from '@freesewing/config'
+import { userAvatarUrl } from '@freesewing/utils'
+// Hooks
+import React, { useState, useContext, useEffect } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Components
+import { Spinner } from '@freesewing/react/components/Spinner'
+//import { Hits } from 'shared/components/admin.mjs'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { SearchIcon } from '@freesewing/react/components/Icon'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+import { Markdown } from '@freesewing/react/components/Markdown'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { AccountStatus, UserRole } from '@freesewing/react/components/Account'
+
+export const SubscriberAdministration = ({ page }) => {
+ const [subscribers, setSubscribers] = useState()
+ const [q, setQ] = useState()
+ const [hits, setHits] = useState([])
+ const backend = useBackend()
+
+ const loadSubscribers = async () => {
+ const [status, body] = await backend.adminLoadSubscribers()
+ if (status === 200 && body.subscribers) setSubscribers(body.subscribers)
+ }
+
+ const search = async () => {
+ if (!subscribers) await loadSubscribers()
+ const found = []
+ for (const lang in subscribers) {
+ found.push(
+ ...subscribers[lang]
+ .filter((sub) => sub.email.toLowerCase().includes(q.toLowerCase()))
+ .map((sub) => ({ ...sub, lang }))
+ )
+ }
+ setHits(found)
+ }
+
+ const unsubscribe = async (ehash) => {
+ await backend.newsletterUnsubscribe(ehash)
+ await loadSubscribers()
+ await search()
+ }
+
+ return (
+ <>
+ {subscribers ? (
+ <>
+ Search subscribers
+
+ setQ(evt.target.value)}
+ className="tw-daisy-input tw-w-full tw-daisy-input-bordered tw-flex tw-flex-row"
+ type="text"
+ placeholder="Username, ID, or E-mail address"
+ />
+
+
+
+
+
+
+
+ Email
+ Language
+ Unsubscribe
+
+
+
+ {hits.map((hit, i) => (
+
+
+ {hit.email}
+
+ {hit.lang.toUpperCase()}
+
+ unsubscribe(hit.ehash)}
+ >
+ Unsubscribe
+
+
+
+ ))}
+
+
+ >
+ ) : (
+
+ Load Subscribers
+
+ )}
+ >
+ )
+}
+
+export const UserAdministration = ({ Link = false }) => {
+ const backend = useBackend()
+
+ const [q, setQ] = useState('')
+ const [results, setResults] = useState()
+ const [loading, setLoading] = useState(false)
+
+ const search = async () => {
+ /*
+ * Search backend
+ */
+ setLoading(true)
+ const [status, body] = await backend.adminSearchUsers(q)
+ if (status === 200 && body.result === 'success' && body.users) {
+ setResults(body.users)
+ }
+ setLoading(false)
+ }
+
+ return (
+ <>
+
+
+
Search users
+
+ setQ(evt.target.value)}
+ className="tw-daisy-input tw-w-full tw-daisy-input-bordered tw-flex tw-flex-row"
+ type="text"
+ placeholder="Username, ID, or E-mail address"
+ />
+
+
+
+
+ {loading ?
:
}
+
+
+ >
+ )
+}
+
+export const Hits = ({ results, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ return (
+ <>
+ {results && results.username && results.username.length > 0 && (
+ <>
+ Results based on username
+ {results.username.map((user) => (
+
+ ))}
+ >
+ )}
+ {results && results.email && results.email.length > 0 && (
+ <>
+ Results based on E-mail address
+ {results.email.map((user) => (
+
+ ))}
+ >
+ )}
+ >
+ )
+}
+
+export const User = ({ user, Link }) => {
+ const { setModal } = useContext(ModalContext)
+
+ return (
+
+
+ setModal(
+
+
+
+ )
+ }
+ style={{
+ backgroundImage: `url(${userAvatarUrl({ ihash: user.ihash, variant: 'sq500' })})`,
+ backgroundSize: 'cover',
+ backgroundColor: '#ccc',
+ }}
+ >
+
+
+ {user.username}
+
+
+
+
+
+ setModal(
+
+ {JSON.stringify(user, null, 2)}
+
+ )
+ }
+ >
+ Details
+
+
+
+
+
+ )
+}
+
+export const ImpersonateButton = ({ userId }) => {
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { impersonate } = useAccount()
+
+ if (!userId) return null
+
+ const impersonateUser = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = await backend.adminImpersonateUser(userId)
+ if (status === 200 && body.result === 'success') {
+ impersonate(body)
+ setLoadingStatus([true, 'Now impersonating', true, true])
+ } else setLoadingStatus([true, 'An error occured', true, false])
+ }
+
+ return (
+
+ Impersonate
+
+ )
+}
+
+export const Row = ({ title, val }) => (
+
+ {title}
+ {val}
+
+)
+
+export const ManageUser = ({ userId }) => {
+ // Hooks
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const { account } = useAccount()
+ const { role } = account
+
+ // State
+ const [user, setUser] = useState({})
+ const [patterns, setPatterns] = useState({})
+ const [sets, setSets] = useState({})
+
+ // Effect
+ useEffect(() => {
+ const loadUser = async () => {
+ const result = await backend.adminLoadUser(userId)
+ if (result.success) {
+ setUser(result.data.user)
+ setPatterns(result.data.patterns)
+ setSets(result.data.sets)
+ }
+ }
+ loadUser()
+ }, [userId])
+
+ const updateUser = async (data) => {
+ setLoadingStatus([true, 'status:contactingBackend'])
+ const result = await backend.adminUpdateUser({ id: userId, data })
+ if (result.success) {
+ setLoadingStatus([true, 'status:settingsSaved', true, true])
+ setUser(result.data.user)
+ } else setLoadingStatus([true, 'status:backendError', true, false])
+ }
+
+ return user.id ? (
+
+
: null}
+ />
+ {role === 'admin' ? (
+
+ {roles.map((role) => (
+ updateUser({ role })}
+ disabled={role === user.role}
+ >
+ Assign {role} role
+
+ ))}
+
+ ) : null}
+
+ {user.mfaEnabled && (
+ updateUser({ mfaEnabled: false })}
+ >
+ Disable MFA
+
+ )}
+ {Object.keys(freeSewingConfig.statuses).map((status) => (
+ updateUser({ status })}
+ disabled={Number(status) === user.status}
+ >
+ Set {freeSewingConfig.statuses[status].name.toUpperCase()} status
+
+ ))}
+
+
+ {user.id ? : null}
+ {patterns ? : null}
+ {sets ? : null}
+
+
+ ) : (
+
+ )
+}
diff --git a/packages/react/components/Breadcrumbs/index.mjs b/packages/react/components/Breadcrumbs/index.mjs
new file mode 100644
index 00000000000..13c37839f7a
--- /dev/null
+++ b/packages/react/components/Breadcrumbs/index.mjs
@@ -0,0 +1,45 @@
+import React from 'react'
+
+/*
+ * The actual Breadcrumbs component
+ *
+ * @param {object} props - All the React props
+ * @param {array} props.crumbs - The crumbs, an array with objects with href, label keys
+ * @param {function} Link - An optional custom component to use to render the Link
+ * @param {text} title - The title of the current page
+ */
+export const Breadcrumbs = ({ crumbs = [], title, Link = false }) => {
+ if (Link === false) Link = RegularLink
+
+ return (
+
+
+
+ Home
+
+
+ {crumbs.map((crumb, i) => (
+
+ {crumb.label}
+
+ ))}
+ {title}
+
+
+ )
+}
+
+/*
+ * People can pass in a custom Link component,
+ * which is useful when using one from your framework.
+ * If not, we use a regular a tag
+ */
+const RegularLink = ({ href, children }) => {children}
+
+/*
+ * This goes between breadcrumbs
+ */
+const Spacer = () => »
diff --git a/packages/react/components/Button/index.mjs b/packages/react/components/Button/index.mjs
new file mode 100644
index 00000000000..6128b8a807b
--- /dev/null
+++ b/packages/react/components/Button/index.mjs
@@ -0,0 +1,34 @@
+import React from 'react'
+
+/**
+ * A button with an icon and a label. Common across our UI
+ *
+ * @param {object} props - All React props
+ * @param {string} title - The button title
+ * @param {string} className - Any EXTRA classes to add
+ * @param {string} color - The main button color
+ * @param {string} href - Set this to make it a link
+ */
+export const IconButton = ({
+ title = '',
+ className = '',
+ onClick = false,
+ href = false,
+ color = 'primary',
+ children = [],
+ btnProps = {},
+}) => {
+ const allProps = {
+ className: `${staticLinkClasses} tw-daisy-btn-${color} hover:tw-text-${color}-content ${className}`,
+ title: title,
+ ...btnProps,
+ }
+ if (onClick) allProps.onClick = onClick
+ else if (href) allProps.href = href
+
+ return onClick ? {children} : {children}
+}
+
+const staticLinkClasses =
+ 'tw-flex tw-flex-row tw-gap-2 lg:tw-gap-6 tw-items-center tw-grow ' +
+ 'tw-justify-between tw-w-full md:tw-w-auto tw-daisy-btn hover:tw-no-underline tw-capitalize'
diff --git a/packages/react/components/Collection/index.mjs b/packages/react/components/Collection/index.mjs
new file mode 100644
index 00000000000..7150ffd984c
--- /dev/null
+++ b/packages/react/components/Collection/index.mjs
@@ -0,0 +1,952 @@
+// Dependencies
+import { atomWithHash } from 'jotai-location'
+import {
+ about,
+ collection,
+ tags,
+ techniques,
+ designers,
+ developers,
+ examples,
+ measurements,
+ requiredMeasurements,
+ optionalMeasurements,
+} from '@freesewing/collection'
+import { capitalize, linkClasses, mutateObject } from '@freesewing/utils'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Hooks
+import React, { useState, useContext, Fragment } from 'react'
+import { useAtom } from 'jotai'
+
+// Components
+import { Link as WebLink, AnchorLink } from '@freesewing/react/components/Link'
+import {
+ CircleIcon,
+ CisFemaleIcon,
+ DocsIcon,
+ FilterIcon,
+ HeartIcon,
+ NewPatternIcon,
+ ResetIcon,
+ ShowcaseIcon,
+} from '@freesewing/react/components/Icon'
+import {
+ lineDrawingsFront as lineDrawings,
+ lineDrawingsBack,
+} from '@freesewing/react/components/LineDrawing'
+import { IconButton } from '@freesewing/react/components/Button'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+import { MissingLinedrawing } from '../LineDrawing/missing.mjs'
+
+const filterAtom = atomWithHash('filter', { example: true })
+
+export const useFilter = () => {
+ return useAtom(filterAtom)
+}
+
+/**
+ * React component to show the FreeSewing collection and pick a design
+ *
+ * @param {object} props - All React props
+ * @param {function} Link - An optional framework specific Link component for client-side routing
+ * @param {bool} editor - Set this to when loaded in the editor (this will make the display more dense)
+ * @param {bool} onClick - Set this to trigger an onClick event, rather than using links
+ */
+export const Collection = ({ Link = false, linkTo = 'about', editor = false, onClick = false }) => {
+ if (!Link) Link = WebLink
+
+ // State
+ const [filter, setFilter] = useFilter()
+ const [showFilters, setShowFilters] = useState(false)
+
+ /*
+ * Apply filter
+ */
+ const filtered = {}
+ for (const d of collection) {
+ let skip = false
+ if (
+ filter.tag &&
+ filter.tag.filter((tag) => about[d].tags.includes(tag)).length < filter.tag.length
+ )
+ skip = true
+ if (
+ filter.tech &&
+ filter.tech.filter((tech) => about[d].techniques.includes(tech)).length < filter.tech.length
+ )
+ skip = true
+ if (filter.difficulty && filter.difficulty !== about[d].difficulty) skip = true
+ if (!skip) filtered[d] = d
+ }
+
+ const updateFilter = (path, val) => {
+ // Allow clicking the same difficulty to remove it as a filter
+ if (path === 'difficulty' && val === filter.difficulty) val = 'unset'
+ const newFilter = mutateObject({ ...filter }, path, val)
+ setFilter(newFilter)
+ }
+
+ const toggle = (type, val) => {
+ const current = filter[type] || []
+ const newSet = new Set(current)
+ if (newSet.has(val)) newSet.delete(val)
+ else newSet.add(val)
+ updateFilter(type, [...newSet])
+ }
+
+ return (
+ <>
+
+
+ {Object.keys(filtered)
+ .sort()
+ .map((d) =>
+ onClick ? (
+ onClick(d)}
+ className="tw-text-secondary tw-decoration-2 tw-underline tw-capitalize hover:tw-decoration-4 hover:tw-text-secondary tw-bg-transparent tw-border-0 tw-font-medium tw-p-0 tw-text-base hover:tw-cursor-pointer"
+ >
+ {d}
+
+ ) : (
+
+ {d}
+
+ )
+ )}
+
+ {showFilters ? (
+ <>
+
+ Filters ({Object.keys(filtered).length}/{collection.length})
+
+
+ Tags:
+ {tags.map((tag) => (
+ toggle('tag', tag)}
+ >
+ {tag}
+
+ ))}
+
+
+ Techniques
+ {techniques.sort().map((tech) => (
+ toggle('tech', tech)}
+ >
+ {tech}
+
+ ))}
+
+
+ Difficulty:
+ {[1, 2, 3, 4, 5].map((score) => (
+ updateFilter('difficulty', score)}
+ key={score}
+ className={`tw-daisy-btn tw-daisy-btn-sm ${
+ filter.difficulty === score
+ ? 'tw-daisy-btn-secondary tw-daisy-btn-outline'
+ : 'tw-daisy-btn-ghost'
+ }`}
+ >
+
+
+ ))}
+
+
+ updateFilter('example', !filter.example)}
+ >
+ {filter.example ? : }
+ {filter.example ? 'Show Line Drawings' : 'Show Examples'}
+
+ setFilter({ example: 1 })}
+ >
+
+ Clear Filter
+
+ setShowFilters(false)}
+ >
+
+ Hide Filters
+
+
+ >
+ ) : (
+
+ updateFilter('example', !filter.example)}
+ >
+ {filter.example ? : }
+ {filter.example ? 'Show Line Drawings' : 'Show Examples'}
+
+ setShowFilters(true)}
+ >
+
+ Show Filters
+
+
+ )}
+
+
+ {Object.keys(filtered)
+ .sort()
+ .map((d) => (
+
+ ))}
+
+ >
+ )
+}
+
+/*
+ * A helper component to show a design technique
+ *
+ * @param {object} props - All React props
+ * @param {function} props.Link - A Link component, typically specific to the framework for client-side routing
+ * @param {string} props.technique - The technique name/id
+ */
+const Technique = ({ Link = WebLink, technique }) => (
+
+ {technique}
+
+)
+
+/*
+ * A helper component to show a design tag
+ *
+ * @param {object} props - All React props
+ * @param {function} props.Link - A Link component, typically specific to the framework for client-side routing
+ * @param {string} props.tag - The tag name/id
+ */
+const Tag = ({ Link = WebLink, technique }) => (
+
+ {tag}
+
+)
+
+const DesignCard = ({ name, lineDrawing = false, linkTo, Link, onClick }) => {
+ if (!Link) Link = WebLink
+
+ const LineDrawing =
+ lineDrawing && lineDrawings[name]
+ ? lineDrawings[name]
+ : ({ className }) =>
+ const exampleImageUrl = examples.href[name] ? examples.href[name] : noExample
+ const bg = { aspectRatio: '1/1.4' }
+ if (!lineDrawing) {
+ bg.backgroundImage = `url(${exampleImageUrl}`
+ bg.backgroundSize = 'cover'
+ bg.backgroundPosition = 'center center'
+ }
+
+ const inner = (
+
+
+ {about[name].name}
+
+ {lineDrawing ? (
+
+
+
+ ) : (
+
+ )}
+
+
+
+
+ )
+
+ return onClick ? (
+ onClick(name)}
+ className="hover:tw-bg-secondary hover:tw-bg-opacity-10 tw-rounded-lg tw-group hover:tw-no-underline tw-bg-transparent tw-border-0 hover:tw-cursor-pointer tw-p-0"
+ title={about[name].description}
+ >
+ {inner}
+
+ ) : (
+
+ {inner}
+
+ )
+}
+
+/*
+ * A helper component to show difficulety of a design
+ *
+ * @param {object} props - All React props
+ * @param {number} props.score - The difficulty score of the design (1-5)
+ */
+const Difficulty = ({ score = 0, className = '' }) => (
+
+ {[0, 1, 2, 3, 4].map((i) => (
+
+ ))}
+
+)
+
+const linkBuilders = {
+ new: (design) =>
+ `/editor/#s={%22design%22%3A%22${design.toLowerCase()}%22%2C%22view%22%3A%22draft%22}`,
+ docs: (design) => `/docs/designs/${design.toLowerCase()}/`,
+ about: (design) => `/designs/${design.toLowerCase()}/`,
+}
+
+const noExample =
+ 'https://images.pexels.com/photos/5626595/pexels-photo-5626595.jpeg?cs=srgb&fm=jpg&w=640&h=427'
+
+/**
+ * React component to show info about a FreeSewing design
+ *
+ * @param {object} props - All React props
+ * @param {string} design - The name/id of the design
+ * @param {function} Link - An optional framework specific Link component for client-side routing
+ */
+export const DesignInfo = ({ Link = false, design = false, noDocsLink = false }) => {
+ if (!Link) Link = WebLink
+
+ // State
+ const [back, setBack] = useState(false)
+
+ // Context
+ const { setModal, clearModal } = useContext(ModalContext)
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ if (!design) return null
+
+ // Line drawings
+ const LineDrawing = lineDrawings[design] || MissingLinedrawing
+ const LineDrawingBack = lineDrawingsBack[design] || null
+
+ // Make sure these always hold arrays, that way we can just map() over them in the JSX output
+ const codeBy = Array.isArray(about[design].code) ? about[design].code : [about[design].code]
+ const designBy = Array.isArray(about[design].design)
+ ? about[design].design
+ : [about[design].design]
+ const tags = about[design].tags || []
+ const techniques = about[design].techniques || []
+ const colors = {
+ 1: 'success',
+ 2: 'success',
+ 3: 'warning',
+ 4: 'warning',
+ 5: 'error',
+ }
+
+ const makeButton = (
+
+
+
+ New {capitalize(design)} pattern
+
+
+ )
+ const buttons = noDocsLink ? (
+ makeButton
+ ) : (
+
+
+
+ Documentation
+
+ {makeButton}
+
+ )
+
+ return (
+ <>
+ {buttons}
+
+
+
+ {back ? : }
+
+ {LineDrawingBack ? (
+
setBack(!back)}
+ >
+ {back ? 'Front' : 'Back'} view
+
+ ) : null}
+
+
+
Description
+
{about[design].description}
+
+
By
+
+ {codeBy.map((code) => (
+
+ ))}
+ {designBy.map((code) => (
+
+ ))}
+
+
+
Difficulty
+
+
+ {optionalMeasurements[design].length > 0 ? (
+ <>
+
+ Optional Measurements
+
+
+ {optionalMeasurements[design].map((m, i) => (
+
+
+ {measurementsTranslations[m]}
+
+ {i < optionalMeasurements[design].length - 1 ? , : null}
+
+ ))}
+
+ >
+ ) : null}
+
+ {requiredMeasurements[design].length > 0 ? (
+ <>
+
+ Required Measurements
+
+
+ {requiredMeasurements[design].map((m, i) => (
+
+
+ {measurementsTranslations[m]}
+
+ {i < requiredMeasurements[design].length - 1 ? , : null}
+
+ ))}
+
+ >
+ ) : null}
+
+
Tags
+
+ {tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
Techniques
+
+ {techniques.map((tech) => (
+
+ {tech}
+
+ ))}
+
+
+
Examples
+
+
+
+
+
{buttons}
+
+
+ >
+ )
+}
+
+const SharingIsCaring = ({ design }) => (
+ <>
+
+ Use #FreeSewing{capitalize(design)} to facilitate discovery
+
+
+ Please use the{' '}
+
+ #FreeSewing{capitalize(design)}
+ {' '}
+ hashtag when discussing FreeSewing's {capitalize(design)} pattern online.
+
+ Doing so can help others discover your post, which really is a win-win.
+
+ If you like, you can copy the hashtag below:
+ >
+)
+
+/*
+// __SDEFILE__ - This file is a dependency for the stand-alone environment
+// Dependencies
+import {
+ nsMerge,
+ capitalize,
+ optionsMenuStructure,
+ optionType,
+ cloudflareImageUrl,
+ horFlexClasses,
+} 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 { 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 { Popout } from 'shared/components/popout/index.mjs'
+import { NewPatternIcon, DocsIcon } from 'shared/components/icons.mjs'
+import { DynamicMdx } from 'shared/components/mdx/dynamic.mjs'
+
+// Translation namespaces used on this page
+export const ns = nsMerge(
+ 'account',
+ 'tags',
+ 'techniques',
+ 'measurements',
+ 'workbench',
+ 'designs',
+ 'tags'
+)
+
+const Option = ({ id, option, design }) =>
+ optionType(option) === 'constant' ? null : (
+
+
+
+ )
+
+const OptionGroup = ({ id, group, t, design }) => (
+
+ {t(`workbench:${id}`)}
+
+ {Object.entries(group).map(([sid, entry]) =>
+ entry.isGroup ? (
+
+ ) : (
+
+ )
+ )}
+
+
+)
+export const SimpleOptionsList = ({ options, t, design }) => {
+ const structure = optionsMenuStructure(options, {}, true)
+ 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, modal = 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')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {Object.keys(config.options).length > 0 ? (
+
+
+
+ ) : null}
+
+
+
+
+ >
+ )
+
+ return (
+ <>
+ #FreeSewing{capitalize(design)}
+ {t(`designs:${design}.d`)}
+
+ {workbench ? null : (
+
+
+ {t('tags:newThingPattern', { thing: capitalize(design) })}
+
+ )}
+ {docs ? null : (
+
+
+ {t('account:docs')}
+
+ )}
+
+ {docs || workbench || modal ? 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) => (
+
+ setModal(
+
+
+
+
+
+
+ )
+ }
+ >
+
+
+ ))}
+
+ ) : (
+
+ {t('account:noExamples')}
+ {t('account:noExamplesMsg')}
+
+
+ {t('account:showcaseNew')}
+
+
+
+ )}
+ >
+ ) : null}
+ {docs
+ ? null
+ : ['needs', 'fabric'].map((page) => (
+
+
+ t.split(':').pop().trim()}
+ />
+
+
+
+ ))}
+
+ {docs ? null : docsContent}
+
+
+
+ {workbench ? null : (
+
+
+ {t('tags:newThingPattern', { thing: capitalize(design) })}
+
+ )}
+ {docs ? null : (
+
+
+ {t('account:docs')}
+
+ )}
+
{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}
+
+ {Object.keys(config.options).length > 0 ? (
+ <>
+
{t('account:designOptions')}
+
+ >
+ ) : null}
+
+
{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}
+
+
+ >
+ )
+}
+*/
diff --git a/packages/react/components/Control/index.mjs b/packages/react/components/Control/index.mjs
new file mode 100644
index 00000000000..b9c2f6e32e0
--- /dev/null
+++ b/packages/react/components/Control/index.mjs
@@ -0,0 +1,16 @@
+import React from 'react'
+import { controlDesc } from '@freesewing/config'
+import { BulletIcon } from '@freesewing/react/components/Icon'
+
+export const ControlScore = ({ control, color = 'base-content' }) =>
+ control ? (
+
+ {Object.keys(controlDesc).map((score) => (
+ = score ? true : false}
+ className="tw-w-6 tw-h-6 tw--ml-1"
+ key={score}
+ />
+ ))}
+
+ ) : null
diff --git a/packages/react/components/CopyToClipboardButton/index.mjs b/packages/react/components/CopyToClipboardButton/index.mjs
new file mode 100644
index 00000000000..84d5a916ffa
--- /dev/null
+++ b/packages/react/components/CopyToClipboardButton/index.mjs
@@ -0,0 +1,48 @@
+import React, { useContext, useState } from 'react'
+import { copyToClipboard } from '@freesewing/utils'
+import ReactDOMServer from 'react-dom/server'
+import { CopyIcon, OkIcon } from '@freesewing/react/components/Icon'
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+const strip = (html) =>
+ typeof DOMParser === 'undefined'
+ ? html
+ : new DOMParser().parseFromString(html, 'text/html').body.textContent || ''
+
+const handleCopied = (content, setCopied, setLoadingStatus, label) => {
+ copyToClipboard(content)
+ setCopied(true)
+ setLoadingStatus([
+ true,
+ label ? `${label} copied to clipboard` : 'Copied to clipboard',
+ true,
+ true,
+ ])
+ setTimeout(() => setCopied(false), 1000)
+}
+
+export const CopyToClipboardButton = ({ content, label = false, sup = false }) => {
+ const [copied, setCopied] = useState(false)
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ const text =
+ typeof content === 'string' ? content : strip(ReactDOMServer.renderToStaticMarkup(content))
+
+ const style = sup ? 'tw-w-4 tw-h-4 tw--mt-4' : 'tw-w-5 tw-h-5'
+
+ return (
+ handleCopied(content, setCopied, setLoadingStatus, label)}
+ >
+ {copied ? (
+
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/packages/react/components/Design/index.mjs b/packages/react/components/Design/index.mjs
new file mode 100644
index 00000000000..3127d8e3193
--- /dev/null
+++ b/packages/react/components/Design/index.mjs
@@ -0,0 +1,139 @@
+// Dependencies
+import { collection } from '@freesewing/collection'
+
+//import { urls } from '@freesewing/config'
+//import { measurements as measurementTranslations } from '@freesewing/i18n'
+//import { measurements as designMeasurements } from '@freesewing/collection'
+import { capitalize } from '@freesewing/utils'
+
+// Context
+//import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+//import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Hooks
+import React, { useState } from 'react'
+//import { useAccount } from '@freesewing/react/hooks/useAccount'
+//import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink, AnchorLink } from '@freesewing/react/components/Link'
+import { ShowcaseIcon } from '@freesewing/react/components/Icon'
+
+/*
+// Dependencies
+import { capitalize } from 'shared/utils.mjs'
+import { linkClasses } from 'shared/components/link.mjs'
+import { designImages } from 'shared/components/designs/examples.mjs'
+import { designs } from 'shared/config/designs.mjs'
+// Context
+import { ModalContext } from 'shared/context/modal-context.mjs'
+// Hooks
+import { useTranslation } from 'next-i18next'
+import { useContext } from 'react'
+// Components
+import { ModalWrapper } from 'shared/components/wrappers/modal.mjs'
+import Link from 'next/link'
+import { Difficulty } from 'shared/components/designs/difficulty.mjs'
+import { lineDrawings } from 'shared/components/designs/linedrawings/index.mjs'
+import { DocsIcon, NewPatternIcon } from 'shared/components/icons.mjs'
+import { DesignInfo } from 'shared/components/designs/info.mjs'
+*/
+
+const linkBuilders = {
+ new: (design) => `/-/?d=${design.toLowerCase()}`,
+ docs: (design) => `/docs/designs/${design.toLowerCase()}`,
+}
+
+export const DesignTechnique = ({ technique }) => (
+
+ {technique}
+
+)
+
+export const DesignTag = ({ tag }) => {
+ const { t } = useTranslation(['tags'])
+
+ return (
+
+ {t(tag)}
+
+ )
+}
+
+export const DesignLink = ({ name, linkTo = 'new', className = linkClasses }) => (
+
+ {name}
+
+)
+
+export const DesignCard = ({ name, lineDrawing = false }) => {
+ const { t } = useTranslation(ns)
+ // Context
+ const { setModal } = useContext(ModalContext)
+
+ const LineDrawing =
+ lineDrawing && lineDrawings[name]
+ ? lineDrawings[name]
+ : ({ className }) =>
+ const exampleImageUrl = designImages[name]
+ ? designImages[name]
+ : 'https://images.pexels.com/photos/5626595/pexels-photo-5626595.jpeg?cs=srgb&dl=pexels-frida-toth-5626595.jpg&fm=jpg&w=640&h=427&_gl=1*vmxq7y*_ga*MTM0OTk5OTY4NS4xNjYxMjUyMjc0*_ga_8JE65Q40S6*MTY5NTU1NDc0Mi4yNS4xLjE2OTU1NTU1NjIuMC4wLjA.'
+
+ const bg = lineDrawing
+ ? {}
+ : {
+ backgroundImage: `url(${exampleImageUrl}`,
+ backgroundSize: 'cover',
+ backgroundPosition: 'center center',
+ }
+
+ return (
+
+ setModal(
+
+ {t(`designs:${name}.t`)}
+
+
+ )
+ }
+ >
+
+
+ {t(`designs:${name}.t`)}
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/react/components/DiffViewer/index.mjs b/packages/react/components/DiffViewer/index.mjs
new file mode 100644
index 00000000000..693422bd280
--- /dev/null
+++ b/packages/react/components/DiffViewer/index.mjs
@@ -0,0 +1,8 @@
+import React from 'react'
+import { diffWords, diffJson } from 'diff'
+import ReactDiffViewer from 'react-diff-viewer-continued'
+
+export const diffJSON = (from, to) => diffJson(from, to)
+export const diffCheck = (from, to) => diffWords(from, to)
+
+export const DiffViewer = (props) =>
diff --git a/packages/react/components/Docusaurus/index.mjs b/packages/react/components/Docusaurus/index.mjs
new file mode 100644
index 00000000000..db95dc2e975
--- /dev/null
+++ b/packages/react/components/Docusaurus/index.mjs
@@ -0,0 +1,147 @@
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import {
+ LoadingStatusContext,
+ LoadingStatusContextProvider,
+} from '@freesewing/react/context/LoadingStatus'
+import { ModalContext, ModalContextProvider } from '@freesewing/react/context/Modal'
+import {
+ DesignIcon,
+ DocsIcon,
+ ShowcaseIcon,
+ RssIcon,
+ LockIcon,
+ UserIcon,
+} from '@freesewing/react/components/Icon'
+import { Layout as DefaultLayout } from '@freesewing/react/components/Layout'
+
+/*
+ * This component should be the top level of a Docusaurus page
+ *
+ * This sets up the various context providers before
+ * passing all props down to the InnerPageWrapper.
+ * This is required because the context providers need to
+ * be setup for the modal and loading state work we do in the InnerPageWrapper
+ *
+ * We also re-use the Docusaurus Layout component here, which needs to be at
+ * the top level of the page
+ */
+export const DocusaurusPage = (props) => {
+ const DocusaurusLayout = props.DocusaurusLayout
+ return DocusaurusLayout ? (
+
+
+
+
+
+
+
+ ) : (
+ You need to pass in the DocusaurusLayout component
+ )
+}
+
+/*
+ * This component should be the top level of any Docusaurus content that's not
+ * a full page where you want access to context (typically account pages and so on)
+ *
+ * This sets up the various context providers before
+ * passing all props down to the InnerPageWrapper.
+ * This is required because the context providers need to
+ * be setup for the modal and loading state work we do in the InnerPageWrapper
+ */
+export const DocusaurusDoc = (props) => (
+
+
+
+
+
+)
+
+/*
+ * This component needs to be a child of the ContextWrapper
+ *
+ * @param {object} props - All React props
+ * @param {function} Layout - A specific React component to use for a non-default Layout
+ * @param {array} children - Child components / content
+ * @param {array} crumbs - An array to construct breadcrumbs from
+ * @param {string} description - Description for the page metadata
+ * @param {string} title - Description for the page title
+ */
+const InnerDocusaurusPage = ({
+ Layout = DefaultLayout,
+ children = [],
+ crumbs = [],
+ description = 'Free Bespoke Sewing Patterns',
+ title = 'FreeSewing',
+}) => {
+ /*
+ * Set up contexts
+ */
+ const { modalContent } = useContext(ModalContext)
+ const { LoadingStatus } = useContext(LoadingStatusContext)
+
+ /*
+ * Return inner page wrapper
+ */
+ return (
+
+
+ {Layout ? {children} : children}
+ {typeof modalContent === 'function' ? modalContent() : modalContent}
+
+ )
+}
+
+export const NavbarItem = (props) => {
+ const { id, Default } = props
+
+ const Component = navbarItems[id] ? navbarItems[id] : Default
+
+ return
+}
+
+const AccountNavbarItem = ({ Link }) => {
+ const [loggedIn, setLoggedIn] = useState(false)
+ const { account } = useAccount()
+
+ useEffect(() => {
+ if (account?.username) setLoggedIn(true)
+ }, [account])
+
+ const itemProps =
+ loggedIn && account.username
+ ? { Link, label: account.username, Icon: UserIcon, href: '/account/' }
+ : { Link, label: 'Sign In', Icon: LockIcon, href: '/signin/' }
+
+ return
+}
+
+const SimpleNavbarItem = ({ label, Icon, href, Link }) => (
+
+
+
+ {label}
+
+
+)
+
+/*
+ * A selection of custom navbar items
+ */
+const navbarItems = {
+ account: AccountNavbarItem,
+ designs: (props) => (
+
+ ),
+ docs: (props) => (
+
+ ),
+ showcase: (props) => (
+
+ ),
+ blog: (props) => ,
+}
diff --git a/packages/react/components/Echart/index.mjs b/packages/react/components/Echart/index.mjs
new file mode 100644
index 00000000000..4c38b4d216a
--- /dev/null
+++ b/packages/react/components/Echart/index.mjs
@@ -0,0 +1,21 @@
+import React from 'react'
+import * as _echarts from 'echarts'
+import ReactECharts from 'echarts-for-react'
+import { Popout } from '@freesewing/react/components/Popout'
+
+export const echarts = _echarts
+
+echarts.registerTheme('light', {
+ backgroundColor: 'transparent',
+})
+echarts.registerTheme('dark', {
+ backgroundColor: 'transparent',
+})
+
+export const ChartWrapper = ({ option = false, theme = 'light', h = 400 }) => {
+ return option ? (
+
+ ) : (
+ Loading chart...
+ )
+}
diff --git a/packages/react/components/Editor/components/Accordion.mjs b/packages/react/components/Editor/components/Accordion.mjs
new file mode 100644
index 00000000000..ea9a068dd20
--- /dev/null
+++ b/packages/react/components/Editor/components/Accordion.mjs
@@ -0,0 +1,67 @@
+import React, { useState } from 'react'
+
+/*
+ * DaisyUI's accordion seems rather unreliable.
+ * So instead, we handle this in React state
+ */
+const getProps = (isActive = false) => ({
+ className: `tw-p-2 tw-px-4 tw-rounded-lg tw-bg-transparent tw-shadow hover:tw-cursor-pointer
+ tw-w-full tw-h-auto tw-content-start tw-text-left tw-bg-opacity-20
+ ${isActive ? 'hover:tw-bg-transparent' : 'hover:tw-bg-secondary hover:tw-bg-opacity-10'}`,
+})
+
+const getSubProps = (isActive) => ({
+ className: `tw-p-2 tw-px-4 tw-rounded-none tw-bg-transparent tw-w-full tw-h-auto
+ tw-content-start tw-bg-secondary tw-text-left tw-bg-opacity-20
+ ${
+ isActive
+ ? 'tw-bg-opacity-100 hover:tw-bg-transparent tw-shadow'
+ : 'hover:tw-bg-opacity-10 hover:tw-bg-secondary '
+ }`,
+})
+
+const components = {
+ button: (props) => {props.children} ,
+ div: (props) => {props.children}
,
+}
+
+export const BaseAccordion = ({
+ items, // Items in the accordion
+ act, // Allows one to preset the active (opened) entry
+ propsGetter = getProps, // Method to get the relevant props
+ component = 'button',
+}) => {
+ const [active, setActive] = useState(act)
+ const Component = components[component]
+
+ return (
+
+ {items
+ .filter((item) => item[0])
+ .map((item, i) =>
+ active === item[2] ? (
+
+
+ {item[0]}
+
+ {item[1]}
+
+ ) : (
+ setActive(item[2])}
+ >
+ {item[0]}
+
+ )
+ )}
+
+ )
+}
+
+export const SubAccordion = (props) =>
+export const Accordion = (props) =>
diff --git a/packages/react/components/Editor/components/AsideViewMenu.mjs b/packages/react/components/Editor/components/AsideViewMenu.mjs
new file mode 100644
index 00000000000..fc6c5db7921
--- /dev/null
+++ b/packages/react/components/Editor/components/AsideViewMenu.mjs
@@ -0,0 +1,115 @@
+import React, { useState } from 'react'
+
+export const AsideViewMenuButton = ({
+ href,
+ label,
+ children,
+ onClick = false,
+ active = false,
+ extraClasses = 'lg:hover:bg-secondary lg:hover:text-secondary-content',
+ Swizzled,
+}) => {
+ const className = `w-full flex flex-row items-center px-4 py-2 ${extraClasses} ${
+ active
+ ? 'font-bold lg:font-normal bg-secondary bg-opacity-10 lg:bg-secondary lg:text-secondary-content lg:bg-opacity-50'
+ : 'lg:bg-neutral lg:text-neutral-content'
+ }`
+ const span = {label}
+
+ return onClick ? (
+
+ {span}
+ {children}
+
+ ) : (
+
+ {span}
+ {children}
+
+ )
+}
+
+export const AsideViewMenuSpacer = () => (
+
+)
+
+export const AsideViewMenuIcons = ({ state, update, setDense, dense, Swizzled }) => {
+ const { t } = Swizzled.methods
+ const iconSize = 'h-6 w-6 grow-0'
+
+ const output = [
+ setDense(!dense)}
+ label={
+ dense ? (
+ ''
+ ) : (
+
+ Editor Views
+
+ )
+ }
+ extraClasses="hidden lg:flex text-accent bg-neutral hover:bg-accent hover:text-neutral-content"
+ >
+ {dense ? (
+
+ ) : (
+
+ )}
+ ,
+ ]
+
+ let i = 1
+ for (const view of [
+ 'spacer',
+ ...Swizzled.config.mainViews,
+ 'spacer',
+ ...Swizzled.config.extraViews,
+ 'spacerOver3',
+ ...Swizzled.config.devViews,
+ 'spacer',
+ 'picker',
+ ]) {
+ if (view === 'spacer') output.push( )
+ else if (view === 'spacerOver3')
+ output.push(state.ui.ux > 3 ? : null)
+ else if (state.ui.ux >= Swizzled.config.uxLevels.views[view])
+ output.push(
+ update.view(view)}
+ label={t(`pe:view.${view}.t`)}
+ active={state.view === view}
+ >
+
+
+ )
+ i++
+ }
+
+ return output
+}
+
+export const AsideViewMenu = ({ Swizzled, update, state }) => {
+ const [dense, setDense] = useState(true)
+ return (
+
+ )
+}
diff --git a/packages/react/components/Editor/components/Flag.mjs b/packages/react/components/Editor/components/Flag.mjs
new file mode 100644
index 00000000000..045c2914e5d
--- /dev/null
+++ b/packages/react/components/Editor/components/Flag.mjs
@@ -0,0 +1,149 @@
+import React from 'react'
+import mustache from 'mustache'
+import { flattenFlags, stripNamespace, bundlePatternTranslations } from '../lib/index.mjs'
+import {
+ ChatIcon,
+ ErrorIcon,
+ ExpandIcon,
+ DocsIcon,
+ FixmeIcon,
+ FlagIcon,
+ OptionsIcon,
+ TipIcon,
+ WarningIcon,
+ WrenchIcon,
+} from '@freesewing/react/components/Icon'
+import { SubAccordion } from './Accordion.mjs'
+import { MiniTip, MiniNote } from '@freesewing/react/components/Mini'
+import Markdown from 'react-markdown'
+
+/*
+ * Helper object to look up flag icons
+ */
+const flagIcons = {
+ error: ErrorIcon,
+ expand: ExpandIcon,
+ fixme: WrenchIcon,
+ info: DocsIcon,
+ note: ChatIcon,
+ otions: OptionsIcon,
+ tip: TipIcon,
+ warning: WarningIcon,
+}
+
+export const FlagTypeIcon = ({ type, className = 'tw-w-6 tw-h-6' }) => {
+ const Icon = flagIcons[type] || FixmeIcon
+
+ return
+}
+
+export const Flag = ({ data, handleUpdate, strings }) => {
+ const btnIcon = data.suggest?.icon ? (
+
+ ) : null
+
+ const button =
+ data.suggest?.text && data.suggest?.update ? (
+ handleUpdate(data.suggest.update)}
+ >
+ {btnIcon}
+ {strings[data.suggest.text] || data.suggest.text}
+
+ ) : null
+
+ const desc = data.replace
+ ? mustache.render(strings[data.desc] || data.desc, data.replace)
+ : strings[data.desc] || data.desc
+ const notes = data.notes
+ ? Array.isArray(data.notes)
+ ? '\n\n' +
+ data.notes
+ .map((note) =>
+ data.replace
+ ? mustache.render(strings[note] || note, data.replace)
+ : strings[note] || note
+ )
+ .join('\n\n')
+ : '\n\n' +
+ (data.replace
+ ? mustache.render(strings[data.notes] || data.notes, data.replace)
+ : strings[data.notes] || data.notes)
+ : null
+
+ return (
+
+
+ {desc ? (
+
+ {strings[desc] || desc}
+
+ ) : null}
+ {notes ? (
+
+ {strings[notes] || notes}
+
+ ) : null}
+
+ {button ? (
+
{button}
+ ) : null}
+
+ )
+}
+
+export const FlagsAccordionTitle = ({ flags }) => {
+ const flagList = flattenFlags(flags)
+
+ if (Object.keys(flagList).length < 1) return null
+
+ return (
+ <>
+
+ Flags ({Object.keys(flagList).length})
+
+
+
+ {Object.keys(flagList).length > 1
+ ? 'Some issues about your current pattern need your attention.'
+ : 'A specific issue about your current pattern needs your attention.'}
+
+ >
+ )
+}
+
+export const FlagsAccordionEntries = ({ flags, update, pattern, strings }) => {
+ const flagList = flattenFlags(flags)
+
+ if (Object.keys(flagList).length < 1) return null
+
+ const handleUpdate = (config) => {
+ if (config.settings) update.settings(...config.settings)
+ if (config.ui) update.ui(...config.settings)
+ }
+
+ return (
+ {
+ const title = flag.replace ? mustache.render(flag.title, flag.replace) : flag.title
+
+ return [
+
+
+
+
+
+
{strings[title] || title}
+
+
{flag.type}
+
,
+ ,
+ key,
+ ]
+ })}
+ />
+ )
+}
diff --git a/packages/react/components/Editor/components/HeaderMenu.mjs b/packages/react/components/Editor/components/HeaderMenu.mjs
new file mode 100644
index 00000000000..8f0a866d8ee
--- /dev/null
+++ b/packages/react/components/Editor/components/HeaderMenu.mjs
@@ -0,0 +1,715 @@
+// Dependencies
+import { missingMeasurements, flattenFlags } from '../lib/index.mjs'
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+import { useDesignTranslation } from '@freesewing/react/hooks/useDesignTranslation'
+// Components
+import { Null } from '@freesewing/react/components/Null'
+import { AsideViewMenuSpacer } from './AsideViewMenu.mjs'
+import { ViewIcon, viewLabels } from './views/index.mjs'
+import { Tooltip } from './Tooltip.mjs'
+import {
+ AsideIcon,
+ DetailIcon,
+ ExpandIcon,
+ ExportIcon,
+ FixmeIcon,
+ FlagIcon,
+ OptionsIcon,
+ PaperlessIcon,
+ PrintIcon,
+ ResetAllIcon,
+ ResetIcon,
+ RightIcon,
+ RocketIcon,
+ RotateIcon,
+ SaIcon,
+ SaveAsIcon,
+ SaveIcon,
+ SettingsIcon,
+ TrashIcon,
+ UiIcon,
+ UndoIcon,
+ UnitsIcon,
+} from '@freesewing/react/components/Icon'
+import { ButtonFrame } from '@freesewing/react/components/Input'
+import { DesignOptionsMenu } from './menus/DesignOptionsMenu.mjs'
+import { CoreSettingsMenu } from './menus/CoreSettingsMenu.mjs'
+import { UiPreferencesMenu } from './menus/UiPreferencesMenu.mjs'
+import { LayoutSettingsMenu } from './menus/LayoutMenu.mjs'
+import { TestOptionsMenu, TestMeasurementsMenu } from './menus/TestMenu.mjs'
+import { FlagsAccordionEntries } from './Flag.mjs'
+import { UndoStep } from './views/UndosView.mjs'
+
+/*
+ * Lookup object for header menu icons
+ */
+const headerMenuIcons = {
+ flag: FlagIcon,
+ options: OptionsIcon,
+ right: RightIcon,
+ settings: SettingsIcon,
+ ui: UiIcon,
+ layout: PrintIcon,
+}
+
+export const HeaderMenuIcon = (props) => {
+ const { name, extraClasses = '' } = props
+ const Icon = headerMenuIcons[name] || FixmeIcon
+
+ // FIXME: Remove this when ready
+ if (!headerMenuIcons[name]) console.log('FIXME: Add headerMenuIcon for ', name)
+
+ return
+}
+
+export const HeaderMenuDraftView = (props) => {
+ const i18n = useDesignTranslation(props.Design.designConfig.data.id)
+ const flags = props.pattern?.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
+
+ return (
+ <>
+
+
+
+
+ {flags ? : null}
+
+
+
+
+ >
+ )
+}
+
+export const HeaderMenuTestView = (props) => {
+ const i18n = useDesignTranslation(props.Design.designConfig.data.id)
+
+ return (
+ <>
+
+
+
+ >
+ )
+}
+
+export const HeaderMenuTestViewDesignOptions = (props) => {
+ return (
+
+
+ Test Options
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuTestViewDesignMeasurements = (props) => {
+ return (
+
+
+ Test Measurements
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuDropdown = (props) => {
+ const { tooltip, toggle, open, setOpen, id, end = false } = props
+ /*
+ * We need to use both !fixed and md:!absolute here to override DaisyUI's
+ * classes on dropdown-content to force the dropdown to use the available
+ * screen space on mobile, rather than be positioned under its toggle button
+ */
+
+ return props.disabled ? (
+
+
+ {toggle}
+
+
+ ) : (
+
+
+
setOpen(open === id ? false : id)}
+ >
+ {toggle}
+
+
+ {props.children}
+
+ {open === id && (
+
setOpen(false)}
+ >
+ )}
+
+
+ )
+}
+
+export const HeaderMenuDraftViewDesignOptions = (props) => (
+
+
+
+ {props.state.design ? props.state.design : 'Design'} Options
+
+ >
+ }
+ >
+
+
+)
+
+export const HeaderMenuDraftViewCoreSettings = (props) => {
+ return (
+
+
+ Core Settings
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuDraftViewUiPreferences = (props) => {
+ return (
+
+
+ UI Preferences
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuDraftViewFlags = (props) => {
+ const count = Object.keys(flattenFlags(props.flags)).length
+
+ return (
+
+
+
+ Flags
+ ({count})
+
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuDraftViewIcons = (props) => {
+ const { update, state } = props
+ const Button = HeaderMenuButton
+ const size = 'tw-w-5 tw-h-5'
+ const muted = 'tw-text-current tw-opacity-50'
+ const ux = state.ui.ux
+ const levels = {
+ ...props.config.uxLevels.core,
+ ...props.config.uxLevels.ui,
+ }
+
+ return (
+
+ {ux >= levels.sa ? (
+
+
+
+ ) : null}
+ {ux >= levels.units ? (
+
+ update.settings('units', state.settings.units === 'imperial' ? 'metric' : 'imperial')
+ }
+ tooltip="Switches Units between metric and imperial (see Core Settings)"
+ >
+
+
+ ) : null}
+ {ux >= levels.paperless ? (
+
update.settings('paperless', state.settings.paperless ? 0 : 1)}
+ tooltip="Turns Paperless on or off (see Core Settings)"
+ >
+
+
+ ) : null}
+ {ux >= levels.complete ? (
+
update.settings('complete', state.settings.complete ? 0 : 1)}
+ tooltip="Turns Details on or off (see Core Settings)"
+ >
+
+
+ ) : null}
+ {ux >= levels.expand ? (
+
update.settings('expand', state.settings.expand ? 0 : 1)}
+ tooltip="Turns Expand on or off (see Core Settings)"
+ >
+
+
+ ) : null}
+
+ {ux >= levels.aside ? (
+
update.ui('aside', state.ui.aside ? 0 : 1)}
+ tooltip="Toggles the side menu (see UI Preferences)"
+ >
+
+
+ ) : null}
+ {ux >= levels.renderer ? (
+
+ update.ui('renderer', state.ui.renderer === 'react' ? 'svg' : 'react')
+ }
+ tooltip="Switches the Render Engine between React and SVG (see UI Preferences)"
+ >
+
+
+ ) : null}
+
+ )
+}
+
+export const HeaderMenuUndoIcons = (props) => {
+ const { update, state, Design } = props
+ const Button = HeaderMenuButton
+ const size = 'tw-w-5 tw-h-5'
+ const undos = state._?.undos && state._.undos.length > 0 ? state._.undos : false
+
+ return (
+
+
update.restore(0, state._)}
+ tooltip="Undo the most recent change"
+ disabled={undos ? false : true}
+ >
+
+
+
update.restore(undos.length - 1, state._)}
+ tooltip="Undo all changes since the last save point"
+ disabled={undos ? false : true}
+ >
+
+
+
+
+ Undo
+ >
+ }
+ >
+ {undos ? (
+
+ {undos.slice(0, 9).map((step, index) => (
+
+
+
+ ))}
+
+ update.view('undos')}>
+
+
+
+ {viewLabels.undos.t}
+
+ {undos.length}
+
+
+
+
+ ) : null}
+
+
+
+
+
+
+
+
+ )
+}
+
+export const HeaderMenuTestIcons = (props) => {
+ const { update, state, Design } = props
+ const Button = HeaderMenuButton
+ const size = 'tw-w-5 tw-h-5'
+ const undos = state._?.undos && state._.undos.length > 0 ? state._.undos : false
+
+ return (
+
+ update.settings('sample', undefined)}
+ tooltip="Clear the test so you can select another"
+ >
+ Clear Test
+
+
+ )
+}
+
+export const HeaderMenuSaveIcons = (props) => {
+ const { update, state } = props
+ const backend = useBackend()
+ const Button = HeaderMenuButton
+ const size = 'tw-w-5 tw-h-5'
+ const saveable = state._?.undos && state._.undos.length > 0
+
+ /*
+ * Save or Save As, depending on state.pattern
+ */
+ const savePattern = async () => {
+ const pid = state.pid || false
+ if (pid) {
+ const loadingId = 'savePattern'
+ update.startLoading(loadingId)
+ const patternData = {
+ settings: state.settings,
+ }
+ const result = await backend.updatePattern(pid, patternData)
+ if (result[0] === 200) {
+ update.stopLoading(loadingId)
+ update.view('draft')
+ update.notifySuccess('Pattern saved')
+ } else update.notifyFailure('oops', loadingId)
+ } else update.view('save')
+ }
+
+ return (
+
+
+
+
+ update.view('save')} tooltip="Save pattern as...">
+
+
+
+
+
+
+ )
+}
+
+export const HeaderMenuIconSpacer = () => (
+ |
+)
+
+export const HeaderMenuButton = ({
+ updateHandler,
+ children,
+ tooltip,
+ lgOnly = false,
+ disabled = false,
+}) => (
+
+
+ {children}
+
+
+)
+
+export const HeaderMenuViewMenu = (props) => {
+ const { config, update, state } = props
+ const output = []
+ let i = 1
+ for (const viewName of [
+ 'spacer',
+ ...config.mainViews,
+ 'spacer',
+ ...config.extraViews,
+ 'spacerOver3',
+ ...config.devViews,
+ 'spacer',
+ 'picker',
+ ]) {
+ if (viewName === 'spacer') output.push( )
+ else if (viewName === 'spacerOver3')
+ output.push(state.ui.ux > 3 ? : null)
+ else if (
+ state.ui.ux >= config.uxLevels.views[viewName] &&
+ (config.measurementsFreeViews.includes(viewName) || state._.missingMeasurements.length < 1)
+ )
+ output.push(
+
+ update.view(viewName)}
+ >
+
+
+ {viewLabels[viewName]?.t || viewName}
+
+
+
+ )
+ i++
+ }
+
+ return (
+
+
+
+ {viewLabels[state.view] ? viewLabels[state.view].t : 'Views'}
+
+ >
+ }
+ >
+
+
+ )
+}
+
+export const HeaderMenuLayoutView = (props) => (
+ <>
+
+
+ Print Settings
+ >
+ }
+ >
+
+
+
+ >
+)
+
+export const HeaderMenuLayoutViewIcons = (props) => {
+ const { pattern, update, state } = props
+ const [tweaks, setTweaks] = useState(0)
+
+ useEffect(() => {
+ /*
+ * When the layout is reset, the UI won't update to changes
+ * unless we apply them on the first change
+ */
+ if (
+ tweaks === 0 &&
+ typeof props.state.ui?.layout === 'object' &&
+ typeof props.state.settings?.layout !== 'object'
+ )
+ applyLayout()
+ setTweaks(tweaks + 1)
+ }, [props.state.ui.layout])
+
+ const applyLayout = () => {
+ setTweaks(-1)
+ update.settings('layout', state.ui.layout)
+ }
+ const resetLayout = () => {
+ setTweaks(-1)
+ update.ui('layout', true)
+ update.settings('layout', true)
+ }
+
+ const pages = pattern.setStores[0].get('pages', {})
+ const format = state.ui.print?.pages?.size
+ ? state.ui.print.pages.size
+ : state.settings?.units === 'imperial'
+ ? 'letter'
+ : 'a4'
+ const { cols, rows, count } = pages
+ const blank = cols * rows - count
+
+ return (
+ <>
+
+
+
+ {count} pages
+
+ ({cols}x{rows}, {blank} blank)
+
+
+
+
+
+
+ Apply Layout
+
+
+
+ update.view('export')}
+ >
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+const headerMenus = {
+ draft: HeaderMenuDraftView,
+ inspect: HeaderMenuDraftView,
+ test: HeaderMenuTestView,
+ layout: HeaderMenuLayoutView,
+ timing: HeaderMenuDraftView,
+ //HeaderMenuDraftViewDesignOptions,
+ //HeaderMenuDraftViewCoreSettings,
+ //HeaderMenuDraftViewUiPreferences,
+ //HeaderMenuDraftViewFlags,
+ //HeaderMenuDraftViewIcons,
+}
+
+export const HeaderMenu = ({ config, Design, pattern, state, update, strings }) => {
+ const [open, setOpen] = useState()
+
+ /*
+ * Guard views that require measurements agains missing measurements
+ * and make sure there's a view-specific header menu
+ */
+ const ViewSpecificMenu =
+ !missingMeasurements(state) && headerMenus[state.view] ? headerMenus[state.view] : Null
+
+ return (
+
+ )
+}
diff --git a/packages/react/components/Editor/components/HtmlSpan.mjs b/packages/react/components/Editor/components/HtmlSpan.mjs
new file mode 100644
index 00000000000..3112e13f28a
--- /dev/null
+++ b/packages/react/components/Editor/components/HtmlSpan.mjs
@@ -0,0 +1,3 @@
+import React from 'react'
+
+export const HtmlSpan = ({ html }) =>
diff --git a/packages/react/components/Editor/components/LoadingStatus.mjs b/packages/react/components/Editor/components/LoadingStatus.mjs
new file mode 100644
index 00000000000..6d16c5746f5
--- /dev/null
+++ b/packages/react/components/Editor/components/LoadingStatus.mjs
@@ -0,0 +1,77 @@
+import React, { useEffect } from 'react'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { TipIcon, OkIcon } from '@freesewing/react/components/Icon'
+import { Null } from '@freesewing/react/components/Null'
+
+const config = {
+ timeout: 2.5,
+ defaults: {
+ color: 'secondary',
+ icon: 'Spinner',
+ },
+}
+
+const icons = {
+ tip: TipIcon,
+ spinner: Spinner,
+ success: () => ,
+}
+
+export const LoadingStatus = ({ state, update }) => {
+ useEffect(() => {
+ if (typeof state._.loading === 'object') {
+ for (const conf of Object.values(state._.loading)) {
+ if (conf.fadeTimer)
+ window.setTimeout(function () {
+ update.fadeNotify(conf.id)
+ }, conf.fadeTimer)
+ if (conf.clearTimer)
+ window.setTimeout(function () {
+ update.clearNotify(conf.id)
+ }, conf.clearTimer)
+ }
+ }
+ }, [state._, update])
+
+ if (!state._.loading || Object.keys(state._.loading).length < 1) return null
+
+ const colorClasses = {
+ info: 'tw-bg-info tw-text-info-content',
+ primary: 'tw-bg-primary tw-text-primary-content',
+ }
+
+ return (
+
+
+ {Object.entries(state._.loading).map(([id, custom]) => {
+ const conf = {
+ ...config.defaults,
+ ...custom,
+ }
+ const Icon = icons[conf.icon] ? icons[conf.icon] : Null
+ return (
+
+ )
+ })}
+
+
+ )
+}
diff --git a/packages/react/components/Editor/components/MeasurementsEditor.mjs b/packages/react/components/Editor/components/MeasurementsEditor.mjs
new file mode 100644
index 00000000000..937ed0f5576
--- /dev/null
+++ b/packages/react/components/Editor/components/MeasurementsEditor.mjs
@@ -0,0 +1,59 @@
+import React from 'react'
+import { MeasurementInput } from '@freesewing/react/components/Input'
+
+/**
+ * This MeasurementsEditor component allows inline-editing of the measurements
+ *
+ * @param {object} props - The component's props
+ * @param {function} props.Design - The design constructor
+ * @param {object} props.state - The ViewWrapper state object
+ * @param {object} props.state.settings - The current settings
+ * @param {object} props.update - Helper object for updating the ViewWrapper state
+ * @return {function} MeasurementsEditor - React component
+ */
+export const MeasurementsEditor = ({ Design, update, state }) => {
+ /*
+ * Helper method to handle state updates for measurements
+ */
+ const onUpdate = (m, newVal) => {
+ update.settings(['measurements', m], newVal)
+ }
+
+ return (
+
+
Required Measurements
+ {Object.keys(Design.patternConfig.measurements).length === 0 ? (
+
This design does not require any measurements.
+ ) : (
+
+ {Design.patternConfig.measurements.map((m) => (
+ onUpdate(m, newVal)}
+ id={`edit-${m}`}
+ />
+ ))}
+
+
+ )}
+
Optional Measurements
+ {Object.keys(Design.patternConfig.optionalMeasurements).length === 0 ? (
+
This design does not use any optional measurements.
+ ) : (
+ Design.patternConfig.optionalMeasurements.map((m) => (
+
onUpdate(m, newVal)}
+ id={`edit-${m}`}
+ />
+ ))
+ )}
+
+ )
+}
diff --git a/packages/react/components/Editor/components/MovablePattern.mjs b/packages/react/components/Editor/components/MovablePattern.mjs
new file mode 100644
index 00000000000..30f7d3369e0
--- /dev/null
+++ b/packages/react/components/Editor/components/MovablePattern.mjs
@@ -0,0 +1,488 @@
+import React, { useRef, useState, useEffect, useCallback } from 'react'
+import { ZoomablePattern } from './ZoomablePattern.mjs'
+import { generateStackTransform, getTransformedBounds } from '@freesewing/core'
+import { getProps } from '@freesewing/react/components/Pattern'
+import { FlipIcon, RotateIcon, ResetIcon } from '@freesewing/react/components/Icon'
+import { drag } from 'd3-drag'
+import { select } from 'd3-selection'
+//import { Buttons } from './transform-buttons.mjs'
+
+export const MovablePattern = ({
+ renderProps,
+ state,
+ update,
+ fitImmovable = false,
+ immovable = [],
+ t,
+}) => {
+ const svgRef = useRef(null)
+ if (!renderProps) return null
+
+ /* keep a fresh copy of the layout because we might manipulate it without
+ * update the state
+ */
+ let layout =
+ renderProps.settings[0].layout === true
+ ? {
+ ...renderProps.autoLayout,
+ width: renderProps.width,
+ height: renderProps.height,
+ }
+ : renderProps.settings[0].layout
+
+ // Helper method to update part layout and re-calculate width * height
+ const updateLayout = (name, config, history = true) => {
+ // Start creating new layout
+ const newLayout = { ...layout }
+ newLayout.stacks[name] = config
+
+ // Pattern topLeft and bottomRight
+ let topLeft = { x: 0, y: 0 }
+ let bottomRight = { x: 0, y: 0 }
+ for (const pname in renderProps.stacks) {
+ if (immovable.includes(pname) && !fitImmovable) continue
+ let partLayout = newLayout.stacks[pname]
+
+ // Pages part does not have its topLeft and bottomRight set by core since it's added post-draft
+ if (partLayout?.tl) {
+ // set the pattern extremes
+ topLeft.x = Math.min(topLeft.x, partLayout.tl.x)
+ topLeft.y = Math.min(topLeft.y, partLayout.tl.y)
+ bottomRight.x = Math.max(bottomRight.x, partLayout.br.x)
+ bottomRight.y = Math.max(bottomRight.y, partLayout.br.y)
+ }
+ }
+
+ newLayout.width = bottomRight.x - topLeft.x
+ newLayout.height = bottomRight.y - topLeft.y
+ newLayout.bottomRight = bottomRight
+ newLayout.topLeft = topLeft
+
+ if (history) {
+ update.ui('layout', newLayout)
+ } else {
+ /* we don't put it in the gist if it shouldn't contribute to history
+ * because we need some of the data calculated here for rendering
+ * purposes on the initial layout, but we don't want to actually save a
+ * layout until the user manipulates it. This is what allows the layout
+ * to respond appropriately to settings changes. Once the user has
+ * starting playing with the layout, all bets are off
+ */
+ layout = newLayout
+ }
+ }
+
+ const sortedStacks = {}
+ Object.keys(renderProps.stacks)
+ .sort((a, b) => {
+ const hasA = immovable.includes(a)
+ const hasB = immovable.includes(b)
+ if (hasA && !hasB) return -1
+ if (!hasA && hasB) return 1
+ return 0
+ })
+ .forEach((s) => (sortedStacks[s] = renderProps.stacks[s]))
+
+ const sortedRenderProps = { ...renderProps, stacks: sortedStacks }
+
+ const Stack = ({ stackName, stack, settings, components, t }) => (
+
+ )
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * This React component is a long way from perfect, but it's a start for
+ * handling custom layouts.
+ *
+ * There are a few reasons that (at least in my opinion) implementing this is non-trivial:
+ *
+ * 1) React re-render vs DOM updates
+ *
+ * For performance reasons, we can't re-render with React when the user drags a
+ * pattern part (or rotates it). It would kill performance.
+ * So, we don't re-render with React upon dragging/rotating, but instead manipulate
+ * the DOM directly.
+ *
+ * So far so good, but of course we don't want a pattern that's only correctly laid
+ * out in the DOM. We want to update the pattern gist so that the new layout is stored.
+ * For this, we re-render with React on the end of the drag (or rotate).
+ *
+ * Handling this balance between DOM updates and React re-renders is a first contributing
+ * factor to why this component is non-trivial
+ *
+ * 2) SVG vs DOM coordinates
+ *
+ * When we drag or rotate with the mouse, all the events are giving us coordinates of
+ * where the mouse is in the DOM.
+ *
+ * The layout uses coordinates from the embedded SVG which are completely different.
+ *
+ * We run `getScreenCTM().inverse()` on the svg element to pass to
+ * `matrixTransform` on a `DOMPointReadOnly` for dom to svg space
+ * conversions.
+ *
+ * 3) Part-level transforms
+ *
+ * All parts use their center as the transform-origin to simplify
+ * transforms, especially flipping and rotating.
+ *
+ * 4) Bounding box
+ *
+ * We use `getBoundingClientRect` rather than `getBBox` because it provides
+ * more data and factors in the transforms. We then use our `domToSvg`
+ * function to move the points back into the SVG space.
+ */
+
+export const MovableStack = ({
+ stackName,
+ stack,
+ components,
+ t,
+ movable = true,
+ layout,
+ updateLayout,
+ settings,
+ state,
+}) => {
+ const stackExists = !movable || typeof layout?.move?.x !== 'undefined'
+
+ // Use a ref for direct DOM manipulation
+ const stackRef = useRef(null)
+ const innerRef = useRef(null)
+
+ // State variable to switch between moving or rotating the part
+ const [rotate, setRotate] = useState(false)
+
+ // This is kept as state to avoid re-rendering on drag, which would kill performance
+ // It's a bit of an anti-pattern, but we'll directly manipulate the properties instead of updating the state
+ // Managing the difference between re-render and direct DOM updates makes this
+ // whole thing a bit tricky to wrap your head around
+ const stackRotation = layout?.rotate || 0
+ const [liveTransforms] = useState({
+ translateX: layout?.move.x,
+ translateY: layout?.move.y,
+ rotation: stackRotation,
+ flipX: !!layout?.flipX,
+ flipY: !!layout?.flipY,
+ })
+
+ const center = stack.topLeft && {
+ x: stack.topLeft.x + (stack.bottomRight.x - stack.topLeft.x) / 2,
+ y: stack.topLeft.y + (stack.bottomRight.y - stack.topLeft.y) / 2,
+ }
+
+ const setTransforms = useCallback(() => {
+ // get the transform attributes
+ const { translateX, translateY, rotation, flipX, flipY } = liveTransforms
+ const transforms = generateStackTransform(translateX, translateY, rotation, flipX, flipY, stack)
+
+ const me = select(stackRef.current)
+ me.attr('transform', transforms.join(' '))
+
+ return transforms
+ }, [liveTransforms, stackRef, stack])
+
+ /** update the layout either locally or in the state */
+ const updateStacklayout = useCallback(
+ (history = true) => {
+ /** don't mess with what we don't lay out */
+ if (!stackRef.current || !movable) return
+
+ // set the transforms on the stack in order to calculate from the latest position
+ const transforms = setTransforms()
+
+ // apply the transforms to the bounding box to get the new extents of the stack
+ const { topLeft, bottomRight } = getTransformedBounds(stack, transforms)
+
+ // update it on the draft component
+ updateLayout(
+ stackName,
+ {
+ move: {
+ x: liveTransforms.translateX,
+ y: liveTransforms.translateY,
+ },
+ rotate: liveTransforms.rotation % 360,
+ flipX: liveTransforms.flipX,
+ flipY: liveTransforms.flipY,
+ tl: topLeft,
+ br: bottomRight,
+ },
+ history
+ )
+ },
+ [stackRef, setTransforms, updateLayout, liveTransforms, movable, stack, stackName]
+ )
+
+ // update the layout on mount
+ useEffect(() => {
+ // only update if there's a rendered part and it's not an imovable part
+ if (stackRef.current && movable) {
+ updateStacklayout(false)
+ }
+ }, [stackRef, movable, updateStacklayout])
+
+ /** reset the part's transforms */
+ const resetPart = () => {
+ liveTransforms.rotation = 0
+ liveTransforms.flipX = 0
+ liveTransforms.flipY = 0
+ updateStacklayout()
+ }
+
+ /** toggle between dragging and rotating */
+ const toggleDragRotate = () => {
+ // only respond if the part should be able to drag/rotate
+ if (!stackRef.current || !movable) {
+ return
+ }
+
+ setRotate(!rotate)
+ }
+
+ /** Method to flip (mirror) the part along the X or Y axis */
+ const flip = (axis) => {
+ if (axis === 'x') liveTransforms.flipX = !liveTransforms.flipX
+ else liveTransforms.flipY = !liveTransforms.flipY
+ updateStacklayout()
+ }
+
+ /** method to rotate 90 degrees */
+ const rotate90 = (direction = 1) => {
+ if (liveTransforms.flipX) direction *= -1
+ if (liveTransforms.flipY) direction *= -1
+
+ liveTransforms.rotation += 90 * direction
+
+ updateStacklayout()
+ }
+
+ /** get the delta rotation from the start of the drag event to now */
+ const getRotation = (event) =>
+ angle(center, event.subject) - angle(center, { x: event.x, y: event.y })
+
+ let didDrag = false
+ const handleDrag =
+ movable &&
+ drag()
+ // subject allows us to save data from the start of the event to use throughout event handing
+ .subject(function (event) {
+ return rotate
+ ? // if we're rotating, the subject is the mouse position
+ { x: event.x, y: event.y }
+ : // if we're moving, the subject is the part's x,y coordinates
+ { x: liveTransforms.translateX, y: liveTransforms.translateY }
+ })
+ .on('drag', function (event) {
+ if (!event.dx && !event.dy) return
+
+ if (rotate) {
+ let newRotation = getRotation(event)
+ // shift key to snap the rotation
+ if (event.sourceEvent.shiftKey) {
+ newRotation = Math.ceil(newRotation / 15) * 15
+ }
+ // reverse the rotation direction one time per flip. if we're flipped both directions, rotation will be positive again
+ if (liveTransforms.flipX) newRotation *= -1
+ if (liveTransforms.flipY) newRotation *= -1
+
+ liveTransforms.rotation = stackRotation + newRotation
+ } else {
+ liveTransforms.translateX = event.x
+ liveTransforms.translateY = event.y
+ }
+
+ // a drag happened, so we should update the layout when we're done
+ didDrag = true
+ setTransforms()
+ })
+ .on('end', function () {
+ // save to gist if anything actually changed
+ if (didDrag) updateStacklayout()
+
+ didDrag = false
+ })
+
+ // Initialize drag handler
+ useEffect(() => {
+ // don't drag the pages
+ if (!movable || !stackExists) return
+ handleDrag(select(stackRef.current))
+ }, [stackRef, movable, stackExists, handleDrag])
+
+ // // Don't just assume this makes sense
+ if (!stackExists) {
+ return null
+ }
+
+ const { Group, Part } = components
+
+ return (
+
+
+ {[...stack.parts].map((part, key) => (
+
+ ))}
+
+ {movable && (
+ <>
+
+
+ >
+ )}
+
+ )
+}
+
+function dx(pointA, pointB) {
+ return pointB.x - pointA.x
+}
+function dy(pointA, pointB) {
+ return pointB.y - pointA.y
+}
+function rad2deg(radians) {
+ return radians * 57.29577951308232
+}
+function angle(pointA, pointB) {
+ let rad = Math.atan2(-1 * dy(pointA, pointB), dx(pointA, pointB))
+ while (rad < 0) rad += 2 * Math.PI
+
+ return rad2deg(rad)
+}
+
+const rectSize = 24
+
+const Button = ({ onClickCb, transform, Icon, children, title = '' }) => {
+ const _onClick = (event) => {
+ event.stopPropagation()
+ onClickCb(event)
+ }
+
+ return (
+
+ {title}
+
+
+
+
+ )
+}
+
+export const ShowButtonsToggle = ({ ui, update }) => {
+ const hideButtons = (evt) => {
+ update.ui('hideMovableButtons', !evt.target.checked)
+ }
+ return (
+
+ {t('showMovableButtons')}
+
+
+ )
+}
+
+/** buttons for manipulating the part */
+export const Buttons = ({ transform, flip, rotate, resetPart, rotate90, iconSize }) => {
+ return (
+
+
+ {rotate ? (
+
+ ) : (
+
+ )}
+
+ }
+ title="Reset part orientation"
+ />
+ rotate90()}
+ transform={`translate(${rectSize * -2.7}, ${rectSize / -2})`}
+ Icon={() => }
+ title="Rotate part clockwise"
+ />
+ flip('y')}
+ transform={`rotate(90) translate(${rectSize / -2}, ${rectSize * -1.6})`}
+ Icon={() => }
+ title="Flip part top/bottom"
+ />
+ flip('x')}
+ transform={`translate(${rectSize * -1.6}, ${rectSize / -2})`}
+ Icon={() => }
+ title="Flip part left/right"
+ />
+ rotate90(-1)}
+ transform={`translate(${rectSize * 1.7}, ${rectSize / -2})`}
+ Icon={() => }
+ title="Rotate part counter-clockwise"
+ />
+
+
+ )
+}
diff --git a/packages/react/components/Editor/components/PatternLayout.mjs b/packages/react/components/Editor/components/PatternLayout.mjs
new file mode 100644
index 00000000000..48796c55e0f
--- /dev/null
+++ b/packages/react/components/Editor/components/PatternLayout.mjs
@@ -0,0 +1,58 @@
+import React from 'react'
+import { useDesignTranslation } from '@freesewing/react/hooks/useDesignTranslation'
+import { ZoomContextProvider } from './ZoomablePattern.mjs'
+import {
+ HeaderMenu,
+ HeaderMenuDraftViewDesignOptions,
+ HeaderMenuDraftViewCoreSettings,
+ HeaderMenuDraftViewUiPreferences,
+ HeaderMenuDraftViewFlags,
+} from './HeaderMenu.mjs'
+import { DesignOptionsMenu } from './menus/DesignOptionsMenu.mjs'
+import { CoreSettingsMenu } from './menus/CoreSettingsMenu.mjs'
+import { UiPreferencesMenu } from './menus/UiPreferencesMenu.mjs'
+import { Accordion } from './Accordion.mjs'
+
+/**
+ * A layout for views that include a drafted pattern
+ *
+ * @param {object} config - The editor configuration
+ * @param {object} settings - The pattern settings/state
+ * @param {object} ui - The UI settings/state
+ * @param {object} update - Object holding methods to manipulate state
+ * @param {function} Design - The Design contructor
+ * @param {object] pattern - The drafted pattern
+ */
+export const PatternLayout = (props) => {
+ const { menu = null, Design, pattern, update, config, state } = props
+ const i18n = useDesignTranslation(Design.designConfig.data.id)
+ const flags = props.pattern?.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
+
+ return (
+
+
+
+
+
+ {props.output}
+
+ {state.ui?.aside ? (
+
+
{pattern.designConfig.data.id} Options
+
+ Core Settings
+
+ UI Preferences
+
+
+ ) : null}
+
+
+
+ )
+}
diff --git a/packages/react/components/Editor/components/Set.mjs b/packages/react/components/Editor/components/Set.mjs
new file mode 100644
index 00000000000..f511a5cec5f
--- /dev/null
+++ b/packages/react/components/Editor/components/Set.mjs
@@ -0,0 +1,265 @@
+// Dependencies
+import { cloudflareImageUrl, hasRequiredMeasurements, orderBy } from '@freesewing/utils'
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Popout } from '@freesewing/react/components/Popout'
+import { MsetCard } from '@freesewing/react/components/Account'
+
+export const UserSetPicker = ({
+ Design,
+ clickHandler,
+ missingClickHandler,
+ size = 'lg',
+ config,
+}) => {
+ // Hooks
+ const backend = useBackend()
+
+ // State (local)
+ const [sets, setSets] = useState({})
+
+ // Effects
+ useEffect(() => {
+ const getSets = async () => {
+ const [status, body] = await backend.getSets()
+ if (status === 200 && body.result === 'success') {
+ const all = {}
+ for (const set of body.sets) all[set.id] = set
+ setSets(all)
+ }
+ }
+ getSets()
+ }, [backend])
+ let hasSets = false
+ const okSets = []
+ const lackingSets = []
+ if (Object.keys(sets).length > 0) {
+ hasSets = true
+ for (const setId in sets) {
+ const [hasMeasies] = hasRequiredMeasurements(Design, sets[setId].measies)
+ if (hasMeasies) okSets.push(sets[setId])
+ else lackingSets.push(sets[setId])
+ }
+ }
+
+ if (!hasSets)
+ return (
+
+
+ You do not (yet) have any of your own measurements sets
+
+ You can store your measurements as a measurements set, after which you can generate as
+ many patterns as you want for them.
+
+ {config.hrefNewSet ? (
+
+ Create a new measurements set
+
+ ) : null}
+
+ Because our patterns are bespoke, we strongly suggest you take accurate measurements.
+
+
+
+ )
+
+ return (
+ <>
+ {okSets.length > 0 && (
+
+ {okSets.map((set) => (
+
+ ))}
+
+ )}
+ {lackingSets.length > 0 ? (
+
+
+
+ Some of your measurements sets lack the measurements required to generate this pattern
+
+
+
+ {lackingSets.map((set) => (
+
+ ))}
+
+
+ ) : null}
+ >
+ )
+}
+
+export const BookmarkedSetPicker = ({
+ Design,
+ config,
+ clickHandler,
+ missingClickHandler,
+ size = 'lg',
+}) => {
+ // Hooks
+ const backend = useBackend()
+
+ // State (local)
+ const [sets, setSets] = useState({})
+
+ // Effects
+ useEffect(() => {
+ const getBookmarks = async () => {
+ const [status, body] = await backend.getBookmarks()
+ const loadedSets = {}
+ if (status === 200 && body.result === 'success') {
+ for (const bookmark of body.bookmarks.filter((bookmark) => bookmark.type === 'set')) {
+ let set
+ try {
+ const [status, body] = await backend.getSet(bookmark.url.slice(6))
+ if (status === 200 && body.result === 'success') {
+ const [hasMeasies] = hasRequiredMeasurements(Design, body.set.measies)
+ loadedSets[body.set.id] = { ...body.set, hasMeasies }
+ }
+ } catch (err) {
+ console.log(err)
+ }
+ }
+ }
+ setSets(loadedSets)
+ }
+ getBookmarks()
+ }, [])
+
+ const okSets = Object.values(sets).filter((set) => set.hasMeasies)
+ const lackingSets = Object.values(sets).filter((set) => !set.hasMeasies)
+
+ return (
+ <>
+ {okSets.length > 0 && (
+
+ {okSets.map((set) => (
+
+ ))}
+
+ )}
+ {lackingSets.length > 0 && (
+
+
+
+ Some of these measurements sets lack the measurements required to generate this
+ pattern
+
+
+
+ {lackingSets.map((set) => (
+
+ ))}
+
+
+ )}
+ >
+ )
+}
+
+export const CuratedSetPicker = ({ clickHandler }) => {
+ // Hooks
+ const backend = useBackend()
+
+ // State (local)
+ const [sets, setSets] = useState([])
+
+ // Effects
+ useEffect(() => {
+ const getSets = async () => {
+ const [status, body] = await backend.getCuratedSets()
+ if (status === 200 && body.result === 'success') {
+ const allSets = {}
+ for (const set of body.curatedSets) {
+ if (set.published) allSets[set.id] = set
+ }
+ setSets(allSets)
+ }
+ }
+ getSets()
+ }, [])
+
+ return (
+
+
+
+ )
+}
+
+export const CuratedMeasurementsSetLineup = ({ sets = [], clickHandler }) => (
+ 1 ? 'tw-justify-start tw-px-8' : 'tw-justify-center'
+ } tw-overflow-x-scroll`}
+ style={{
+ backgroundImage: `url(/img/lineup-backdrop.svg)`,
+ width: 'auto',
+ backgroundSize: 'auto 100%',
+ backgroundRepeat: 'repeat-x',
+ }}
+ >
+ {sets.map((set) => {
+ const props = {
+ className:
+ 'tw-aspect-[1/3] tw-w-auto tw-h-96 tw-bg-transparent tw-border-0 hover:tw-cursor-pointer hover:tw-bg-secondary/20',
+ style: {
+ backgroundImage: `url(${cloudflareImageUrl({
+ id: `cset-${set.id}`,
+ type: 'lineup',
+ })})`,
+ width: 'auto',
+ backgroundSize: 'contain',
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: 'center',
+ },
+ onClick: () => clickHandler(set),
+ }
+
+ return (
+
+
+ {set.nameEn}
+
+ )
+ })}
+
+)
diff --git a/packages/react/components/Editor/components/Tooltip.mjs b/packages/react/components/Editor/components/Tooltip.mjs
new file mode 100644
index 00000000000..6b5d0883e07
--- /dev/null
+++ b/packages/react/components/Editor/components/Tooltip.mjs
@@ -0,0 +1,15 @@
+import React from 'react'
+
+export const Tooltip = (props) => {
+ const { children, tip, ...rest } = props
+
+ return (
+
+ {children}
+
+ )
+}
diff --git a/packages/react/components/Editor/components/ZoomablePattern.mjs b/packages/react/components/Editor/components/ZoomablePattern.mjs
new file mode 100644
index 00000000000..524aba832b0
--- /dev/null
+++ b/packages/react/components/Editor/components/ZoomablePattern.mjs
@@ -0,0 +1,110 @@
+import React, { useState, useMemo, useCallback, forwardRef, useContext } from 'react'
+import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'
+import { Pattern } from '@freesewing/react/components/Pattern'
+import { ZoomInIcon, ZoomOutIcon, RotateIcon } from '@freesewing/react/components/Icon'
+
+/*
+ * A pattern you can pan and zoom
+ */
+export const ZoomablePattern = forwardRef(function ZoomablePatternRef(props, ref) {
+ const { renderProps, rotate, update, components = {}, strings = {} } = props
+ const { onTransformed, zoomFunctions, setZoomFunctions } = useContext(ZoomContext)
+
+ return (
+
+
+
+ props.update.ui('rotate', rotate ? 0 : 1)}
+ className="hover:tw-text-secondary"
+ >
+
+
+ (zoomFunctions.zoomIn ? zoomFunctions.zoomIn() : null)}
+ className="hover:tw-text-secondary"
+ >
+
+
+ (zoomFunctions.zoomOut ? zoomFunctions.zoomOut() : null)}
+ className="hover:tw-text-secondary"
+ >
+
+
+
+
+
+
+
+ {props.children || (
+
+ )}
+
+
+
+ )
+})
+
+/**
+ * A context for managing zoom state of a ZoomablePattern
+ * Makes transform handlers to be available in components
+ */
+const ZoomContext = React.createContext({})
+
+/**
+ * Provider for the ZoomContext
+ */
+export const ZoomContextProvider = ({ children }) => {
+ const [zoomed, setZoomed] = useState(false)
+ const [zoomFunctions, _setZoomFunctions] = useState(false)
+
+ const setZoomFunctions = useCallback(
+ (zoomInstance) => {
+ const reset = () => {
+ setZoomed(false)
+ zoomInstance.resetTransform()
+ }
+
+ if (zoomInstance) {
+ const { zoomIn, zoomOut, resetTransform } = zoomInstance
+ _setZoomFunctions({ zoomIn, zoomOut, resetTransform, reset })
+ }
+ },
+ [_setZoomFunctions, setZoomed]
+ )
+
+ const onTransformed = useCallback(
+ (_ref, state) => {
+ setZoomed(state.scale !== 1)
+ },
+ [setZoomed]
+ )
+
+ const value = useMemo(() => {
+ return {
+ zoomed,
+ zoomFunctions,
+ setZoomFunctions,
+ onTransformed,
+ }
+ }, [zoomed, zoomFunctions, setZoomFunctions, onTransformed])
+
+ return {children}
+}
diff --git a/packages/react/components/Editor/components/menus/Container.mjs b/packages/react/components/Editor/components/menus/Container.mjs
new file mode 100644
index 00000000000..4efa7f9de7e
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/Container.mjs
@@ -0,0 +1,362 @@
+// Dependencies
+import { menuValueWasChanged } from '../../lib/index.mjs'
+import { designOptionType } from '@freesewing/utils'
+// Hooks
+import React, { useState, useMemo } from 'react'
+// Components
+import { SubAccordion } from '../Accordion.mjs'
+import { EditIcon, GroupIcon, OptionsIcon, ResetIcon } from '@freesewing/react/components/Icon'
+import { FormControl } from '@freesewing/react/components/Input'
+import { MiniTip } from '@freesewing/react/components/Mini'
+
+/** @type {String} class to apply to buttons on open menu items */
+const iconButtonClass = 'tw-daisy-btn tw-daisy-btn-xs tw-daisy-btn-ghost tw-px-0 tw-text-accent'
+
+/**
+ * A generic component for handling a menu item.
+ * Wraps the given input in a {@see Collapse} with the appropriate buttons
+ * @param {String} options.name the name of the item, for using as a key
+ * @param {Object} options.config the configuration for the input
+ * @param {Sting|Boolean|Number} options.current the current value of the item
+ * @param {Function} options.updateFunc the function that will be called by event handlers to update the value
+ * @param {Function} options.t the translation function
+ * @param {Object} options.passProps props to pass to the Input component
+ * @param {Boolean} changed has the value changed from default?
+ * @param {React.Component} Input the input component this menu item will use
+ * @param {React.Component} Value a value display component this menu item will use
+ * @param {Boolean} allowOverride all a text input to be used to override the given input component
+ * @param {Number} ux the user-defined ux level
+ */
+export const MenuItem = ({
+ name,
+ current,
+ updateHandler,
+ passProps = {},
+ changed,
+ Input = () => {},
+ allowOverride = false,
+ ux = 5,
+ docs,
+ config,
+ Design,
+ i18n,
+}) => {
+ // Local state - whether the override input should be shown
+ const [override, setOverride] = useState(false)
+
+ // generate properties to pass to the Input
+ const drillProps = useMemo(
+ () => ({
+ name,
+ config,
+ ux,
+ current,
+ updateHandler,
+ changed,
+ override,
+ Design,
+ ...passProps,
+ }),
+ [name, config, current, updateHandler, changed, override, passProps, ux]
+ )
+
+ if (!config) {
+ console.log('no config in containers', { name, current, config })
+ return null
+ }
+
+ // don't render if this item is more advanced than the user has chosen to see
+ if (config.ux && config.ux > ux) return null
+
+ // get buttons for open and closed states
+ const buttons = []
+ if (allowOverride)
+ buttons.push(
+ {
+ evt.stopPropagation()
+ setOverride(!override)
+ }}
+ >
+
+
+ )
+ const ResetButton = ({ disabled = false }) => (
+ {
+ evt.stopPropagation()
+ updateHandler([name], '__UNSET__')
+ }}
+ >
+
+
+ )
+
+ buttons.push( )
+
+ return (
+ <>
+ {buttons}}
+ labelBL={
+
+ {changed ? 'This is a custom value' : 'This is the default value'}
+
+ }
+ >
+
+
+ {config.about ? {config.about} : null}
+ >
+ )
+}
+
+const coreLabels = {
+ complete: 'Details',
+ only: 'Included Parts',
+ paperless: 'Paperless',
+ sabool: 'Include Seam Allowance',
+}
+
+const getItemLabel = (i18n, name) => {
+ if (Object.keys(coreLabels).includes(name)) return coreLabels[name]
+
+ return i18n?.en?.o?.[name]?.t || name
+}
+
+/**
+ * A component for recursively displaying groups of menu items.
+ * Accepts any object where menu item configurations are keyed by name
+ * Items that are group headings are expected to have an isGroup: true property
+ * @param {Boolean} options.collapsible Should this group be collapsible (use false for the top level of a menu)
+ * @param {Number} options.ux the user-defined ux level
+ * @param {String} options.name the name of the group or item
+ * @param {Object} options.currentValues a map of current values for items in the group, keyed by name
+ * @param {Object} structure the configuration for the group.
+ * @param {React.Component} Icon the icon to display next to closed groups
+ * @param {React.Component} Item the component to use for menu items
+ * @param {Object} values a map of Value display components to be used by menu items in the group
+ * @param {Object} inputs a map of Input components to be used by menu items in the group
+ * @param {Object} passProps properties to pass to Inputs within menu items
+ * @param {Object} emojis a map of emojis to use as icons for groups or items
+ * @param {Function} updateHandler the function called by change handlers on inputs within menu items
+ * @param {Boolean} topLevel is this group the top level group? false for nested
+ * @param {Function} t translation function
+ */
+export const MenuItemGroup = ({
+ collapsible = true,
+ ux,
+ currentValues = {},
+ structure,
+ Icon,
+ Item = false,
+ inputs = {},
+ values = {},
+ passProps = {},
+ updateHandler,
+ topLevel = false,
+ isDesignOptionsGroup = false,
+ Design,
+ state,
+ i18n,
+}) => {
+ if (!Item) Item = MenuItem
+
+ // map the entries in the structure
+ const content = Object.entries(structure).map(([itemName, item]) => {
+ // if it's the isGroup property, or it is false, it shouldn't be shown
+ if (itemName === 'isGroup' || item === false) return null
+ if (!item) return null
+ if (item.ux && ux && item.ux > ux) return null
+
+ const ItemIcon = item.icon
+ ? item.icon
+ : item.isGroup
+ ? GroupIcon
+ : Icon
+ ? Icon
+ : () => fixme-icon
+ const Value = item.isGroup
+ ? () => (
+
+ {Object.keys(item).filter((i) => i !== 'isGroup').length}
+
+
+ )
+ : isDesignOptionsGroup
+ ? values[designOptionType(item)]
+ : values[itemName]
+ ? values[itemName]
+ : () => ¯\_(ツ)_/¯
+
+ return [
+
+
+
+
+ {item.title ? item.title : getItemLabel(i18n, itemName)}
+
+
+
+
+
+
,
+ item.isGroup ? (
+
+ ) : (
+
+ ),
+ itemName,
+ ]
+ })
+
+ return item !== null)} dense />
+}
+
+/**
+ * A generic component to present the title of a menu item
+ * @param {String} options.name the name of the item, to act as its translation key
+ * @param {Function} options.t the translation function
+ * @param {String|React.Component} options.current a the current value, or a Value component to display it
+ * @param {Boolean} options.open is the menu item open?
+ * @param {String} options.emoji the emoji icon of the menu item
+ */
+export const MenuItemTitle = ({ name, current = null, open = false, emoji = '', Icon = false }) => (
+
+
+ {Icon ? : {emoji} }
+ fixme: {name}
+
+ {current}
+
+)
+
+/**
+ * A component for recursively displaying groups of menu buttons.
+ *
+ * This is a lot simpler than the options menu structure
+ *
+ * @param {object} props - All the React props
+ * @param {object} props.structure - The menu structure
+ * @param {React.Component} props.Button - The component to use for menu items
+ * @param {freesewing.Design} props.Design - The FreeSewing design
+ * @param {object} props.i18n - The translations object
+ */
+export const MenuButtonGroup = ({ structure, Button = false, Design, Icon, i18n }) => {
+ if (!Button) return null
+ /*
+ * Create structure, push groups to the end
+ */
+ const content = []
+ for (const [itemName, item] of Object.entries(structure)) {
+ if (item && !item.isGroup && !['isGroup', 'title'].includes(itemName))
+ content.push( )
+ }
+
+ for (const [itemName, item] of Object.entries(structure)) {
+ if (item && item.isGroup) {
+ const ItemIcon = item.icon
+ ? item.icon
+ : item.isGroup
+ ? GroupIcon
+ : Icon
+ ? Icon
+ : () => fixme-icon
+ const Value = item.isGroup
+ ? () => (
+
+ {Object.keys(item).filter((i) => i !== 'isGroup').length}
+
+
+ )
+ : null
+
+ content.push([
+
+
+
+
+ {item.title ? item.title : getItemLabel(i18n, itemName)}
+
+
+
+
+
+
,
+ ,
+ ])
+ }
+ }
+
+ return (
+
+ {content.filter((item) => item !== null)}
+
+ )
+}
diff --git a/packages/react/components/Editor/components/menus/CoreSettingsMenu.mjs b/packages/react/components/Editor/components/menus/CoreSettingsMenu.mjs
new file mode 100644
index 00000000000..82f165f9ffa
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/CoreSettingsMenu.mjs
@@ -0,0 +1,148 @@
+import React from 'react'
+import {
+ menuCoreSettingsOnlyHandler,
+ menuCoreSettingsSaboolHandler,
+ menuCoreSettingsSammHandler,
+ menuCoreSettingsStructure,
+} from '../../lib/index.mjs'
+import {
+ MenuBoolInput,
+ MenuListInput,
+ MenuMmInput,
+ MenuOnlySettingInput,
+ MenuSliderInput,
+} from './Input.mjs'
+import {
+ //MenuBoolValue,
+ MenuListValue,
+ MenuMmValue,
+ MenuOnlySettingValue,
+ MenuScaleSettingValue,
+} from './Value.mjs'
+import { MenuItemGroup, MenuItem } from './Container.mjs'
+import { SettingsIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * The core settings menu
+ *
+ * @param {object} props.Design - An object holding the Design instance
+ * @param {Object} props.state - Object holding state
+ * @param {Object} props.i18n - Object holding translations loaded from the design
+ * @param {Object} props.update - Object holding state handlers
+ */
+export const CoreSettingsMenu = ({ Design, state, i18n, update }) => {
+ const structure = menuCoreSettingsStructure({
+ units: state.settings?.units,
+ sabool: state.settings?.sabool,
+ parts: Design.patternConfig.draftOrder,
+ })
+
+ const inputs = {
+ complete: MenuListInput,
+ expand: MenuListInput,
+ margin: MenuMmInput,
+ only: MenuOnlySettingInput,
+ paperless: MenuBoolInput,
+ sabool: MenuBoolInput,
+ samm: MenuMmInput,
+ scale: MenuSliderInput,
+ units: MenuBoolInput,
+ }
+
+ const values = {
+ complete: MenuListValue,
+ expand: MenuListValue,
+ margin: MenuMmValue,
+ only: MenuOnlySettingValue,
+ paperless: MenuListValue,
+ sabool: MenuListValue,
+ samm: MenuMmValue,
+ scale: MenuScaleSettingValue,
+ units: MenuListValue,
+ }
+
+ return (
+ (
+
+ ),
+ isFirst: true,
+ name: 'Core Settings',
+ passProps: {
+ ux: state.ui.ux,
+ settings: state.settings,
+ patternConfig: Design.patternConfig,
+ toggleSa: update.toggleSa,
+ },
+ updateHandler: update.settings,
+ isDesignOptionsGroup: false,
+ state,
+ Design,
+ inputs,
+ values,
+ i18n,
+ }}
+ />
+ )
+}
+
+// Facilitate custom handlers for core settings
+const coreSettingsHandlerMethods = {
+ only: menuCoreSettingsOnlyHandler,
+ sabool: menuCoreSettingsSaboolHandler,
+ samm: menuCoreSettingsSammHandler,
+}
+
+/** A wrapper for {@see MenuItem} to handle core settings-specific business */
+export const CoreSetting = ({ name, config, ux, updateHandler, current, passProps, ...rest }) => {
+ // is toggling allowed?
+ const allowToggle = ux > 3 && config.list?.length === 2
+
+ const handlerArgs = {
+ updateHandler,
+ current,
+ config,
+ ...passProps,
+ }
+
+ /*
+ * Load a specific update handler if one is configured
+ */
+ const handler = coreSettingsHandlerMethods[name.toLowerCase()]
+ ? coreSettingsHandlerMethods[name.toLowerCase()](handlerArgs)
+ : updateHandler
+
+ return (
+
+ )
+}
+
+export const ClearAllButton = ({ setSettings, compact = false }) => {
+ return (
+
+ setSettings({})}
+ >
+
+ Clear Settings
+
+
+ )
+}
diff --git a/packages/react/components/Editor/components/menus/DesignOptionsMenu.mjs b/packages/react/components/Editor/components/menus/DesignOptionsMenu.mjs
new file mode 100644
index 00000000000..9ca52fd4324
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/DesignOptionsMenu.mjs
@@ -0,0 +1,130 @@
+// Dependencies
+import { menuDesignOptionsStructure } from '../../lib/index.mjs'
+import { designOptionType } from '@freesewing/utils'
+// Hooks
+import React, { useCallback, useMemo } from 'react'
+// Components
+import {
+ MenuBoolInput,
+ MenuConstantInput,
+ MenuSliderInput,
+ MenuDegInput,
+ MenuListInput,
+ MenuMmInput,
+ MenuPctInput,
+} from './Input.mjs'
+import {
+ MenuBoolValue,
+ MenuConstantOptionValue,
+ MenuCountOptionValue,
+ MenuDegOptionValue,
+ MenuListOptionValue,
+ MenuMmOptionValue,
+ MenuPctOptionValue,
+} from './Value.mjs'
+import { MenuItemGroup, MenuItem } from './Container.mjs'
+import { OptionsIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * The design options menu
+ *
+ * @param {object} props.Design - An object holding the Design instance
+ * @param {String} props.isFirst - Boolean indicating whether this is the first/top entry of the menu
+ * @param {Object} props.state - Object holding state
+ * @param {Object} props.i18n - Object holding translations loaded from the design
+ * @param {Object} props.update - Object holding state handlers
+ */
+export const DesignOptionsMenu = ({ Design, isFirst = true, state, i18n, update }) => {
+ const structure = useMemo(
+ () =>
+ menuDesignOptionsStructure(
+ Design.designConfig.data.id,
+ Design.patternConfig.options,
+ state.settings
+ ),
+ [Design.designConfig.data.id, Design.patternConfig, state.settings]
+ )
+ const updateHandler = useCallback(
+ (name, value = '__UNSET__') => update.settings(['options', ...name], value),
+ [update.settings]
+ )
+
+ const drillProps = { Design, state, update, i18n }
+ const inputs = {
+ bool: (props) => ,
+ constant: (props) => ,
+ count: (props) => (
+
+ ),
+ deg: (props) => ,
+ list: (props) => ,
+ mm: (props) => ,
+ pct: (props) => ,
+ }
+ const values = {
+ bool: (props) => ,
+ constant: (props) => ,
+ count: (props) => ,
+ deg: (props) => ,
+ list: (props) => ,
+ mm: (props) => ,
+ pct: (props) => ,
+ }
+
+ return (
+ ,
+ isFirst,
+ name: 'Design Options',
+ passProps: {
+ ux: state.ui.ux,
+ settings: state.settings,
+ patternConfig: Design.patternConfig,
+ },
+ updateHandler,
+ isDesignOptionsGroup: true,
+ state,
+ Design,
+ inputs,
+ values,
+ i18n,
+ }}
+ />
+ )
+}
+
+/**
+ * A wrapper for {@see MenuItem} to handle design option-specific business
+ * @param {Object} options.config the config for the item
+ * @param {Object} options.settings core settings
+ * @param {Object} options.rest the rest of the props
+ */
+export const DesignOption = ({ config, settings, ux, inputs, values, ...rest }) => {
+ const type = designOptionType(config)
+ const Input = inputs[type]
+ const Value = values[type]
+ const allowOverride = ['pct', 'count', 'deg', 'mm'].includes(type)
+ const allowToggle = (ux > 3 && type === 'bool') || (type == 'list' && config.list.length === 2)
+
+ // Hide option?
+ if (config?.hide || (typeof config?.hide === 'function' && config.hide(settings))) return null
+
+ return (
+
+ )
+}
diff --git a/packages/react/components/Editor/components/menus/DraftMenu.mjs b/packages/react/components/Editor/components/menus/DraftMenu.mjs
new file mode 100644
index 00000000000..476133ca6b8
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/DraftMenu.mjs
@@ -0,0 +1,58 @@
+import React from 'react'
+import { OptionsIcon, SettingsIcon, UiIcon } from '@freesewing/react/components/Icon'
+import { DesignOptionsMenu } from './DesignOptionsMenu.mjs'
+import { CoreSettingsMenu } from './CoreSettingsMenu.mjs'
+import { UiPreferencesMenu } from './UiPreferencesMenu.mjs'
+import { FlagsAccordionEntries } from '../Flag.mjs'
+import { Accordion } from '../Accordion.mjs'
+
+export const DraftMenu = ({ Design, pattern, state, update, i18n }) => {
+ const menuProps = { Design, state, pattern, update }
+
+ const sections = [
+ {
+ t: 'Design Options',
+ d: 'These options are specific to this design. You can use them to customize your pattern in a variety of ways.',
+ icon: ,
+ menu: ,
+ },
+ {
+ t: 'Core Settings',
+ d: 'These settings are not specific to the design, but instead allow you to customize various parameters of the FreeSewing core library, which generates the design for you.',
+ icon: ,
+ menu: ,
+ },
+ {
+ t: 'UI Preferences',
+ d: 'These preferences control the UI (User Interface) of the pattern editor',
+ icon: ,
+ menu: ,
+ },
+ ]
+
+ const items = []
+ items.push(
+ ...sections.map((section) => [
+ <>
+
+ {section.t}
+ {section.icon}
+
+ {section.d}
+ >,
+ section.menu,
+ section.name,
+ ])
+ )
+
+ const flags = pattern.setStores?.[0]?.plugins?.['plugin-annotations']?.flags
+
+ if (flags)
+ items.push([
+ ,
+ ,
+ 'flags',
+ ])
+
+ return
+}
diff --git a/packages/react/components/Editor/components/menus/Input.mjs b/packages/react/components/Editor/components/menus/Input.mjs
new file mode 100644
index 00000000000..0477aa69ab6
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/Input.mjs
@@ -0,0 +1,482 @@
+import React, { useMemo, useCallback, useState } from 'react'
+import { i18n } from '@freesewing/collection'
+import {
+ designOptionType,
+ round,
+ measurementAsUnits,
+ measurementAsMm,
+ formatMm,
+ formatFraction128,
+} from '@freesewing/utils'
+import { menuRoundPct } from '../../lib/index.mjs'
+import { ButtonFrame, NumberInput } from '@freesewing/react/components/Input'
+import { defaultConfig } from '../../config/index.mjs'
+import { ApplyIcon } from '@freesewing/react/components/Icon'
+import { mergeOptions } from '@freesewing/core'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+
+/** A boolean version of {@see MenuListInput} that sets up the necessary configuration */
+export const MenuBoolInput = (props) => {
+ const { name, config } = props
+ //const boolConfig = useBoolConfig(name, config)
+
+ return
+}
+
+/** A placeholder for an input to handle constant values */
+export const MenuConstantInput = ({
+ type = 'number',
+ name,
+ current,
+ updateHandler,
+ changed,
+ config,
+}) => (
+ <>
+ updateHandler([name], evt.target.value)}
+ />
+ >
+)
+
+/** A {@see MenuSliderInput} to handle degree values */
+export const MenuDegInput = (props) => {
+ const { updateHandler } = props
+ const degUpdateHandler = useCallback(
+ (path, newVal) => {
+ updateHandler(path, newVal === undefined ? undefined : Number(newVal))
+ },
+ [updateHandler]
+ )
+ return (
+
+ )
+}
+
+const getTitleAndDesc = (config = {}, i18n = {}, isDesignOption = false) => {
+ if (config.choiceTitles && config.choiceDescriptions) {
+ const current = typeof config.current === 'undefined' ? config.dflt : config.current
+ return {
+ title: config.choiceTitles[current],
+ desc: config.choiceDescriptions[current],
+ }
+ }
+
+ let titleKey = config.choiceTitles
+ ? 'fixme' //config.choiceTitles[entry]
+ : isDesignOption
+ ? i18n?.en?.o?.[name] || name
+ : `${name}.o.${entry}`
+ if (!config.choiceTitles && i18n && i18n.en.o[`${name}.${entry}`])
+ titleKey = i18n.en.o[`${name}.${entry}`]
+ const title = config.title
+ ? config.title
+ : config.titleMethod
+ ? config.titleMethod(entry)
+ : typeof titleKey === 'string'
+ ? i18n.en.o[titleKey]?.t
+ : titleKey.t
+ const desc = config.valueMethod
+ ? config.valueMethod(entry)
+ : typeof titleKey === 'string'
+ ? i18n.en.o[titleKey]?.d
+ : titleKey.d
+
+ return {
+ title: 'fixmeTitle',
+ desc: 'fixmeDesc',
+ }
+}
+
+/**
+ * An input for selecting and item from a list
+ * @param {String} options.name the name of the property this input changes
+ * @param {Object} options.config configuration for the input
+ * @param {String|Number} options.current the current value of the input
+ * @param {Function} options.updateFunc the function called by the event handler to update the value
+ * @param {Boolean} options.compact include descriptions with the list items?
+ * @param {Function} options.t translation function
+ * @param {String} design name of the design
+ * @param {Boolean} isDesignOption Whether or not it's a design option
+ */
+export const MenuListInput = ({
+ name,
+ config,
+ current,
+ updateHandler,
+ compact = false,
+ t,
+ changed,
+ design,
+ isDesignOption = false,
+ i18n,
+}) => {
+ const handleChange = useSharedHandlers({
+ dflt: config.dflt,
+ updateHandler,
+ name,
+ isDesignOption,
+ })
+
+ return config.list.map((entry) => {
+ const { title = false, about = false } = config //getTitleAndDesc(config, i18n, isDesignOption)
+ if (!title || !about) console.log('No title or about in', { name, config, design })
+ const sideBySide = config.sideBySide || about.length + title.length < 42
+
+ return (
+ handleChange(entry)}
+ >
+
+
{config.choiceTitles[entry]}
+ {compact || !config.choiceDescriptions ? null : (
+
+ {config.choiceDescriptions[entry]}
+
+ )}
+
+
+ )
+ })
+}
+
+/** a toggle input for list/boolean values */
+export const MenuListToggle = ({ config, changed, updateHandler, name }) => {
+ const boolConfig = useBoolConfig(name, config)
+ const handleChange = useSharedHandlers({ dflt: boolConfig.dflt, updateHandler, name })
+
+ const dfltIndex = boolConfig.list.indexOf(boolConfig.dflt)
+
+ const doToggle = () =>
+ handleChange(boolConfig.list[changed ? dfltIndex : Math.abs(dfltIndex - 1)])
+
+ const checked = boolConfig.dflt == false ? changed : !changed
+
+ return (
+ evt.stopPropagation()}
+ />
+ )
+}
+
+export const MenuMmInput = (props) => {
+ const { updateHandler, current, config } = props
+ const units = props.state.settings?.units
+ const imperial = units === 'imperial'
+ const mmUpdateHandler = useCallback(
+ (path, newCurrent) => {
+ console.log('mmUpdateHandler', { path, newCurrent })
+ const calcCurrent =
+ typeof newCurrent === 'undefined' ? undefined : measurementAsMm(newCurrent, units)
+ updateHandler(path, calcCurrent)
+ },
+ [updateHandler, units]
+ )
+
+ /*
+ * Set a default step that matches the unit
+ */
+ const defaultStep = units === 'imperial' ? 0.125 : 0.1
+
+ return (
+ (units === 'imperial' ? formatFraction128(val, null) : val),
+ suffix: units === 'imperial' ? '"' : 'cm',
+ }}
+ />
+ )
+}
+
+/** A {@see SliderInput} to handle percentage values */
+export const MenuPctInput = ({ current, changed, updateHandler, config, ...rest }) => {
+ const factor = 100
+ let pctCurrent = changed ? menuRoundPct(current, factor) : current
+ const pctUpdateHandler = useCallback(
+ (path, newVal) =>
+ updateHandler(path, newVal === undefined ? undefined : menuRoundPct(newVal, 1 / factor)),
+ [updateHandler]
+ )
+
+ return (
+
+ )
+}
+
+/**
+ * An input component that uses a slider to change a number value
+ * @param {String} options.name the name of the property being changed by the input
+ * @param {Object} options.config configuration for the input
+ * @param {Number} options.current the current value of the input
+ * @param {Function} options.updateHandler the function called by the event handler to update the value
+ * @param {Function} options.t translation function
+ * @param {Boolean} options.override open the text input to allow override of the slider?
+ * @param {String} options.suffix a suffix to append to value labels
+ * @param {Function} options.valFormatter a function that accepts a value and formats it for display as a label
+ * @param {Function} options.setReset a setter for the reset function on the parent component
+ */
+export const MenuSliderInput = ({
+ name,
+ config,
+ current,
+ updateHandler,
+ override,
+ suffix = '',
+ valFormatter = (val) => val,
+ setReset,
+ children,
+ changed,
+ i18n,
+ state,
+ Design,
+}) => {
+ const { max, min } = config
+ const handleChange = useSharedHandlers({
+ current,
+ dflt: config.dflt,
+ updateHandler,
+ name,
+ setReset,
+ })
+
+ const val = typeof current === 'undefined' ? config.dflt : current
+
+ if (override)
+ return (
+ <>
+
+
+
+ {children}
+ >
+ )
+
+ return (
+ <>
+
+
+
+
+
+
+ {typeof config.toAbs === 'function' ? (
+
+ |
+
+
+ ) : null}
+
+
+
+
+
+ handleChange(evt.target.value)}
+ className={`
+ tw-daisy-range tw-daisy-range-sm tw-mt-1
+ ${changed ? 'tw-daisy-range-accent' : 'tw-daisy-range-secondary'}
+ `}
+ />
+ {children}
+ >
+ )
+}
+
+export const MenuEditOption = (props) => {
+ const { config, handleChange } = props
+ const type = designOptionType(config)
+
+ const [manualEdit, setManualEdit] = useState(props.current)
+ const [abs, setAbs] = useState(false)
+ const [units, setUnits] = useState(
+ abs
+ ? props.state.settings?.units === 'imperial'
+ ? 'inch'
+ : 'cm'
+ : defaultConfig.menuOptionEditLabels[type]
+ )
+
+ const onUpdate = useCallback(
+ (validVal, units) => {
+ if (validVal !== null && validVal !== false) {
+ if (type === 'pct' && units === 'cm')
+ return handleChange(config.fromAbs(Number(validVal) * 1000, props.state.settings))
+ if (type === 'pct' && units === 'inch')
+ return handleChange(config.fromAbs(Number(validVal) * 2540, props.state.settings))
+ return handleChange(validVal)
+ }
+ },
+ [handleChange]
+ )
+
+ const toggleInputUnits = () => {
+ if (abs) setUnits(defaultConfig.menuOptionEditLabels[type])
+ else setUnits(props.state.settings?.units === 'imperial' ? 'inch' : 'cm')
+ setAbs(!abs)
+ console.log('in toogg;e')
+ }
+
+ if (!['pct', 'count', 'deg', 'mm'].includes(type))
+ return This design option type does not have a component to handle manual input.
+
+ return (
+
+
+
+ Enter a custom value
+
+ {type === 'pct' && typeof config.fromAbs === 'function' ? (
+
+
+
+ ) : null}
+
+
+
+ onUpdate(manualEdit, units)}
+ >
+
+
+
+
+ )
+}
+
+/**
+ * A hook to get the change handler for an input.
+ * @param {Number|String|Boolean} options.dflt the default value for the input
+ * @param {Function} options.updateHandler the onChange
+ * @param {string} options.name the name of the property being changed
+ * @return the change handler for the input
+ */
+const useSharedHandlers = ({ dflt, updateHandler, name, isDesignOption }) => {
+ return useCallback(
+ (newCurrent = '__UNSET__') => {
+ /*
+ * When a design option is set to the default, just unset it instead
+ * This is both more efficient, and makes it easy to see in which ways
+ * your pattern differs from the defaults
+ */
+ if (isDesignOption && newCurrent === dflt) newCurrent = '__UNSET__'
+ updateHandler([name], newCurrent)
+ },
+ [dflt, updateHandler, name, isDesignOption]
+ )
+}
+
+/** get the configuration that allows a boolean value to use the list input */
+const useBoolConfig = (name, config) => {
+ return useMemo(
+ () => ({
+ list: [false, true],
+ choiceTitles: {
+ false: `${name}No`,
+ true: `${name}Yes`,
+ },
+ valueTitles: {
+ false: 'no',
+ true: 'yes',
+ },
+ ...config,
+ }),
+ [name, config]
+ )
+}
+
+/** an input for the 'only' setting. toggles individual parts*/
+export const MenuOnlySettingInput = (props) => {
+ const { config } = props
+ config.list = config.list.sort()
+ config.choiceTitles = {}
+ for (const part of config.list) {
+ const [design, name] = part.split('.')
+ config.choiceTitles[part] = (
+
+ {design}
+ »
+ {i18n[design].en.p[name]}
+
+ )
+ }
+
+ return
+}
+
+export const MenuUxSettingInput = (props) => {
+ const { state, update } = props
+
+ return
+}
diff --git a/packages/react/components/Editor/components/menus/LayoutMenu.mjs b/packages/react/components/Editor/components/menus/LayoutMenu.mjs
new file mode 100644
index 00000000000..f523266b5c2
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/LayoutMenu.mjs
@@ -0,0 +1,123 @@
+// Dependencies
+import React from 'react'
+import { capitalize } from '@freesewing/utils'
+import { menuLayoutSettingsStructure } from '../../lib/index.mjs'
+// Components
+import { PatternIcon } from '@freesewing/react/components/Icon'
+import { MenuBoolInput, MenuMmInput, MenuListInput, MenuPctInput } from './Input.mjs'
+import { MenuBoolValue, MenuMmValue, MenuPctOptionValue } from './Value.mjs'
+import { MenuItemGroup } from './Container.mjs'
+import { MenuHighlightValue } from './Value.mjs'
+
+export const LayoutSettingsMenu = ({ update, state, Design }) => {
+ const structure = menuLayoutSettingsStructure()
+
+ const drillProps = { Design, state, update }
+ const inputs = {
+ size: (props) => ,
+ orientation: (props) => ,
+ margin: (props) => ,
+ coverPage: (props) => ,
+ iconSize: (props) => ,
+ }
+ const values = {
+ size: ({ current, changed, config }) => (
+
+ {capitalize(current ? current : config.dflt)}
+
+ ),
+ orientation: ({ current, changed }) => (
+
+
+
+ ),
+ margin: MenuMmValue,
+ coverPage: MenuBoolValue,
+ iconSize: MenuPctOptionValue,
+ }
+
+ return (
+ update.ui(['layout', key], val),
+ isDesignOptionsGroup: false,
+ state,
+ Design,
+ inputs,
+ values,
+ }}
+ />
+ )
+}
+
+/*
+const PrintActions = ({ state, update }) => (
+
+
+
+ {'workbench:partTransfo'}
+
+ {state.ui.hideMovableButtons ? : }
+ ,
+ update.state.ui('hideMovableButtons', state.ui.hideMovableButtons ? false : true)}
+ label={
+ {'workbench:partTransfoDesc'}
+ }
+ list={[
+ {
+ val: true,
+ label: 'workbench:partTransfoNo',
+ desc: 'workbench:partTransfoNoDesc',
+ },
+ {
+ val: false,
+ label: 'workbench:partTransfoYes',
+ desc: 'workbench:partTransfoYesDesc',
+ },
+ ]}
+ current={state.ui.hideMovableButtons ? true : false}
+ />,
+ 'partTransfo',
+ ],
+ [
+
+
+
+ {'workbench:resetPrintLayout'}
+
+
+
,
+
+
+ {'workbench:resetPrintLayoutDesc'}
+ update.ui(['layouts', 'print'])}
+ >
+
+ {'workbench:resetPrintLayout'}
+
+ ,
+ 'reset',
+ ],
+ ]}
+ />
+)
+*/
diff --git a/packages/react/components/Editor/components/menus/TestMenu.mjs b/packages/react/components/Editor/components/menus/TestMenu.mjs
new file mode 100644
index 00000000000..2861caa2c5f
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/TestMenu.mjs
@@ -0,0 +1,105 @@
+// Dependencies
+import { menuDesignOptionsStructure } from '../../lib/index.mjs'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+// Hooks
+import React, { useMemo } from 'react'
+// Components
+import { MenuButtonGroup } from './Container.mjs'
+import { BeakerIcon, OptionsIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * The test design options menu
+ *
+ * @param {object} props.Design - An object holding the Design instance
+ * @param {Object} props.state - Object holding state
+ * @param {Object} props.i18n - Object holding translations loaded from the design
+ * @param {Object} props.update - Object holding state handlers
+ */
+export const TestOptionsMenu = ({ Design, state, i18n, update }) => {
+ const structure = useMemo(
+ () =>
+ menuDesignOptionsStructure(
+ Design.designConfig.data.id,
+ Design.patternConfig.options,
+ state.settings
+ ),
+ [Design.designConfig.data.id, Design.patternConfig, state.settings]
+ )
+
+ return (
+ ,
+ name: 'Design Options',
+ isDesignOptionsGroup: true,
+ state,
+ Design,
+ i18n,
+ }}
+ />
+ )
+}
+
+/**
+ * The test measurements options menu
+ *
+ * @param {object} props.Design - An object holding the Design instance
+ * @param {Object} props.state - Object holding state
+ * @param {Object} props.update - Object holding state handlers
+ */
+export const TestMeasurementsMenu = ({ Design, state, update }) => {
+ const structure = {}
+ if (Design.patternConfig.measurements.length > 0)
+ structure.required = { isGroup: true, title: 'Required Measurements' }
+ for (const m of Design.patternConfig.measurements) {
+ structure.required[m] = { isGroup: false, name: m, title: m }
+ }
+ if (Design.patternConfig.optionalMeasurements.length > 0)
+ structure.optional = { isGroup: true, title: 'Optional Measurements' }
+ for (const m of Design.patternConfig.optionalMeasurements) {
+ structure.optional[m] = { isGroup: false, name: m, title: m }
+ }
+
+ return (
+ ,
+ name: 'Design Measurments',
+ isDesignOptionsGroup: true,
+ state,
+ Design,
+ }}
+ />
+ )
+}
+
+const SampleOptionButton = ({ name, i18n, update }) => (
+ update.settings('sample', { type: 'option', option: name })}
+ >
+
+ {i18n.en.o[name].t}
+
+)
+
+const SampleMeasurementButton = ({ name, i18n, update }) => (
+ update.settings('sample', { type: 'option', option: name })}
+ >
+
+ {measurementsTranslations[name]}
+
+)
diff --git a/packages/react/components/Editor/components/menus/UiPreferencesMenu.mjs b/packages/react/components/Editor/components/menus/UiPreferencesMenu.mjs
new file mode 100644
index 00000000000..5e39b2723ec
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/UiPreferencesMenu.mjs
@@ -0,0 +1,56 @@
+// Depdendencies
+import React from 'react'
+import { menuUiPreferencesStructure } from '../../lib/index.mjs'
+// Components
+import { MenuUxSettingInput, MenuListInput } from './Input.mjs'
+import { MenuListValue } from './Value.mjs'
+import { MenuItemGroup, MenuItem } from './Container.mjs'
+
+export const UiPreferencesMenu = ({ update, state, Design }) => {
+ const structure = menuUiPreferencesStructure()
+
+ const drillProps = { Design, state, update }
+ const inputs = {
+ aside: (props) => ,
+ ux: (props) => ,
+ rotate: (props) => ,
+ renderer: (props) => ,
+ }
+ const values = {
+ aside: MenuListValue,
+ ux: (props) => {state.ui.ux}/5 ,
+ rotate: MenuListValue,
+ renderer: MenuListValue,
+ }
+
+ return (
+ (
+
+ ),
+ isFirst: true,
+ name: 'UI Preferences',
+ language: state.locale,
+ passProps: {
+ ux: state.ui?.ux,
+ settings: state.settings,
+ patternConfig: Design.patternConfig,
+ },
+ updateHandler: update.ui,
+ isDesignOptionsGroup: false,
+ state,
+ Design,
+ inputs,
+ values,
+ }}
+ />
+ )
+}
+
+export const UiPreference = ({ name, ux, ...rest }) => (
+ 3} ux={ux} />
+)
diff --git a/packages/react/components/Editor/components/menus/Value.mjs b/packages/react/components/Editor/components/menus/Value.mjs
new file mode 100644
index 00000000000..6f759688972
--- /dev/null
+++ b/packages/react/components/Editor/components/menus/Value.mjs
@@ -0,0 +1,171 @@
+import React from 'react'
+import { mergeOptions } from '@freesewing/core'
+import { formatMm, formatPercentage } from '@freesewing/utils'
+import { BoolYesIcon, BoolNoIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * this method is here to capture deprecated use of the translation method
+ *
+ * @param {string} key - The translation key
+ * @retunr {string} key - Returns the key as-is
+ */
+const t = (key) => {
+ console.log('FIXME: t method called in react/components/Editor/components/menus/Value.mjs')
+ return key
+}
+
+/**
+ * Displays that constant values are not implemented in the front end
+ */
+export const MenuConstantOptionValue = () => (
+ FIXME: No ConstantOptionvalue implemented
+)
+
+/**
+ * Displays a count value
+ *
+ * @param {object} config - The option config
+ * @param {number} current - The current (count) value
+ * @param {bool} changed - Whether or not the value is non-default
+ */
+export const MenuCountOptionValue = ({ config, current, changed }) => (
+
+)
+
+/**
+ * Displays a degree value
+ *
+ * @param {object} config - The option config
+ * @param {number} current - The current (count) value
+ * @param {bool} changed - Whether or not the value is non-default
+ */
+export const MenuDegOptionValue = ({ config, current, changed }) => (
+ {changed ? current : config.deg}°
+)
+
+/**
+ * A component to highlight a changed value
+ *
+ * @param {Boolean} changed - Whether the value is non-default
+ * @param {Function} children - The React children
+ */
+export const MenuHighlightValue = ({ changed, children }) => (
+ {children}
+)
+
+/**
+ * Displays a list option value
+ */
+export const MenuListOptionValue = (props) =>
+
+/**
+ * Displays the correct, translated value for a list
+ * @param {String|Boolean} options.current the current value, if it has been changed
+ * @param {Function} options.t a translation function
+ * @param {Object} options.config the item config
+ * @param {Boolean} options.changed has the value been changed?
+ */
+export const MenuListValue = ({ current, config, changed }) => {
+ // get the values
+ const val = changed ? current : config.dflt
+
+ // key will be based on a few factors
+ let key
+ // are valueTitles configured?
+ if (config.valueTitles) key = config.valueTitles[val]
+ // if not, is the value a string
+ else if (typeof val === 'string') key = val
+ // otherwise stringify booleans
+ else if (val) key =
+ else key =
+
+ const translated = config.doNotTranslate || key
+
+ return {translated}
+}
+
+/**
+ * Displays the corrent, translated value for a boolean
+ */
+export const MenuBoolValue = MenuListOptionValue
+
+/**
+ * Displays the MmOptions are not supported
+ */
+export const MenuMmOptionValue = ({ config, changed, current, state }) => (
+
+
+
+)
+
+/**
+ * Displays a formated mm value based on the current units
+ */
+export const MenuMmValue = ({ current, config, units, changed }) => (
+
+
+
+)
+
+/**
+ * Displays the current percentage value, and the absolute value if configured
+ */
+export const MenuPctOptionValue = ({ config, current, settings, changed, patternConfig }) => {
+ const val = changed ? current : config.pct / 100
+
+ return (
+
+ {formatPercentage(val)}
+ {config.toAbs && settings?.measurements
+ ? ` | ${formatMm(
+ config.toAbs(val, settings, mergeOptions(settings, patternConfig.options))
+ )}`
+ : null}
+
+ )
+}
+
+/**
+ * A component to display a value, highligting it if it changed
+ *
+ * @param {Number|String|Boolean} options.current - The current value, if it has been changed
+ * @param {Number|String|Boolean} options.dflt - The default value
+ * @param {Boolean} options.changed - Has the value been changed?
+ */
+export const MenuShowValue = ({ current, dflt, changed }) => {
+ return {changed ? current : dflt}
+}
+
+/**
+ * Displays the value for core's scale setting
+ *
+ * @param {number} current - The current (count) value
+ * @param {Object} options.config the item config
+ * @param {bool} changed - Whether or not the value is non-default
+ */
+export const MenuScaleSettingValue = ({ current, config, changed }) => (
+
+ {typeof current === 'undefined' ? config.dflt : current}
+
+)
+
+/**
+ * Displays the value for core's only setting
+ *
+ * @param {object} config - The option config
+ * @param {number} current - The current (count) value
+ * @param {bool} changed - Whether or not the value is non-default
+ */
+export const MenuOnlySettingValue = ({ current, config }) => (
+
+ {current === undefined ? '-' : current.length}
+
+)
diff --git a/packages/react/components/Editor/components/views/DesignsView.mjs b/packages/react/components/Editor/components/views/DesignsView.mjs
new file mode 100644
index 00000000000..c1c0a0fc921
--- /dev/null
+++ b/packages/react/components/Editor/components/views/DesignsView.mjs
@@ -0,0 +1,22 @@
+import React from 'react'
+import { Collection } from '@freesewing/react/components/Collection'
+
+/**
+ * The designs view is loaded if and only if no design name is passed to the editor
+ *
+ * @param {Object} props - All the props
+ * @param {Object} designs - Object holding all designs
+ * @param {Object} update - ViewWrapper state update object
+ */
+export const DesignsView = ({ designs = {}, update }) => (
+
+
Choose a design from the FreeSewing collection
+ {
+ update.design(design)
+ update.view('draft')
+ }}
+ />
+
+)
diff --git a/packages/react/components/Editor/components/views/DocsView.mjs b/packages/react/components/Editor/components/views/DocsView.mjs
new file mode 100644
index 00000000000..91745a32718
--- /dev/null
+++ b/packages/react/components/Editor/components/views/DocsView.mjs
@@ -0,0 +1,51 @@
+// Dependencies
+import { linkClasses } from '@freesewing/utils'
+// Hooks
+import React from 'react'
+// Components
+import { H1, H5 } from '@freesewing/react/components/Heading'
+import { Popout } from '@freesewing/react/components/Popout'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+
+/**
+ * This is the docs view, it just shows content
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ */
+export const DocsView = ({ state, config, update }) => {
+ return (
+ <>
+
+
+
Documenation
+
+ Understanding the FreeSewing Pattern Editor
+
+ Please refer to the pattern editor documentation at:
+
+
+ {`FreeSewing.org/docs/about/editor`}
+
+
+
+
+
+ Looking for info on how it really works?
+
+
+ Documentation for developers and contributors is available at{' '}
+
+ {`FreeSewing.dev`}
+
+
+
+
+ >
+ )
+}
diff --git a/packages/react/components/Editor/components/views/DraftView.mjs b/packages/react/components/Editor/components/views/DraftView.mjs
new file mode 100644
index 00000000000..d26e80d30f8
--- /dev/null
+++ b/packages/react/components/Editor/components/views/DraftView.mjs
@@ -0,0 +1,81 @@
+// Dependencies
+import React from 'react'
+import { draft, missingMeasurements, bundlePatternTranslations } from '../../lib/index.mjs'
+// Components
+import { Null } from '@freesewing/react/components/Null'
+import { ZoomablePattern } from '../ZoomablePattern.mjs'
+import { PatternLayout } from '../PatternLayout.mjs'
+
+/**
+ * The draft view allows users to tweak their pattern
+ *
+ * @param (object) props - All the props
+ * @param {function} props.config - The editor configuration
+ * @param {function} props.Design - The design constructor
+ * @param {array} props.missingMeasurements - List of missing measurements for the current design
+ * @param {object} props.state - The ViewWrapper state object
+ * @param {object} props.state.settings - The current settings
+ * @param {object} props.update - Helper object for updating the ViewWrapper state
+ * @param {React.component} props.plugins - Any (extra) plugins to load in the pattern
+ * @param {React.component} props.PluginOutput - An optional component to display plugin-specific output
+ * @return {function} DraftView - React component
+ */
+export const DraftView = ({ Design, state, update, config, plugins = [], PluginOutput = Null }) => {
+ /*
+ * Don't trust that we have all measurements
+ *
+ * We do not need to change the view here. That is done in the central
+ * ViewWrapper componenet. However, checking the measurements against
+ * the design takes a brief moment, so this component will typically
+ * render before that happens, and if measurements are missing it will
+ * throw and error.
+ *
+ * So when measurements are missing, we just return here and the view
+ * will switch on the next render loop.
+ */
+ if (missingMeasurements(state)) return
+
+ /*
+ * First, attempt to draft
+ */
+ const { pattern } = draft(Design, state.settings, plugins)
+
+ /*
+ * Create object holding strings for translation
+ */
+ const strings = bundlePatternTranslations(pattern.designConfig.data.id)
+
+ let output = null
+ let renderProps = false
+ if (state.ui?.renderer === 'svg') {
+ try {
+ const __html = pattern.render()
+ output = (
+ <>
+
+
+
+
+ >
+ )
+ } catch (err) {
+ console.log(err)
+ }
+ } else {
+ renderProps = pattern.getRenderProps()
+ output = (
+ <>
+
+
+ >
+ )
+ }
+
+ return
+}
diff --git a/packages/react/components/Editor/components/views/EditSettingsView.mjs b/packages/react/components/Editor/components/views/EditSettingsView.mjs
new file mode 100644
index 00000000000..1b2054245a0
--- /dev/null
+++ b/packages/react/components/Editor/components/views/EditSettingsView.mjs
@@ -0,0 +1,146 @@
+// Dependencies
+import { clone } from '@freesewing/utils'
+import yaml from 'yaml'
+// Hooks
+import React, { useState } from 'react'
+import { useStateObject } from '@freesewing/react/hooks/useStateObject'
+// Components
+import { H1, H4 } from '@freesewing/react/components/Heading'
+import { DiffViewer, diffCheck } from '@freesewing/react/components/DiffViewer'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+import { ResetIcon, OkIcon } from '@freesewing/react/components/Icon'
+import CodeMirror from '@uiw/react-codemirror'
+import { yaml as yamlLang } from '@codemirror/lang-yaml'
+
+/**
+ * This is the editSettings view
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ */
+export const EditSettingsView = (props) => {
+ const [settings, setSettings] = useState(props.state.settings)
+ const { state, config, update } = props
+
+ return (
+ <>
+
+
+
Edit settings by hand
+
+ You can hand-edit your pattern settings below.
+
+ The changes will not take effect until you click the Save Settings button at the
+ bottom.
+
+
+
+ >
+ )
+}
+
+/**
+ * This is the React component for the settings editor itself
+ */
+export const PrimedSettingsEditor = (props) => {
+ /*
+ * Destructure props
+ */
+ const { state } = props
+
+ /*
+ * React state
+ */
+ /* eslint-disable-next-line no-unused-vars */
+ const [settings, update, setSettings] = useStateObject(state.settings) // Holds the settings
+ const [showDelta, setShowDelta] = useState(false)
+ const [localYaml, setLocalYaml] = useState(yaml.stringify(state.settings)) // Holds the settings as YAML
+
+ /*
+ * Method to revert to the settings in the editor state
+ */
+ const revert = () => {
+ setSettings(clone(state.settings))
+ setLocalYaml(yaml.stringify(state.settings))
+ }
+
+ /*
+ * Method to save to the settings into the editor state
+ */
+ const save = () => {
+ props.update.state('settings', yaml.parse(localYaml))
+ }
+
+ if (!settings) return null
+
+ /*
+ * Handle settings delta
+ */
+ const delta =
+ diffCheck(yaml.stringify(state.settings), yaml.stringify(settings)).length > 1 ? true : false
+
+ const onChangeYaml = (input) => {
+ let newSettings
+ try {
+ newSettings = yaml.parse(input)
+ if (newSettings) {
+ setLocalYaml(input)
+ setSettings(newSettings)
+ }
+ } catch (err) {
+ // This is fine
+ }
+ }
+
+ return (
+ <>
+
+ {delta ? (
+ <>
+ You have made changes
+ Your settings have been edited, and are now different from the editor settings.
+
+ setShowDelta(!showDelta)}
+ >
+ {showDelta ? 'Hide' : 'Show'} Changes
+
+
+
+ Save Settings
+
+
+
+ Revert Settings
+
+
+ {showDelta ? (
+
+
+
+ ) : null}
+ >
+ ) : null}
+ >
+ )
+}
diff --git a/packages/react/components/Editor/components/views/ExportView.mjs b/packages/react/components/Editor/components/views/ExportView.mjs
new file mode 100644
index 00000000000..eb8f22bfe3a
--- /dev/null
+++ b/packages/react/components/Editor/components/views/ExportView.mjs
@@ -0,0 +1,162 @@
+// Dependencies
+import { linkClasses, horFlexClasses, patternUrlFromState } from '@freesewing/utils'
+import { handleExport } from '../../lib/export/index.mjs'
+// Hooks
+import React, { useState } from 'react'
+// Components
+import { H1, H2, H3, H5 } from '@freesewing/react/components/Heading'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+import { CopyToClipboardButton } from '@freesewing/react/components/CopyToClipboardButton'
+import { Highlight } from '@freesewing/react/components/Highlight'
+import { EditIcon, CodeIcon, TipIcon, PrintIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * This is the export view, it allows you to export your pattern in a variety of formats
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ */
+export const ExportView = (props) => {
+ const { config, state, update } = props
+ const [link, setLink] = useState(false)
+ const [format, setFormat] = useState(false)
+
+ const { protocol, hostname, port } = window.location
+ const site =
+ (protocol === 'https:' && port === 443) || (protocol === 'http:' && port === 80)
+ ? `${window.location.protocol}//${window.location.hostname}`
+ : `${window.location.protocol}//${window.location.hostname}:${window.location.port}`
+ const urls = {
+ a: `${site}${patternUrlFromState(state, true)}`,
+ b: `${site}${patternUrlFromState(state, false)}`,
+ }
+
+ const exportProps = {
+ design: props.design,
+ Design: props.Design,
+ ui: props.state.ui,
+ settings: props.state.settings,
+ setLink,
+ setFormat,
+ startLoading: update.startLoading,
+ stopLoading: update.stopLoading,
+ }
+
+ return (
+ <>
+
+
+
Export Pattern
+
Share your pattern
+
If you merely want to share your pattern with others, you can copy these URLs:
+
+
+ Pattern and Measurements
+
+
+ Pattern only
+
+
+
+
+ Explain these buttons
+
+
+
Pattern and Measurements
+
+ Use the Pattern and Measurements URL to share this pattern exactly as-is,
+ including the measurements used to generate it:
+
+
+ {urls.a}
+
+
+
+ Use this to allow others to troubleshoot your pattern.
+
+
Pattern only
+
+ Use the Pattern only to share this pattern as-is, but without measurements:
+
+
+ {urls.b}
+
+
+
+ Use this to allow others to recreate this pattern for themselves.
+
+
+
+
Export for printing
+
You can export your pattern in a variety of page formats for printing:
+
+
+
ISO paper sizes
+ {['a4', 'a3', 'a2', 'a1', 'a0'].map((format) => (
+
exportPattern({ ...exportProps, format })}
+ >
+
+ {format} PDF
+
+ ))}
+
+
+
Other paper sizes
+ {['letter', 'legal', 'tabloid'].map((format) => (
+
exportPattern({ ...exportProps, format })}
+ >
+
+ {format} PDF
+
+ ))}
+
+
+
Export for editing
+
+ We recommend SVG for editing, but we also provide a full-sized PDF if you prefer that.
+
+
+ {['svg', 'pdf'].map((format) => (
+ exportPattern({ ...exportProps, format })}
+ >
+
+ {format}
+
+ ))}
+
+
Export as code
+
This is all you need to reconstruct this pattern using FreeSewing' software:
+
+ {['json', 'yaml'].map((format) => (
+ exportPattern({ ...exportProps, format })}
+ >
+
+ {format}
+
+ ))}
+
+
+ >
+ )
+}
+
+export function exportPattern(props) {
+ if (props.setLink) props.setLink(false)
+ if (props.setFormat) props.setFormat(props.format)
+
+ handleExport({
+ ...props,
+ onComplete: (e) => (e.data?.link ? props.setLink(e.data.link) : null),
+ onError: (e) => (e.data?.error ? props.stopLoading('export', e.data.error.message) : null),
+ })
+}
diff --git a/packages/react/components/Editor/components/views/InspectView.mjs b/packages/react/components/Editor/components/views/InspectView.mjs
new file mode 100644
index 00000000000..f215bdf174a
--- /dev/null
+++ b/packages/react/components/Editor/components/views/InspectView.mjs
@@ -0,0 +1,78 @@
+// Dependencies
+import React, { useContext } from 'react'
+import { draft, missingMeasurements, bundlePatternTranslations } from '../../lib/index.mjs'
+// Context
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Components
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { Null } from '@freesewing/react/components/Null'
+import { ZoomablePattern } from '../ZoomablePattern.mjs'
+import { PatternLayout } from '../PatternLayout.mjs'
+import { Xray } from '@freesewing/react/components/Xray'
+
+/**
+ * The inspect view allows users to inspect their pattern
+ *
+ * @param (object) props - All the props
+ * @param {function} props.config - The editor configuration
+ * @param {function} props.Design - The design constructor
+ * @param {array} props.missingMeasurements - List of missing measurements for the current design
+ * @param {object} props.state - The ViewWrapper state object
+ * @param {object} props.state.settings - The current settings
+ * @param {object} props.update - Helper object for updating the ViewWrapper state
+ * @return {function} DraftView - React component
+ */
+export const InspectView = ({ Design, state, update, config }) => {
+ const { setModal, clearModal, modalContent } = useContext(ModalContext)
+
+ const info = {
+ set: (info) => setModal({info} ),
+ clear: clearModal,
+ }
+
+ /*
+ * Don't trust that we have all measurements
+ *
+ * We do not need to change the view here. That is done in the central
+ * ViewWrapper componenet. However, checking the measurements against
+ * the design takes a brief moment, so this component will typically
+ * render before that happens, and if measurements are missing it will
+ * throw and error.
+ *
+ * So when measurements are missing, we just return here and the view
+ * will switch on the next render loop.
+ */
+ if (missingMeasurements(state)) return
+
+ /*
+ * First, attempt to draft
+ */
+ const { pattern } = draft(Design, state.settings)
+
+ /*
+ * Create object holding strings for translation
+ */
+ const strings = bundlePatternTranslations(pattern.designConfig.data.id)
+
+ const renderProps = pattern.getRenderProps()
+ const output = (
+ <>
+
+
+
+ {modalContent}
+ >
+ )
+
+ return
+}
diff --git a/packages/react/components/Editor/components/views/LayoutView.mjs b/packages/react/components/Editor/components/views/LayoutView.mjs
new file mode 100644
index 00000000000..091c64f8a16
--- /dev/null
+++ b/packages/react/components/Editor/components/views/LayoutView.mjs
@@ -0,0 +1,40 @@
+// Dependencies
+import React from 'react'
+import { defaultPrintSettings } from '../../lib/export/index.mjs'
+import { tilerPlugin } from '../../lib/export/plugin-tiler.mjs'
+import { get } from '@freesewing/utils'
+import { draft } from '../../lib/index.mjs'
+// Components
+import { PatternLayout } from '../PatternLayout.mjs'
+import { MovablePattern } from '../MovablePattern.mjs'
+
+export const LayoutView = (props) => {
+ const { config, state, update, Design } = props
+ const { ui, settings } = state
+ const defaultSettings = defaultPrintSettings(settings?.units)
+
+ // Settings for the tiler plugin
+ const pageSettings = {
+ ...defaultSettings,
+ ...get(state.ui, 'layout', {}),
+ }
+
+ /*
+ * Now draft the pattern
+ */
+ const { pattern, failure, errors } = draft(Design, settings, [tilerPlugin(pageSettings)])
+ if (failure) return Draft failed. FIXME: Handle this gracefully.
+
+ const output = (
+
+ )
+
+ return
+}
diff --git a/packages/react/components/Editor/components/views/LogView.mjs b/packages/react/components/Editor/components/views/LogView.mjs
new file mode 100644
index 00000000000..a0fa4d50d3c
--- /dev/null
+++ b/packages/react/components/Editor/components/views/LogView.mjs
@@ -0,0 +1,64 @@
+// Dependencies
+import { draft } from '../../lib/index.mjs'
+// Hooks
+import React from 'react'
+// Components
+import Markdown from 'react-markdown'
+import { H1, H3 } from '@freesewing/react/components/Heading'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+import { Tabs, Tab } from '@freesewing/react/components/Tab'
+
+// The log levels
+const levels = ['error', 'warn', 'info', 'debug']
+
+/**
+ * This is the log view, it shows the pattern logs
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ */
+export const LogView = (props) => {
+ const { state, config, update } = props
+ const { pattern } = draft(props.Design, state.settings)
+
+ return (
+ <>
+
+
+
Pattern Logs
+
+
+ {levels.map((level) => (
+
+ {pattern.setStores[0].logs[level].length > 0 ? (
+ <>
+
{level}
+ {pattern.setStores[0].logs[level].map((line, i) => (
+ {line}
+ ))}
+ >
+ ) : null}
+
+ ))}
+
+
+ {levels.map((level) => (
+
+ {pattern.store.logs[level].length > 0 ? (
+ <>
+
{level}
+ {pattern.store.logs[level].map((line, i) => (
+ {line}
+ ))}
+ >
+ ) : null}
+
+ ))}
+
+
+
+ >
+ )
+}
diff --git a/packages/react/components/Editor/components/views/MeasurementsView.mjs b/packages/react/components/Editor/components/views/MeasurementsView.mjs
new file mode 100644
index 00000000000..58f7819cf14
--- /dev/null
+++ b/packages/react/components/Editor/components/views/MeasurementsView.mjs
@@ -0,0 +1,268 @@
+// Dependencies
+import { designMeasurements } from '../../lib/index.mjs'
+import { capitalize, horFlexClasses as horFlexClasses } from '@freesewing/utils'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+// Hooks
+import React, { Fragment, useState, useEffect } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Popout } from '@freesewing/react/components/Popout'
+import { NumberInput } from '@freesewing/react/components/Input'
+import {
+ BookmarkIcon,
+ CuratedMeasurementsSetIcon,
+ EditIcon,
+ MeasurementsSetIcon,
+ FingerprintIcon,
+} from '@freesewing/react/components/Icon'
+import { Accordion } from '../Accordion.mjs'
+import { MeasurementsEditor } from '../MeasurementsEditor.mjs'
+import { BookmarkedSetPicker, CuratedSetPicker, UserSetPicker } from '../Set.mjs'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+import { H1, H5 } from '@freesewing/react/components/Heading'
+
+const iconClasses = {
+ className: 'tw-w-8 tw-h-8 md:tw-w-10 md:tw-h-10 lg:tw-w-12 lg:tw-h-12 tw-shrink-0',
+ stroke: 1.5,
+}
+
+/**
+ * The measurements view is loaded to update/set measurements
+ *
+ * It will be automatically loaded if we do not have all required measurements for a design.
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Function} props.Design - The design constructor
+ * @param {Array} props.missingMeasurements - List of missing measurements for the current design
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ * @return {Function} MeasurementsView - React component
+ */
+export const MeasurementsView = ({
+ config,
+ Design,
+ missingMeasurements,
+ state,
+ update,
+ design,
+}) => {
+ /*
+ * If there is no view set, completing measurements will switch to the view picker
+ * Which is a bit confusing. So in this case, set the view to measurements.
+ */
+ useEffect(() => {
+ if (!config?.views || !config.views.includes(state.view)) update.view('measurements')
+ if (state._.missingMeasurements && state._.missingMeasurements.length > 0)
+ update.notify(
+ {
+ msg: 'To generate this pattern, we need some additional measurements',
+ icon: 'tip',
+ },
+ 'missingMeasurements'
+ )
+ else update.notifySuccess(`We have all measurements to draft ${capitalize(design)}`)
+ }, [state.view, update])
+
+ const loadMeasurements = (set) => {
+ update.settings(['measurements'], designMeasurements(Design, set.measies))
+ update.settings(['units'], set.imperial ? 'imperial' : 'metric')
+ // Save the measurement set name to pattern settings
+ if (set.nameEn)
+ // Curated measurement set
+ update.settings(['metadata'], { setName: set.nameEn })
+ else if (set.name)
+ // User measurement set
+ update.settings(['metadata'], { setName: set.name })
+ update.notifySuccess(
+
+ Measurements loaded
+ update.view('draft')}
+ >
+ Load Draft View
+
+
+ )
+ }
+
+ // Construct accordion items based on the editor configuration
+ const items = []
+ if (config.enableBackend)
+ items.push(
+ [
+
+
+
Choose one of your own measurements sets
+
+
+
+ Pick any of your own measurements sets that have all required measurements to generate
+ this pattern.
+
+ ,
+ ,
+ 'ownSets',
+ ],
+ [
+
+
+
Choose one of the measurements sets you have bookmarked
+
+
+
+ If you have bookmarked any measurements sets, you can select from those too.
+
+ ,
+ ,
+ 'bmSets',
+ ],
+ [
+
+
+
Choose one of FreeSewing's curated measurements sets
+
+
+
+ If you're just looking to try out our platform, you can select from our list of
+ curated measurements sets.
+
+ ,
+ ,
+ 'csets',
+ ],
+ [
+
+
+
Load a measurements set by ID
+
+
+
+ If you know the ID of a measurements set — either one of your own or a public set — we
+ can load it for you.
+
+ ,
+ ,
+ 'setid',
+ ]
+ )
+ // Manual editing is always an option
+ items.push([
+
+
+
Edit measurements by hand
+
+
+ You can manually set or override measurements below.
+ ,
+ ,
+ 'edit',
+ ])
+
+ return (
+ <>
+
+
+
Measurements
+ {missingMeasurements && missingMeasurements.length > 0 ? (
+
+
+ To generate this pattern, we need {missingMeasurements.length} additional measurement
+ {missingMeasurements.length === 1 ? '' : 's'}:
+
+
+ {missingMeasurements.map((m, i) => (
+
+ {i > 0 ? , : null}
+ {measurementsTranslations[m]}
+
+ ))}
+
+
+ ) : (
+
+ We have all required measurements to draft this pattern
+
+ update.view('draft')}
+ >
+ Draft Pattern
+
+ update.view('picker')}
+ >
+ Choose a different view
+
+
+
+ )}
+ {items.length > 1 ?
: items}
+
+ >
+ )
+}
+
+const LoadMeasurementsSetById = ({ loadMeasurements, update }) => {
+ const backend = useBackend()
+ const [id, setId] = useState('')
+
+ return (
+
+
+ Number(val) == val}
+ />
+ loadMeasurementsSet(id, backend, loadMeasurements, update)}
+ >
+ Load set
+
+
+
+ )
+}
+
+async function loadMeasurementsSet(id, backend, loadMeasurements, update) {
+ update.startLoading('getset', {
+ msg: 'Loading measurements set from the FreeSewing backend',
+ icon: 'spinner',
+ })
+ const result = await backend.getSet(id)
+ if (result[0] === 200 && result[1].set) {
+ loadMeasurements(result[1].set)
+ update.clearLoading()
+ update.notifySuccess(
+
+ Measurements set loaded
+ update.view('draft')}
+ >
+ Load Draft View
+
+
+ )
+ } else {
+ update.clearLoading()
+ update.notifyFailure('Failed to load measurements set', 'getsetko')
+ }
+}
diff --git a/packages/react/components/Editor/components/views/SaveView.mjs b/packages/react/components/Editor/components/views/SaveView.mjs
new file mode 100644
index 00000000000..6a001478a45
--- /dev/null
+++ b/packages/react/components/Editor/components/views/SaveView.mjs
@@ -0,0 +1,181 @@
+// Dependencies
+import yaml from 'js-yaml'
+import { capitalize, shortDate, notEmpty } from '@freesewing/utils'
+import { linkClasses } from '@freesewing/utils'
+// Hooks
+import React, { useState } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { RoleBlock } from '@freesewing/react/components/Role'
+import { Popout } from '@freesewing/react/components/Popout'
+import { StringInput } from '@freesewing/react/components/Input'
+import { SaveAsIcon } from '@freesewing/react/components/Icon'
+import { H1 } from '@freesewing/react/components/Heading'
+import { Link, SuccessLink } from '@freesewing/react/components/Link'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+
+/**
+ * This is the save view, it allows you to save your pattern to a FreeSewing account
+ *
+ * @param {Object} props - All the props
+ * @param {Function} props.config - The editor configuration
+ * @param {Object} props.state - The editor state object
+ * @param {Object} props.update - Helper object for updating the editor state
+ */
+export const SaveView = ({ config, state, update }) => {
+ // Hooks
+ const backend = useBackend()
+
+ // State
+ const [name, setName] = useState(`${capitalize(state.design)} / ${shortDate()}`)
+ const [withNotes, setWithNotes] = useState(false)
+ const [notes, setNotes] = useState('')
+ const [savedId, setSavedId] = useState()
+ const [saveAs] = useState(false) // FIXME
+
+ const addSettingsToNotes = () => {
+ setNotes(notes + '\n\n#### Settings\n\n```yaml\n' + yaml.dump(state.settings) + '\n````')
+ }
+
+ const saveAsNewPattern = async () => {
+ const loadingId = 'savePatternAs'
+ update.startLoading(loadingId)
+ const patternData = {
+ design: state.design,
+ name,
+ public: false,
+ settings: state.settings,
+ data: {},
+ }
+ if (withNotes) patternData.notes = notes
+ const result = await backend.createPattern(patternData)
+ if (result[0] === 201 && result[1].pattern.id) {
+ const id = result[1].pattern.id
+ update.stopLoading(loadingId)
+ update.view('draft')
+ update.pid(id)
+ update.notifySuccess(
+
+ {' '}
+ Pattern saved as:{' '}
+ #{id}
+ ,
+ id
+ )
+ } else update.notifyFailure('oops', loadingId)
+ }
+
+ const savePattern = async () => {
+ setLoadingStatus([true, 'Saving pattern...'])
+ const patternData = {
+ design: state.design,
+ settings: state.settings,
+ name,
+ public: false,
+ data: {},
+ }
+ const result = await backend.updatePattern(saveAs.pattern, patternData)
+ if (result.success) {
+ //setLoadingStatus([
+ // true,
+ // <>
+ // {t('status:patternSaved')} [#{saveAs.pattern}]
+ // >,
+ // true,
+ // true,
+ //])
+ setSavedId(saveAs.pattern)
+ update.notify({ color: 'success', msg: 'boom' }, saveAs.pattern)
+ } //else setLoadingStatus([true, 'backendError', true, false])
+ }
+
+ return (
+
+
+
+ {saveAs && saveAs.pattern ? (
+ <>
+
Save Pattern
+ {savedId && (
+
+ Pattern Saved
+ See: /account/patterns/{savedId}
+
+ )}
+
+
+ Save Patter #{saveAs.pattern}
+
+ >
+ ) : null}
+
Save As New Pattern
+
+
+ {withNotes ? (
+
+ setWithNotes(false)}
+ >
+ Hide notes
+
+
+ Add settings to notes
+
+
+ ) : (
+ setWithNotes(true)}
+ >
+ Add notes
+
+ )}
+ >
+ }
+ />
+ {withNotes ? (
+
+ ) : null}
+
+
+ Cancel
+
+
+
+ Save as new pattern
+
+
+
+ To access your saved patterns, go to:
+
+ {' '}
+ /account/patterns
+
+
+
+
+
+ )
+}
diff --git a/packages/react/components/Editor/components/views/TestView.mjs b/packages/react/components/Editor/components/views/TestView.mjs
new file mode 100644
index 00000000000..66dc667effc
--- /dev/null
+++ b/packages/react/components/Editor/components/views/TestView.mjs
@@ -0,0 +1,206 @@
+// Dependencies
+import React, { useMemo } from 'react'
+import {
+ sample,
+ missingMeasurements,
+ menuDesignOptionsStructure,
+ bundlePatternTranslations,
+} from '../../lib/index.mjs'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+import { orderBy } from '@freesewing/utils'
+// Components
+import { Null } from '@freesewing/react/components/Null'
+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'
+
+/**
+ * The test view allows users to test options and measurements
+ *
+ * @param (object) props - All the props
+ * @param {function} props.config - The editor configuration
+ * @param {function} props.Design - The design constructor
+ * @param {array} props.missingMeasurements - List of missing measurements for the current design
+ * @param {object} props.state - The ViewWrapper state object
+ * @param {object} props.state.settings - The current settings
+ * @param {object} props.update - Helper object for updating the ViewWrapper state
+ * @return {function} DraftView - React component
+ */
+export const TestView = ({ Design, state, update, config }) => {
+ /*
+ * Don't trust that we have all measurements
+ *
+ * We do not need to change the view here. That is done in the central
+ * ViewWrapper componenet. However, checking the measurements against
+ * the design takes a brief moment, so this component will typically
+ * render before that happens, and if measurements are missing it will
+ * throw and error.
+ *
+ * So when measurements are missing, we just return here and the view
+ * will switch on the next render loop.
+ */
+ if (missingMeasurements(state)) return
+
+ const { settings } = state
+ if (settings.sample) {
+ /*
+ * When testing/sampling one design, and then switching the editor to a different design,
+ * we run the risk that settings.sample holds invalid configuration. Like testing an unused
+ * measurement, or non-existing option.
+ * So here we try to check for that and only test/sample if things make sense
+ */
+ if (
+ (settings.sample.type === 'option' &&
+ Object.keys(Design.patternConfig.options).includes(settings.sample.option)) ||
+ (settings.sample.type === 'measurement' &&
+ [
+ ...Design.patternConfig.measurements,
+ ...Design.patternConfig.optionalMeasurements,
+ ].includes(settings.sample.measurement)) ||
+ settings.sample.type === 'models'
+ ) {
+ const { pattern } = sample(Design, settings)
+ const renderProps = pattern.getRenderProps()
+ const strings = bundlePatternTranslations(pattern.designConfig.data.id)
+ const output = (
+
+ )
+
+ return
+ } else console.log('Not sampling', settings.sample)
+ }
+
+ // Translated measurements
+ const trm = orderBy(
+ Design.patternConfig.measurements.map((m) => ({ m, t: measurementsTranslations[m] })),
+ 't',
+ 'ASC'
+ )
+ const tom = orderBy(
+ Design.patternConfig.optionalMeasurements.map((m) => ({ m, t: measurementsTranslations[m] })),
+ 't',
+ 'ASC'
+ )
+
+ return (
+ <>
+
+
+
Test Pattern
+
+
+
Test Design Options
+
+
+ {trm.length > 0 ? (
+
+
Test Measurements
+
Required Measurements
+
+ {trm.map(({ t, m }) => (
+
+ update.settings(['sample'], { type: 'measurement', measurement: m })
+ }
+ >
+ {t}
+
+ ))}
+
+ {tom.length > 0 ? (
+
+
Optional Measurements
+
+ {tom.map(({ t, m }) => (
+
+ update.settings(['sample'], { type: 'measurement', measurement: m })
+ }
+ >
+ {t}
+
+ ))}
+
+
+ ) : null}
+
+ ) : null}
+
+
+ >
+ )
+}
+
+const SampleOptionsMenu = ({ Design, state, update }) => {
+ const structure = useMemo(
+ () =>
+ menuDesignOptionsStructure(
+ Design.designConfig.data.id,
+ Design.patternConfig.options,
+ state.settings
+ ),
+ [Design.designConfig.data.id, Design.patternConfig, state.settings]
+ )
+
+ return
+}
+
+const SampleOptionsSubMenu = ({ structure, update, level = 1 }) => {
+ const output = []
+ /*
+ * Show entries alphabetic, but force groups last, and advanced last among them
+ */
+ const titles = Object.keys(structure)
+ .filter((key) => key !== 'isGroup')
+ .sort()
+ const order = [
+ ...titles.filter((key) => key !== 'advanced'),
+ ...titles.filter((key) => key === 'advanced'),
+ ]
+ // Non-groups first
+ for (const name of order) {
+ const struct = structure[name]
+ if (!struct.isGroup)
+ output.push(
+ update.settings(['sample'], { type: 'option', option: name })}
+ >
+ {struct.title}
+
+ )
+ }
+ // Then groups
+ for (const name of order) {
+ const struct = structure[name]
+ if (struct.isGroup) {
+ output.push(
+
+ {name}
+
+ )
+ output.push(
+
+ )
+ }
+ }
+
+ return {output}
+}
diff --git a/packages/react/components/Editor/components/views/TimingView.mjs b/packages/react/components/Editor/components/views/TimingView.mjs
new file mode 100644
index 00000000000..f5d0d581d99
--- /dev/null
+++ b/packages/react/components/Editor/components/views/TimingView.mjs
@@ -0,0 +1,148 @@
+// Dependencies
+import React, { useState, useEffect } from 'react'
+import * as echarts from 'echarts'
+import { timingPlugin } from '@freesewing/plugin-timing'
+// Components
+import { ChartWrapper } from '@freesewing/react/components/Echart'
+import { DraftView } from './DraftView.mjs'
+
+/**
+ * The timing view is the draft view with an extra timing header
+ *
+ * @param (object) props - All the props
+ * @return {React.component} TimingView - React component
+ */
+export const TimingView = (props) => (
+
+)
+
+const PluginOutput = (props) => (
+
+)
+
+const TimingHeader = ({ timing, parts }) => {
+ const [data, setData] = useState([])
+
+ useEffect(() => setData([...data, timing]), [timing])
+ const opt = option(parts, data, timing.draft.took, setData)
+
+ return data.length > 0 ? (
+
+
+
+ ) : null
+}
+
+const resolveColor = (color) => {
+ const [c, i] = color.split('-')
+
+ return tailwindColors[c][i]
+}
+
+const getColor = (i, colors) =>
+ new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ { offset: 0, color: resolveColor(colors[i % colors.length]) + 'dd' },
+ { offset: 1, color: resolveColor(colors[i % colors.length]) },
+ ])
+
+const timeScore = (took) => {
+ if (took < 25) return 'Very Fast'
+ if (took < 50) return 'Fast'
+ if (took < 75) return 'OK'
+ if (took < 100) return 'Slow'
+
+ return 'Too Slow'
+}
+
+const option = (parts, data, took, setData) => ({
+ //color: colors.map((color) => resolveColor(color)),
+ title: {
+ text: `Timing of most recent draft: ${timeScore(took)}`,
+ left: 'center',
+ },
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross',
+ label: {
+ backgroundColor: 'transparent',
+ },
+ },
+ },
+ toolbox: {
+ feature: {
+ saveAsImage: {},
+ dataView: {
+ backgroundColor: 'var(--pattern-bg)',
+ textareaColor: 'transparent',
+ textColor: 'currentColor',
+ buttonColor: 'transparent',
+ buttonTextColor: 'currentColor',
+ },
+ magicType: {
+ type: ['line', 'bar', 'stack'],
+ },
+ myClearData: {
+ show: true,
+ title: 'Clear timing data',
+ icon: 'path://M12 9.75 14.25 12m0 0 2.25 2.25M14.25 12l2.25-2.25M14.25 12 12 14.25m-2.58 4.92-6.374-6.375a1.125 1.125 0 0 1 0-1.59L9.42 4.83c.21-.211.497-.33.795-.33H19.5a2.25 2.25 0 0 1 2.25 2.25v10.5a2.25 2.25 0 0 1-2.25 2.25h-9.284c-.298 0-.585-.119-.795-.33Z',
+ onclick: function () {
+ setData([])
+ },
+ },
+ },
+ },
+ graphic: [
+ {
+ type: 'image',
+ right: 35,
+ top: 72,
+ z: 1,
+ style: {
+ image: '/img/logo.svg',
+ width: 75,
+ height: 75,
+ opacity: 0.25,
+ },
+ },
+ ],
+ legend: {
+ data: parts,
+ bottom: '0',
+ },
+ grid: {
+ left: '1%',
+ right: '1%',
+ bottom: '12%',
+ containLabel: true,
+ },
+ xAxis: [
+ {
+ type: 'category',
+ boundaryGap: false,
+ data: data.map((d, i) => i + 1),
+ },
+ ],
+ yAxis: [{ type: 'value' }],
+ series: parts.map((name, i) => ({
+ name,
+ type: 'line',
+ stack: 'Total',
+ smooth: true,
+ lineStyle: {
+ width: 0,
+ },
+ showSymbol: false,
+ areaStyle: {
+ opacity: 0.8,
+ //color: 'red',
+ },
+ emphasis: {
+ focus: 'series',
+ },
+ data: data.map((render) => (render.parts[name].took ? render.parts[name].took : 0)),
+ })),
+})
diff --git a/packages/react/components/Editor/components/views/UndosView.mjs b/packages/react/components/Editor/components/views/UndosView.mjs
new file mode 100644
index 00000000000..2bf46160a13
--- /dev/null
+++ b/packages/react/components/Editor/components/views/UndosView.mjs
@@ -0,0 +1,140 @@
+import React from 'react'
+import { orderBy } from '@freesewing/utils'
+import { ButtonFrame } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { UndoIcon, LeftIcon } from '@freesewing/react/components/Icon'
+import { HeaderMenu } from '../HeaderMenu.mjs'
+import { H1 } from '@freesewing/react/components/Heading'
+import { MiniTip } from '@freesewing/react/components/Mini'
+
+import { getUndoStepData } from '../../lib/index.mjs'
+
+/**
+ * The undos view shows the undo history, and allows restoring any undo state
+ *
+ * @param (object) props - All the props
+ * @param {object} designs - Object holding all designs
+ * @param {object} update - ViewWrapper state update object
+ */
+export const UndosView = ({ Design, update, state, config }) => {
+ const steps = orderBy(state._.undos, 'time', 'desc')
+
+ return (
+ <>
+
+
+
Undo History
+
Time-travel through your recent pattern changes.
+ {steps.length < 1 ? (
+
+ Your undo history is currently empty
+ When you make changes to your pattern, they will show up here.
+ For example, you can click the button below to change the pattern rotation:
+ update.settings('ui.rotate', state.settings?.ui?.rotate ? 0 : 1)}
+ >
+ Example: Rotate pattern
+
+ As soon as you do, the change will show up here, and you can undo it.
+
+ ) : (
+ <>
+
+ Click on any change to undo all changes up to, and including, that change.
+
+
+ {steps.map((step, index) => (
+
+ ))}
+
+ >
+ )}
+
+ >
+ )
+}
+
+export const UndoStepTimeAgo = ({ step }) => {
+ if (!step.time) return null
+ const secondsAgo = Math.floor((Date.now() - step.time) / 100) / 10
+ const minutesAgo = Math.floor(secondsAgo / 60)
+ const hoursAgo = Math.floor(minutesAgo / 60)
+
+ return hoursAgo ? (
+ {hoursAgo} hours ago
+ ) : minutesAgo ? (
+ {minutesAgo} minutes ago
+ ) : (
+ {secondsAgo} seconds ago
+ )
+}
+
+export const UndoStep = ({ update, state, step, Design, compact = false, index = 0 }) => {
+ /*
+ * Ensure path is always an array
+ */
+ if (!Array.isArray(step.path)) step.path = step.path.split('.')
+
+ /*
+ * Figure this out once
+ */
+ const imperial = state.settings?.units === 'imperial' ? true : false
+
+ /*
+ * Metadata can be ignored
+ */
+ if (step.name === 'settings' && step.path[1] === 'metadata') return null
+
+ /*
+ * Defer for anything else to this method
+ */
+ const data = getUndoStepData({ step, state, Design, imperial })
+
+ if (data === false) return null //{JSON.stringify(step, null, 2)} //null
+ if (data === null) return Unsupported
+
+ if (compact)
+ return (
+ update.restore(index, state._)}>
+
+
+ {data.msg ? data.msg : data.title}
+
+
+ )
+
+ 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}
+
+ >
+ )}
+
+
+ >
+ )
+}
diff --git a/packages/react/components/Editor/components/views/ViewPicker.mjs b/packages/react/components/Editor/components/views/ViewPicker.mjs
new file mode 100644
index 00000000000..ba8e351670f
--- /dev/null
+++ b/packages/react/components/Editor/components/views/ViewPicker.mjs
@@ -0,0 +1,114 @@
+import React, { useState } from 'react'
+import { defaultConfig as config } from '../../config/index.mjs'
+import { viewIcons, viewLabels } from './index.mjs'
+// Components
+import { Popout } from '@freesewing/react/components/Popout'
+import { H2, H4, H5 } from '@freesewing/react/components/Heading'
+
+/**
+ * The design view is loaded if and only if not design is passed to the editor
+ *
+ * @param (object) props - All the props
+ * @param {object} designs - Object holding all designs
+ * @param {object} update - ViewWrapper state update object
+ */
+export const ViewPicker = ({ Design, update, state }) => {
+ const [showDev, setShowDev] = useState(false)
+
+ /*
+ * If we don't have the measurements, only present measurements free views
+ */
+ if (state._.missingMeasurements.length > 1)
+ return (
+
+
Choose a view
+
+ {config.measurementsFreeViews
+ .filter((view) => view !== 'picker')
+ .map((view) => (
+
+ ))}
+
+
+
pe:measurementsFreeViewsOnly.t:
+
pe:measurementsFreeViewsOnly.d
+
+
+
+
+ )
+
+ return (
+
+
Choose an Editor View
+
+ {config.mainViews.map((view) => (
+
+ ))}
+
+
+ {config.extraViews.map((view) => (
+
+ ))}
+
+ {showDev || state.ui.ux > 3 ? (
+
+ {config.devViews.map((view) => (
+
+ ))}
+
+ ) : null}
+ {state.ui.ux < 4 ? (
+
setShowDev(!showDev)}
+ >
+ {showDev ? 'Hide' : 'Show'} Advanced Views
+
+ ) : null}
+
+ )
+}
+
+const MainCard = ({ view, update, Design }) => {
+ const Icon = viewIcons[view]
+
+ return (
+ update.view(view)}
+ >
+
+
+ {viewLabels[view].t}
+
+
+
+
+ {viewLabels[view].d}
+
+
+ )
+}
+
+const ExtraCard = ({ view, update }) => {
+ const Icon = viewIcons[view]
+ return (
+ update.view(view)}
+ >
+
+
+ {viewLabels[view].t}
+
+
+
+ {viewLabels[view].d}
+
+ )
+}
diff --git a/packages/react/components/Editor/components/views/index.mjs b/packages/react/components/Editor/components/views/index.mjs
new file mode 100644
index 00000000000..0b4c3c36254
--- /dev/null
+++ b/packages/react/components/Editor/components/views/index.mjs
@@ -0,0 +1,144 @@
+import React from 'react'
+import { ViewPicker } from './ViewPicker.mjs'
+import { DesignsView } from './DesignsView.mjs'
+import { MeasurementsView } from './MeasurementsView.mjs'
+import { DraftView } from './DraftView.mjs'
+import { InspectView } from './InspectView.mjs'
+import { SaveView } from './SaveView.mjs'
+import { ExportView } from './ExportView.mjs'
+import { UndosView } from './UndosView.mjs'
+import { LayoutView } from './LayoutView.mjs'
+import { DocsView } from './DocsView.mjs'
+import { LogView } from './LogView.mjs'
+import { TestView } from './TestView.mjs'
+import { TimingView } from './TimingView.mjs'
+import { EditSettingsView } from './EditSettingsView.mjs'
+import {
+ OptionsIcon,
+ MeasurementsIcon,
+ BeakerIcon,
+ GaugeIcon,
+ PrintIcon,
+ SaveIcon,
+ ExportIcon,
+ EditIcon,
+ FixmeIcon,
+ ListIcon,
+ XrayIcon,
+ DocsIcon,
+ DesignIcon,
+ UiIcon,
+ BackIcon,
+} from '@freesewing/react/components/Icon'
+
+/*
+ * A lookup table for view icons
+ */
+export const viewIcons = {
+ draft: OptionsIcon,
+ measurements: MeasurementsIcon,
+ test: BeakerIcon,
+ timing: GaugeIcon,
+ layout: PrintIcon,
+ save: SaveIcon,
+ export: ExportIcon,
+ editSettings: EditIcon,
+ logs: ListIcon,
+ inspect: XrayIcon,
+ docs: DocsIcon,
+ designs: DesignIcon,
+ picker: UiIcon,
+ undos: BackIcon,
+}
+
+/*
+ * This returns a view-specific component
+ */
+export const View = (props) => {
+ const { view } = props
+
+ if (view === 'designs') return
+ if (view === 'measurements') return
+ if (view === 'draft') return
+ if (view === 'save') return
+ if (view === 'export') return
+ if (view === 'undos') return
+ if (view === 'layout') return
+ if (view === 'docs') return
+ if (view === 'editSettings') return
+ if (view === 'inspect') return
+ if (view === 'logs') return
+ if (view === 'test') return
+ if (view === 'timing') return
+ if (view === 'picker') return
+
+ return No view component for view {props.view}
+}
+
+/*
+ * This returns a view-specific icon
+ */
+export const ViewIcon = ({ view, className = 'tw-w-6 tw-h-6' }) => {
+ const Icon = viewIcons[view] || FixmeIcon
+
+ return
+}
+
+export const viewLabels = {
+ draft: {
+ t: 'Draft Pattern',
+ d: 'Choose this if you are not certain what to pick',
+ },
+ measurements: {
+ t: 'Pattern Measurements',
+ d: 'Update or load measurements to generate a pattern for',
+ },
+ test: {
+ t: 'Test Design',
+ d: 'See how different options or changes in measurements influence the design',
+ },
+ timing: {
+ t: 'Time Design',
+ d: 'Shows detailed timing of the pattern being drafted, allowing you to find bottlenecks in performance',
+ },
+ layout: {
+ t: 'Pattern Layout',
+ d: 'Organize your pattern parts to minimize paper use',
+ },
+ save: {
+ t: 'Save pattern as...',
+ d: 'Save the changes to this pattern in your account, or save it as a new pattern',
+ },
+ export: {
+ t: 'Export Pattern',
+ d: 'Export this pattern into a variety of formats',
+ },
+ editSettings: {
+ t: 'Edit settings by hand',
+ d: "Throw caution to the wind, and hand-edit the pattern's settings",
+ },
+ logs: {
+ t: 'Pattern Logs',
+ d: 'Show the logs generated by the pattern, useful to troubleshoot problems',
+ },
+ inspect: {
+ t: 'Pattern inspector',
+ d: "Load the pattern in the inspector, giving you in-depth info about a pattern's components",
+ },
+ docs: {
+ t: 'Documentation',
+ d: 'More information and links to documentation',
+ },
+ designs: {
+ t: 'Choose a different Design',
+ d: 'Select a different design from the collection',
+ },
+ picker: {
+ t: 'Choose a different view',
+ d: 'fixme',
+ },
+ undos: {
+ t: 'Undo History',
+ d: 'Time-travel through your recent pattern changes',
+ },
+}
diff --git a/packages/react/components/Editor/config/index.mjs b/packages/react/components/Editor/config/index.mjs
new file mode 100644
index 00000000000..75ea3f3c9b4
--- /dev/null
+++ b/packages/react/components/Editor/config/index.mjs
@@ -0,0 +1,153 @@
+/*
+ * Default configuration for the FreeSewing pattern editor
+ */
+export const defaultConfig = {
+ // Enable use of a (FreeSewing) backend to load data from
+ enableBackend: true,
+ // Link to create a new measurements set, set to false to disable
+ hrefNewSet: '/new/set',
+ // Cloud default image
+ cloudImageDflt:
+ 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/365cc64e-1502-4d2b-60e0-cc8beee73f00/public',
+ // Cloud image base URL
+ cloudImageUrl: 'https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/',
+ // Cloud image variants
+ cloudImageVariants: ['public', 'sq100', 'sq200', 'sq500', 'w200', 'w500', 'w1000', 'w2000'],
+ // Views
+ mainViews: ['draft', 'designs', 'save', 'export'],
+ extraViews: ['measurements', 'undos', 'layout', 'docs'],
+ devViews: ['editSettings', 'inspect', 'logs', 'test', 'timing'],
+ utilViews: ['picker'],
+ measurementsFreeViews: ['designs', 'measurements', 'docs', 'picker'],
+ // View components
+ // Facilitate lookup of view components
+ viewComponents: {
+ draft: 'DraftView',
+ designs: 'DesignsView',
+ save: 'SaveView',
+ export: 'ViewPicker',
+ measurements: 'MeasurementsView',
+ undos: 'UndosView',
+ layout: 'ViewPicker',
+ editSettings: 'ViewPicker',
+ docs: 'ViewPicker',
+ inspect: 'ViewPicker',
+ logs: 'ViewPicker',
+ test: 'ViewPicker',
+ timing: 'ViewPicker',
+ picker: 'ViewPicker',
+ error: 'ViewPicker',
+ },
+ // Facilitate lookup of menu value components
+ menuValueComponents: {
+ bool: 'BoolValue',
+ constant: 'ConstantOptionValue',
+ count: 'CountOptionValue',
+ deg: 'DegOptionValue',
+ list: 'ListOptionValue',
+ mm: 'MmOptionValue',
+ pct: 'PctOptionValue',
+ },
+ menuGroupEmojis: {
+ advanced: '🤓',
+ fit: '👕',
+ style: '💃🏽',
+ dflt: '🕹️',
+ groupDflt: '📁',
+ },
+ menuOptionEditLabels: {
+ pct: '%',
+ count: '#',
+ deg: '°',
+ mm: 'mm',
+ },
+ // i18n
+ i18nPatternNamespaces: ['plugin-annotations'],
+ // State backend (one of 'react', 'storage', 'session', or 'url')
+ stateBackend: 'url',
+ // UX levels
+ uxLevels: {
+ core: {
+ sa: 1,
+ paperless: 2,
+ units: 1,
+ complete: 3,
+ expand: 4,
+ only: 4,
+ scale: 3,
+ margin: 3,
+ },
+ ui: {
+ renderer: 4,
+ aside: 3,
+ kiosk: 3,
+ rotate: 4,
+ ux: 1,
+ },
+ views: {
+ draft: 1,
+ measurements: 1,
+ test: 4,
+ timing: 4,
+ layout: 2,
+ export: 1,
+ save: 1,
+ undos: 2,
+ editSettings: 3,
+ logs: 4,
+ inspect: 4,
+ docs: 1,
+ designs: 1,
+ picker: 1,
+ },
+ },
+ defaultUx: 4,
+ // Flag types
+ flagTypes: ['error', 'warn', 'note', 'info', 'tip', 'fixme'],
+ // Initial state
+ initialState: {
+ settings: {},
+ ui: {
+ renderer: 'react',
+ kiosk: 0,
+ aside: 1,
+ ux: 4,
+ },
+ },
+ roles: {
+ levels: {
+ readNone: 0,
+ readSome: 1,
+ readOnly: 2,
+ writeSome: 3,
+ user: 4,
+ tester: 4,
+ curator: 5,
+ bughunter: 6,
+ support: 8,
+ admin: 9,
+ },
+ base: 'user',
+ },
+ // Ms before to fade out a notification
+ notifyTimeout: 2500,
+ degreeMeasurements: ['shoulderSlope'],
+}
+
+/*
+ * This method returns a merged configuration
+ */
+export const mergeConfig = (config = {}) => {
+ const mergedConfig = {
+ ...defaultConfig,
+ ...config,
+ }
+ mergedConfig.views = [
+ ...mergedConfig.mainViews,
+ ...mergedConfig.extraViews,
+ ...mergedConfig.devViews,
+ ...mergedConfig.utilViews,
+ ]
+
+ return mergedConfig
+}
diff --git a/packages/react/components/Editor/hooks/useEditorState.mjs b/packages/react/components/Editor/hooks/useEditorState.mjs
new file mode 100644
index 00000000000..e5e3c0bb97e
--- /dev/null
+++ b/packages/react/components/Editor/hooks/useEditorState.mjs
@@ -0,0 +1,86 @@
+// Dependenicies
+import { atomWithHash } from 'jotai-location'
+import { stateUpdateFactory } from '../lib/index.mjs'
+// Hooks
+import { useAtom } from 'jotai'
+import { useMemo, useEffect } from 'react'
+
+/*
+ * Set up the atom
+ */
+const urlAtom = atomWithHash('s', {})
+
+/**
+ * Url state backend
+ *
+ * This holds the editor state, using session storage.
+ * It also provides helper methods to manipulate state.
+ *
+ * @params {object} init - Initial pattern settings
+ * @params {function} setEphemeralState - Method to set the ephemeral state
+ * @params {object] config - The editor config
+ * @return {array} return - And array with get, set, and update methods
+ */
+export const useEditorState = (init = {}, setEphemeralState, config) => {
+ const [state, setState] = useAtom(urlAtom)
+
+ const update = useMemo(() => stateUpdateFactory(setState, setEphemeralState, config), [setState])
+
+ /*
+ * Set the initial state
+ */
+ useEffect(() => {
+ // Handle state on a hard reload or cold start
+ if (typeof URLSearchParams !== 'undefined') {
+ try {
+ const data = getHashData()
+ if (typeof data.s === 'object') setState(data.s)
+ else setState(init)
+ } catch (err) {
+ setState(init)
+ }
+ }
+ }, [])
+
+ return [state, setState, update]
+}
+
+/*
+ * Our URL state library does not support storing Javascript objects out of the box.
+ * But it allows us to pass a customer parser to handle them, so this is that parser
+ */
+const pojoParser = {
+ parse: (v) => {
+ let val
+ try {
+ val = JSON.parse(v)
+ } catch (err) {
+ val = null
+ }
+ return val
+ },
+ serialize: (v) => {
+ let val
+ try {
+ val = JSON.stringify(v)
+ } catch (err) {
+ val = null
+ }
+ return val
+ },
+}
+
+function getHashData() {
+ if (!window) return false
+
+ const hash = window.location.hash
+ .slice(1)
+ .split('&')
+ .map((chunk) => chunk.split('='))
+ const data = {}
+ for (const [key, val] of hash) {
+ data[key] = JSON.parse(decodeURIComponent(decodeURI(val)))
+ }
+
+ return data
+}
diff --git a/packages/react/components/Editor/index.mjs b/packages/react/components/Editor/index.mjs
new file mode 100644
index 00000000000..c502d8673e7
--- /dev/null
+++ b/packages/react/components/Editor/index.mjs
@@ -0,0 +1,205 @@
+// Dependencies
+import { designs as collectionDesigns } from '@freesewing/collection'
+import { capitalize, hasRequiredMeasurements } from '@freesewing/utils'
+import { initialEditorState } from './lib/index.mjs'
+import { mergeConfig } from './config/index.mjs'
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useEditorState } from './hooks/useEditorState.mjs'
+// Components
+import { View, viewLabels } from './components/views/index.mjs'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { AsideViewMenu } from './components/AsideViewMenu.mjs'
+import { LoadingStatus } from './components/LoadingStatus.mjs'
+import { ModalContextProvider } from '@freesewing/react/context/Modal'
+import { LoadingStatusContextProvider } from '@freesewing/react/context/LoadingStatus'
+
+/**
+ * FreeSewing's pattern editor
+ *
+ * Editor is the high-level FreeSewing component
+ * that provides the entire pattern editing environment
+ * This is a high-level wrapper that figures out what view to load initially,
+ * and handles state for the pattern, including the view
+ *
+ * @param {object} props - All React props
+ * @param {object} props.config - A configuration object for the editor
+ * @param {object} props.design - A design name to force the editor to use this design
+ * @param {object} props.preload - Any state to preload
+ * @param {function} props.setTitle - A way to set the page title (optional)
+ * @param {object} props.localDesigns - A way to add local designs to the editor (optional)
+ */
+export const Editor = ({
+ config = {},
+ design = false,
+ preload = {},
+ setTitle = false,
+ localDesigns = {},
+}) => {
+ /*
+ * Bundle all designs
+ */
+ const designs = { ...collectionDesigns, ...localDesigns }
+
+ /*
+ * Ephemeral state will not be stored in the state backend
+ * It is used for things like loading state and so on
+ */
+ const [ephemeralState, setEphemeralState] = useState({})
+
+ /*
+ * Merge custom and default configuration
+ */
+ const editorConfig = mergeConfig(config)
+
+ /*
+ * The Editor state is kept in a state backend (URL)
+ */
+ const allState = useEditorState(
+ initialEditorState(preload, config),
+ setEphemeralState,
+ editorConfig
+ )
+
+ const state = allState[0]
+ const update = allState[2]
+
+ /*
+ * If state is not loaded, we return early
+ * However, we cannot return before the useEffect call and we need
+ * the view in the useEffect call which depends on state.
+ * So, if state is not ready, we make sure view is set to false and
+ * then return right after the useEffect code
+ */
+ const [view, extraProps] = state
+ ? viewfinder({ design, designs, preload, state, config: editorConfig })
+ : [false, {}]
+
+ /*
+ * Title is typically kept in state by the parent component
+ * so we should not call it inside the regular render but
+ * in the useEffect hook instead
+ */
+ useEffect(() => {
+ if (typeof setTitle === 'function' && state.design) {
+ setTitle(`${capitalize(state.design)}${viewLabels[view] ? ' | ' + viewLabels[view].t : ''}`)
+ }
+ }, [setTitle, state.design, view])
+
+ /*
+ * Don't bother before state is initialized
+ */
+ if (!state) return
+
+ /*
+ * Pass this down to allow disabling features that require measurements
+ */
+ const { missingMeasurements = [] } = extraProps
+
+ /*
+ * Almost all editor state has a default settings, and when that is selected
+ * we just unset that value in the state. This way, state holds only what is
+ * customized, and it makes it a lot easier to see how a pattern was edited.
+ * The big exception is the 'ui.ux' setting. If it is unset, a bunch of
+ * components will not function properly. We could guard against this by passing
+ * the default to all of these components, but instead, we just check that state
+ * is undefined, and if so pass down the default ux value here.
+ * This way, should more of these exceptions get added over time, we can use
+ * the same centralized solution.
+ * We also ensure that settings is always set to an empty object in case there
+ * are no settings yet, as this avoids having to null-check them everywhere.
+ */
+ const passDownState =
+ state.ui?.ux === undefined
+ ? {
+ settings: {}, // Ensure settings is always set
+ ...state,
+ ui: { ...(state.ui || {}), ux: editorConfig.defaultUx },
+ _: { ...ephemeralState, missingMeasurements },
+ }
+ : {
+ settings: {}, // Ensure settings is always set
+ ...state,
+ _: { ...ephemeralState, missingMeasurements },
+ }
+
+ return (
+
+ {editorConfig.withAside ?
: null}
+
+
+
+
+
+
+
+
+
+ )
+}
+
+/**
+ * Helper method to figure out what view to load
+ * based on the props passed in, and destructure
+ * the props we need for it.
+ *
+ * @param (object) props - All the props
+ * @param {object} props.design - The (name of the) current design
+ * @param {object} props.designs - An object holding all designs
+ * @param (object) props.state - React state passed down from the wrapper view
+ * @param (object) props.config - The editor config
+ */
+const viewfinder = ({ design, designs, state, config }) => {
+ /*
+ * Grab Design from props or state and make them extra props
+ */
+ if (!design && state?.design) design = state.design
+ const Design = designs[design] || false
+ const extraProps = { design, Design }
+
+ /*
+ * If no design is set, return the designs view
+ */
+ if (!designs[design]) return ['designs', extraProps]
+
+ /*
+ * If we have a design, do we have the measurements?
+ */
+ const [measurementsOk, missingMeasurements] = hasRequiredMeasurements(
+ designs[design],
+ state.settings?.measurements
+ )
+ if (missingMeasurements) extraProps.missingMeasurements = missingMeasurements
+
+ /*
+ * Allow all views that do not require measurements before
+ * we force the user to the measurements view
+ */
+ if (state.view && config.measurementsFreeViews.includes(state.view))
+ return [state.view, extraProps]
+
+ /*
+ * Force the measurements view if measurements are missing
+ */
+ if (!measurementsOk) return ['measurements', extraProps]
+
+ /*
+ * If a view is set, return that
+ */
+ if (state.view) return [state.view, extraProps]
+
+ /*
+ * If no obvious view was found, return the view picker
+ */
+ return ['picker', extraProps]
+}
diff --git a/packages/react/components/Editor/lib/core-settings.mjs b/packages/react/components/Editor/lib/core-settings.mjs
new file mode 100644
index 00000000000..f048d0253ee
--- /dev/null
+++ b/packages/react/components/Editor/lib/core-settings.mjs
@@ -0,0 +1,248 @@
+import React from 'react'
+// Dependencies
+import { defaultConfig as config } from '../config/index.mjs'
+import { measurementAsMm } from '@freesewing/utils'
+import { linkClasses } from '@freesewing/utils'
+/*
+ * Components
+ * Note that these are only used as returns values
+ * There's no JSX in here so no React import needed
+ */
+import {
+ DetailIcon,
+ ExpandIcon,
+ IncludeIcon,
+ MarginIcon,
+ PaperlessIcon,
+ SaIcon,
+ ScaleIcon,
+ UnitsIcon,
+} from '@freesewing/react/components/Icon'
+
+export function defaultSa(units, inMm = true) {
+ const dflt = units === 'imperial' ? 0.5 : 1
+ return inMm ? measurementAsMm(dflt, units) : dflt
+}
+export function defaultSamm(units, inMm = true) {
+ const dflt = units === 'imperial' ? 0.5 : 1
+ return inMm ? measurementAsMm(dflt, units) : dflt
+}
+/** custom event handlers for inputs that need them */
+export function menuCoreSettingsOnlyHandler({ updateHandler, current }) {
+ return function (path, part) {
+ // Is this a reset?
+ if (part === undefined || part === '__UNSET__') return updateHandler(path, part)
+
+ // add or remove the part from the set
+ let newParts = new Set(current || [])
+ if (newParts.has(part)) newParts.delete(part)
+ else newParts.add(part)
+
+ // if the set is now empty, reset
+ if (newParts.size < 1) newParts = undefined
+ // otherwise use the new set
+ else newParts = [...newParts]
+
+ updateHandler(path, newParts)
+ }
+}
+
+export function menuCoreSettingsSammHandler({ updateHandler, config }) {
+ return function (_path, newCurrent) {
+ // convert to millimeters if there's a value
+ newCurrent = newCurrent === undefined ? config.dflt : newCurrent
+ // update both values to match
+ updateHandler(['samm'], newCurrent)
+ updateHandler(['sa'], newCurrent)
+ }
+}
+
+export function menuCoreSettingsSaboolHandler({ toggleSa }) {
+ return toggleSa
+}
+
+const CoreDocsLink = ({ item }) => (
+
+ Learn more
+
+)
+
+export function menuCoreSettingsStructure({ units = 'metric', sabool = false, parts = [] }) {
+ return {
+ sabool: {
+ dense: true,
+ title: 'Include seam allowance',
+ about: (
+ <>
+ Controls whether or not you want to include seam allowance on your pattern.
+
+ >
+ ),
+ ux: config.uxLevels.core.sa,
+ list: [0, 1],
+ choiceTitles: {
+ 0: 'Do not include seam allowance',
+ 1: 'Include seam allowance',
+ },
+ valueTitles: {
+ 0: 'No',
+ 1: 'Yes',
+ },
+ dflt: 0,
+ icon: SaIcon,
+ },
+ samm: sabool
+ ? {
+ title: 'Seam Allowance Size',
+ about: (
+ <>
+ Controls the size of the pattern's seam allowance.
+
+ >
+ ),
+ ux: config.uxLevels.core.sa,
+ min: 0,
+ max: units === 'imperial' ? 2 : 2.5,
+ dflt: defaultSamm(units),
+ icon: SaIcon,
+ }
+ : false,
+ units: {
+ dense: true,
+ title: 'Pattern units',
+ about: (
+ <>
+ Allows you to switch between metric and imperial units on the pattern.
+
+ >
+ ),
+ ux: config.uxLevels.core.units,
+ list: ['metric', 'imperial'],
+ dflt: 'metric',
+ choiceTitles: {
+ metric: 'Metric Units (cm)',
+ imperial: 'Imperial Units (inch)',
+ },
+ valueTitles: {
+ metric: 'Metric',
+ imperial: 'Imperial',
+ },
+ icon: UnitsIcon,
+ },
+ paperless: {
+ dense: true,
+ title: 'Paperless pattern',
+ about: (
+ <>
+ Trees are awesome, and taping together sewing patterns is not much fun. Try our paperless
+ mode to avoid the need to print out your pattern altogether.
+
+ >
+ ),
+ ux: config.uxLevels.core.paperless,
+ list: [0, 1],
+ choiceTitles: {
+ 0: 'Generate a regular pattern',
+ 1: 'Generate a paperless pattern',
+ },
+ valueTitles: {
+ 0: 'No',
+ 1: 'Yes',
+ },
+ dflt: 0,
+ icon: PaperlessIcon,
+ },
+ complete: {
+ dense: true,
+ title: 'Generate a detailed pattern',
+ about: (
+ <>
+ Controls how detailed the pattern is; Either a complete pattern with all details, or a
+ basic outline of the pattern parts.
+
+ >
+ ),
+ ux: config.uxLevels.core.complete,
+ list: [1, 0],
+ dflt: 1,
+ choiceTitles: {
+ 0: 'Generate a pattern outline',
+ 1: 'Generate a detailed pattern',
+ },
+ valueTitles: {
+ 0: 'No',
+ 1: 'Yes',
+ },
+ icon: DetailIcon,
+ },
+ expand: {
+ dense: true,
+ title: 'Expand pattern parts',
+ about: (
+ <>
+ Controls efforts to save paper. Disable this to expand all pattern parts at the cost of
+ using more space & paper.
+
+ >
+ ),
+ ux: config.uxLevels.core.expand,
+ list: [1, 0],
+ dflt: 1,
+ choiceTitles: {
+ 0: 'Keep pattern parts compact where possible',
+ 1: 'Expand all pattern parts',
+ },
+ valueTitles: {
+ 0: 'No',
+ 1: 'Yes',
+ },
+ icon: ExpandIcon,
+ },
+ only: {
+ dense: true,
+ title: 'Only included selected pattern parts',
+ about: (
+ <>
+ Allows you to control what parts to include in your pattern.
+
+ >
+ ),
+ ux: config.uxLevels.core.only,
+ dflt: false,
+ list: parts,
+ parts,
+ icon: IncludeIcon,
+ },
+ scale: {
+ title: 'Pattern annotations scale',
+ about: (
+ <>
+ Allows you to control the scale of annotations on the pattern. This is most useful when
+ generating very small patterns, like for doll outfits.
+
+ >
+ ),
+ ux: config.uxLevels.core.scale,
+ min: 0.1,
+ max: 5,
+ dflt: 1,
+ step: 0.1,
+ icon: ScaleIcon,
+ },
+ margin: {
+ title: 'Pattern parts margin',
+ about: (
+ <>
+ Controls the gap between pattern parts, as well as the gap between the parts and the page
+ edge.
+
+ >
+ ),
+ ux: config.uxLevels.core.margin,
+ min: 0,
+ max: 2.5,
+ dflt: measurementAsMm(units === 'imperial' ? 0.125 : 0.2, units),
+ icon: MarginIcon,
+ },
+ }
+}
diff --git a/packages/react/components/Editor/lib/design-options.mjs b/packages/react/components/Editor/lib/design-options.mjs
new file mode 100644
index 00000000000..1bc024b0ab7
--- /dev/null
+++ b/packages/react/components/Editor/lib/design-options.mjs
@@ -0,0 +1,129 @@
+import React from 'react'
+import { mergeOptions } from '@freesewing/core'
+import { designOptionType, set, orderBy } from '@freesewing/utils'
+import { i18n } from '@freesewing/collection'
+import { linkClasses } from '@freesewing/utils'
+
+const DesignDocsLink = ({ design, item }) => (
+
+ Learn more
+
+)
+
+export function menuDesignOptionsStructure(design, options, settings, asFullList = false) {
+ if (!options) return options
+ const sorted = {}
+ for (const [name, option] of Object.entries(options)) {
+ if (typeof option === 'object') {
+ sorted[name] = {
+ ...option,
+ name,
+ title: i18n[design]?.en?.o?.[name]?.t || name,
+ about: (
+
+ {i18n[design]?.en?.o?.[name]?.d || name}
+
+
+ ),
+ dense: true,
+ sideBySide: true,
+ }
+ }
+ }
+
+ // Save us some typing to access English options
+ const eno = i18n[design]?.en?.o || {}
+
+ const menu = {}
+ for (const option of orderBy(sorted, ['order', 'menu', 'name'], ['asc', 'asc', 'asc'])) {
+ if (typeof option === 'object') {
+ const oType = designOptionType(option)
+ option.dflt = option.dflt || option[oType]
+ // Percentage option tweaks
+ if (oType === 'pct') option.dflt /= 100
+ // List option tweaks
+ else if (oType === 'list') {
+ option.valueTitles = {}
+ option.choiceTitles = {}
+ option.choiceDescriptions = {}
+ for (const entry of option.list) {
+ option.choiceTitles[entry] = eno[`${option.name}.${entry}`]?.t || option.name
+ option.choiceDescriptions[entry] = eno[`${option.name}.${entry}`]?.d || ''
+ option.valueTitles[entry] = eno[`${option.name}.${entry}`]?.t || option.name
+ }
+ }
+ // Bool option tweaks
+ else if (oType === 'bool') {
+ option.list = [false, true]
+ option.valueTitles = {}
+ option.choiceTitles = {}
+ option.choiceDescriptions = {}
+ for (const entry of option.list) {
+ option.choiceTitles.false = eno[`${option.name}No`]?.t || option.name
+ option.choiceDescriptions.false = eno[`${option.name}No`]?.d || 'No'
+ option.valueTitles.false = 'No'
+ option.choiceTitles.true = eno[`${option.name}Yes`]?.t || 'Yes'
+ option.choiceDescriptions.true = eno[`${option.name}Yes`]?.d || 'No'
+ option.valueTitles.true = 'Yes'
+ }
+ }
+ if (typeof option.menu === 'function')
+ option.menu = asFullList
+ ? 'conditional'
+ : option.menu(settings, mergeOptions(settings, options))
+ if (option.menu) {
+ // Handle nested groups that don't have any direct children
+ if (option.menu.includes('.')) {
+ let menuPath = []
+ for (const chunk of option.menu.split('.')) {
+ menuPath.push(chunk)
+ set(menu, `${menuPath.join('.')}.isGroup`, true)
+ }
+ }
+ set(menu, `${option.menu}.isGroup`, true)
+ set(menu, `${option.menu}.${option.name}`, option)
+ } else if (typeof option.menu === 'undefined') {
+ console.log(
+ `Warning: Option ${option.name} does not have a menu config. ` +
+ 'Either configure it, or set it to false to hide this option.'
+ )
+ }
+ }
+ }
+
+ // Always put advanced at the end
+ if (menu.advanced) {
+ const adv = menu.advanced
+ delete menu.advanced
+ menu.advanced = adv
+ }
+
+ return menu
+}
+
+/*
+ * Helper method to grab an option from an Design options structure
+ *
+ * Since these structures can be nested with option groups, this needs some extra logic
+ */
+export function getOptionStructure(option, Design, state) {
+ const structure = menuDesignOptionsStructure(Design.patternConfig.options, state.settings)
+
+ return findOption(structure, option)
+}
+
+export function findOption(structure, option) {
+ for (const [key, val] of Object.entries(structure)) {
+ if (key === option) return val
+ if (val.isGroup) {
+ const sub = findOption(val, option)
+ if (sub) return sub
+ }
+ }
+
+ return false
+}
diff --git a/packages/react/components/Editor/lib/editor.mjs b/packages/react/components/Editor/lib/editor.mjs
new file mode 100644
index 00000000000..4638a9a0c6f
--- /dev/null
+++ b/packages/react/components/Editor/lib/editor.mjs
@@ -0,0 +1,783 @@
+// Dependencies
+import React from 'react'
+import { defaultConfig } from '../config/index.mjs'
+import { round, formatMm, randomLoadingMessage } from '@freesewing/utils'
+import { formatDesignOptionValue, menuCoreSettingsStructure } from './index.mjs'
+import { menuUiPreferencesStructure } from './ui-preferences.mjs'
+import { i18n } from '@freesewing/collection'
+import { i18n as pluginI18n } from '@freesewing/core-plugins'
+import { flags as flagTranslations } from '@freesewing/i18n'
+// Components
+import {
+ ErrorIcon,
+ MeasurementsIcon,
+ OptionsIcon,
+ SettingsIcon,
+ UiIcon,
+} from '@freesewing/react/components/Icon'
+import { HtmlSpan } from '../components/HtmlSpan.mjs'
+
+/*
+ * i18n makes everything complicated
+ */
+const flagTranslationsWithNamespace = {}
+for (const [key, val] of Object.entries(flagTranslations || {}))
+ flagTranslationsWithNamespace[`flag:${key}`] = val
+
+/*
+ * This method bundles pattern translations in a object we can pass to the Pattern component
+ *
+ * @param {string} design - The name of the design
+ * @return {object} strings - An object of key/value pairs for translation
+ */
+export const bundlePatternTranslations = (design) => {
+ const strings = {}
+ for (const [key, val] of Object.entries(flagTranslationsWithNamespace)) strings[key] = val
+ if (i18n[design]?.en) {
+ const en = i18n[design].en
+ // Parts have no prefix
+ for (const [key, val] of Object.entries(en.p || {})) strings[key] = val
+ // Strings do
+ for (const [key, val] of Object.entries(en.s || {})) strings[`${design}:${key}`] = val
+ }
+ for (const [key, val] of Object.entries(pluginI18n.en)) strings[key] = val
+
+ return strings
+}
+/*
+ * This method drafts the pattern
+ *
+ * @param {function} Design - The Design constructor
+ * @param {object} settings - The settings for the pattern
+ * @param {array} plugins - Any (extra) plugins to load into the pattern
+ * @return {object} data - The drafted pattern, along with errors and failure data
+ */
+export function draft(Design, settings, plugins = []) {
+ const pattern = new Design(settings)
+ for (const plugin of plugins) pattern.use(plugin)
+ const data = {
+ // The pattern
+ pattern,
+ // Any errors logged by the pattern
+ errors: [],
+ // If the pattern fails to draft, this will hold the error
+ failure: false,
+ }
+ // Draft the pattern or die trying
+ try {
+ data.pattern.draft()
+ data.errors.push(...data.pattern.store.logs.error)
+ for (const store of data.pattern.setStores) data.errors.push(...store.logs.error)
+ } catch (error) {
+ data.failure = error
+ }
+
+ return data
+}
+
+/*
+ * This method samples a pattern option
+ *
+ * @param {function} Design - The Design constructor
+ * @param {object} settings - The settings for the pattern
+ * @param {array} plugins - Any (extra) plugins to load into the pattern
+ * @return {object} data - The drafted pattern, along with errors and failure data
+ */
+export function sample(Design, settings, plugins = []) {
+ const pattern = new Design(settings)
+ for (const plugin of plugins) pattern.use(plugin)
+ const data = {
+ // The pattern
+ pattern,
+ // Any errors logged by the pattern
+ errors: [],
+ // If the pattern fails to draft, this will hold the error
+ failure: false,
+ }
+ // Draft the pattern or die trying
+ try {
+ data.pattern.sample()
+ data.errors.push(...data.pattern.store.logs.error)
+ for (const store of data.pattern.setStores) data.errors.push(...store.logs.error)
+ } catch (error) {
+ data.failure = error
+ }
+
+ return data
+}
+
+export function flattenFlags(flags) {
+ const all = {}
+ for (const type of defaultConfig.flagTypes) {
+ let i = 0
+ if (flags[type]) {
+ for (const flag of Object.values(flags[type])) {
+ i++
+ all[`${type}-${i}`] = { ...flag, type }
+ }
+ }
+ }
+
+ return all
+}
+
+export function getUiPreferenceUndoStepData({ step }) {
+ /*
+ * We'll need these
+ */
+ const field = step.name === 'ui' ? step.path[1] : step.path[2]
+ const structure = menuUiPreferencesStructure()[field]
+
+ if (!structure) return false
+
+ /*
+ * This we'll end up returning
+ */
+ const data = {
+ icon: ,
+ field,
+ title: structure.title,
+ menu: 'UI Preferences',
+ structure: menuUiPreferencesStructure()[field],
+ }
+ const FieldIcon = data.structure.icon
+ data.fieldIcon =
+
+ /*
+ * Add oldval and newVal if they exist, or fall back to default
+ */
+ for (const key of ['old', 'new'])
+ data[key + 'Val'] = t(
+ structure.choiceTitles[
+ structure.choiceTitles[String(step[key])] ? String(step[key]) : String(structure.dflt)
+ ]
+ )
+
+ return data
+}
+
+export function getCoreSettingUndoStepData({ step, state, Design }) {
+ const field = step.path[1]
+ const structure = menuCoreSettingsStructure({
+ language: state.language,
+ units: state.settings.units,
+ sabool: state.settings.sabool,
+ parts: Design.patternConfig.draftOrder,
+ })
+
+ const data = {
+ field,
+ menu: 'Core Settings',
+ title: structure?.[field] ? structure[field].title : '',
+ icon: ,
+ structure: structure[field],
+ }
+ if (!data.structure && field === 'sa') data.structure = structure.samm
+ const FieldIcon = data.structure?.icon || ErrorIcon
+ data.fieldIcon =
+
+ /*
+ * Save us some typing
+ */
+ const cord = settingsValueCustomOrDefault
+ const Html = HtmlSpan
+
+ /*
+ * Need to allow HTML in some of these in case this is
+ * formated as imperial which uses and
+ */
+ switch (data.field) {
+ case 'margin':
+ case 'sa':
+ case 'samm':
+ if (data.field !== 'margin') data.title = 'Seam Allowance'
+ data.oldVal =
+ data.newVal =
+ return data
+ case 'scale':
+ data.oldVal = cord(step.old, data.structure.dflt)
+ data.newVal = cord(step.new, data.structure.dflt)
+ return data
+ case 'units':
+ data.oldVal = t(step.new === 'imperial' ? 'Metric Units' : 'Imperial Units')
+ data.newVal = t(step.new === 'imperial' ? 'Imperial Units' : 'Metric Units')
+ return data
+ case 'only':
+ data.oldVal = cord(step.old, data.structure.dflt) || 'Include all parts'
+ data.newVal = cord(step.new, data.structure.dflt) || 'Include all parts'
+ return data
+ default:
+ data.oldVal = t(
+ data.structure.choiceTitles[String(step.old)]
+ ? data.structure.choiceTitles[String(step.old)]
+ : data.structure.choiceTitles[String(data.structure.dflt)]
+ )
+ data.newVal = t(
+ data.structure.choiceTitles[String(step.new)]
+ ? data.structure.choiceTitles[String(step.new)]
+ : data.structure.choiceTitles[String(data.structure.dflt)]
+ )
+ return data
+ }
+}
+
+export function getDesignOptionUndoStepData({ step, state, Design }) {
+ const option = Design.patternConfig.options[step.path[2]]
+ const data = {
+ icon: ,
+ field: step.path[2],
+ title: `${state.design}:${step.path[2]}`,
+ menu: `Design Options`,
+ oldVal: formatDesignOptionValue(option, step.old, state.units === 'imperial'),
+ newVal: formatDesignOptionValue(option, step.new, state.units === 'imperial'),
+ }
+
+ return data
+}
+
+export function getUndoStepData(props) {
+ /*
+ * UI Preferences
+ */
+ if ((props.step.name === 'settings' && props.step.path[1] === 'ui') || props.step.name === 'ui')
+ return getUiPreferenceUndoStepData(props)
+
+ /*
+ * Design options
+ */
+ if (props.step.name === 'settings' && props.step.path[1] === 'options')
+ return getDesignOptionUndoStepData(props)
+
+ /*
+ * Core Settings
+ */
+ if (
+ props.step.name === 'settings' &&
+ [
+ 'sa',
+ 'samm',
+ 'margin',
+ 'scale',
+ 'only',
+ 'complete',
+ 'paperless',
+ 'sabool',
+ 'units',
+ 'expand',
+ ].includes(props.step.path[1])
+ )
+ return getCoreSettingUndoStepData(props)
+
+ /*
+ * Measurements
+ */
+ if (props.step.name === 'settings' && props.step.path[1] === 'measurements') {
+ const data = {
+ icon: ,
+ field: 'measurements',
+ title: `measurements`,
+ menu: 'measurements',
+ }
+ /*
+ * Single measurements change?
+ */
+ if (props.step.path[2])
+ return {
+ ...data,
+ field: props.step.path[2],
+ oldVal: formatMm(props.step.old, props.imperial),
+ newVal: formatMm(props.step.new, props.imperial),
+ }
+ let count = 0
+ for (const m of Object.keys(props.step.new)) {
+ if (props.step.new[m] !== props.step.old?.[m]) count++
+ }
+ return { ...data, msg: `${count} measurements updated` }
+ }
+
+ /*
+ * Bail out of the step fell throug
+ */
+ return false
+}
+/*
+ * This helper method constructs the initial state object.
+ *
+ * If they are not present, it will fall back to the relevant defaults
+ */
+export function initialEditorState(preload = {}, config) {
+ /*
+ * Create initial state object
+ */
+ const initial = { ...config.initialState, ...preload }
+
+ /*
+ * FIXME: Add preload support, from URL or other sources, rather than just passing in an object
+ */
+
+ return initial
+}
+
+/**
+ * round a value to the correct number of decimal places to display all supplied digits after multiplication
+ * this is a workaround for floating point errors
+ * examples:
+ * roundPct(0.72, 100) === 72
+ * roundPct(7.5, 0.01) === 0.075
+ * roundPct(7.50, 0.01) === 0.0750
+ * @param {Number} num the number to be operated on
+ * @param {Number} factor the number to multiply by
+ * @return {Number} the given num multiplied by the factor, rounded appropriately
+ */
+export function menuRoundPct(num, factor) {
+ // stringify
+ const str = '' + num
+ // get the index of the decimal point in the number
+ const decimalIndex = str.indexOf('.')
+ // get the number of places the factor moves the decimal point
+ const factorPlaces = factor > 0 ? Math.ceil(Math.log10(factor)) : Math.floor(Math.log10(factor))
+ // the number of places needed is the number of digits that exist after the decimal minus the number of places the decimal point is being moved
+ const numPlaces = Math.max(0, str.length - (decimalIndex + factorPlaces))
+ return round(num * factor, numPlaces)
+}
+
+const menuNumericInputMatcher = /^-?[0-9]*[.,eE]?[0-9]+$/ // match a single decimal separator
+const menuFractionInputMatcher = /^-?[0-9]*(\s?[0-9]+\/|[.,eE])?[0-9]+$/ // match a single decimal separator or fraction
+
+/**
+ * Validate and parse a value that should be a number
+ * @param {any} val the value to validate
+ * @param {Boolean} allowFractions should fractions be considered valid input?
+ * @param {Number} min the minimum allowable value
+ * @param {Number} max the maximum allowable value
+ * @return {null|false|Number} null if the value is empty,
+ * false if the value is invalid,
+ * or the value parsed to a number if it is valid
+ */
+export function menuValidateNumericValue(
+ val,
+ allowFractions = true,
+ min = -Infinity,
+ max = Infinity
+) {
+ // if it's empty, we're neutral
+ if (typeof val === 'undefined' || val === '') return null
+
+ // make sure it's a string
+ val = ('' + val).trim()
+
+ // get the appropriate match pattern and check for a match
+ const matchPattern = allowFractions ? menuFractionInputMatcher : menuNumericInputMatcher
+ if (!val.match(matchPattern)) return false
+
+ // replace comma with period
+ const parsedVal = val.replace(',', '.')
+ // if fractions are allowed, parse for fractions, otherwise use the number as a value
+ const useVal = allowFractions ? fractionToDecimal(parsedVal) : parsedVal
+
+ // check that it's a number and it's in the range
+ if (isNaN(useVal) || useVal > max || useVal < min) return false
+
+ // all checks passed. return the parsed value
+ return useVal
+}
+
+/**
+ * Check to see if a value is different from its default
+ * @param {Number|String|Boolean} current the current value
+ * @param {Object} config configuration containing a dflt key
+ * @return {Boolean} was the value changed?
+ */
+export function menuValueWasChanged(current, config) {
+ if (typeof current === 'undefined') return false
+ if (current == config.dflt) return false
+
+ return true
+}
+import get from 'lodash.get'
+import set from 'lodash.set'
+import unset from 'lodash.unset'
+
+const UNSET = '__UNSET__'
+/*
+ * Helper method to handle object updates
+ *
+ * @param {object} obj - The object to update
+ * @param {string|array} path - The path to the key to update, either as array or dot notation
+ * @param {mixed} val - The new value to set or 'unset' to unset the value
+ * @return {object} result - The updated object
+ */
+export function objUpdate(obj = {}, path, val = '__UNSET__') {
+ if (val === UNSET) unset(obj, path)
+ else set(obj, path, val)
+
+ return obj
+}
+
+/*
+ * Helper method to handle object updates that also updates the undo history in ephemeral state
+ *
+ * @param {object} obj - The object to update
+ * @param {string|array} path - The path to the key to update, either as array or dot notation
+ * @param {mixed} val - The new value to set or 'unset' to unset the value
+ * @param {function} setEphemeralState - The ephemeral state setter
+ * @return {object} result - The updated object
+ */
+export function undoableObjUpdate(name, obj = {}, path, val = '__UNSET__', setEphemeralState) {
+ const current = get(obj, path)
+ setEphemeralState((cur) => {
+ if (!Array.isArray(cur.undos)) cur.undos = []
+ return {
+ ...cur,
+ undos: [
+ {
+ name,
+ time: Date.now(),
+ path,
+ old: current,
+ new: val,
+ restore: cloneObject(obj),
+ },
+ ...cur.undos,
+ ],
+ }
+ })
+
+ return objUpdate(obj, path, val)
+}
+
+/*
+ * Helper method to strip a namespace: prefix from a string
+ *
+ * @param {string} key
+ * @return {string} keyWithoutNamespace
+ */
+export function stripNamespace(key) {
+ const pos = `${key}`.indexOf(':')
+
+ return pos === -1 ? key : key.slice(pos + 1)
+}
+
+/*
+ * Helper method to add an undo step for which state updates are handles in another way
+ *
+ * This is typically used for SA changes as it requires changing 3 fields:
+ * - sabool: Is sa on or off?
+ * - sa: sa value for core
+ * - samm: Holds the sa value in mm even when sa is off
+ *
+ * @param {object} undo - The undo step to add
+ * @param {object} restore - The state to restore for this step
+ * @param {function} setEphemeralState - The ephemeral state setter
+ */
+export function addUndoStep(undo, restore, setEphemeralState) {
+ setEphemeralState((cur) => {
+ if (!Array.isArray(cur.undos)) cur.undos = []
+ return {
+ ...cur,
+ undos: [{ time: Date.now(), ...undo, restore: cloneObject(restore) }, ...cur.undos],
+ }
+ })
+}
+
+/*
+ * Helper method to clone an object
+ */
+export function cloneObject(obj) {
+ return JSON.parse(JSON.stringify(obj))
+}
+
+/**
+ * Helper method to push a prefix to a set path
+ *
+ * By 'set path' we mean a path to be passed to the
+ * objUpdate method, which uses lodash's set under the hood.
+ *
+ * @param {string} prefix - The prefix path to add
+ * @param {string|array} path - The path to prefix either as array or a string in dot notation
+ * @return {array} newPath - The prefixed path
+ */
+export function statePrefixPath(prefix, path) {
+ if (Array.isArray(path)) return [prefix, ...path]
+ else return [prefix, ...path.split('.')]
+}
+
+/*
+ * This creates the helper object for state updates
+ */
+export function stateUpdateFactory(setState, setEphemeralState, config) {
+ return {
+ /*
+ * This allows raw access to the entire state object
+ */
+ state: (path, val) => setState((cur) => objUpdate({ ...cur }, path, val)),
+ /*
+ * These hold an object, so we take a path
+ */
+ settings: (path = null, val = null) => {
+ /*
+ * This check can be removed once all code is migrated to the new editor
+ */
+ if (Array.isArray(path) && Array.isArray(path[0]) && val === null) {
+ throw new Error(
+ 'Update.settings was called with an array of operations. This is no longer supported.'
+ )
+ }
+ return setState((cur) =>
+ undoableObjUpdate(
+ 'settings',
+ { ...cur },
+ statePrefixPath('settings', path),
+ val,
+ setEphemeralState
+ )
+ )
+ },
+ /*
+ * Helper to restore from undo state
+ * Takes the index of the undo step in the array in ephemeral state
+ */
+ restore: async (i, ephemeralState) => {
+ setState(ephemeralState.undos[i].restore)
+ setEphemeralState((cur) => {
+ cur.undos = cur.undos.slice(i + 1)
+ return cur
+ })
+ },
+ /*
+ * Helper to toggle SA on or off as that requires managing sa, samm, and sabool
+ */
+ toggleSa: () =>
+ setState((cur) => {
+ const sa = cur.settings?.samm || (cur.settings?.units === 'imperial' ? 15.3125 : 10)
+ const restore = cloneObject(cur)
+ // This requires 3 changes
+ const update = cur.settings.sabool
+ ? [
+ ['sabool', 0],
+ ['sa', 0],
+ ['samm', sa],
+ ]
+ : [
+ ['sabool', 1],
+ ['sa', sa],
+ ['samm', sa],
+ ]
+ for (const [key, val] of update) objUpdate(cur, `settings.${key}`, val)
+ // Which we'll group as 1 undo action
+ addUndoStep(
+ {
+ name: 'settings',
+ path: ['settings', 'sa'],
+ new: cur.settings.sabool ? 0 : sa,
+ old: cur.settings.sabool ? sa : 0,
+ },
+ restore,
+ setEphemeralState
+ )
+
+ return cur
+ }),
+ ui: (path, val) =>
+ setState((cur) =>
+ undoableObjUpdate('ui', { ...cur }, statePrefixPath('ui', path), val, setEphemeralState)
+ ),
+ /*
+ * These only hold a string, so we only take a value
+ */
+ design: (val) => setState((cur) => objUpdate({ ...cur }, 'design', val)),
+ view: (val) => {
+ // Only take valid view names
+ if (!config.views.includes(val)) return console.log('not a valid view:', val)
+ setState((cur) => ({ ...cur, view: val }))
+ // Also add it onto the views (history)
+ setEphemeralState((cur) => {
+ if (!Array.isArray(cur.views)) cur.views = []
+ return { ...cur, views: [val, ...cur.views] }
+ })
+ },
+ viewBack: () => {
+ setEphemeralState((eph) => {
+ if (Array.isArray(eph.views) && config.views.includes(eph.views[1])) {
+ // Load view at the 1 position of the history
+ setState((cur) => ({ ...cur, view: eph.views[1] }))
+ return { ...eph, views: eph.views.slice(1) }
+ }
+
+ return eph
+ })
+ },
+ // Pattern ID (pid)
+ pid: (val) => setState((cur) => ({ ...cur, pid: val })),
+ ux: (val) => setState((cur) => objUpdate({ ...cur }, 'ux', val)),
+ clearPattern: () =>
+ setState((cur) => {
+ const newState = { ...cur }
+ objUpdate(newState, 'settings', {
+ measurements: cur.settings.measurements,
+ })
+ /*
+ * Let's also reset the renderer to React as that feels a bit like a pattern setting even though it's UI
+ */
+ objUpdate(newState, 'ui', { ...newState.ui, renderer: 'react' })
+ return newState
+ }),
+ clearAll: () => setState(config.initialState),
+ /*
+ * These are setters for the ephemeral state which is passed down as part of the
+ * state object, but is not managed in the state backend because it's ephemeral
+ */
+ startLoading: (id, conf = {}) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ if (typeof newState.loading !== 'object') newState.loading = {}
+ if (typeof conf.color === 'undefined') conf.color = 'info'
+ newState.loading[id] = {
+ msg: randomLoadingMessage(),
+ icon: 'spinner',
+ ...conf,
+ }
+ return newState
+ }),
+ stopLoading: (id) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ if (typeof newState.loading[id] !== 'undefined') delete newState.loading[id]
+ return newState
+ }),
+ clearLoading: () => setEphemeralState((cur) => ({ ...cur, loading: {} })),
+ notify: (conf, id = false) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ /*
+ * Passing in an id allows making sure the same notification is not repeated
+ * So if the id is set, and we have a loading state with that id, we just return
+ */
+ if (id && cur.loading?.[id]) return newState
+ if (typeof newState.loading !== 'object') newState.loading = {}
+ if (id === false) id = Date.now()
+ newState.loading[id] = { ...conf, id, fadeTimer: config.notifyTimeout }
+ return newState
+ }),
+ notifySuccess: (msg, id = false) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ /*
+ * Passing in an id allows making sure the same notification is not repeated
+ * So if the id is set, and we have a loading state with that id, we just return
+ */
+ if (id && cur.loading?.[id]) return newState
+ if (typeof newState.loading !== 'object') newState.loading = {}
+ if (id === false) id = Date.now()
+ newState.loading[id] = {
+ msg,
+ icon: 'success',
+ color: 'success',
+ id,
+ fadeTimer: config.notifyTimeout,
+ }
+ return newState
+ }),
+ notifyFailure: (msg, id = false) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ /*
+ * Passing in an id allows making sure the same notification is not repeated
+ * So if the id is set, and we have a loading state with that id, we just return
+ */
+ if (id && cur.loading?.[id]) return newState
+ if (typeof newState.loading !== 'object') newState.loading = {}
+ if (id === false) id = Date.now()
+ newState.loading[id] = {
+ msg,
+ icon: 'failure',
+ color: 'error',
+ id,
+ fadeTimer: config.notifyTimeout,
+ }
+ return newState
+ }),
+ fadeNotify: (id) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ newState.loading[id] = { ...newState.loading[id], clearTimer: 600, id, fading: true }
+ delete newState.loading[id].fadeTimer
+ return newState
+ }),
+ clearNotify: (id) =>
+ setEphemeralState((cur) => {
+ const newState = { ...cur }
+ if (typeof newState.loading[id] !== 'undefined') delete newState.loading[id]
+ return newState
+ }),
+ }
+}
+/*
+ * Returns the URL of a cloud-hosted image (cloudflare in this case) based on the ID and Variant
+ */
+export function cloudImageUrl({ id = 'default-avatar', variant = 'public' }) {
+ /*
+ * Return something default so that people will actually change it
+ */
+ if (!id || id === 'default-avatar') return config.cloudImageDflt
+
+ /*
+ * If the variant is invalid, set it to the smallest thumbnail so
+ * people don't load enourmous images by accident
+ */
+ if (!config.cloudImageVariants.includes(variant)) variant = 'sq100'
+
+ return `${config.cloudImageUrl}${id}/${variant}`
+}
+/**
+ * This method does nothing. It is used to disable certain methods
+ * that need to be passed it to work
+ *
+ * @return {null} null - null
+ */
+export function noop() {
+ return null
+}
+/*
+ * A method that check that a value is not empty
+ */
+export function notEmpty(value) {
+ return String(value).length > 0
+}
+/**
+ * Helper method to merge arrays of translation namespaces
+ *
+ * Note that this method is variadic
+ *
+ * @param {[string]} namespaces - A string or array of strings of namespaces
+ * @return {[string]} namespaces - A merged array of all namespaces
+ */
+export function nsMerge(...args) {
+ const ns = new Set()
+ for (const arg of args) {
+ if (typeof arg === 'string') ns.add(arg)
+ else if (Array.isArray(arg)) {
+ for (const el of nsMerge(...arg)) ns.add(el)
+ }
+ }
+
+ return [...ns]
+}
+
+/*
+ * A translation fallback method in case none is passed in
+ *
+ * @param {string} key - The input
+ * @return {string} key - The input is returned
+ */
+export function t(key) {
+ return Array.isArray(key) ? key[0] : key
+}
+
+export function settingsValueIsCustom(val, dflt) {
+ return typeof val === 'undefined' || val === '__UNSET__' || val === dflt ? false : true
+}
+
+export function settingsValueCustomOrDefault(val, dflt) {
+ return typeof val === 'undefined' || val === '__UNSET__' || val === dflt ? dflt : val
+}
diff --git a/sites/shared/components/workbench/exporting/export-worker.js b/packages/react/components/Editor/lib/export/export-worker.js
similarity index 76%
rename from sites/shared/components/workbench/exporting/export-worker.js
rename to packages/react/components/Editor/lib/export/export-worker.js
index 47e783f3302..b8da9d26c39 100644
--- a/sites/shared/components/workbench/exporting/export-worker.js
+++ b/packages/react/components/Editor/lib/export/export-worker.js
@@ -1,10 +1,8 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
/**
* A web worker to handle the business of exporting pattern files
* */
import yaml from 'js-yaml'
-import axios from 'axios'
-import { PdfMaker } from './pdf-maker'
+import { PdfMaker } from './pdf-maker.mjs'
import { SinglePdfMaker } from './single-pdf-maker.mjs'
/** when the worker receives data from the page, do the appropriate export */
@@ -55,17 +53,3 @@ const exportPdf = async (data) => {
await maker.makePdf()
postSuccess(await maker.toBlob())
}
-
-const exportGithubGist = (data) => {
- axios
- .post('https://backend.freesewing.org/github/gist', {
- design: data.design,
- data: yaml.dump(data),
- })
- .then((res) => {
- postMessage({
- success: true,
- link: 'https://gist.github.com/' + res.data.id,
- })
- })
-}
diff --git a/packages/react/components/Editor/lib/export/index.mjs b/packages/react/components/Editor/lib/export/index.mjs
new file mode 100644
index 00000000000..9663a1cfddd
--- /dev/null
+++ b/packages/react/components/Editor/lib/export/index.mjs
@@ -0,0 +1,203 @@
+import Worker from 'web-worker'
+import fileSaver from 'file-saver'
+import { themePlugin } from '@freesewing/plugin-theme'
+import { pluginI18n } from '@freesewing/plugin-i18n'
+import { tilerPlugin } from './plugin-tiler.mjs'
+import { capitalize, formatMm, get } from '@freesewing/utils'
+import mustache from 'mustache'
+import he from 'he'
+import yaml from 'js-yaml'
+
+export const exportTypes = {
+ exportForPrinting: ['a4', 'a3', 'a2', 'a1', 'a0', 'letter', 'legal', 'tabloid'],
+ exportForEditing: ['svg', 'pdf'],
+ exportAsData: ['json', 'yaml'],
+}
+
+export const defaultPrintSettings = (units) => ({
+ size: units === 'imperial' ? 'letter' : 'a4',
+ orientation: 'portrait',
+ margin: units === 'imperial' ? 12.7 : 10,
+ coverPage: true,
+ cutlist: true,
+})
+
+/**
+ * Instantiate a pattern that uses plugins theme, i18n, and cutlist
+ * @param {Design} Design the design to construct the pattern from
+ * @param {Object} settings the settings
+ * @param {Object} overwrite settings to overwrite settings settings with
+ * @param {string} format the export format this pattern will be prepared for
+ * @param {function} t the i18n function
+ * @return {Pattern} a pattern
+ */
+const themedPattern = (Design, settings, overwrite, format, t) => {
+ const pattern = new Design({ ...settings, ...overwrite })
+
+ // add the theme and translation to the pattern
+ pattern.use(themePlugin, { stripped: format !== 'svg', skipGrid: ['pages'] })
+ pattern.use(pluginI18n, (key) => key)
+
+ return pattern
+}
+
+/**
+ * Handle exporting the draft or settings
+ * format: format to export to
+ * settings: the settings
+ * Design: the pattern constructor for the design to be exported
+ * t: a translation function to attach to the draft
+ * onComplete: business to perform after a successful export
+ * onError: business to perform on error
+ * */
+export const handleExport = async ({
+ format,
+ settings,
+ Design,
+ design,
+ ui,
+ t,
+ startLoading,
+ stopLoading,
+ stopLoadingFail,
+ onComplete,
+ onError,
+}) => {
+ // start the loading indicator
+ if (typeof startLoading === 'function') startLoading()
+
+ // get a worker going
+ const worker = new Worker(new URL('./export-worker.js', import.meta.url), { type: 'module' })
+
+ /*
+ * Guard against settings being false, which happens for
+ * fully default designs that do not require measurements
+ */
+ if (settings === false) settings = {}
+
+ // listen for the worker's message back
+ worker.addEventListener('message', (e) => {
+ // on success
+ if (e.data.success) {
+ // save it out
+ if (e.data.blob) {
+ const fileType = exportTypes.exportForPrinting.indexOf(format) === -1 ? format : 'pdf'
+ fileSaver.saveAs(e.data.blob, `freesewing-${design || 'pattern'}.${fileType}`)
+ }
+ // do additional business
+ onComplete && onComplete(e)
+ // stop the loader
+ if (typeof stopLoading === 'function') stopLoading()
+ }
+ // on error
+ else {
+ console.log(e.data.error)
+ onError && onError(e)
+ // stop the loader
+ if (typeof stopLoadingFail === 'function') stopLoadingFail()
+ }
+ })
+
+ // pdf settings
+ const pageSettings = {
+ ...defaultPrintSettings(settings.units),
+ ...get(ui, 'layout', {}),
+ }
+
+ // arguments to pass to the worker
+ const workerArgs = { format, settings, pageSettings }
+
+ // data passed to the worker must be JSON serializable, so we can't pass functions or prototypes
+ // that means if it's not a data export there's more work to do before we can hand off to the worker
+ if (exportTypes.exportAsData.indexOf(format) === -1) {
+ settings.embed = false
+ // make a pattern instance for export rendering
+ const layout = settings.layout || ui.layouts?.print || true
+ let pattern = themedPattern(Design, settings, { layout }, format, t)
+
+ // a specified size should override the settings one
+ pageSettings.size = format
+
+ try {
+ // add pages to pdf exports
+ if (!exportTypes.exportForEditing.includes(format)) {
+ pattern.use(
+ tilerPlugin({
+ ...pageSettings,
+ printStyle: true,
+ renderBlanks: false,
+ setPatternSize: true,
+ })
+ )
+ }
+
+ // add the strings that are used on the cover page
+ workerArgs.strings = {
+ design: capitalize(design),
+ tagline: 'Come for the sewing pattern. Stay for the community.',
+ url: window.location.href,
+ cuttingLayout: 'Cutting layout',
+ }
+
+ // Initialize the pattern stores
+ pattern.getConfig()
+
+ // Save the measurement set name to pattern stores
+ if (settings?.metadata?.setName) {
+ pattern.store.set('data.setName', settings.metadata.setName)
+ for (const store of pattern.setStores) store.set('data.setName', settings.metadata.setName)
+ }
+
+ // draft and render the pattern
+ pattern.draft()
+ workerArgs.svg = pattern.render()
+
+ // Get coversheet info: setName, settings YAML, version, notes, warnings
+ const store = pattern.setStores[pattern.activeSet]
+ workerArgs.strings.setName = settings?.metadata?.setName
+ ? settings.metadata.setName
+ : 'ephemeral'
+ workerArgs.strings.yaml = yaml.dump(settings)
+ workerArgs.strings.version = store?.data?.version ? store.data.version : ''
+ const notes = store?.plugins?.['plugin-annotations']?.flags?.note
+ ? store?.plugins?.['plugin-annotations']?.flags?.note
+ : []
+ const warns = store?.plugins?.['plugin-annotations']?.flags?.warn
+ ? store?.plugins?.['plugin-annotations']?.flags?.warn
+ : []
+ workerArgs.strings.notes = flagsToString(notes, mustache, t)
+ workerArgs.strings.warns = flagsToString(warns, mustache, t)
+
+ if (format === 'pdf') pageSettings.size = [pattern.width, pattern.height]
+
+ // add the svg and pages data to the worker args
+ workerArgs.pages = pattern.setStores[pattern.activeSet].get('pages')
+ } catch (err) {
+ console.log(err)
+ onError && onError(err)
+ }
+ }
+
+ // post a message to the worker with all needed data
+ worker.postMessage(workerArgs)
+}
+
+/**
+ * Convert pattern flags to a formatted string for printing
+ */
+const flagsToString = (flags, mustache, t) => {
+ let first = true
+ let string = ''
+ for (const flag of Object.values(flags)) {
+ let title = flag.replace ? mustache.render(flag.title, flag.replace) : flag.title
+ title = he.decode(title)
+ let desc = flag.replace ? mustache.render(flag.desc, flag.replace) : flag.desc
+ desc = desc.replaceAll('\n\n', '\n')
+ desc = desc.replaceAll('\n', ' ')
+ desc = he.decode(desc)
+ if (!first) string += '\n'
+ first = false
+ string += '- ' + title + ': ' + desc
+ }
+ return string
+}
diff --git a/sites/shared/components/workbench/exporting/pdf-maker.mjs b/packages/react/components/Editor/lib/export/pdf-maker.mjs
similarity index 99%
rename from sites/shared/components/workbench/exporting/pdf-maker.mjs
rename to packages/react/components/Editor/lib/export/pdf-maker.mjs
index 55bc703f33b..252c479d7cf 100644
--- a/sites/shared/components/workbench/exporting/pdf-maker.mjs
+++ b/packages/react/components/Editor/lib/export/pdf-maker.mjs
@@ -1,7 +1,7 @@
// __SDEFILE__ - This file is a dependency for the stand-alone environment
import { Pdf, mmToPoints } from './pdf.mjs'
import SVGtoPDF from 'svg-to-pdfkit'
-import { logoPath } from 'shared/components/icons.mjs'
+import { logoPath } from '@freesewing/config'
/** an svg of the logo to put on the cover page */
const logoSvg = `
diff --git a/packages/react/components/Editor/lib/export/pdf.mjs b/packages/react/components/Editor/lib/export/pdf.mjs
new file mode 100644
index 00000000000..9fa19806b88
--- /dev/null
+++ b/packages/react/components/Editor/lib/export/pdf.mjs
@@ -0,0 +1,59 @@
+import PDFDocument from 'pdfkit/js/pdfkit.standalone.js'
+
+/**
+ * PdfKit, the library we're using for pdf generation, uses points as a unit,
+ * so when we tell it things like where to put the svg and how big the svg is,
+ * we need those numbers to be in points. The svg uses mm internally, so when
+ * we do spatial reasoning inside the svg, we need to know values in mm
+ * */
+export const mmToPoints = 2.834645669291339
+
+/**
+ * A PDFKit PDF instance
+ */
+export const Pdf = ({ size, layout }) => {
+ const pdf = new PDFDocument({
+ size,
+ layout,
+ })
+
+ /*
+ * PdfKit wants to flush the buffer on each new page.
+ * We can't save directly from inside a worker, so we have to manage the
+ * buffers ourselves so we can return a blob
+ */
+ const buffers = []
+
+ /*
+ * Use a listener to add new data to our buffer storage
+ */
+ pdf.on('data', buffers.push.bind(buffers))
+
+ /*
+ * Convert the pdf to a blob
+ */
+ pdf.toBlob = function () {
+ return new Promise((resolve) => {
+ /*
+ * We have to do it this way so that the document flushes everything to buffers
+ */
+ pdf.on('end', () => {
+ /*
+ * Convert buffers to a blob
+ */
+ resolve(
+ new Blob(buffers, {
+ type: 'application/pdf',
+ })
+ )
+ })
+
+ /*
+ * End the stream
+ */
+ pdf.end()
+ })
+ }
+
+ return pdf
+}
diff --git a/packages/react/components/Editor/lib/export/plugin-tiler.mjs b/packages/react/components/Editor/lib/export/plugin-tiler.mjs
new file mode 100644
index 00000000000..0e27e2b90b0
--- /dev/null
+++ b/packages/react/components/Editor/lib/export/plugin-tiler.mjs
@@ -0,0 +1,432 @@
+const name = 'Tiler Plugin'
+const version = '1.0.0'
+export const sizes = {
+ a4: [210, 297],
+ a3: [297, 420],
+ a2: [420, 594],
+ a1: [594, 841],
+ a0: [841, 1188],
+ letter: [215.9, 279.4],
+ legal: [215.9, 355.6],
+ tabloid: [279.4, 431.8],
+}
+
+/** get a letter to represent an index less than 26*/
+const indexLetter = (i) => String.fromCharCode('A'.charCodeAt(0) + i - 1)
+
+/** get a string of letters to represent an index */
+const indexStr = (i) => {
+ let index = i % 26
+ let quotient = i / 26
+ let result
+
+ if (i <= 26) {
+ return indexLetter(i)
+ } //Number is within single digit bounds of our encoding letter alphabet
+
+ if (quotient >= 1) {
+ //This number was bigger than the alphabet, recursively perform this function until we're done
+ if (index === 0) {
+ quotient--
+ } //Accounts for the edge case of the last letter in the dictionary string
+ result = indexStr(quotient)
+ }
+
+ if (index === 0) {
+ index = 26
+ } //Accounts for the edge case of the final letter; avoids getting an empty string
+
+ return result + indexLetter(index)
+}
+/**
+ * A plugin to tile a pattern into printer pages
+ * */
+export const tilerPlugin = ({ size = 'a4', ...settings }) => {
+ const ls = settings.orientation === 'landscape'
+ let sheetHeight = sizes[size][ls ? 0 : 1]
+ let sheetWidth = sizes[size][ls ? 1 : 0]
+ sheetWidth -= settings.margin * 2
+ sheetHeight -= settings.margin * 2
+
+ return basePlugin({ ...settings, sheetWidth, sheetHeight })
+}
+
+export const materialPlugin = (settings) => {
+ return basePlugin({
+ ...settings,
+ partName: 'material',
+ responsiveColumns: false,
+ })
+}
+
+/** check if there is anything to render on the given section of the svg so that we can skip empty pages */
+const doScanForBlanks = (stacks, layout, x, y, w, h) => {
+ let hasContent = false
+ for (var s in stacks) {
+ let stack = stacks[s]
+
+ // get the position of the part
+ let stackLayout = layout.stacks[s]
+ if (!stackLayout) continue
+
+ let stackMinX = stackLayout.tl?.x || stackLayout.move.x + stack.topLeft.x
+ let stackMinY = stackLayout.tl?.y || stackLayout.move.y + stack.topLeft.y
+ let stackMaxX = stackLayout.br?.x || stackMinX + stack.width
+ let stackMaxY = stackLayout.br?.y || stackMinY + stack.height
+
+ // check if the stack overlaps the page extents
+ if (
+ // if the left of the stack is further left than the right end of the page
+ stackMinX < x + w &&
+ // and the top of the stack is above the bottom of the page
+ stackMinY < y + h &&
+ // and the right of the stack is further right than the left of the page
+ stackMaxX > x &&
+ // and the bottom of the stack is below the top to the page
+ stackMaxY > y
+ ) {
+ // the stack has content inside the page
+ hasContent = true
+ // so we stop looking
+ break
+ }
+ }
+
+ return hasContent
+}
+
+export function addToOnly(pattern, partName) {
+ const only = pattern.settings[0].only
+ if (only && !only.includes(partName)) {
+ pattern.settings[0].only = [].concat(only, partName)
+ }
+}
+
+function removeFromOnly(pattern, partName) {
+ const only = pattern.settings[0].only
+ if (only && only.includes(partName)) {
+ pattern.settings[0].only.splice(only.indexOf(partName), 1)
+ }
+}
+/**
+ * The base plugin for adding a layout helper part like pages or fabric
+ * sheetWidth: the width of the helper part
+ * sheetHeight: the height of the helper part
+ * boundary: should the helper part calculate its boundary?
+ * responsiveColumns: should the part make more columns if the pattern exceed its width? (for pages you want this, for fabric you don't)
+ * printStyle: should the pages be rendered for printing or for screen viewing?
+ * */
+const basePlugin = ({
+ sheetWidth,
+ sheetHeight,
+ // boundary = false,
+ partName = 'pages',
+ responsiveColumns = true,
+ printStyle = false,
+ scanForBlanks = true,
+ renderBlanks = true,
+ setPatternSize = false,
+}) => ({
+ name,
+ version,
+ hooks: {
+ preDraft: function (pattern) {
+ if (!responsiveColumns) {
+ pattern.settings[0].maxWidth = sheetWidth
+ }
+
+ addToOnly(pattern, partName)
+ // Add part
+ pattern.addPart({
+ name: partName,
+ draft: (shorthand) => {
+ const layoutData = shorthand.store.get('layoutData')
+ // only actually draft the part if layout data has been set
+ if (layoutData) {
+ shorthand.macro('addPages', layoutData, shorthand)
+ shorthand.part.unhide()
+ } else {
+ shorthand.part.hide()
+ }
+ return shorthand.part
+ },
+ })
+ },
+ postLayout: function (pattern) {
+ let { height, width, stacks } = pattern
+ if (!responsiveColumns) width = sheetWidth
+ // get the layout
+ const layout =
+ typeof pattern.settings[pattern.activeSet].layout === 'object'
+ ? pattern.settings[pattern.activeSet].layout
+ : pattern.autoLayout
+
+ // if the layout doesn't start at 0,0 we want to account for that in our height and width
+ if (layout?.topLeft) {
+ height += layout.topLeft.y
+ responsiveColumns && (width += layout.topLeft.x)
+ }
+
+ // store the layout data so the part can use it during drafting
+ pattern.setStores[pattern.activeSet].set('layoutData', {
+ size: [sheetHeight, sheetWidth],
+ height,
+ width,
+ layout,
+ stacks,
+ })
+
+ // draft the part
+ pattern.draftPartForSet(partName, pattern.activeSet)
+
+ // if the pattern size is supposed to be re-set to the full width and height of all pages, do that
+ const generatedPageData = pattern.setStores[pattern.activeSet].get(partName)
+ if (setPatternSize === true || setPatternSize === 'width')
+ pattern.width = Math.max(pattern.width, sheetWidth * generatedPageData.cols)
+ if (setPatternSize === true || setPatternSize === 'height')
+ pattern.height = Math.max(pattern.height, sheetHeight * generatedPageData.rows)
+
+ removeFromOnly(pattern, partName)
+ },
+ preRender: function (svg) {
+ addToOnly(svg.pattern, partName)
+ },
+ postRender: function (svg) {
+ removeFromOnly(svg.pattern, partName)
+ },
+ },
+ macros: {
+ /** draft the pages */
+ addPages: function (so, shorthand) {
+ const [h, w] = so.size
+ const cols = Math.ceil(so.width / w)
+ const rows = Math.ceil(so.height / h)
+ const { points, Point, paths, Path, part, macro, store } = shorthand
+ let count = 0
+ let withContent = {}
+ part.topLeft = so.layout.topLeft
+ ? new Point(so.layout.topLeft.x, so.layout.topLeft.y)
+ : new Point(0, 0)
+
+ // get the layout from the pattern
+ const { layout } = so
+ for (let row = 0; row < rows; row++) {
+ let y = row * h
+ withContent[row] = {}
+ for (let col = 0; col < cols; col++) {
+ let x = col * w
+ let hasContent = true
+ if (scanForBlanks && layout) {
+ hasContent = doScanForBlanks(so.stacks, layout, x, y, w, h)
+ }
+ withContent[row][col] = hasContent
+ if (!renderBlanks && !hasContent) continue
+ if (hasContent) count++
+ const pageName = `_pages__row${row}-col${col}`
+ points[`${pageName}-tl`] = new Point(x, y)
+ points[`${pageName}-tr`] = new Point(x + w, y)
+ points[`${pageName}-br`] = new Point(x + w, y + h)
+ points[`${pageName}-bl`] = new Point(x, y + h)
+ points[`${pageName}-circle`] = new Point(x + w / 2, y + h / 2)
+ .setCircle(56, 'stroke-4xl muted fabric')
+ .attr('data-circle-id', `${pageName}-circle`)
+ points[`${pageName}-text`] = new Point(x + w / 2, y + h / 2)
+ .setText(
+ `${responsiveColumns ? indexStr(col + 1) : ''}${row + 1}`,
+ 'text-4xl center baseline-center bold muted fill-fabric'
+ )
+ .attr('data-text-id', `${pageName}-text`)
+
+ paths[pageName] = new Path()
+ .attr('id', pageName)
+ .move(points[`${pageName}-tl`])
+ .line(points[`${pageName}-bl`])
+ .line(points[`${pageName}-br`])
+ .line(points[`${pageName}-tr`])
+ .close()
+
+ // add an edge warning if it can't expand horizontally
+ if (!responsiveColumns) {
+ paths[pageName + '_edge'] = new Path()
+ .move(points[`${pageName}-tr`])
+ .line(points[`${pageName}-br`])
+ // .move(points[`${pageName}-br`].translate(20, 0))
+ .addClass('help contrast stroke-xl')
+
+ shorthand.macro('banner', {
+ path: paths[pageName + '_edge'],
+ text: 'plugin:edgeOf' + shorthand.utils.capitalize(partName),
+ className: 'text-xl center',
+ spaces: 20,
+ })
+ }
+
+ if (col === cols - 1 && row === rows - 1) {
+ const br = points[`${pageName}-br`]
+ part.width = br.x
+ part.height = br.y
+ part.bottomRight = new Point(br.x, br.y)
+ }
+
+ if (!printStyle) {
+ paths[pageName]
+ .attr('class', 'fill-fabric')
+ .attr(
+ 'style',
+ `stroke-opacity: 0; fillOpacity: ${(col + row) % 2 === 0 ? 0.03 : 0.15};`
+ )
+ } else {
+ paths[pageName].attr('class', 'interfacing stroke-xs')
+ // add markers and rulers
+ macro('addPageMarkers', { row, col, pageName, withContent }, shorthand)
+ macro('addRuler', { xAxis: true, pageName }, shorthand)
+ macro('addRuler', { xAxis: false, pageName }, shorthand)
+ }
+ }
+ }
+ // Store page count in part
+ store.set(partName, { cols, rows, count, withContent, width: w, height: h })
+ },
+ /** add a ruler to the top left corner of the page */
+ addRuler({ xAxis, pageName }, shorthand) {
+ const { points, paths, Path } = shorthand
+ const isMetric = this.context.settings.units === 'metric'
+ // not so arbitrary number of units for the ruler
+ const rulerLength = isMetric ? 10 : 2
+ // distance to the end of the ruler
+ const endPointDist = [(isMetric ? 10 : 25.4) * rulerLength, 0]
+
+ const axisName = xAxis ? 'x' : 'y'
+ const rulerName = `${pageName}-${axisName}`
+ // start by making an endpoint for the ruler based on the axis
+ const endPoint = [endPointDist[xAxis ? 0 : 1], endPointDist[xAxis ? 1 : 0]]
+ points[`${rulerName}-ruler-end`] = points[`${pageName}-tl`].translate(
+ endPoint[0],
+ endPoint[1]
+ )
+ // also make a tick for the end of the ruler
+ points[`${rulerName}-ruler-tick`] = points[`${rulerName}-ruler-end`]
+ .translate(xAxis ? 0 : 3, xAxis ? 3 : 0)
+ // add a label to it
+ .attr('data-text', rulerLength + (isMetric ? 'cm' : '"'))
+ // space the text properly from the end of the line
+ .attr('data-text-class', 'fill-interfacing baseline-center' + (xAxis ? ' center' : ''))
+ .attr(`data-text-d${xAxis ? 'y' : 'x'}`, xAxis ? 5 : 3)
+ // give the text an explicit id in case we need to hide it later
+ .attr('data-text-id', `${rulerName}-ruler-text`)
+
+ // start the path
+ paths[`${rulerName}-ruler`] = new Path()
+ .move(points[`${pageName}-tl`])
+ // give it an explicit id in case we need to hide it later
+ .attr('id', `${rulerName}-ruler`)
+ .attr('class', 'interfacing stroke-xs')
+
+ // get the distance between the smaller ticks on the rule
+ const division = (isMetric ? 0.1 : 0.125) / rulerLength
+ // Set up intervals for whole and half units.
+ const wholeInterval = isMetric ? 10 : 8
+ const halfInterval = isMetric ? 5 : 4
+ let tickCounter = 1
+ // we're going to go by fraction, so we want to do this up to 1
+ for (var d = division; d < 1; d += division) {
+ // make a start point
+ points[`${rulerName}-ruler-${d}-end`] = points[`${pageName}-tl`].shiftFractionTowards(
+ points[`${rulerName}-ruler-end`],
+ d
+ )
+
+ // base tick size on whether this is a major interval or a minor one
+ let tick = 1
+ // if this tick indicates a whole unit, extra long
+ if (tickCounter % wholeInterval === 0) tick = 3
+ // if this tick indicates half a unit, long
+ else if (tickCounter % halfInterval === 0) tick = 2
+ tickCounter++
+
+ // make a point for the end of the tick
+ points[`${rulerName}-ruler-${d}-tick`] = points[`${rulerName}-ruler-${d}-end`].translate(
+ xAxis ? 0 : tick,
+ xAxis ? tick : 0
+ )
+
+ // add the whole set to the ruler path
+ paths[`${rulerName}-ruler`]
+ .line(points[`${rulerName}-ruler-${d}-end`])
+ .line(points[`${rulerName}-ruler-${d}-tick`])
+ .line(points[`${rulerName}-ruler-${d}-end`])
+ }
+
+ // add the end
+ paths[`${rulerName}-ruler`]
+ .line(points[`${rulerName}-ruler-end`])
+ .line(points[`${rulerName}-ruler-tick`])
+ },
+ /** add page markers to the given page */
+ addPageMarkers({ row, col, pageName, withContent }, shorthand) {
+ const { macro, points } = shorthand
+ // these markers are placed on the top and left of the page,
+ // so skip markers for the top row or leftmost column
+ if (row !== 0 && withContent[row - 1][col])
+ macro('addPageMarker', {
+ along: [points[`${pageName}-tr`], points[`${pageName}-tl`]],
+ label: [`${row}`, `${row + 1}`],
+ isRow: true,
+ pageName,
+ })
+ if (col !== 0 && withContent[row][col - 1])
+ macro('addPageMarker', {
+ along: [points[`${pageName}-tl`], points[`${pageName}-bl`]],
+ label: [indexStr(col), indexStr(col + 1)],
+ isRow: false,
+ pageName,
+ })
+ },
+ /** add a page marker for either the row or the column, to aid with alignment and orientation */
+ addPageMarker({ along, label, isRow, pageName }) {
+ const { points, paths, Path, scale } = this.shorthand()
+ const markerName = `${pageName}-${isRow ? 'row' : 'col'}-marker`
+
+ // x and y distances between corners. one will always be 0, which is helpful
+ const xDist = along[0].dx(along[1])
+ const yDist = along[0].dy(along[1])
+
+ // size of the x mark should be impacted by the scale setting
+ const markSize = 4 * scale
+
+ // make one at 25% and one at 75%
+ for (var d = 25; d < 100; d += 50) {
+ // get points to make an x at d% along the edge
+ const dName = `${markerName}-${d}`
+ const centerName = `${dName}-center`
+ points[centerName] = along[0].translate((xDist * d) / 100, (yDist * d) / 100)
+ points[`${dName}-tr`] = points[centerName].translate(-markSize, markSize)
+ points[`${dName}-tl`] = points[centerName].translate(-markSize, -markSize)
+ points[`${dName}-br`] = points[centerName].translate(markSize, markSize)
+ points[`${dName}-bl`] = points[centerName].translate(markSize, -markSize)
+
+ // make a path for the x
+ paths[`${dName}`] = new Path()
+ .move(points[`${dName}-tr`])
+ .line(points[`${dName}-bl`])
+ .move(points[`${dName}-tl`])
+ .line(points[`${dName}-br`])
+ .attr('class', 'interfacing stroke-xs')
+ // give it an explicit ID in case we need to hide it later
+ .attr('id', dName)
+
+ // add directional labels
+ let angle = along[0].angle(along[1]) - 90
+ for (var i = 0; i < 2; i++) {
+ points[`${dName}-label-${i + 1}`] = points[centerName]
+ .shift(angle, markSize)
+ .setText(label[i], 'text-xs center baseline-center fill-interfacing')
+ // give it an explicit ID in case we need to hide it later
+ .attr('data-text-id', `${dName}-text-${i + 1}`)
+ // rotate for the next one
+ angle += 180
+ }
+ }
+ },
+ },
+})
diff --git a/sites/shared/components/workbench/exporting/single-pdf-maker.mjs b/packages/react/components/Editor/lib/export/single-pdf-maker.mjs
similarity index 100%
rename from sites/shared/components/workbench/exporting/single-pdf-maker.mjs
rename to packages/react/components/Editor/lib/export/single-pdf-maker.mjs
diff --git a/packages/react/components/Editor/lib/formatting.mjs b/packages/react/components/Editor/lib/formatting.mjs
new file mode 100644
index 00000000000..b0b922be06c
--- /dev/null
+++ b/packages/react/components/Editor/lib/formatting.mjs
@@ -0,0 +1,229 @@
+import React from 'react'
+import { designOptionType } from '@freesewing/utils'
+import { BoolNoIcon, BoolYesIcon } from '@freesewing/react/components/Icon'
+
+/*
+ * Method that capitalizes a string (make the first character uppercase)
+ *
+ * @param {string} string - The input string to capitalize
+ * @return {string} String - The capitalized input string
+ */
+export function capitalize(string) {
+ return typeof string === 'string' ? string.charAt(0).toUpperCase() + string.slice(1) : ''
+}
+
+export function formatDesignOptionValue(option, value, imperial) {
+ const oType = designOptionType(option)
+ if (oType === 'pct') return formatPercentage(value ? value : option.pct / 100)
+ if (oType === 'deg') return `${value ? value : option.deg}°`
+ if (oType === 'bool')
+ return typeof value === 'undefined' ? option.bool : value ? :
+ if (oType === 'mm') return formatMm(typeof value === 'undefined' ? option.mm : value, imperial)
+ if (oType === 'list') return typeof value === 'undefined' ? option.dflt : value
+
+ return value
+}
+
+/**
+ * format a value to the nearest fraction with a denominator that is a power of 2
+ * or a decimal if the value is between fractions
+ * NOTE: this method does not convert mm to inches. It will turn any given value directly into its equivalent fractional representation
+ *
+ * fraction: the value to process
+ * format: the type of formatting to apply. html, notags, or anything else which will only return numbers
+ */
+export function formatFraction128(fraction, format = 'html') {
+ let negative = ''
+ let inches = ''
+ let rest = ''
+ if (fraction < 0) {
+ fraction = fraction * -1
+ negative = '-'
+ }
+ if (Math.abs(fraction) < 1) rest = fraction
+ else {
+ inches = Math.floor(fraction)
+ rest = fraction - inches
+ }
+ let fraction128 = Math.round(rest * 128)
+ if (fraction128 == 0) return formatImperial(negative, inches || fraction128, false, false, format)
+
+ for (let i = 1; i < 7; i++) {
+ const numoFactor = Math.pow(2, 7 - i)
+ if (fraction128 % numoFactor === 0)
+ return formatImperial(negative, inches, fraction128 / numoFactor, Math.pow(2, i), format)
+ }
+
+ return (
+ negative +
+ Math.round(fraction * 100) / 100 +
+ (format === 'html' || format === 'notags' ? '"' : '')
+ )
+}
+
+// Formatting for imperial values
+export function formatImperial(neg, inch, numo = false, deno = false, format = 'html') {
+ if (format === 'html') {
+ if (numo) return `${neg}${inch} ${numo} /${deno} "`
+ else return `${neg}${inch}"`
+ } else if (format === 'notags') {
+ if (numo) return `${neg}${inch} ${numo}/${deno}"`
+ else return `${neg}${inch}"`
+ } else {
+ if (numo) return `${neg}${inch} ${numo}/${deno}`
+ else return `${neg}${inch}`
+ }
+}
+
+// Format a value in mm based on the user's units
+// Format can be html, notags, or anything else which will only return numbers
+export function formatMm(val, units, format = 'html') {
+ val = roundMm(val)
+ if (units === 'imperial' || units === true) {
+ if (val == 0) return formatImperial('', 0, false, false, format)
+
+ let fraction = val / 25.4
+ return formatFraction128(fraction, format)
+ } else {
+ if (format === 'html' || format === 'notags') return roundMm(val / 10) + 'cm'
+ else return roundMm(val / 10)
+ }
+}
+
+// Format a percentage (as in, between 0 and 1)
+export function formatPercentage(val) {
+ return Math.round(1000 * val) / 10 + '%'
+}
+
+/**
+ * A generic rounding method
+ *
+ * @param {number} val - The input number to round
+ * @param {number} decimals - The number of decimal points to use when rounding
+ * @return {number} result - The rounded number
+ */
+export function round(methods, val, decimals = 1) {
+ return Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals)
+}
+
+// Rounds a value in mm
+export function roundMm(val, units) {
+ if (units === 'imperial') return Math.round(val * 1000000) / 1000000
+ else return Math.round(val * 10) / 10
+}
+
+/**
+ * Converts a value that contain a fraction to a decimal
+ *
+ * @param {number} value - The input value
+ * @return {number} result - The resulting decimal value
+ */
+export function fractionToDecimal(value) {
+ // if it's just a number, return it
+ if (!isNaN(value)) return value
+
+ // keep a running total
+ let total = 0
+
+ // split by spaces
+ let chunks = String(value).split(' ')
+ if (chunks.length > 2) return Number.NaN // too many spaces to parse
+
+ // a whole number with a fraction
+ if (chunks.length === 2) {
+ // shift the whole number from the array
+ const whole = Number(chunks.shift())
+ // if it's not a number, return NaN
+ if (isNaN(whole)) return Number.NaN
+ // otherwise add it to the total
+ total += whole
+ }
+
+ // now we have only one chunk to parse
+ let fraction = chunks[0]
+
+ // split it to get numerator and denominator
+ let fChunks = fraction.trim().split('/')
+ // not really a fraction. return NaN
+ if (fChunks.length !== 2 || fChunks[1] === '') return Number.NaN
+
+ // do the division
+ let num = Number(fChunks[0])
+ let denom = Number(fChunks[1])
+ if (isNaN(num) || isNaN(denom)) return NaN
+ return total + num / denom
+}
+
+/**
+ * Helper method to turn a measurement in millimeter regardless of units
+ *
+ * @param {number} value - The input value
+ * @param {string} units - One of 'metric' or 'imperial'
+ * @return {number} result - Value in millimeter
+ */
+export function measurementAsMm(value, units = 'metric') {
+ if (typeof value === 'number') return value * (units === 'imperial' ? 25.4 : 10)
+
+ if (String(value).endsWith('.')) return false
+
+ if (units === 'metric') {
+ value = Number(value)
+ if (isNaN(value)) return false
+ return value * 10
+ } else {
+ const decimal = fractionToDecimal(value)
+ if (isNaN(decimal)) return false
+ return decimal * 24.5
+ }
+}
+
+/**
+ * Converts a millimeter value to a Number value in the given units
+ *
+ * @param {number} mmValue - The input value in millimeter
+ * @param {string} units - One of 'metric' or 'imperial'
+ * @result {number} result - The result in millimeter
+ */
+export function measurementAsUnits(mmValue, units = 'metric') {
+ return round(mmValue / (units === 'imperial' ? 25.4 : 10), 3)
+}
+export function shortDate(locale = 'en', timestamp = false, withTime = true) {
+ const options = {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ }
+ if (withTime) {
+ options.hour = '2-digit'
+ options.minute = '2-digit'
+ options.hour12 = false
+ }
+ const ts = timestamp ? new Date(timestamp) : new Date()
+
+ return ts.toLocaleDateString(locale, options)
+}
+/*
+ * Parses value that should be a distance (cm or inch)
+ *
+ * @param {number} val - The input value
+ * @param {bool} imperial - True if the units are imperial, false for metric
+ * @return {number} result - The distance in the relevant units
+ */
+export function parseDistanceInput(val = false, imperial = false) {
+ // No input is not valid
+ if (!val) return false
+
+ // Cast to string, and replace comma with period
+ val = val.toString().trim().replace(',', '.')
+
+ // Regex pattern for regular numbers with decimal seperator or fractions
+ const regex = imperial
+ ? /^-?[0-9]*(\s?[0-9]+\/|[.])?[0-9]+$/ // imperial (fractions)
+ : /^-?[0-9]*[.]?[0-9]+$/ // metric (no fractions)
+ if (!val.match(regex)) return false
+
+ // if fractions are allowed, parse for fractions, otherwise use the number as a value
+ if (imperial) val = fractionToDecimal(val)
+
+ return isNaN(val) ? false : Number(val)
+}
diff --git a/packages/react/components/Editor/lib/index.mjs b/packages/react/components/Editor/lib/index.mjs
new file mode 100644
index 00000000000..2258b5856c3
--- /dev/null
+++ b/packages/react/components/Editor/lib/index.mjs
@@ -0,0 +1,123 @@
+/*
+ * Import of all methods used by the editor
+ */
+import {
+ defaultSa,
+ defaultSamm,
+ menuCoreSettingsOnlyHandler,
+ menuCoreSettingsSaboolHandler,
+ menuCoreSettingsSammHandler,
+ menuCoreSettingsStructure,
+} from './core-settings.mjs'
+import { findOption, getOptionStructure, menuDesignOptionsStructure } from './design-options.mjs'
+import { menuLayoutSettingsStructure } from './layout-settings.mjs'
+import {
+ addUndoStep,
+ bundlePatternTranslations,
+ cloneObject,
+ cloudImageUrl,
+ draft,
+ flattenFlags,
+ getCoreSettingUndoStepData,
+ getDesignOptionUndoStepData,
+ getUiPreferenceUndoStepData,
+ getUndoStepData,
+ initialEditorState,
+ menuRoundPct,
+ menuValidateNumericValue,
+ menuValueWasChanged,
+ noop,
+ notEmpty,
+ nsMerge,
+ objUpdate,
+ sample,
+ settingsValueIsCustom,
+ settingsValueCustomOrDefault,
+ statePrefixPath,
+ stateUpdateFactory,
+ stripNamespace,
+ t,
+ undoableObjUpdate,
+} from './editor.mjs'
+import {
+ capitalize,
+ formatDesignOptionValue,
+ formatFraction128,
+ formatImperial,
+ formatMm,
+ formatPercentage,
+ round,
+ roundMm,
+ fractionToDecimal,
+ measurementAsMm,
+ measurementAsUnits,
+ shortDate,
+ parseDistanceInput,
+} from './formatting.mjs'
+import { designMeasurements, missingMeasurements } from './measurements.mjs'
+import { menuUiPreferencesStructure } from './ui-preferences.mjs'
+
+/*
+ * Re-export as named exports
+ */
+export {
+ // core-settings.mjs
+ defaultSa,
+ defaultSamm,
+ menuCoreSettingsOnlyHandler,
+ menuCoreSettingsSaboolHandler,
+ menuCoreSettingsSammHandler,
+ menuCoreSettingsStructure,
+ // design-options.mjs
+ findOption,
+ getOptionStructure,
+ menuDesignOptionsStructure,
+ // layout-settings.mjs
+ menuLayoutSettingsStructure,
+ // editor.mjs
+ addUndoStep,
+ bundlePatternTranslations,
+ cloneObject,
+ cloudImageUrl,
+ draft,
+ flattenFlags,
+ getCoreSettingUndoStepData,
+ getDesignOptionUndoStepData,
+ getUiPreferenceUndoStepData,
+ getUndoStepData,
+ initialEditorState,
+ menuRoundPct,
+ menuValidateNumericValue,
+ menuValueWasChanged,
+ noop,
+ notEmpty,
+ nsMerge,
+ objUpdate,
+ sample,
+ settingsValueIsCustom,
+ settingsValueCustomOrDefault,
+ statePrefixPath,
+ stateUpdateFactory,
+ stripNamespace,
+ t,
+ undoableObjUpdate,
+ // formatting.mjs
+ capitalize,
+ formatDesignOptionValue,
+ formatFraction128,
+ formatImperial,
+ formatMm,
+ formatPercentage,
+ round,
+ roundMm,
+ fractionToDecimal,
+ measurementAsMm,
+ measurementAsUnits,
+ shortDate,
+ parseDistanceInput,
+ // measurements.mjs
+ designMeasurements,
+ missingMeasurements,
+ // ui-preferences.mjs
+ menuUiPreferencesStructure,
+}
diff --git a/packages/react/components/Editor/lib/layout-settings.mjs b/packages/react/components/Editor/lib/layout-settings.mjs
new file mode 100644
index 00000000000..517650328d5
--- /dev/null
+++ b/packages/react/components/Editor/lib/layout-settings.mjs
@@ -0,0 +1,116 @@
+import React from 'react'
+import { linkClasses } from '@freesewing/utils'
+import {
+ CoverPageIcon,
+ PageMarginIcon,
+ PageOrientationIcon,
+ PageSizeIcon,
+ PatternIcon,
+ ScaleIcon,
+} from '@freesewing/react/components/Icon'
+
+const UiDocsLink = ({ item }) => (
+
+ Learn more
+
+)
+
+const sizes = ['a4', 'a3', 'a2', 'a1', 'a0', 'letter', 'legal', 'tabloid']
+const defaultPrintSettings = (units) => ({
+ size: units === 'imperial' ? 'letter' : 'a4',
+ orientation: 'portrait',
+ margin: units === 'imperial' ? 12.7 : 10,
+ coverPage: true,
+})
+
+export function menuLayoutSettingsStructure(units) {
+ const defaults = defaultPrintSettings(units)
+ const sizeTitles = {
+ a4: 'A4',
+ a3: 'A3',
+ a2: 'A2',
+ a1: 'A1',
+ a0: 'A0',
+ letter: 'Letter',
+ legal: 'Legal',
+ tabloid: 'Tabloid',
+ }
+
+ return {
+ size: {
+ dense: true,
+ title: 'Paper Size',
+ about: (
+
+ This control the pages overlay that helps you see how your pattern spans the pages. This
+ does not limit your export options, you can still export in a variety of paper sizes.
+
+ ),
+ ux: 1,
+ list: Object.keys(sizeTitles),
+ choiceTitles: sizeTitles,
+ valueTitles: sizeTitles,
+ dflt: defaults.size,
+ icon: PageSizeIcon,
+ },
+ orientation: {
+ dense: true,
+ title: 'Page Orientation',
+ about: (
+ Landscape or Portrait. Try both to see which yields the least amount of pages.
+ ),
+ ux: 1,
+ list: ['portrait', 'landscape'],
+ choiceTitles: {
+ portrait: (
+
+ ),
+ landscape: (
+
+ ),
+ },
+ icon: PageOrientationIcon,
+ },
+ margin: {
+ dense: true,
+ title: 'Page Margin',
+ min: units === 'imperial' ? 2.5 : 5,
+ max: 25,
+ dflt: defaults.margin,
+ icon: PageMarginIcon,
+ ux: 1,
+ },
+ coverPage: {
+ dense: true,
+ ux: 1,
+ icon: CoverPageIcon,
+ title: 'Cover Page',
+ about:
+ 'The cover page includes information about the pattern and an overview of how to assemble the pages.',
+ list: [0, 1],
+ choiceTitles: {
+ 0: 'Do not include a cover page',
+ 1: 'Include a cover page',
+ },
+ dflt: 0,
+ },
+ iconSize: {
+ dense: true,
+ ux: 1,
+ icon: ScaleIcon,
+ title: 'Icon Size',
+ about:
+ 'Controls the size of the icons that allow you to rotate/flip individual pattern parts',
+ min: 10,
+ dflt: 0.5,
+ step: 1,
+ max: 200,
+ },
+ }
+}
diff --git a/packages/react/components/Editor/lib/measurements.mjs b/packages/react/components/Editor/lib/measurements.mjs
new file mode 100644
index 00000000000..392b2c5b1b0
--- /dev/null
+++ b/packages/react/components/Editor/lib/measurements.mjs
@@ -0,0 +1,36 @@
+// Dependencies
+import { defaultConfig } from '../config/index.mjs'
+
+/*
+ * Returns a list of measurements for a design
+ *
+ * @param {object} Design - The Design object
+ * @param {object} measies - The current set of measurements
+ * @return {object} measurements - Object holding measurements that are relevant for this design
+ */
+export function designMeasurements(Design, measies = {}) {
+ const measurements = {}
+ for (const m of Design.patternConfig?.measurements || []) measurements[m] = measies[m]
+ for (const m of Design.patternConfig?.optionalMeasurements || []) measurements[m] = measies[m]
+
+ return measurements
+}
+
+/*
+ * Helper method to check whether measurements are missing
+ *
+ * Note that this does not actually check the settings against
+ * the chosen design, but rather relies on the missing measurements
+ * being set in state. That's because checking is more expensive,
+ * so we do it only once.
+ *
+ * @param {object} state - The Editor state
+ * @return {bool} missing - True if there are missing measurments, false if not
+ */
+export function missingMeasurements(state) {
+ return (
+ !defaultConfig.measurementsFreeViews.includes(state.view) &&
+ state._.missingMeasurements &&
+ state._.missingMeasurements.length > 0
+ )
+}
diff --git a/packages/react/components/Editor/lib/ui-preferences.mjs b/packages/react/components/Editor/lib/ui-preferences.mjs
new file mode 100644
index 00000000000..7ab2153358e
--- /dev/null
+++ b/packages/react/components/Editor/lib/ui-preferences.mjs
@@ -0,0 +1,119 @@
+import React from 'react'
+import { defaultConfig } from '../config/index.mjs'
+import { linkClasses } from '@freesewing/utils'
+import { AsideIcon, RotateIcon, RocketIcon, UxIcon } from '@freesewing/react/components/Icon'
+
+const UiDocsLink = ({ item }) => (
+
+ Learn more
+
+)
+
+export function menuUiPreferencesStructure() {
+ const uiUx = defaultConfig.uxLevels.ui
+ const uiPreferences = {
+ aside: {
+ dense: true,
+ title: 'Show side menu',
+ about: (
+
+ Uses the right side of the screen for the Design Options, Core Settings, and UI
+ Preferences menus.
+
+
+ ),
+ ux: uiUx.aside,
+ list: [0, 1],
+ choiceTitles: {
+ 0: 'Do not show the side menu',
+ 1: 'Show the side menu',
+ },
+ dflt: 0,
+ icon: AsideIcon,
+ },
+ ux: {
+ dense: true,
+ title: 'User Experience',
+ about: (
+
+ Controls the user experience, from keep it simple, to give me all the powers.
+
+
+ ),
+ ux: uiUx.ux,
+ emoji: '🖥️',
+ list: [1, 2, 3, 4, 5],
+ choiceTitles: {
+ 1: 'Keep it as simple as possible',
+ 2: 'Keep it simple, but not too simple',
+ 3: 'Balance simplicity with power',
+ 4: 'Give me all powers, but keep me safe',
+ 5: 'Get out of my way',
+ },
+ _choiceDescriptions: {
+ 1: 'Hides all but the most crucial features.',
+ 2: 'Hides most of the advanced features.',
+ 3: 'Reveals the majority of advanced features, but not all of them.',
+ 4: 'Reveals all advanced features, keeps handrails and safety checks.',
+ 5: 'Reveals all advanced features, removes handrails and safety checks.',
+ },
+ icon: UxIcon,
+ dflt: defaultConfig.defaultUx,
+ },
+ rotate: {
+ dense: true,
+ title: 'Rotate Pattern',
+ about: (
+
+ Allows you to rotate your pattern 90 degrees, handy for tall patterns.
+
+
+ ),
+ ux: uiUx.rotate,
+ list: [0, 1],
+ choiceTitles: {
+ 0: 'Do not rotate the pattern',
+ 1: 'Rotate the pattern 90 degrees',
+ },
+ dflt: 0,
+ icon: RotateIcon,
+ },
+ renderer: {
+ dense: true,
+ title: 'Pattern render engine',
+ about: 'Change the way the pattern is rendered on screen',
+ about: (
+
+ Change the underlying method for rendering the pattern on screen.
+
+
+ ),
+ ux: uiUx.renderer,
+ list: ['react', 'svg'],
+ choiceTitles: {
+ react: (
+
+ Render using @freesewing/react
+
+ ),
+ svg: (
+
+ Render using @freesewing/core
+
+ ),
+ },
+ choiceDescriptions: {
+ 0: 'pe:noAside',
+ 1: 'pe:withAside',
+ },
+ valueTitles: {
+ react: 'React',
+ svg: 'Core',
+ },
+ dflt: 'react',
+ icon: RocketIcon,
+ },
+ }
+
+ return uiPreferences
+}
diff --git a/packages/react/components/Heading/index.mjs b/packages/react/components/Heading/index.mjs
new file mode 100644
index 00000000000..8619c7df99a
--- /dev/null
+++ b/packages/react/components/Heading/index.mjs
@@ -0,0 +1,37 @@
+import React from 'react'
+
+export const H1 = ({ children }) => (
+
+ {children}
+
+)
+
+export const H2 = ({ children }) => (
+
+ {children}
+
+)
+
+export const H3 = ({ children }) => (
+
+ {children}
+
+)
+
+export const H4 = ({ children }) => (
+
+ {children}
+
+)
+
+export const H5 = ({ children }) => (
+
+ {children}
+
+)
+
+export const H6 = ({ children }) => (
+
+ {children}
+
+)
diff --git a/packages/react/components/Highlight/index.mjs b/packages/react/components/Highlight/index.mjs
new file mode 100644
index 00000000000..c542c4880ad
--- /dev/null
+++ b/packages/react/components/Highlight/index.mjs
@@ -0,0 +1,56 @@
+import React from 'react'
+import { CopyToClipboardButton } from '@freesewing/react/components/CopyToClipboardButton'
+
+const defaultTitles = {
+ js: 'Javascript',
+ bash: 'Bash commands',
+ sh: 'Shell commands',
+ json: 'JSON',
+ yaml: 'YAML',
+}
+
+/**
+ * A React component to highlight code
+ *
+ * @params {object} props - All React props
+ * @params {string} language - The language to highlight
+ * @params {object} children - The React children
+ * @params {bool} raw - Set this to true to not escape tags
+ * @params {string} title - Title for the highlight
+ * @params {string} copy - Content to copy to clipboard
+ * @params {bool} noCopy - Do not add copy to clipboard
+ */
+export const Highlight = ({
+ language = 'txt',
+ children,
+ raw = false,
+ title = false,
+ copy = false,
+ noCopy = false,
+}) => {
+ if (children?.props?.className) {
+ language = children.props.className.split('-').pop()
+ }
+
+ const preProps = {
+ className: `language-${language} hljs tw-text-base lg:tw-text-lg tw-whitespace-break-spaces tw-overflow-scroll tw-pr-4`,
+ }
+ if (raw) preProps.dangerouslySetInnerHTML = { __html: raw }
+
+ const label = title ? title : defaultTitles[language] ? defaultTitles[language] : language
+
+ return (
+
+
+ {label}
+ {noCopy ? null : }
+
+
{children}
+
+ )
+}
diff --git a/packages/react/components/Icon/index.mjs b/packages/react/components/Icon/index.mjs
new file mode 100644
index 00000000000..51a3b2d9f2a
--- /dev/null
+++ b/packages/react/components/Icon/index.mjs
@@ -0,0 +1,842 @@
+import React from 'react'
+import { logoPath } from '@freesewing/config'
+
+// Used in several icons
+const page =
+ 'M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z'
+
+/*
+ * Used inside the pattern editor
+ */
+export const IconWrapper = ({
+ className = 'tw-w-6 tw-h-6',
+ stroke = 2,
+ children = null,
+ fill = false,
+ fillOpacity = 1,
+ dasharray = null,
+ wrapped = true,
+}) =>
+ wrapped ? (
+
+ {children}
+
+ ) : (
+ <> {children} >
+ )
+
+// Looks like a play triangle
+export const ApplyIcon = (props) => (
+
+
+
+)
+
+// Looks like a two-column layout
+export const AsideIcon = (props) => (
+
+
+
+)
+
+// Looks like a lab beaker
+export const BeakerIcon = (props) => (
+
+
+
+)
+
+// Looks like a left U-turn that we slightly rotate
+export const BackIcon = (props) => (
+
+
+
+)
+
+// Looks like a red X
+export const BoolNoIcon = ({ size = 6 }) => (
+
+)
+
+// Looks like a green checkbox
+export const BoolYesIcon = ({ size = 6 }) => (
+
+)
+
+// Looks like a bookmark
+export const BookmarkIcon = (props) => (
+
+
+
+)
+
+// Looks like a circle
+export const BulletIcon = (props) => (
+
+
+
+)
+
+// Looks lik a speech bubble
+export const ChatIcon = (props) => (
+
+
+
+)
+
+// Looks like a circle
+export const CircleIcon = (props) => (
+
+
+ {props.label ? (
+
+ {props.label}
+
+ ) : null}
+
+)
+
+// Looks like a female-projecting bathing suit
+export const CisFemaleIcon = (props) => (
+
+
+
+)
+
+// Looks like male-projecting swim trunks
+export const CisMaleIcon = (props) => (
+
+
+
+)
+
+// FIXME
+export const CloneIcon = (props) => (
+
+
+
+)
+
+// Looks like a X
+export const CloseIcon = (props) => (
+
+
+
+)
+
+// Looks like coding brackets
+export const CodeIcon = (props) => (
+
+
+
+)
+
+// FIXME
+export const CompareIcon = (props) => (
+
+
+
+)
+
+// Looks like scales of justice
+export const ControlIcon = (props) => (
+
+
+
+)
+
+// Looks like two rounded squares above each other with a bit of offset
+export const CopyIcon = (props) => (
+
+
+
+)
+
+// Looks like a page with a smiley on it
+export const CoverPageIcon = (props) => (
+
+
+
+
+
+
+)
+
+// Looks like a museum building
+export const CuratedMeasurementsSetIcon = (props) => (
+
+
+
+)
+
+// Looks like a coathanger
+export const DesignIcon = (props) => (
+
+
+
+)
+
+// Looks like a left and right pane with different level of detail
+export const DetailIcon = (props) => (
+
+
+
+)
+
+// Looks like a document icon
+export const DocsIcon = (props) => (
+
+
+
+)
+
+// Looks like a down pointing chevron
+export const DownIcon = (props) => (
+
+
+
+)
+
+// Looks like a cloud with an arrow pointing down from it
+export const DownloadIcon = (props) => (
+
+
+
+)
+
+// Looks like a pencil
+export const EditIcon = (props) => (
+
+
+
+)
+
+// Looks like an envelope
+export const EmailIcon = (props) => (
+
+
+
+)
+
+// Looks like FIXME
+export const ErrorIcon = (props) => (
+
+
+
+)
+
+// Looks like arrows pointing outwards
+export const ExpandIcon = (props) => (
+
+
+
+)
+
+// Looks like a file/sheet with an arrow pointing downwards
+export const ExportIcon = (props) => (
+
+
+
+)
+
+// Looks like a ! in a triangle, is intended to be shown on an error background
+export const FailureIcon = ({ size = 6 }) => (
+
+)
+
+// Looks like a funnel
+export const FilterIcon = (props) => (
+
+
+
+)
+
+// Looks like a fingerprint
+export const FingerprintIcon = (props) => (
+
+
+
+)
+
+// Looks lik an exclamation point inside a circle
+export const FixmeIcon = (props) => (
+
+
+
+)
+
+// Looks lik a flag
+export const FlagIcon = (props) => (
+
+
+
+)
+
+// Looks lik a flag
+export const FlipIcon = (props) => (
+
+
+
+)
+
+// Looks like skully
+export const FreeSewingIcon = (props) => (
+
+
+
+)
+
+// Looks like a gauge or speedometer
+export const GaugeIcon = (props) => (
+
+
+
+
+)
+
+// Looks like the octocat
+export const GitHubIcon = (props) => (
+
+
+
+)
+
+// Looks like the Google G
+export const GoogleIcon = (props) => (
+
+
+
+)
+
+// Looks like abox
+export const GroupIcon = (props) => (
+
+
+
+)
+
+// Looks like a heart
+export const HeartIcon = (props) => (
+
+
+
+)
+
+// Looks like a question mark in a circle
+export const HelpIcon = (props) => (
+
+
+
+)
+
+// Looks like a pie with a slice a bit out of it
+export const IncludeIcon = (props) => (
+
+
+
+
+)
+
+// Looks like the Instagram logo
+export const InstagramIcon = (props) => (
+
+
+
+)
+
+// Looks like a key
+export const KeyIcon = (props) => (
+
+
+
+)
+
+// Looks like a rectangle with rounded corners (like a full screen display)
+export const KioskIcon = (props) => (
+
+
+
+)
+
+// Looks like a left pointing chevron
+export const LeftIcon = (props) => (
+
+
+
+)
+
+// Looks like a chain link
+export const LinkIcon = (props) => (
+
+
+
+)
+
+// Looks like a bullet list
+export const ListIcon = (props) => (
+
+
+
+)
+
+// Looks like a padlock
+export const LockIcon = (props) => (
+
+
+
+)
+
+// Looks like 4 boxes spaces out
+export const MarginIcon = (props) => (
+
+
+
+)
+
+// Looks like the Mastodon logo
+export const MastodonIcon = (props) => (
+
+
+
+)
+
+// Looks like a tape measure
+export const MeasurementsIcon = (props) => (
+
+
+
+)
+
+// Looks like two people's heads next/behinf to each other, one bigger, one smaller
+export const MeasurementsSetIcon = (props) => (
+
+
+
+)
+
+// Looks like 3 horizontal lines (hamburger menu)
+export const MenuIcon = (props) => (
+
+
+
+)
+
+// Looks like a person icon with a + sign
+export const NewMeasurementsSetIcon = (props) => (
+
+
+
+)
+
+// Looks like page with a + sign in it
+export const NewPatternIcon = (props) => (
+
+
+
+)
+
+// Looks like a newspaper
+export const NewsletterIcon = (props) => (
+
+
+
+)
+
+// Looks like a X
+export const NoIcon = (props) => (
+
+
+
+)
+
+// Looks like a checkmark
+export const OkIcon = (props) => (
+
+
+
+)
+
+// Looks like sliders on a mixing panel
+export const OptionsIcon = (props) => (
+
+
+
+)
+
+// Looks like a page with a margin drawn around
+export const PageMarginIcon = (props) => (
+
+
+
+
+)
+
+// Looks like a portrait and landscape page stacked
+export const PageOrientationIcon = (props) => (
+
+
+
+
+)
+
+// Looks like two differently sizes pages stacked
+export const PageSizeIcon = (props) => (
+
+
+
+
+)
+
+// Looks like a grid
+export const PaperlessIcon = (props) => (
+
+
+
+
+)
+
+// Looks like a page
+export const PatternIcon = (props) => (
+
+
+
+)
+
+// Looks like a +
+export const PlusIcon = (props) => (
+
+
+
+)
+
+// Looks like a printer
+export const PrintIcon = (props) => (
+
+
+
+)
+
+// FIXME
+export const PrivacyIcon = (props) => (
+
+
+
+)
+
+// Looks like the Reddit alian
+export const RedditIcon = (props) => (
+
+
+
+)
+
+// FIXME
+export const ReloadIcon = (props) => (
+
+
+
+)
+
+// Looks like a backspace key
+export const ResetIcon = (props) => (
+
+
+
+)
+
+// Looks like a double rewind arrow
+export const ResetAllIcon = (props) => (
+
+
+
+)
+
+// Looks like a right pointing chevron
+export const RightIcon = (props) => (
+
+
+
+)
+
+// Looks like a rocket
+export const RocketIcon = (props) => (
+
+
+
+)
+
+// Looks like two arrows in a circular layout
+export const RotateIcon = (props) => (
+
+
+
+)
+
+// Looks like the RSS symbol
+export const RssIcon = (props) => (
+
+
+
+)
+
+// Looks like a cloud with a plus sign in it
+export const SaveIcon = (props) => (
+
+
+
+)
+
+// Looks like a cloud with a plus sign in it
+export const SaveAsIcon = (props) => (
+
+
+
+)
+
+// Looks like a small solid circle with a larger dashed circle around it
+export const SaIcon = (props) => (
+
+
+
+
+)
+
+// Looks like lines of varying thickness
+export const ScaleIcon = (props) => (
+
+
+
+
+
+)
+
+// Looks like a magnifying glass
+export const SearchIcon = (props) => (
+
+
+
+)
+
+// Looks like a gear
+export const SettingsIcon = (props) => (
+
+
+
+
+)
+
+// Looks like a shield
+export const ShieldIcon = (props) => (
+
+
+
+)
+
+// Looks like a picture camera
+export const ShowcaseIcon = (props) => (
+
+
+
+
+)
+
+// Looks like an exit door
+export const SignoutIcon = (props) => (
+
+
+
+)
+
+// Looks like a spinning circle
+export const SpinnerIcon = (props) => (
+
+
+
+
+)
+
+// Looks like a white checkbox, intended to be shown on a success-colored background
+export const SuccessIcon = ({ size = 6 }) => (
+
+)
+
+// Looks like the TikTok t
+export const TikTokIcon = (props) => (
+
+
+
+)
+
+// Looks like a light bulb
+export const TipIcon = (props) => (
+
+
+
+)
+
+// Looks like a trashcan
+export const TrashIcon = (props) => (
+
+
+
+)
+
+// Looks like the twitch logo
+export const TwitchIcon = (props) => (
+
+
+
+)
+
+// Looks like a desktop screen
+export const UiIcon = (props) => (
+
+
+
+)
+
+// Looks like a rewind arrow, but takes text to go inside it
+export const UndoIcon = (props) => (
+
+
+ {props.text ? (
+
+ {props.text}
+
+ ) : null}
+
+)
+
+// Looks like a bit of measuring tape
+export const UnitsIcon = (props) => (
+
+
+
+
+)
+
+// Looks like an up pointing chevron
+export const UpIcon = (props) => (
+
+
+
+)
+// Looks like a cloud with an arrow pointing upwards in it
+export const UploadIcon = (props) => (
+
+
+
+)
+
+// Looks like a person's face
+export const UserIcon = (props) => (
+
+
+
+)
+
+// Looks like old-timey scales
+export const UxIcon = (props) => (
+
+
+
+)
+
+// Looks like an ! in a triangle
+export const WarningIcon = (props) => (
+
+
+
+)
+
+// Looks like a wrench
+export const WrenchIcon = (props) => (
+
+
+
+)
+
+// Looks like a box in dashed lines
+export const XrayIcon = (props) => (
+
+
+
+)
+
+// Looks like a magnifying glas with a + inside
+export const ZoomInIcon = (props) => (
+
+
+
+)
+
+// Looks like a magnifying glas with a + inside
+export const ZoomOutIcon = (props) => (
+
+
+
+)
diff --git a/packages/react/components/Input/index.mjs b/packages/react/components/Input/index.mjs
new file mode 100644
index 00000000000..0531300f974
--- /dev/null
+++ b/packages/react/components/Input/index.mjs
@@ -0,0 +1,735 @@
+// Dependencies
+import {
+ cloudflareImageUrl,
+ measurementAsMm,
+ measurementAsUnits,
+ distanceAsMm,
+} from '@freesewing/utils'
+import { collection } from '@freesewing/collection'
+import { measurements as measurementsTranslations } from '@freesewing/i18n'
+// Context
+import { ModalContext } from '@freesewing/react/context/Modal'
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+// Hooks
+import React, { useState, useCallback, useContext } from 'react'
+import { useDropzone } from 'react-dropzone'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { TrashIcon, ResetIcon, UploadIcon } from '@freesewing/react/components/Icon'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { isDegreeMeasurement } from '@freesewing/config'
+import { Tabs, Tab } from '@freesewing/react/components/Tab'
+import Markdown from 'react-markdown'
+
+/*
+ * Helper component to display a tab heading
+ */
+export const _Tab = ({
+ id, // The tab ID
+ label, // A label for the tab, if not set we'll use the ID
+ activeTab, // Which tab (id) is active
+ setActiveTab, // Method to set the active tab
+}) => (
+ setActiveTab(id)}
+ >
+ {label ? label : id}
+
+)
+
+/**
+ * A helper component to render the help link in formcontrol
+ *
+ * @param {string|function| help - The help href of onClick method
+ * @param {React.component} Link - An optional framework-specific link component
+ */
+const HelpLink = ({ help, Link = false }) => {
+ if (!Link) Link = WebLink
+
+ if (typeof helpLink === 'function')
+ return (
+ help} title="Show help">
+
+
+ )
+
+ if (typeof helpLink === 'string')
+ return (
+
+
+
+ )
+
+ return null
+}
+
+/*
+ * Helper component to wrap a form control with a label
+ */
+export const FormControl = ({
+ label, // the (top-left) label
+ children, // Children to go inside the form control
+ labelTR = false, // Optional top-right label
+ labelBL = false, // Optional bottom-left label
+ labelBR = false, // Optional bottom-right label
+ forId = false, // ID of the for element we are wrapping
+ help = false, // An optional URL/method to link/show help/docs
+ Link = false, // An optionan framework-specific link components
+}) => {
+ if (labelBR && !labelBL) labelBL =
+
+ const topLabelChildren = (
+ <>
+ {label ? (
+
+ {label}
+
+ ) : (
+
+
+
+ )}
+ {labelTR ? {labelTR} : null}
+ >
+ )
+ const bottomLabelChildren = (
+ <>
+ {labelBL ? {labelBL} : null}
+ {labelBR ? {labelBR} : null}
+ >
+ )
+
+ return (
+
+ {forId ? (
+
+ {topLabelChildren}
+
+ ) : label ? (
+
{topLabelChildren}
+ ) : null}
+ {children}
+ {labelBL || labelBR ? (
+ forId ? (
+
+ {bottomLabelChildren}
+
+ ) : (
+
{bottomLabelChildren}
+ )
+ ) : null}
+
+ )
+}
+
+/*
+ * Helper method to wrap content in a button
+ */
+export const ButtonFrame = ({
+ children, // Children of the button
+ onClick, // onClick handler
+ active, // Whether or not to render the button as active/selected
+ accordion = false, // Set this to true to not set a background color when active
+ dense = false, // Use less padding
+}) => (
+
+ {children}
+
+)
+
+/*
+ * Input for integers
+ */
+export const NumberInput = ({
+ label, // Label to use
+ update, // onChange handler
+ valid, // Method that should return whether the value is valid or not
+ current, // The current value
+ original, // The original value
+ placeholder, // The placeholder text
+ id = '', // An id to tie the input to the label
+ labelBL = false, // Bottom-Left label
+ labelBR = false, // Bottom-Right label
+ max = 0,
+ min = 220,
+ step = 1,
+}) => (
+
+ update(evt.target.value)}
+ className={`tw-daisy-input tw-w-full tw-daisy-input-bordered ${
+ current === original
+ ? 'tw-daisy-input-secondary'
+ : valid(current)
+ ? 'tw-daisy-input-success'
+ : 'tw-daisy-input-error'
+ }`}
+ {...{ max, min, step }}
+ />
+
+)
+
+/*
+ * Input for strings
+ */
+export const StringInput = ({
+ label, // Label to use
+ update, // onChange handler
+ valid, // Method that should return whether the value is valid or not
+ current, // The current value
+ original, // The original value
+ placeholder, // The placeholder text
+ id = '', // An id to tie the input to the label
+ labelBL = false, // Bottom-Left label
+ labelBR = false, // Bottom-Right label
+}) => (
+
+ update(evt.target.value)}
+ className={`tw-daisy-input tw-w-full tw-daisy-input-bordered tw-text-current ${
+ current === original
+ ? 'tw-daisy-input-secondary'
+ : valid(current)
+ ? 'tw-daisy-input-success'
+ : 'tw-daisy-input-error'
+ }`}
+ />
+
+)
+
+/*
+ * Input for MFA code
+ */
+export const MfaInput = ({
+ update, // onChange handler
+ current, // The current value
+ id = 'mfa', // An id to tie the input to the label
+}) => {
+ return (
+ val.length > 4}
+ {...{ update, current, id }}
+ placeholder="MFA Code"
+ />
+ )
+}
+
+/*
+ * Input for passwords
+ */
+export const PasswordInput = ({
+ label, // Label to use
+ update, // onChange handler
+ valid, // Method that should return whether the value is valid or not
+ current, // The current value
+ placeholder = '¯\\_(ツ)_/¯', // The placeholder text
+ id = '', // An id to tie the input to the label
+ onKeyDown = false, // Optionall capture certain keys (like enter)
+}) => {
+ const [reveal, setReveal] = useState(false)
+
+ const extraProps = onKeyDown ? { onKeyDown } : {}
+
+ return (
+ setReveal(!reveal)}
+ >
+ {reveal ? 'Hide Password' : 'Reveal Password'}
+
+ }
+ >
+ update(evt.target.value)}
+ className={`tw-daisy-input tw-w-full tw-daisy-input-bordered ${
+ valid(current) ? 'input-success' : 'input-error'
+ }`}
+ {...extraProps}
+ />
+
+ )
+}
+
+/*
+ * Input for email addresses
+ */
+export const EmailInput = ({
+ label, // Label to use
+ update, // onChange handler
+ valid, // Method that should return whether the value is valid or not
+ current, // The current value
+ original, // The original value
+ placeholder, // The placeholder text
+ id = '', // An id to tie the input to the label
+ labelTR = false, // Top-Right label
+ labelBL = false, // Bottom-Left label
+ labelBR = false, // Bottom-Right label
+}) => (
+
+ update(evt.target.value)}
+ className={`tw-daisy-input tw-w-full tw-daisy-input-bordered ${
+ current === original
+ ? 'tw-daisy-input-secondary'
+ : valid(current)
+ ? 'tw-daisy-input-success'
+ : 'tw-daisy-input-error'
+ }`}
+ />
+
+)
+
+/*
+ * Input for designs
+ */
+export const DesignInput = ({
+ label, // Label to use
+ update, // onChange handler
+ current, // The current value
+ firstOption = null, // Any first option to add in addition to designs
+ id = '', // An id to tie the input to the label
+}) => {
+ return (
+
+ update(evt.target.value)}
+ value={current}
+ >
+ {firstOption}
+ {collection.map((design) => (
+
+ {design}
+
+ ))}
+
+
+ )
+}
+
+/*
+ * Input for an image
+ */
+export const ImageInput = ({
+ label, // The label
+ update, // The onChange handler
+ current, // The current value
+ original, // The original value
+ active = false, // Whether or not to upload images
+ imgType = 'showcase', // The image type
+ imgSubid, // The image sub-id
+ imgSlug, // The image slug or other unique identifier to use in the image ID
+ id = '', // An id to tie the input to the label
+}) => {
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const [url, setUrl] = useState(false)
+ const [uploadedId, setUploadedId] = useState(false)
+
+ const upload = async (img, fromUrl = false) => {
+ setLoadingStatus([true, 'uploadingImage'])
+ const data = {
+ type: imgType,
+ subId: imgSubid,
+ slug: imgSlug,
+ }
+ if (fromUrl) data.url = img
+ else data.img = img
+ const result = await backend.uploadAnonImage(data)
+ setLoadingStatus([true, 'allDone', true, true])
+ if (result.success) {
+ update(result.data.imgId)
+ setUploadedId(result.data.imgId)
+ } else setLoadingStatus([true, 'backendError', true, false])
+ }
+
+ const onDrop = useCallback(
+ (acceptedFiles) => {
+ const reader = new FileReader()
+ reader.onload = async () => {
+ if (active) upload(reader.result)
+ else update(reader.result)
+ }
+ acceptedFiles.forEach((file) => reader.readAsDataURL(file))
+ },
+ [current]
+ )
+
+ const { getRootProps, getInputProps } = useDropzone({ onDrop })
+
+ if (current)
+ return (
+
+
+ update(original)}
+ >
+
+
+
+
+ )
+
+ return (
+
+
+
+
Drag and drop and image here
+
or
+
+ Select an image to use
+
+
+ or
+
+ setUrl(evt.target.value) : (evt) => update(evt.target.value)}
+ />
+ {active && (
+ upload(url, true)}
+ >
+ Upload
+
+ )}
+
+
+ )
+}
+
+/*
+ * Input for an image that is active (it does upload the image)
+ */
+export const ActiveImageInput = (props) =>
+
+/*
+ * Input for an image that is passive (it does not upload the image)
+ */
+export const PassiveImageInput = (props) =>
+
+/*
+ * Input for a list of things to pick from
+ */
+export const ListInput = ({
+ update, // the onChange handler
+ label, // The label
+ list, // The list of items to present { val, label, desc }
+ current, // The (value of the) current item
+}) => (
+
+ {list.map((item, i) => (
+ update(item.val)}>
+
+
{item.label}
+ {item.desc ? (
+
+ {item.desc}
+
+ ) : null}
+
+
+ ))}
+
+)
+
+/*
+ * Input for markdown content
+ */
+export const MarkdownInput = ({
+ label, // The label
+ current, // The current value (markdown)
+ update, // The onChange handler
+ placeholder, // The placeholder content
+ id = '', // An id to tie the input to the label
+ labelBL = false, // Bottom-Left label
+ labelBR = false, // Bottom-Right label
+}) => (
+
+
+
+
+
+
+
+
+ {current}
+
+
+
+
+)
+
+export const MeasurementInput = ({
+ imperial, // True for imperial, False for metric
+ m, // The measurement name
+ original, // The original value
+ update, // The onChange handler
+ placeholder, // The placeholder content
+ id = '', // An id to tie the input to the label
+}) => {
+ const isDegree = isDegreeMeasurement(m)
+ const units = imperial ? 'imperial' : 'metric'
+
+ const [localVal, setLocalVal] = useState(
+ typeof original === 'undefined'
+ ? original
+ : isDegree
+ ? Number(original)
+ : measurementAsUnits(original, units)
+ )
+ const [validatedVal, setValidatedVal] = useState(measurementAsUnits(original, units))
+ const [valid, setValid] = useState(null)
+
+ // Update onChange
+ const localUpdate = (newVal) => {
+ setLocalVal(newVal)
+ const parsedVal = isDegree ? Number(newVal) : distanceAsMm(newVal, imperial)
+ if (parsedVal) {
+ update(m, isDegree ? parsedVal : measurementAsMm(parsedVal, units))
+ setValid(true)
+ setValidatedVal(parsedVal)
+ } else if (newVal === undefined) update(m, undefined)
+ else setValid(false)
+ }
+
+ // Clear value
+ const clearValue = () => {
+ localUpdate(undefined)
+ setLocalVal('')
+ }
+
+ if (!m) return null
+
+ // Various visual indicators for validating the input
+ let inputClasses = 'daisy-input-secondary'
+ let bottomLeftLabel = null
+ if (valid === true) {
+ inputClasses = 'daisy-input-success tw-outline-success'
+ const val = `${validatedVal}${isDegree ? '°' : imperial ? '"' : 'cm'}`
+ bottomLeftLabel = (
+ {val}
+ )
+ } else if (valid === false) {
+ inputClasses = 'daisy-input-error'
+ bottomLeftLabel = (
+
+ ¯\_(ツ)_/¯
+
+ )
+ }
+
+ /*
+ * I'm on the fence here about using a text input rather than number
+ * Obviously, number is the more correct option, but when the user enter
+ * text, it won't fire an onChange event and thus they can enter text and it
+ * will not be marked as invalid input.
+ * See: https://github.com/facebook/react/issues/16554
+ */
+ return (
+
+
+ localUpdate(evt.target.value)}
+ className={`tw-border-0 tw-grow-2 tw-w-full`}
+ />
+ {isDegree ? '°' : imperial ? 'inch' : 'cm'}
+
+
+
+
+
+
+
+ )
+}
+
+export const FileInput = ({
+ label, // The label
+ valid = () => true, // Method that should return whether the value is valid or not
+ update, // The onChange handler
+ current, // The current value
+ original, // The original value
+ id = '', // An id to tie the input to the label
+ dropzoneConfig = {}, // Configuration for react-dropzone
+}) => {
+ /*
+ * Ondrop handler
+ */
+ const onDrop = useCallback(
+ (acceptedFiles) => {
+ const reader = new FileReader()
+ reader.onload = async () => update(reader.result)
+ acceptedFiles.forEach((file) => reader.readAsDataURL(file))
+ },
+ [update]
+ )
+
+ /*
+ * Dropzone hook
+ */
+ const { getRootProps, getInputProps } = useDropzone({ onDrop, ...dropzoneConfig })
+
+ /*
+ * If we have a current file, return this
+ */
+ if (current)
+ return (
+
+
+ update(original)}
+ >
+
+
+
+
+ )
+
+ /*
+ * Return upload form
+ */
+ return (
+
+
+
+
Drag and drop your file here
+
+ Browse...
+
+
+
+ )
+}
+
+/*
+ * Input for booleans
+ */
+export const ToggleInput = ({
+ label, // Label to use
+ update, // onChange handler
+ current, // The current value
+ disabled = false, // Allows rendering a disabled view
+ list = [true, false], // The values to chose between
+ labels = ['Yes', 'No'], // The labels for the values
+ on = true, // The value that should show the toggle in the 'on' state
+ id = '', // An id to tie the input to the label
+ labelTR = false, // Top-Right label
+ labelBL = false, // Bottom-Left label
+ labelBR = false, // Bottom-Right label
+}) => (
+
+ update(list.indexOf(current) === 0 ? list[1] : list[0])}
+ className="tw-daisy-toggle tw-my-3 tw-daisy-toggle-primary"
+ checked={list.indexOf(current) === 0 ? true : false}
+ />
+
+)
diff --git a/packages/react/components/Json/index.mjs b/packages/react/components/Json/index.mjs
new file mode 100644
index 00000000000..82e927a5571
--- /dev/null
+++ b/packages/react/components/Json/index.mjs
@@ -0,0 +1,11 @@
+import React from 'react'
+import { Highlight } from '@freesewing/react/components/Highlight'
+import hljs from 'highlight.js/lib/common'
+
+export const Json = (props) => {
+ const code = props.js ? JSON.stringify(props.js, null, 2) : props.children
+
+ return (
+
+ )
+}
diff --git a/packages/react/components/KeyVal/index.mjs b/packages/react/components/KeyVal/index.mjs
new file mode 100644
index 00000000000..98b88617764
--- /dev/null
+++ b/packages/react/components/KeyVal/index.mjs
@@ -0,0 +1,147 @@
+import React, { useState, useContext } from 'react'
+import { copyToClipboard } from '@freesewing/utils'
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+export const KeyVal = ({
+ k,
+ val,
+ color = 'primary',
+ small = false,
+ href = false,
+ onClick = false,
+}) => {
+ const [copied, setCopied] = useState(false)
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ let colorClasses1 = primaryClasses1
+ if (color === 'secondary') colorClasses1 = secondaryClasses1
+ else if (color === 'neutral') colorClasses1 = neutralClasses1
+ else if (color === 'accent') colorClasses1 = accentClasses1
+ else if (color === 'info') colorClasses1 = infoClasses1
+ else if (color === 'warning') colorClasses1 = warningClasses1
+ else if (color === 'success') colorClasses1 = successClasses1
+ else if (color === 'error') colorClasses1 = errorClasses1
+ let colorClasses2 = primaryClasses2
+ if (color === 'secondary') colorClasses2 = secondaryClasses2
+ else if (color === 'neutral') colorClasses2 = neutralClasses2
+ else if (color === 'accent') colorClasses2 = accentClasses2
+ else if (color === 'warning') colorClasses2 = warningClasses2
+ else if (color === 'success') colorClasses2 = successClasses2
+ else if (color === 'error') colorClasses2 = errorClasses2
+
+ if (href) return
+
+ const inner = (
+ <>
+
+ {k}
+
+
+ {val}
+
+ >
+ )
+
+ return onClick === false ? (
+ {
+ copyToClipboard(val)
+ handleCopied(setCopied, setLoadingStatus, k)
+ }}
+ >
+ {inner}
+
+ ) : (
+
+ {inner}
+
+ )
+}
+
+const LinkKeyVal = ({
+ k,
+ val,
+ color = 'primary',
+ small = false,
+ href = false,
+ colorClasses1,
+ colorClasses2,
+ Link = false,
+}) => {
+ const inner = (
+ <>
+
+ {k}
+
+
+ {val}
+
+ >
+ )
+ const linkProps = {
+ className: 'tw-daisy-btn-ghost tw-p-0 hover:tw-no-underline hover:tw-bg-transparent',
+ href: href,
+ }
+
+ return Link ? {inner} : {inner}
+}
+
+/*
+ * If we configure the tailwind classes dynamically, they won't be picked up
+ * So let's create a component for each color
+ */
+const sharedClasses = `tw-px-1 tw-text-sm tw-font-medium tw-whitespace-nowrap tw-border-2 tw-border-solid`
+const primaryClasses1 = `tw-text-primary-content tw-bg-primary tw-border-primary`
+const primaryClasses2 = `tw-text-primary tw-border-primary`
+const secondaryClasses1 = `tw-text-secondary-content tw-bg-secondary tw-border-secondary`
+const secondaryClasses2 = `tw-text-secondary tw-border-secondary`
+const neutralClasses1 = `tw-text-neutral-content tw-bg-neutral tw-border-neutral`
+const neutralClasses2 = `tw-text-neutral tw-border-neutral`
+const accentClasses1 = `tw-text-accent-content tw-bg-accent tw-border-accent`
+const accentClasses2 = `tw-text-accent tw-border-accent`
+const infoClasses1 = `tw-text-info-content tw-bg-info tw-border-info`
+const infoClasses2 = `tw-text-info tw-border-info`
+const warningClasses1 = `tw-text-warning-content tw-bg-warning tw-border-warning`
+const warningClasses2 = `tw-text-warning tw-border-warning`
+const successClasses1 = `tw-text-warning-content tw-bg-success tw-border-success`
+const successClasses2 = `tw-text-success tw-border-success`
+const errorClasses1 = `tw-text-error-content tw-bg-error tw-border-error`
+const errorClasses2 = `tw-text-error tw-border-error`
+
+const PrimarySpans = ({ small, k, val }) => (
+ <>
+
+ {k}
+
+
+ {val}
+
+ >
+)
+
+const handleCopied = (setCopied, setLoadingStatus, label) => {
+ setCopied(true)
+ setLoadingStatus([
+ true,
+ label ? `${label} copied to clipboard` : 'Copied to clipboard',
+ true,
+ true,
+ ])
+ setTimeout(() => setCopied(false), 1000)
+}
diff --git a/packages/react/components/Layout/index.mjs b/packages/react/components/Layout/index.mjs
new file mode 100644
index 00000000000..32a5ceca9b6
--- /dev/null
+++ b/packages/react/components/Layout/index.mjs
@@ -0,0 +1,102 @@
+import React from 'react'
+import { Breadcrumbs } from '@freesewing/react/components/Breadcrumbs'
+import { Link as DefaultLink } from '@freesewing/react/components/Link'
+
+/*
+ * This is the default layout, including title and breadcrumbs
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ * @param {array} props.crumbs - Data for the breadcrumbs
+ * @param {string} props.description - The page description
+ * @param {function} props.Link - An optional framework specific Link component
+ * @param {string} props.title - The page title
+ */
+export const Layout = ({ children = [], crumbs = [], description, Link = false, title }) => {
+ if (!Link) Link = DefaultLink
+
+ return (
+
+
+
+
{title}
+
{children}
+
+
+ )
+}
+
+/*
+ * This is the base layout
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ */
+export const BaseLayout = ({ children }) => (
+
+ {children}
+
+)
+
+/*
+ * The left column of the base layout
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ */
+export const BaseLayoutLeft = ({ children = [] }) => (
+
+ {children}
+
+)
+
+/*
+ * The right column of the base layout
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ */
+export const BaseLayoutRight = ({ children = [] }) => (
+
+ {children}
+
+)
+
+/*
+ * The main column for prose (text like docs and so on)
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ * @param {array} props.wide - Whether or not to use the wide view
+ */
+export const BaseLayoutProse = ({ children = [], wide = false }) => (
+
+ {children}
+
+)
+
+/*
+ * The central column for wide content (no max-width)
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ */
+export const BaseLayoutWide = ({ children = [] }) => (
+ {children}
+)
+
+/*
+ * A layout for pages that do their own title/layout, like the sign in page
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ */
+export const NoTitleLayout = ({ children }) => {
+ return (
+
+
+
+ )
+}
diff --git a/packages/react/components/LineDrawing/aaron.mjs b/packages/react/components/LineDrawing/aaron.mjs
new file mode 100644
index 00000000000..233f67a3ad2
--- /dev/null
+++ b/packages/react/components/LineDrawing/aaron.mjs
@@ -0,0 +1,94 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Aaron
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Aaron = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Aaron
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const AaronFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Aaron
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const AaronBack = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/albert.mjs b/packages/react/components/LineDrawing/albert.mjs
new file mode 100644
index 00000000000..4fecb44a455
--- /dev/null
+++ b/packages/react/components/LineDrawing/albert.mjs
@@ -0,0 +1,94 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Albert
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Albert = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Albert
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const AlbertFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Albert
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const AlbertBack = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the front
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bee.mjs b/packages/react/components/LineDrawing/bee.mjs
new file mode 100644
index 00000000000..11184c1af4c
--- /dev/null
+++ b/packages/react/components/LineDrawing/bee.mjs
@@ -0,0 +1,49 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.4
+
+/**
+ * A linedrawing component for Bee
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bee = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/**
+ * Front is the same
+ */
+export const BeeFront = Bee
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bella.mjs b/packages/react/components/LineDrawing/bella.mjs
new file mode 100644
index 00000000000..201111f9908
--- /dev/null
+++ b/packages/react/components/LineDrawing/bella.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Bella
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bella = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Bella
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BellaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BellaBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the front
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/benjamin.mjs b/packages/react/components/LineDrawing/benjamin.mjs
new file mode 100644
index 00000000000..9a44004452c
--- /dev/null
+++ b/packages/react/components/LineDrawing/benjamin.mjs
@@ -0,0 +1,45 @@
+import React from 'react'
+import { LineDrawingWrapper, regular, thin } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.2
+
+/**
+ * A linedrawing component for Benjamin
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Benjamin = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * Front is the same
+ */
+export const BenjaminFront = Benjamin
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bent.mjs b/packages/react/components/LineDrawing/bent.mjs
new file mode 100644
index 00000000000..5bdb3065ae4
--- /dev/null
+++ b/packages/react/components/LineDrawing/bent.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.7
+
+/**
+ * A linedrawing component for Bent
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bent = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Bent
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BentFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BentBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bibi.mjs b/packages/react/components/LineDrawing/bibi.mjs
new file mode 100644
index 00000000000..ec5c01f5101
--- /dev/null
+++ b/packages/react/components/LineDrawing/bibi.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Bibi
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bibi = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Bibi
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BibiFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BibiBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bob.mjs b/packages/react/components/LineDrawing/bob.mjs
new file mode 100644
index 00000000000..31ec52a8575
--- /dev/null
+++ b/packages/react/components/LineDrawing/bob.mjs
@@ -0,0 +1,88 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.15
+
+/**
+ * A linedrawing component for Bob
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bob = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Bob
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BobFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BobBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/breanna.mjs b/packages/react/components/LineDrawing/breanna.mjs
new file mode 100644
index 00000000000..569fe30383c
--- /dev/null
+++ b/packages/react/components/LineDrawing/breanna.mjs
@@ -0,0 +1,100 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.3
+
+/**
+ * A linedrawing component for Breanna
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Breanna = ({ className, stroke = 1 }) => (
+
+
+
+
+
+
+)
+
+/**
+ * A linedrawing component for Breanna
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BreannaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BreannaBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/brian.mjs b/packages/react/components/LineDrawing/brian.mjs
new file mode 100644
index 00000000000..1de8e3da365
--- /dev/null
+++ b/packages/react/components/LineDrawing/brian.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Brian
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Brian = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Brian
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BrianFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BrianBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/bruce.mjs b/packages/react/components/LineDrawing/bruce.mjs
new file mode 100644
index 00000000000..153272e72cd
--- /dev/null
+++ b/packages/react/components/LineDrawing/bruce.mjs
@@ -0,0 +1,100 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Bruce
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Bruce = ({ className, stroke = 1 }) => (
+
+
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Bruce
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const BruceFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const BruceBack = ({
+ className = 'tw-w-full', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/carlita.mjs b/packages/react/components/LineDrawing/carlita.mjs
new file mode 100644
index 00000000000..2c22d7cd143
--- /dev/null
+++ b/packages/react/components/LineDrawing/carlita.mjs
@@ -0,0 +1,374 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Carlita
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Carlita = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Carlita
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const CarlitaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const CarlitaBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/carlton.mjs b/packages/react/components/LineDrawing/carlton.mjs
new file mode 100644
index 00000000000..2df9259429e
--- /dev/null
+++ b/packages/react/components/LineDrawing/carlton.mjs
@@ -0,0 +1,356 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Carlton
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Carlton = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Carlton
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const CarltonFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const CarltonBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/cathrin.mjs b/packages/react/components/LineDrawing/cathrin.mjs
new file mode 100644
index 00000000000..12b6725a26f
--- /dev/null
+++ b/packages/react/components/LineDrawing/cathrin.mjs
@@ -0,0 +1,751 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Cathrin
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Cathrin = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Cathrin
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const CathrinFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const CathrinBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/charlie.mjs b/packages/react/components/LineDrawing/charlie.mjs
new file mode 100644
index 00000000000..dca9f4e010b
--- /dev/null
+++ b/packages/react/components/LineDrawing/charlie.mjs
@@ -0,0 +1,284 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.8
+
+/**
+ * A linedrawing component for Charlie
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Charlie = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Charlie
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const CharlieFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const CharlieBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/cornelius.mjs b/packages/react/components/LineDrawing/cornelius.mjs
new file mode 100644
index 00000000000..d2a162c3bbe
--- /dev/null
+++ b/packages/react/components/LineDrawing/cornelius.mjs
@@ -0,0 +1,479 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, regular, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Cornelius
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Cornelius = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Cornelius
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const CorneliusFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const CorneliusBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/diana.mjs b/packages/react/components/LineDrawing/diana.mjs
new file mode 100644
index 00000000000..ea82bb6aede
--- /dev/null
+++ b/packages/react/components/LineDrawing/diana.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1
+
+/**
+ * A linedrawing component for Diana
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Diana = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front Diana
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const DianaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const DianaBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/florence.mjs b/packages/react/components/LineDrawing/florence.mjs
new file mode 100644
index 00000000000..94cec5dc301
--- /dev/null
+++ b/packages/react/components/LineDrawing/florence.mjs
@@ -0,0 +1,47 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Florence
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Florence = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const FlorenceFront = Florence
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/florent.mjs b/packages/react/components/LineDrawing/florent.mjs
new file mode 100644
index 00000000000..5184582a4bb
--- /dev/null
+++ b/packages/react/components/LineDrawing/florent.mjs
@@ -0,0 +1,92 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Florence
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Florent = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const FlorentFront = Florent
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/gozer.mjs b/packages/react/components/LineDrawing/gozer.mjs
new file mode 100644
index 00000000000..d272949e2b3
--- /dev/null
+++ b/packages/react/components/LineDrawing/gozer.mjs
@@ -0,0 +1,180 @@
+import React from 'react'
+import { LineDrawingWrapper, regular } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Gozer
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Gozer = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Gozer
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const GozerFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const GozerBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/hi.mjs b/packages/react/components/LineDrawing/hi.mjs
new file mode 100644
index 00000000000..f77b115f269
--- /dev/null
+++ b/packages/react/components/LineDrawing/hi.mjs
@@ -0,0 +1,111 @@
+import React from 'react'
+import { LineDrawingWrapper, regular } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Hi
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Hi = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const HiFront = Hi
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/holmes.mjs b/packages/react/components/LineDrawing/holmes.mjs
new file mode 100644
index 00000000000..2b011c4ffa6
--- /dev/null
+++ b/packages/react/components/LineDrawing/holmes.mjs
@@ -0,0 +1,146 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.3
+
+/**
+ * A linedrawing component for Holmes
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Holmes = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const HolmesFront = Holmes
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/hortensia.mjs b/packages/react/components/LineDrawing/hortensia.mjs
new file mode 100644
index 00000000000..ea7b41edb81
--- /dev/null
+++ b/packages/react/components/LineDrawing/hortensia.mjs
@@ -0,0 +1,42 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.7
+
+/**
+ * A linedrawing component for Hortensia
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Hortensia = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const HortensiaFront = Hortensia
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/huey.mjs b/packages/react/components/LineDrawing/huey.mjs
new file mode 100644
index 00000000000..1341fc7df8d
--- /dev/null
+++ b/packages/react/components/LineDrawing/huey.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.7
+
+/**
+ * A linedrawing component for Huey
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Huey = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for front of Huey
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const HueyFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const HueyBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/hugo.mjs b/packages/react/components/LineDrawing/hugo.mjs
new file mode 100644
index 00000000000..96475fde46d
--- /dev/null
+++ b/packages/react/components/LineDrawing/hugo.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.7
+
+/**
+ * A linedrawing component for Hugo
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Hugo = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Hugo
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const HugoFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const HugoBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/index.mjs b/packages/react/components/LineDrawing/index.mjs
new file mode 100644
index 00000000000..6aa103de6e9
--- /dev/null
+++ b/packages/react/components/LineDrawing/index.mjs
@@ -0,0 +1,304 @@
+import { Aaron, AaronFront, AaronBack } from './aaron.mjs'
+import { Albert, AlbertFront } from './albert.mjs'
+import { Bee, BeeFront } from './bee.mjs'
+import { Bella, BellaFront, BellaBack } from './bella.mjs'
+import { Benjamin, BenjaminFront } from './benjamin.mjs'
+import { Bent, BentFront, BentBack } from './bent.mjs'
+import { Bibi, BibiFront, BibiBack } from './bibi.mjs'
+import { Bob, BobFront, BobBack } from './bob.mjs'
+import { Breanna, BreannaFront, BreannaBack } from './breanna.mjs'
+import { Brian, BrianFront, BrianBack } from './brian.mjs'
+import { Bruce, BruceFront, BruceBack } from './bruce.mjs'
+import { Carlita, CarlitaFront, CarlitaBack } from './carlita.mjs'
+import { Carlton, CarltonFront, CarltonBack } from './carlton.mjs'
+import { Cathrin, CathrinFront, CathrinBack } from './cathrin.mjs'
+import { Charlie, CharlieFront, CharlieBack } from './charlie.mjs'
+import { Cornelius, CorneliusFront, CorneliusBack } from './cornelius.mjs'
+import { Diana, DianaFront, DianaBack } from './diana.mjs'
+import { Florence, FlorenceFront } from './florence.mjs'
+import { Florent, FlorentFront } from './florent.mjs'
+import { Gozer, GozerFront, GozerBack } from './gozer.mjs'
+import { Hi, HiFront } from './hi.mjs'
+import { Holmes, HolmesFront } from './holmes.mjs'
+import { Hortensia, HortensiaFront } from './hortensia.mjs'
+import { Huey, HueyFront, HueyBack } from './huey.mjs'
+import { Hugo, HugoFront, HugoBack } from './hugo.mjs'
+import { Lucy, LucyFront } from './lucy.mjs'
+import { Lumina, LuminaFront, LuminaBack } from './lumina.mjs'
+import { Lumira, LumiraFront, LumiraBack } from './lumira.mjs'
+import { Lunetius, LunetiusFront } from './lunetius.mjs'
+import { Noble, NobleFront, NobleBack } from './noble.mjs'
+import { Simon, SimonFront, SimonBack } from './simon.mjs'
+import { Teagan, TeaganFront, TeaganBack } from './teagan.mjs'
+import { Tristan, TristanFront, TristanBack } from './tristan.mjs'
+import { Uma, UmaFront, UmaBack } from './uma.mjs'
+import { Umbra, UmbraFront, UmbraBack } from './umbra.mjs'
+import { Wahid, WahidFront, WahidBack } from './wahid.mjs'
+
+/*
+ * Bundle all fronts
+ */
+const lineDrawingsFront = {
+ aaron: AaronFront,
+ albert: AlbertFront,
+ bee: BeeFront,
+ bella: BellaFront,
+ benjamin: BenjaminFront,
+ bent: BentFront,
+ bibi: BibiFront,
+ bob: BobFront,
+ breanna: BreannaFront,
+ brian: BrianFront,
+ bruce: BruceFront,
+ carlita: CarlitaFront,
+ carlton: CarltonFront,
+ cathrin: CathrinFront,
+ charlie: CharlieFront,
+ cornelius: CorneliusFront,
+ diana: DianaFront,
+ florence: FlorenceFront,
+ florent: FlorentFront,
+ gozer: GozerFront,
+ hi: HiFront,
+ holmes: HolmesFront,
+ hortensia: HortensiaFront,
+ huey: HueyFront,
+ hugo: HugoFront,
+
+ lucy: LucyFront,
+ lumina: LuminaFront,
+ lumira: LumiraFront,
+ lunetius: LunetiusFront,
+ noble: NobleFront,
+
+ simon: SimonFront,
+
+ teagan: TeaganFront,
+
+ tristan: TristanFront,
+ uma: UmaFront,
+ umbra: UmbraFront,
+ wahid: WahidFront,
+}
+
+/*
+ * Bundle all backs
+ */
+const lineDrawingsBack = {
+ aaron: AaronBack,
+ bella: BellaBack,
+ bent: BentBack,
+ bibi: BibiBack,
+ bob: BobBack,
+ breanna: BreannaBack,
+ brian: BrianBack,
+ bruce: BruceBack,
+ carlita: CarlitaBack,
+ carlton: CarltonBack,
+ cathrin: CathrinBack,
+ charlie: CharlieBack,
+ cornelius: CorneliusBack,
+ diana: DianaBack,
+ gozer: GozerBack,
+ huey: HueyBack,
+ hugo: HugoBack,
+ lumina: LuminaBack,
+ lumira: LumiraBack,
+ noble: NobleBack,
+ simon: SimonBack,
+ teagan: TeaganBack,
+ tristan: TristanBack,
+ uma: UmaBack,
+ umbra: UmbraBack,
+ wahid: WahidBack,
+}
+
+/*
+ * Bundle all linedrawings
+ */
+const lineDrawings = {
+ aaron: Aaron,
+ albert: Albert,
+ bee: Bee,
+ bella: Bella,
+ benjamin: Benjamin,
+ bent: Bent,
+ bibi: Bibi,
+ bob: Bob,
+ breanna: Breanna,
+ brian: Brian,
+ bruce: Bruce,
+ carlita: Carlita,
+ carlton: Carlton,
+ cathrin: Cathrin,
+ charlie: Charlie,
+ cornelius: Cornelius,
+ diana: Diana,
+ florence: Florence,
+ florent: Florent,
+ gozer: Gozer,
+ hi: Hi,
+ holmes: Holmes,
+ hortensia: Hortensia,
+ huey: Huey,
+ hugo: Hugo,
+
+ lucy: Lucy,
+ lumina: Lumina,
+ lumira: Lumira,
+ lunetius: Lunetius,
+ noble: Noble,
+
+ simon: Simon,
+
+ teagan: Teagan,
+
+ tristan: Tristan,
+ uma: Uma,
+ umbra: Umbra,
+ wahid: Wahid,
+}
+
+/*
+ * Named exports
+ */
+export {
+ // Bundles
+ lineDrawings,
+ lineDrawingsBack,
+ lineDrawingsFront,
+ // Aaron
+ Aaron,
+ AaronFront,
+ AaronBack,
+ // Albert
+ Albert,
+ AlbertFront,
+ // Bee
+ Bee,
+ BeeFront,
+ // Bella
+ Bella,
+ BellaFront,
+ BellaBack,
+ // Benjamin
+ Benjamin,
+ BenjaminFront,
+ // Bent
+ Bent,
+ BentFront,
+ BentBack,
+ // Bibi
+ Bibi,
+ BibiFront,
+ BibiBack,
+ // Bob
+ Bob,
+ BobFront,
+ BobBack,
+ // Breanna
+ Breanna,
+ BreannaFront,
+ BreannaBack,
+ // Brian
+ Brian,
+ BrianFront,
+ BrianBack,
+ // Bruce
+ Bruce,
+ BruceFront,
+ BruceBack,
+ // Carlita
+ Carlita,
+ CarlitaFront,
+ CarlitaBack,
+ // Carlton
+ Carlton,
+ CarltonFront,
+ CarltonBack,
+ // Cathrin
+ Cathrin,
+ CathrinFront,
+ CathrinBack,
+ // Charlie
+ Charlie,
+ CharlieFront,
+ CharlieBack,
+ // Cornelius
+ Cornelius,
+ CorneliusFront,
+ CorneliusBack,
+ // Diana
+ Diana,
+ DianaFront,
+ DianaBack,
+ // Florence
+ Florence,
+ FlorenceFront,
+ // Florent
+ Florent,
+ FlorentFront,
+ // Gozer
+ Gozer,
+ GozerFront,
+ GozerBack,
+ // Hi
+ Hi,
+ HiFront,
+ // Holmes
+ Holmes,
+ HolmesFront,
+ // Hortensia
+ Hortensia,
+ HortensiaFront,
+ // Huey
+ Huey,
+ HueyFront,
+ HueyBack,
+ // Hugo
+ Hugo,
+ HugoFront,
+ HugoBack,
+ // Lucy
+ Lucy,
+ LucyFront,
+ // Lumina
+ Lumina,
+ LuminaFront,
+ LuminaBack,
+ // Lumira
+ Lumira,
+ LumiraFront,
+ LumiraBack,
+ // Lunetius
+ Lunetius,
+ LunetiusFront,
+ // Noble
+ Noble,
+ NobleFront,
+ NobleBack,
+ // Simon
+ Simon,
+ SimonFront,
+ SimonBack,
+ // Teagan
+ Teagan,
+ TeaganFront,
+ TeaganBack,
+ // Tristan
+ Tristan,
+ TristanFront,
+ TristanBack,
+ // Uma
+ Uma,
+ UmaFront,
+ UmaBack,
+ // Umbra
+ Umbra,
+ UmbraFront,
+ UmbraBack,
+ // Wahid
+ Wahid,
+ WahidFront,
+ WahidBack,
+}
diff --git a/packages/react/components/LineDrawing/lucy.mjs b/packages/react/components/LineDrawing/lucy.mjs
new file mode 100644
index 00000000000..16badd283b1
--- /dev/null
+++ b/packages/react/components/LineDrawing/lucy.mjs
@@ -0,0 +1,69 @@
+import React from 'react'
+import { LineDrawingWrapper, regular } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.9
+
+/**
+ * A linedrawing component for Hugo
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Lucy = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const LucyFront = Lucy
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/lumina.mjs b/packages/react/components/LineDrawing/lumina.mjs
new file mode 100644
index 00000000000..2541b66bb4c
--- /dev/null
+++ b/packages/react/components/LineDrawing/lumina.mjs
@@ -0,0 +1,160 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.7
+
+/**
+ * A linedrawing component for Lumina
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Lumina = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Lumina
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const LuminaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const LuminaBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/lumira.mjs b/packages/react/components/LineDrawing/lumira.mjs
new file mode 100644
index 00000000000..852085b6f6b
--- /dev/null
+++ b/packages/react/components/LineDrawing/lumira.mjs
@@ -0,0 +1,178 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.2
+
+/**
+ * A linedrawing component for Lumira
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Lumira = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Lumira
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const LumiraFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const LumiraBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/lunetius.mjs b/packages/react/components/LineDrawing/lunetius.mjs
new file mode 100644
index 00000000000..f44b34c1fd1
--- /dev/null
+++ b/packages/react/components/LineDrawing/lunetius.mjs
@@ -0,0 +1,47 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 1.5
+
+/**
+ * A linedrawing component for Lunetius
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Lunetius = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+// Front is the same
+export const LunetiusFront = Lunetius
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/missing.mjs b/packages/react/components/LineDrawing/missing.mjs
new file mode 100644
index 00000000000..34aa3f6301f
--- /dev/null
+++ b/packages/react/components/LineDrawing/missing.mjs
@@ -0,0 +1,30 @@
+import React from 'react'
+import { LineDrawingWrapper, regular } from './shared.mjs'
+
+/**
+ * A linedrawing component for designs that do not (yet) have their own
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const MissingLinedrawing = ({ className, stroke = 1 }) => (
+
+
+
+
+ No line drawing (yet)
+
+
+
+)
diff --git a/packages/react/components/LineDrawing/noble.mjs b/packages/react/components/LineDrawing/noble.mjs
new file mode 100644
index 00000000000..96bca69bf61
--- /dev/null
+++ b/packages/react/components/LineDrawing/noble.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.4
+
+/**
+ * A linedrawing component for Noble
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Noble = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Noble
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const NobleFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const NobleBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the front
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/shared.mjs b/packages/react/components/LineDrawing/shared.mjs
new file mode 100644
index 00000000000..76bb751e418
--- /dev/null
+++ b/packages/react/components/LineDrawing/shared.mjs
@@ -0,0 +1,51 @@
+import React from 'react'
+
+/*
+ * A React component to wrap SVG linedrawings for FreeSewing designs
+ *
+ * @param design {string} - The (lowercase) name of a FreeSewing design
+ * @param className {string} - CSS classes to set on the svg tag
+ *
+ * @return LineDrawing as JSX
+ */
+export const LineDrawingWrapper = ({
+ className = 'tw-w-full', // CSS classes to apply
+ viewBox = '0 0 100 100', // SVG viewBox
+ stroke = 1, // Stroke to use
+ children = [], // The actual linedrawing
+ style = { maxHeight: 'inherit' },
+}) => (
+
+ {children}
+
+)
+
+/*
+ * Regular stroke-width helper to ensure consistency across linedrawings
+ */
+export const regular = (stroke = 1) => ({ strokeWidth: stroke })
+
+/*
+ * Thin stroke-width helper to ensure consistency across linedrawings
+ */
+export const thin = (stroke = 1) => ({ strokeWidth: stroke / 1.3 })
+
+/*
+ * Very thin stroke-width helper to ensure consistency across linedrawings
+ */
+export const veryThin = (stroke = 1) => ({ strokeWidth: stroke / 2 })
+
+/*
+ * Dashed stroke-dasharray helper to ensure consistency across linedrawings
+ */
+export const dashed = (stroke = 1) => ({ strokeDasharray: `${stroke * 1.2},${stroke * 0.8}` })
diff --git a/packages/react/components/LineDrawing/simon.mjs b/packages/react/components/LineDrawing/simon.mjs
new file mode 100644
index 00000000000..3127c39bd3a
--- /dev/null
+++ b/packages/react/components/LineDrawing/simon.mjs
@@ -0,0 +1,139 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.15
+
+/**
+ * A linedrawing component for Simon
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Simon = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Simon
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const SimonFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const SimonBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * Always use an id for defs that is unique to the design because if we have
+ * multiple linedrawings on the page, they share the same namespace and thus
+ * IDs will collide
+ */
+const defs = (
+
+
+
+
+
+
+
+
+
+)
+
+/*
+ * SVG elements for the back
+ */
+const Front = ({ stroke }) => (
+ <>
+ {defs}
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/teagan.mjs b/packages/react/components/LineDrawing/teagan.mjs
new file mode 100644
index 00000000000..bec323ad736
--- /dev/null
+++ b/packages/react/components/LineDrawing/teagan.mjs
@@ -0,0 +1,98 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Teagan
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Teagan = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Teagan
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const TeaganFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const TeaganBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/tristan.mjs b/packages/react/components/LineDrawing/tristan.mjs
new file mode 100644
index 00000000000..67d0b9b36bd
--- /dev/null
+++ b/packages/react/components/LineDrawing/tristan.mjs
@@ -0,0 +1,88 @@
+import React from 'react'
+import { LineDrawingWrapper, regular } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Tristan
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Tristan = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Tristan
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const TristanFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const TristanBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/uma.mjs b/packages/react/components/LineDrawing/uma.mjs
new file mode 100644
index 00000000000..b56ed112c23
--- /dev/null
+++ b/packages/react/components/LineDrawing/uma.mjs
@@ -0,0 +1,88 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Uma
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Uma = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Uma
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const UmaFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const UmaBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/umbra.mjs b/packages/react/components/LineDrawing/umbra.mjs
new file mode 100644
index 00000000000..a1c4f73be3c
--- /dev/null
+++ b/packages/react/components/LineDrawing/umbra.mjs
@@ -0,0 +1,169 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Umbra
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Umbra = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Umbra
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const UmbraFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+/*
+ * React component for the back
+ */
+export const UmbraBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)
diff --git a/packages/react/components/LineDrawing/wahid.mjs b/packages/react/components/LineDrawing/wahid.mjs
new file mode 100644
index 00000000000..1075eb208aa
--- /dev/null
+++ b/packages/react/components/LineDrawing/wahid.mjs
@@ -0,0 +1,119 @@
+import React from 'react'
+import { LineDrawingWrapper, thin, dashed } from './shared.mjs'
+
+/*
+ * This strokeScale factor is used to normalize the stroke across
+ * designs so we have a consistent look when showing our collection
+ */
+const strokeScale = 0.5
+
+/**
+ * A linedrawing component for Wahid
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const Wahid = ({ className, stroke = 1 }) => (
+
+
+
+
+)
+
+/**
+ * A linedrawing component for the front of Wahid
+ *
+ * @param {object} props - All React props
+ * @param {string} props.className - Any CSS classes to apply
+ * @param {number} props.stroke - The stroke width to apply
+ */
+export const WahidFront = ({ className, stroke = 1 }) => (
+
+
+
+)
+
+export const WahidBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * Always use an id for defs that is unique to the design because if we have
+ * multiple linedrawings on the page, they share the same namespace and thus
+ * IDs will collide
+ */
+const defs = (
+
+
+
+
+
+
+
+
+
+)
+
+/*
+ * React component for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+ {defs}
+
+
+
+
+
+
+
+
+
+ >
+)
+
+/*
+ * React component for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+
+ >
+)
diff --git a/packages/react/components/Link/index.mjs b/packages/react/components/Link/index.mjs
new file mode 100644
index 00000000000..88c26830522
--- /dev/null
+++ b/packages/react/components/Link/index.mjs
@@ -0,0 +1,82 @@
+import React from 'react'
+import { linkClasses } from '@freesewing/utils'
+
+/**
+ * An anchor link component
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ * @param {array} props.id - The ID of the anchor to link to
+ * @param {array} props.title - An optional link title
+ */
+export const AnchorLink = ({ children, id = '', title = false }) => (
+
+ {children}
+
+)
+
+/**
+ * A regular link component
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ * @param {array} props.href - The target to link to
+ * @param {array} props.title - An optional link title
+ * @param {string} props.className - Any non-default CSS classes to apply
+ * @param {string} props.style - Any non-default styles to apply
+ */
+export const Link = ({ href, title = false, children, className = linkClasses, style = {} }) => (
+
+ {children}
+
+)
+
+const BaseLink = Link
+
+/**
+ * A regular link, but on a success background
+ *
+ * @param {object} props - All React props
+ * @param {array} props.children - The content to go in the layout
+ * @param {array} props.href - The target to link to
+ * @param {array} props.title - An optional link title
+ * @param {string} props.className - Any non-default CSS classes to apply
+ * @param {string} props.style - Any non-default styles to apply
+ */
+export const SuccessLink = ({
+ href,
+ title = false,
+ children,
+ className = `${linkClasses} tw-text-success-content hover:tw-text-success-content`,
+ style = {},
+}) => (
+
+ {children}
+
+)
+
+export const CardLink = ({
+ href,
+ title,
+ icon,
+ children,
+ Link,
+ className = 'tw-bg-base-200 tw-text-base-content',
+}) => {
+ if (!Link) Link = BaseLink
+
+ return (
+
+
+ {title}
+ {icon}
+
+ {children}
+
+ )
+}
diff --git a/packages/react/components/Logo/index.mjs b/packages/react/components/Logo/index.mjs
new file mode 100644
index 00000000000..d0b38093b7b
--- /dev/null
+++ b/packages/react/components/Logo/index.mjs
@@ -0,0 +1,30 @@
+import React from 'react'
+import { logoPath } from '@freesewing/config'
+
+/*
+ * The FreeSewing logo, aka Skully, as a React component
+ *
+ * @params {object} props - All React props
+ * @params {string} className - Custom CSS classes to apply
+ * @params {string} theme - The theme, light or dark. Although by default this component will auto-adapt by using currentColor
+ * @params {number} stroke - Set this to also stroke the logo
+ */
+export const FreeSewingLogo = ({ className = 'w-20 h-20', theme = 'light', stroke = false }) => {
+ const svgProps = {}
+ const strokes = { light: '#000', darf: '#fff' }
+
+ return (
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/react/components/Markdown/index.mjs b/packages/react/components/Markdown/index.mjs
new file mode 100644
index 00000000000..64f7a693ff0
--- /dev/null
+++ b/packages/react/components/Markdown/index.mjs
@@ -0,0 +1,4 @@
+import ReactMarkdown from 'react-markdown'
+
+// This is just a re-export since this is a dependency anyway
+export const Markdown = ReactMarkdown
diff --git a/packages/react/components/Mini/index.mjs b/packages/react/components/Mini/index.mjs
new file mode 100644
index 00000000000..cfb3ea5616d
--- /dev/null
+++ b/packages/react/components/Mini/index.mjs
@@ -0,0 +1,35 @@
+import React from 'react'
+import { TipIcon, ChatIcon, WarningIcon } from '@freesewing/react/components/Icon'
+
+export const MiniTip = ({ children }) => (
+
+)
+
+export const MiniNote = ({ children }) => (
+
+)
+
+export const MiniWarning = ({ children }) => (
+
+)
diff --git a/packages/react/components/Modal/index.mjs b/packages/react/components/Modal/index.mjs
new file mode 100644
index 00000000000..e5715289040
--- /dev/null
+++ b/packages/react/components/Modal/index.mjs
@@ -0,0 +1,96 @@
+import React, { useState, useEffect, useContext } from 'react'
+import { ModalContext } from '@freesewing/react/context/Modal'
+import { CloseIcon } from '@freesewing/react/components/Icon'
+
+const slideClasses = {
+ left: 'tw--translate-x-full',
+ right: 'tw-translate-x-full',
+ top: 'tw--translate-y-full',
+ bottom: 'tw-translate-y-full',
+}
+
+/**
+ * This component wraps modal content, making sure the layout is ok and handling transitions
+ *
+ * @param {object} props - All React props
+ * @param {array} children - Content to render inside the modal
+ * @param {string} flex - Flexbox direction (row or col)
+ * @param {string} justify - Flexbox justify value
+ * @param {string} items - Flexbox items value
+ * @param {string} bg - Background
+ * @param {string} bgOpacity - Background opacity
+ * @param {bool} bare - Set true to not handle layout
+ * @param {bool} keepOpenOnClick - Set to true to prevent a click in the modal content to close the modal
+ * @param {string} slideFrom - Direction to slide in from
+ * @param {bool} fullWidth - Set to true to not constrain the width
+ */
+export const ModalWrapper = ({
+ children = null,
+ flex = 'row',
+ justify = 'center',
+ items = 'center',
+ bg = 'neutral lg:tw-neutral',
+ bgOpacity = '100 lg:tw-bg-opacity-70',
+ bare = false,
+ keepOpenOnClick = false,
+ slideFrom = 'left',
+ fullWidth = false,
+}) => {
+ const { clearModal } = useContext(ModalContext)
+ const [animate, setAnimate] = useState('in')
+
+ const close = (evt) => {
+ // Only process the first event
+ if (evt?.event) evt.event.stopPropagation()
+ setAnimate('out')
+ window.setTimeout(clearModal, 150)
+ }
+
+ useEffect(() => {
+ // only turn off animation if it's animating in
+ if (animate === 'in') setAnimate(false)
+ }, [animate])
+
+ // CSS classes for animation
+ const animation = animate
+ ? `lg:tw-opacity-0 ${slideClasses[slideFrom]} lg:tw-translate-x-0 lg:tw-translate-y-0`
+ : 'tw-opacity-100 tw-translate-none'
+
+ const stopClick = (evt) => {
+ /*
+ * Do not keep modal open for links (with a href)
+ * but do keep it open for buttons (like a new modal context)
+ */
+ if (!evt.target.attributes.href) evt.stopPropagation()
+ }
+
+ return (
+
+ {bare ? (
+ children
+ ) : (
+
+ {children}
+
+
+
+
+ )}
+
+ )
+}
diff --git a/packages/react/components/New/NewLinks.mjs b/packages/react/components/New/NewLinks.mjs
new file mode 100644
index 00000000000..9071275f576
--- /dev/null
+++ b/packages/react/components/New/NewLinks.mjs
@@ -0,0 +1,92 @@
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as DefaultLink } from '@freesewing/react/components/Link'
+import {
+ NewMeasurementsSetIcon,
+ NewPatternIcon,
+ ShowcaseIcon,
+ KioskIcon,
+} from '@freesewing/react/components/Icon'
+
+const NewLink = ({ title, Icon, description, href, Link }) => {
+ if (!Link) Link = DefaultLink
+ const linkProps = {
+ href,
+ className:
+ 'tw-p-8 tw--ml-4 tw--mr-4 md:tw-m-0 tw-rounded-none md:tw-rounded-xl ' +
+ 'md:tw-shadow hover:tw-bg-secondary tw-bg-base-200 hover:tw-bg-opacity-10 ' +
+ 'tw-w-full tw-max-w-lg hover:tw-no-underline',
+ }
+
+ const inner = (
+ <>
+
+ {title}
+
+
+
+ {description}
+
+ >
+ )
+
+ return {inner}
+ return {inner}
+}
+
+const newLinks = {
+ pattern: {
+ href: '/editor/',
+ Icon: NewPatternIcon,
+ title: 'Generate a new pattern',
+ description:
+ 'Pick a design, add your measurements set, and we will generate a bespoke sewing pattern for you.',
+ },
+ set: {
+ Icon: NewMeasurementsSetIcon,
+ title: 'Create new measurements set',
+ description:
+ 'Create a new set of measurements which you can then use to generate patterns for.',
+ },
+ showcase: {
+ Icon: ShowcaseIcon,
+ title: 'Create a new showcase post',
+ description:
+ 'Made something from a FreeSewing pattern? Please share the results here to inspire others.',
+ },
+ img: {
+ Icon: KioskIcon,
+ title: 'Generate a social media image',
+ description:
+ 'Share the FreeSewing love on social media, supports wide, square, and tall formats.',
+ },
+}
+
+/**
+ * The NewLinks component shows all of the links to create something new
+ *
+ * @param {object} props - All the React props
+ * @param {function} Link - A custom Link component, typically the Docusaurus one, but it's optional
+ */
+export const NewLinks = ({ Link = false }) => {
+ // Use custom Link component if available
+ if (!Link) Link = DefaultLink
+
+ // Hooks
+ const { account } = useAccount()
+
+ return (
+
+
+ {Object.entries(newLinks).map(([href, link]) => (
+
+ ))}
+
+
+ )
+}
diff --git a/packages/react/components/New/index.mjs b/packages/react/components/New/index.mjs
new file mode 100644
index 00000000000..59b0a60bb24
--- /dev/null
+++ b/packages/react/components/New/index.mjs
@@ -0,0 +1,3 @@
+import { NewLinks } from './NewLinks.mjs'
+
+export { NewLinks }
diff --git a/packages/react/components/Newsletter/index.mjs b/packages/react/components/Newsletter/index.mjs
new file mode 100644
index 00000000000..bb9d26c814a
--- /dev/null
+++ b/packages/react/components/Newsletter/index.mjs
@@ -0,0 +1,120 @@
+// Dependencies
+import { linkClasses, validateEmail } from '@freesewing/utils'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Components
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon, RightIcon, WarningIcon } from '@freesewing/react/components/Icon'
+import { EmailInput } from '@freesewing/react/components/Input'
+import { Popout } from '@freesewing/react/components/Popout'
+import { IconButton } from '@freesewing/react/components/Button'
+
+/*
+ * Component for newsletter signup (by visitors)
+ *
+ * @params {object} props - All React props
+ * @param {function} props.Link - An optional framework-specific Link component
+ */
+export const NewsletterSignup = ({ Link = false, noP = false, noTitle = false, noBox = false }) => {
+ if (!Link) Link = WebLink
+
+ // Hooks
+ const { account, setAccount } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [email, setEmail] = useState('')
+ const [unsubscribe, setUnsubscribe] = useState(false)
+ const [subscribed, setSubscribed] = useState(false)
+
+ // Helper method to handle subscription
+ const subscribe = async () => {
+ setLoadingStatus([true, 'Contacting backend'])
+ const [status, body] = unsubscribe
+ ? await backend.newsletterStartUnsubscribe(email)
+ : await backend.newsletterSubscribe(email)
+ if (status === 200) {
+ setLoadingStatus([true, 'Request Initiated', true, true])
+ setSubscribed(true)
+ } else setLoadingStatus([true, 'An error occured. Please report this.', true, true])
+ }
+
+ return (
+
+ {subscribed ? (
+ <>
+
Now check your inbox for a confirmation E-mail
+
+ We have sent and email to {email} with a link to confirm this action.
+
+
+
Why do I need to confirm this?
+
+ Without this confirmation step, anyone could attempt to {unsubscribe ? 'un' : ''}
+ subcribe this E-mail address {unsubscribe ? 'from' : 'to'} our newsletter.
+
+
+ >
+ ) : (
+ <>
+ {noTitle ? null :
Subcribe to the FreeSewing newsletter }
+ {noP ? null : (
+
+ Subscribe to our newsletter and once every 3 months you will receive an email from us
+ with honest wholesome content. No tracking, no ads, no nonsense.
+
+ )}
+
+ You can{' '}
+ setUnsubscribe(!unsubscribe)}>
+ {unsubscribe ? 're-' : 'un'}subscribe
+ {' '}
+ at any time
+ >
+ }
+ labelBL={
+
+ {validateEmail(email) ? (
+ <>
+
+ Looks great, click below to {unsubscribe ? 'un' : ''}subscribe this address
+ >
+ ) : (
+ <>
+ Please enter a valid
+ E-mail address
+ >
+ )}
+
+ }
+ update={setEmail}
+ current={email}
+ valid={validateEmail}
+ />
+
+ {unsubscribe ? `Unsubscribe` : 'Subscribe'}
+
+ >
+ )}
+
+ )
+}
diff --git a/packages/react/components/Null/index.mjs b/packages/react/components/Null/index.mjs
new file mode 100644
index 00000000000..a0c82072e47
--- /dev/null
+++ b/packages/react/components/Null/index.mjs
@@ -0,0 +1,6 @@
+import React from 'react'
+
+/*
+ * Sometimes, you just want a component that does nothing
+ */
+export const Null = () => null
diff --git a/packages/react/components/Number/index.mjs b/packages/react/components/Number/index.mjs
new file mode 100644
index 00000000000..ec47f5da623
--- /dev/null
+++ b/packages/react/components/Number/index.mjs
@@ -0,0 +1,11 @@
+import React from 'react'
+
+export const NumberCircle = ({ nr, color = 'secondary' }) => (
+
+ {nr}
+
+)
diff --git a/packages/react/components/Patrons/index.mjs b/packages/react/components/Patrons/index.mjs
new file mode 100644
index 00000000000..7d32130bc2f
--- /dev/null
+++ b/packages/react/components/Patrons/index.mjs
@@ -0,0 +1,309 @@
+// Dependencies
+import { linkClasses } from '@freesewing/utils'
+// Hooks
+import React, { useEffect, useState } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+
+export const PleaseSubscribe = (props = {}) => (
+
+
+
+
+
+
Support FreeSewing
+
+
+
+
+
+)
+
+export const Plea = () => (
+
+
+ Hi friend
+ 👋
+
+ {[
+ 'My name is Joost De Cock. I am the founder and maintainer of FreeSewing.',
+ 'I am here to ask your help. Or more accurately, your support. Which we really need.',
+ 'If you think FreeSewing is worthwhile, and if you can spare a few coins each month without hardship, please support our work.',
+ 'Thanks in advance for considering it.',
+ 'love',
+ ].map((txt, i) => (
+
+ {txt}
+
+ ))}
+
+
+)
+
+const PaypalFormBody = ({ amount, period, currency }) => (
+ <>
+ {[
+ ...Object.entries(paypalConfig.vars[period === 'x' ? 'donate' : 'subscribe']),
+ ...Object.entries(paypalConfig.vars.shared),
+ ].map(([name, value]) => (
+
+ ))}
+ {period === 'x' ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+
+
+ >
+ )}
+
+
+ >
+)
+
+export const Subscribe = ({
+ color = 'secondary',
+ subscribeOnly,
+ amountPreset = '25',
+ periodPreset = 'm',
+}) => {
+ const [amount, setAmount] = useState(amountPreset)
+ const [currency, setCurrency] = useState('eur')
+ const [period, setPeriod] = useState(periodPreset)
+
+ const { amounts, currencies } = paypalConfig
+ const periods = subscribeOnly
+ ? paypalConfig.periods.filter((p) => p !== 'x')
+ : paypalConfig.periods
+
+ return (
+
+
+
+
+ Your Contribution
+
+ setAmount(evt.target.value)}
+ />
+
+
+
+ Currency
+
+ setCurrency(evt.target.value)}
+ >
+ {currencies.sort().map((cur) => (
+
+ {cur.toUpperCase()}
+
+ ))}
+
+
+
+
+
+
+ Presets:
+ {amounts.map((val) => (
+ setAmount(val)}
+ >
+ {val}
+
+ ))}
+
+
+
+
+ {periods.map((val) => (
+
+
+ setPeriod(val)}
+ checked={val === period ? 1 : 0}
+ />
+
+ {paypalConfig.periodLabels[val]}
+
+
+
+ ))}
+
+
+
+ )
+}
+
+export const Joost = ({ className = 'tw-w-32', stroke = 0 }) => (
+
+
+
+)
+
+const paypalConfig = {
+ /*
+ * This is the plan ID for FreeSewing Patron Subscriptions.
+ * Note that to maximize flexibility, and have a sort of pay-what-you-wnat
+ * system, we have only 1 plan: 1 euro/month.
+ *
+ * But we use quantity pricing. So if a person selects a 15/month plan,
+ * we subscribe them to the 1/month plan but set the quantity to 15.
+ */
+ planId: 'P-41W64036N5201172WMTEKMIA',
+ /*
+ * List of amounts we display
+ * (users can also enter their own amount, which we'll floor to an int)
+ */
+ amounts: [5, 10, 15, 25, 50, 75, 100],
+ /*
+ * Currencies supported by PayPal that we use
+ * https://developer.paypal.com/api/nvp-soap/currency-codes#paypal
+ */
+ currencies: ['aud', 'cad', 'eur', 'usd'],
+ /*
+ * Periods for recurring payments
+ * x means donation, not subscription
+ */
+ periods: ['w', 'm', '3m', '6m', 'y', 'x'],
+ periodLabels: {
+ w: 'Weekly',
+ m: 'Monthly',
+ '3m': 'Quarterly',
+ '6m': 'Half-yearly',
+ y: 'Yearly',
+ x: 'One time only',
+ },
+ /*
+ * Variables to set in the form
+ * https://developer.paypal.com/api/nvp-soap/paypal-payments-standard/integration-guide/Appx-websitestandard-htmlvariables/
+ */
+ vars: {
+ // Subscribe form
+ subscribe: {
+ /*
+ * This value indicates it is a subscribe button that was clicked
+ */
+ cmd: '_xclick-subscriptions',
+ /*
+ * Item name as shown to the user
+ *
+ * Will be replaced with the translated value at run time, but this is
+ * here as a safe default.
+ */
+ item_name: 'FreeSewing Patron Subscription',
+ /*
+ * Return URL the user will be redirected to after completion
+ * of the payment.
+ */
+ return: 'https://freesewing.org/patrons/thanks',
+ /*
+ * This needs to be set to 1 to indicate that recurring
+ * payments should be collected.
+ */
+ src: 1,
+ },
+ // Donate form
+ donate: {
+ /*
+ * This value indicates it is a donate button that was clicked
+ */
+ cmd: '_donations',
+ /*
+ * Item name as shown to the user
+ *
+ * Will be replaced with the translated value at run time, but this is
+ * here as a safe default.
+ */
+ item_name: 'FreeSewing Donation',
+ /*
+ * Return URL the user will be redirected to after completion
+ * of the payment.
+ */
+ return: 'https://freesewing.org/donate/thanks',
+ },
+ // Included in both forms
+ shared: {
+ /*
+ * This is required. It is the email address tied to FreeSewing's PayPal account.
+ */
+ business: 'info@freesewing.org',
+ /*
+ * Do not let users include a note. It just clutters up the UI.
+ */
+ no_note: 1,
+ /*
+ * This setting means the user will be redirected using GET
+ * without any payment variables included. It's the cleanest UI.
+ */
+ rm: 1,
+ /*
+ * Image to display on the PayPal checkkout page
+ * Should be 150x50 pixels (which is small)
+ */
+ image_url: 'https://data.freesewing.org/static/img/paypal-logo.png',
+ },
+ },
+}
diff --git a/packages/react-components/src/pattern/circle.mjs b/packages/react/components/Pattern/circle.mjs
similarity index 81%
rename from packages/react-components/src/pattern/circle.mjs
rename to packages/react/components/Pattern/circle.mjs
index a6ba4a0fbf2..86609f251e7 100644
--- a/packages/react-components/src/pattern/circle.mjs
+++ b/packages/react/components/Pattern/circle.mjs
@@ -1,5 +1,3 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
-// eslint-disable-next-line no-unused-vars
import React from 'react'
export const Circle = ({ point }) =>
diff --git a/packages/react-components/src/pattern/defs.mjs b/packages/react/components/Pattern/defs.mjs
similarity index 97%
rename from packages/react-components/src/pattern/defs.mjs
rename to packages/react/components/Pattern/defs.mjs
index 088776b52aa..ce6ddcedad0 100644
--- a/packages/react-components/src/pattern/defs.mjs
+++ b/packages/react/components/Pattern/defs.mjs
@@ -1,4 +1,3 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
// eslint-disable-next-line no-unused-vars
import React from 'react'
import sanitize from 'html-react-parser'
diff --git a/packages/react-components/src/pattern/grid.mjs b/packages/react/components/Pattern/grid.mjs
similarity index 100%
rename from packages/react-components/src/pattern/grid.mjs
rename to packages/react/components/Pattern/grid.mjs
diff --git a/packages/react-components/src/pattern/group.mjs b/packages/react/components/Pattern/group.mjs
similarity index 100%
rename from packages/react-components/src/pattern/group.mjs
rename to packages/react/components/Pattern/group.mjs
diff --git a/packages/react/components/Pattern/index.mjs b/packages/react/components/Pattern/index.mjs
new file mode 100644
index 00000000000..656e61ed5e9
--- /dev/null
+++ b/packages/react/components/Pattern/index.mjs
@@ -0,0 +1,104 @@
+// Dependencies
+import { cloudflareImageUrl } from '@freesewing/utils'
+// Components
+import React, { forwardRef } from 'react'
+import { Svg as DefaultSvg } from './svg.mjs'
+import { Defs as DefaultDefs } from './defs.mjs'
+import { Group as DefaultGroup } from './group.mjs'
+import { Stack as DefaultStack } from './stack.mjs'
+import { Part as DefaultPart } from './part.mjs'
+import { Point as DefaultPoint } from './point.mjs'
+import { Snippet as DefaultSnippet } from './snippet.mjs'
+import { Path as DefaultPath } from './path.mjs'
+import { Grid as DefaultGrid } from './grid.mjs'
+import { Text as DefaultText, TextOnPath as DefaultTextOnPath } from './text.mjs'
+import { Circle as DefaultCircle } from './circle.mjs'
+import { getId, getProps, withinPartBounds, translateStrings } from './utils.mjs'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+
+/*
+ * Allow people to override these components
+ */
+const defaultComponents = {
+ Svg: DefaultSvg,
+ Defs: DefaultDefs,
+ Group: DefaultGroup,
+ Stack: DefaultStack,
+ Part: DefaultPart,
+ Point: DefaultPoint,
+ Path: DefaultPath,
+ Snippet: DefaultSnippet,
+ Grid: DefaultGrid,
+ Text: DefaultText,
+ TextOnPath: DefaultTextOnPath,
+ Circle: DefaultCircle,
+}
+
+/*
+ * The pattern component
+ * FIXME: document props
+ */
+const Pattern = forwardRef((props, ref) => {
+ if (!props.renderProps) return null
+
+ // Destructure props
+ const {
+ renderProps = false,
+ strings = {},
+ children = false,
+ className = 'freesewing pattern',
+ components = {},
+ } = props
+
+ // Merge default and swizzled components
+ const mergedComponents = {
+ ...defaultComponents,
+ ...components,
+ }
+
+ const { Svg, Defs, Stack, Group } = mergedComponents
+
+ const optionalProps = {}
+ if (className) optionalProps.className = className
+
+ return (
+
+
+
+
+ {children
+ ? children
+ : Object.keys(renderProps.stacks).map((stackName) => (
+
+ ))}
+
+
+ )
+})
+
+export {
+ // utils
+ getId,
+ getProps,
+ withinPartBounds,
+ translateStrings,
+ // default components
+ defaultComponents,
+ // The Pattern component itself
+ Pattern,
+}
diff --git a/packages/react-components/src/pattern/part.mjs b/packages/react/components/Pattern/part.mjs
similarity index 86%
rename from packages/react-components/src/pattern/part.mjs
rename to packages/react/components/Pattern/part.mjs
index cf5305002a6..e773244caa9 100644
--- a/packages/react-components/src/pattern/part.mjs
+++ b/packages/react/components/Pattern/part.mjs
@@ -1,10 +1,9 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
// eslint-disable-next-line no-unused-vars
import React, { forwardRef } from 'react'
import { getId, getProps } from './utils.mjs'
export const PartInner = forwardRef(
- ({ stackName, partName, part, settings, components, t }, ref) => {
+ ({ stackName, partName, part, settings, components, strings }, ref) => {
const { Group, Path, Point, Snippet } = components
return (
@@ -16,7 +15,7 @@ export const PartInner = forwardRef(
topLeft={part.topLeft}
bottomRight={part.bottomRight}
units={settings[0].units}
- {...{ stackName, partName, pathName, part, settings, components, t }}
+ {...{ stackName, partName, pathName, part, settings, components, strings }}
/>
))}
{Object.keys(part.points).map((pointName) => (
@@ -25,14 +24,14 @@ export const PartInner = forwardRef(
point={part.points[pointName]}
topLeft={part.topLeft}
bottomRight={part.bottomRight}
- {...{ stackName, partName, pointName, part, settings, components, t }}
+ {...{ stackName, partName, pointName, part, settings, components, strings }}
/>
))}
{Object.keys(part.snippets).map((snippetName) => (
))}
@@ -42,12 +41,12 @@ export const PartInner = forwardRef(
PartInner.displayName = 'PartInner'
-export const Part = ({ stackName, partName, part, settings, components, t }) => {
+export const Part = ({ stackName, partName, part, settings, components, strings }) => {
const { Group } = components
return (
-
+
)
}
diff --git a/packages/react/components/Pattern/path.mjs b/packages/react/components/Pattern/path.mjs
new file mode 100644
index 00000000000..fc9db81d5b0
--- /dev/null
+++ b/packages/react/components/Pattern/path.mjs
@@ -0,0 +1,22 @@
+// eslint-disable-next-line no-unused-vars
+import React from 'react'
+import { getId, getProps } from './utils.mjs'
+
+export const Path = ({ stackName, pathName, path, partName, settings, components, strings }) => {
+ // Don't render hidden paths
+ if (path.hidden) return null
+
+ // Get potentially swizzled components
+ const { TextOnPath } = components
+
+ const pathId = getId({ settings, stackName, partName, pathName })
+
+ return (
+ <>
+
+ {path.attributes.text && path.attributes.text.length > 0 ? (
+
+ ) : null}
+ >
+ )
+}
diff --git a/packages/react/components/Pattern/point.mjs b/packages/react/components/Pattern/point.mjs
new file mode 100644
index 00000000000..04298b5c88d
--- /dev/null
+++ b/packages/react/components/Pattern/point.mjs
@@ -0,0 +1,23 @@
+// eslint-disable-next-line no-unused-vars
+import React from 'react'
+import { withinPartBounds } from './utils.mjs'
+
+export const Point = ({ stackName, partName, pointName, part, point, components, strings }) => {
+ /*
+ * Don't include points outside the part bounding box
+ * Unless the `data-render-always` attribute is set
+ */
+ if (!withinPartBounds(point, part) && !point.attributes.list['data-render-always']) return null
+
+ // Get potentially swizzled components
+ const { Circle, Text } = components
+
+ return point.attributes ? (
+ <>
+ {point.attributes.text ? (
+
+ ) : null}
+ {point.attributes.circle ? : null}
+ >
+ ) : null
+}
diff --git a/packages/react-components/src/pattern/snippet.mjs b/packages/react/components/Pattern/snippet.mjs
similarity index 100%
rename from packages/react-components/src/pattern/snippet.mjs
rename to packages/react/components/Pattern/snippet.mjs
diff --git a/packages/react/components/Pattern/stack.mjs b/packages/react/components/Pattern/stack.mjs
new file mode 100644
index 00000000000..954fab2c3ab
--- /dev/null
+++ b/packages/react/components/Pattern/stack.mjs
@@ -0,0 +1,15 @@
+import React from 'react'
+import { getProps } from './utils.mjs'
+
+export const Stack = ({ stackName, stack, settings, components, strings }) => {
+ const { Group, Part, Grid } = components
+
+ return (
+
+ {settings[0].paperless ? : null}
+ {[...stack.parts].map((part, key) => (
+
+ ))}
+
+ )
+}
diff --git a/packages/react-components/src/pattern/svg.mjs b/packages/react/components/Pattern/svg.mjs
similarity index 92%
rename from packages/react-components/src/pattern/svg.mjs
rename to packages/react/components/Pattern/svg.mjs
index 86961c397c8..d5d54fbb2df 100644
--- a/packages/react-components/src/pattern/svg.mjs
+++ b/packages/react/components/Pattern/svg.mjs
@@ -1,4 +1,3 @@
-// __SDEFILE__ - This file is a dependency for the stand-alone environment
// eslint-disable-next-line no-unused-vars
import React from 'react'
import { forwardRef } from 'react'
diff --git a/packages/react/components/Pattern/text.mjs b/packages/react/components/Pattern/text.mjs
new file mode 100644
index 00000000000..2b4bf27cd07
--- /dev/null
+++ b/packages/react/components/Pattern/text.mjs
@@ -0,0 +1,55 @@
+// eslint-disable-next-line no-unused-vars
+import React from 'react'
+import { translateStrings } from './utils.mjs'
+
+export const TextSpans = ({ point, strings }) => {
+ const translated = translateStrings(point.attributes.list['data-text'], strings)
+ const text = []
+ if (translated.indexOf('\n') !== -1) {
+ // Handle muti-line text
+ let key = 0
+ let lines = translated.split('\n')
+ text.push({lines.shift()} )
+ for (let line of lines) {
+ key++
+ text.push(
+
+ {line.toString().replace(/"/g, '"')}
+
+ )
+ }
+ } else text.push({translated} )
+
+ return text
+}
+
+export const Text = ({ point, strings }) => (
+
+
+
+)
+
+export const TextOnPath = ({ path, pathId, strings }) => {
+ const textPathProps = {
+ xlinkHref: '#' + pathId,
+ startOffset: '0%',
+ }
+ const translated = translateStrings(path.attributes.text, strings)
+ const align = path.attributes.list['data-text-class']
+ ? path.attributes.list['data-text-class'].join(' ')
+ : false
+ if (align && align.indexOf('center') > -1) textPathProps.startOffset = '50%'
+ else if (align && align.indexOf('right') > -1) textPathProps.startOffset = '100%'
+
+ return (
+
+
+
+
+
+ )
+}
diff --git a/packages/react/components/Pattern/utils.mjs b/packages/react/components/Pattern/utils.mjs
new file mode 100644
index 00000000000..0ee0401da26
--- /dev/null
+++ b/packages/react/components/Pattern/utils.mjs
@@ -0,0 +1,82 @@
+import React from 'react'
+
+export const getProps = (obj) => {
+ /** I can't believe it but there seems to be no method on NPM todo this */
+ const cssKey = (key) => {
+ let chunks = key.split('-')
+ if (chunks.length > 1) {
+ key = chunks.shift()
+ for (let s of chunks) key += s.charAt(0).toUpperCase() + s.slice(1)
+ }
+
+ return key
+ }
+
+ const convert = (css) => {
+ let style = {}
+ let rules = css.split(';')
+ for (let rule of rules) {
+ let chunks = rule.split(':')
+ if (chunks.length === 2) style[cssKey(chunks[0].trim())] = chunks[1].trim()
+ }
+ return style
+ }
+
+ let rename = {
+ class: 'className',
+ 'marker-start': 'markerStart',
+ 'marker-end': 'markerEnd',
+ }
+ let props = {}
+ for (let key in obj.attributes.list) {
+ if (key === 'style') props[key] = convert(obj.attributes.list[key].join(' '))
+ if (Object.keys(rename).indexOf(key) !== -1)
+ props[rename[key]] = obj.attributes.list[key].join(' ')
+ else if (key !== 'style') props[key] = obj.attributes.list[key].join(' ')
+ }
+
+ return props
+}
+
+export const withinPartBounds = (point, part) =>
+ point.x >= part.topLeft.x &&
+ point.x <= part.bottomRight.x &&
+ point.y >= part.topLeft.y &&
+ point.y <= part.bottomRight.y
+ ? true
+ : false
+
+export const getId = ({
+ settings = {},
+ stackName = false,
+ partName = false,
+ pathName = false,
+ pointName = false,
+ snippetName = false,
+ name = false,
+}) => {
+ let id = settings.idPrefix || ''
+ if (stackName) id += `${stackName}-`
+ if (partName) id += `${partName}-`
+ if (pathName) id += `${pathName}-`
+ if (pointName) id += `${pointName}-`
+ if (snippetName) id += `${snippetName}-`
+ if (name) id += name
+
+ return id
+}
+
+export const translateStrings = (list, translations = {}) => {
+ let translated = ''
+ if (!list) return translated
+ for (const string of list) {
+ if (Array.isArray(string)) translated += translateStrings(string, translations)
+ else if (string) {
+ if (translations[string]) {
+ translated += `${translations[string]}`.replace(/"/g, '"') + ' '
+ } else translated += `${string}`
+ }
+ }
+
+ return translated
+}
diff --git a/packages/react/components/Popout/index.mjs b/packages/react/components/Popout/index.mjs
new file mode 100644
index 00000000000..9d86cc6b0ce
--- /dev/null
+++ b/packages/react/components/Popout/index.mjs
@@ -0,0 +1,108 @@
+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',
+}
+
+/**
+ * This popout component is a way to make some content stand out
+ *
+ * @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
+ */
+export const Popout = (props) => {
+ // 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 && (
+
setHide(true)} className="hover:tw-text-secondary" title="Close">
+
+
+ )}
+
+
{props.children}
+ {type === 'comment' && (
+
{props.by}
+ )}
+
+
+ )
+}
diff --git a/packages/react/components/Profile/index.mjs b/packages/react/components/Profile/index.mjs
new file mode 100644
index 00000000000..90d985e6585
--- /dev/null
+++ b/packages/react/components/Profile/index.mjs
@@ -0,0 +1,120 @@
+// Dependencies
+import { linkClasses, cloudflareImageUrl, getSearchParam } from '@freesewing/utils'
+// Context
+import { ModalContext } from '@freesewing/react/context/Modal'
+// Hooks
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { NoIcon, OkIcon, SaveIcon, RightIcon, WarningIcon } from '@freesewing/react/components/Icon'
+import { MiniWarning } from '@freesewing/react/components/Mini'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+import Markdown from 'react-markdown'
+
+/*
+ * Component for the currently authenticated user's profile
+ *
+ * @params {object} props - All React props
+ * @param {number} props.uid - The user ID for which to show the profile
+ * @param {function} props.Link - An optional framework-specific Link component
+ */
+export const OwnProfile = (props) => {
+ const { account } = useAccount()
+
+ return
+}
+
+/*
+ * Component for a user profile
+ *
+ * @params {object} props - All React props
+ * @param {number} props.uid - The user ID for which to show the profile
+ * @param {function} props.Link - An optional framework-specific Link component
+ */
+export const UserProfile = ({
+ Link = false,
+ setTitle = false,
+ uid = false,
+ noBox = false,
+ fromUrl = false,
+}) => {
+ if (!uid && !fromUrl)
+ return (
+
+ You must provide either a uid
or fromUrl
prop
+
+ )
+ if (!Link) Link = WebLink
+
+ const [ruid, setRuid] = useState()
+
+ // Hooks
+ const backend = useBackend()
+
+ // State
+ const [data, setData] = useState(false)
+
+ // Effect
+ useEffect(() => {
+ if (uid && uid !== ruid) setRuid(uid)
+ if (fromUrl) {
+ const urlId = getSearchParam(fromUrl)
+ if (urlId && urlId !== ruid) setRuid(urlId)
+ }
+ if (ruid) loadProfileData(ruid, backend, setData)
+ }, [uid, fromUrl, ruid])
+
+ return (
+ <>
+
+
+
+
{data.username}
+
+
+
+
+ Permalink:
+ {`freesewing.eu/users?id=${ruid}`}
+
+ {data.bio}
+ >
+ )
+}
+
+/*
+ * Shows an avatar image
+ *
+ * @param {string} ihash - The ihash of the account
+ */
+export const Avatar = ({ ihash }) => {
+ const { setModal } = useContext(ModalContext)
+
+ return (
+
+ setModal(
+
+
+
+ )
+ }
+ >
+
+
+ )
+}
+
+async function loadProfileData(uid, backend, setData) {
+ const [status, body] = await backend.getUserProfile(uid)
+ if (status === 200 && body.result === 'success' && body.profile) setData(body.profile)
+}
diff --git a/packages/react/components/Role/index.mjs b/packages/react/components/Role/index.mjs
new file mode 100644
index 00000000000..87737ab7628
--- /dev/null
+++ b/packages/react/components/Role/index.mjs
@@ -0,0 +1,276 @@
+import { horFlexClasses } from '@freesewing/utils'
+import { roles } from '@freesewing/config'
+//Hooks
+import React, { useEffect, useState } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link as DefaultLink } from '@freesewing/react/components/Link'
+import { LockIcon, PlusIcon } from '@freesewing/react/components/Icon'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { H1, H2, H3 } from '@freesewing/react/components/Heading'
+
+//import { ConsentForm, ns as gdprNs } from 'shared/components/gdpr/form.mjs'
+
+const ConsentForm = () => null
+
+const Wrap = ({ children }) => (
+ {children}
+)
+
+const ContactSupport = ({ Link = false }) => {
+ if (!Link) Link = DefaultLink
+
+ return (
+
+
+ Contact Support
+
+
+ )
+}
+
+const AuthRequired = ({ Link, banner }) => {
+ if (!Link) Link = DefaultLink
+
+ return (
+
+ {banner}
+ Authentication Required
+ This functionality requires a FreeSewing account
+
+
+
+ Sign Up
+
+
+
+ Sign In
+
+
+
+ )
+}
+
+const AccountInactive = ({ Link, banner }) => {
+ if (!Link) Link = DefaultLink
+
+ return (
+
+ {banner}
+ Account Inactive
+ You must activate your account via the signup link we sent you.
+ If you cannot find the link, you can receive a new one by signing up again.
+
+
+ Sign Up
+
+
+
+ )
+}
+
+const AccountDisabled = ({ banner }) => (
+
+ {banner}
+ Acccount Disabled
+
+ You cannot re-enable a disabled account. You need to contact support to resolve this
+ situation.
+
+
+
+)
+
+const AccountProhibited = ({ banner }) => (
+
+ {banner}
+ Your account has been disabled
+ Your account has been administratively disabled.
+
+
+)
+
+const AccountStatusUnknown = ({ banner }) => (
+
+ {banner}
+ Account status warning
+ Your account status prohibits us from processing your data. Please contact support.
+
+
+)
+
+const RoleLacking = ({ t, requiredRole, role, banner }) => (
+
+ {banner}
+ You lack the required role to access this content
+
+ This content requires the {requiredRole} role. Your role is {role} which does
+ not grant you access to this content.
+
+
+
+)
+
+const ConsentLacking = ({ banner, refresh }) => {
+ const { setAccount, setToken, setSeenUser } = useAccount()
+ const backend = useBackend()
+
+ const updateConsent = async ({ consent1, consent2 }) => {
+ let consent = 0
+ if (consent1) consent = 1
+ if (consent1 && consent2) consent = 2
+ if (consent > 0) {
+ const result = await backend.updateConsent(consent)
+ if (result.success) {
+ setToken(result.data.token)
+ setAccount({ ...result.data.account, bestBefore: Date.now() + 3600000 })
+ setSeenUser(result.data.account.username)
+ refresh()
+ } else {
+ console.log('something went wrong', result)
+ refresh()
+ }
+ }
+ }
+
+ return (
+
+
+ {banner}
+
+
+
+ )
+}
+
+export const RoleBlock = ({ children, user = false, Link = false }) => {
+ if (!Link) Link = DefaultLink
+ let requiredRole = 'admin'
+ if (user) requiredRole = user
+
+ const { account, setAccount, token, admin, stopImpersonating, signOut } = useAccount()
+ const backend = useBackend()
+
+ const [ready, setReady] = useState(false)
+ const [impersonating, setImpersonating] = useState(false)
+ const [error, setError] = useState(false)
+ const [refreshCount, setRefreshCount] = useState(0)
+
+ /*
+ * Avoid hydration errors
+ */
+ useEffect(() => {
+ if (admin?.account?.username && account?.username)
+ setImpersonating({
+ admin: admin.account.username,
+ user: account.username,
+ })
+ const verifyUser = async () => {
+ const [status, data] = await backend.ping()
+ if (status === 200 && data.result === 'success') {
+ // Refresh account in local storage
+ setAccount({
+ ...account,
+ ...data.account,
+ bestBefore: Date.now() + 3600000,
+ })
+ } else {
+ if (data?.error?.error) setError(data.error.error)
+ else {
+ signOut()
+ }
+ }
+ setReady(true)
+ }
+ if (token) {
+ // Don't hammer the backend. Check once per hour.
+ if (!account.bestBefore || account.bestBefore < Date.now()) verifyUser()
+ }
+ setReady(true)
+ }, [admin, refreshCount, signOut])
+
+ const refresh = () => {
+ setRefreshCount(refreshCount + 1)
+ setError(false)
+ }
+
+ if (!ready) return
+
+ const banner = impersonating ? (
+
+
+ Hi {impersonating.admin} , you are currently impersonating {impersonating.user}
+
+
+ Stop Impersonating
+
+
+ ) : null
+
+ const childProps = { banner }
+
+ if (!token || !account.username) return
+ if (error) {
+ if (error === 'accountInactive') return
+ if (error === 'accountDisabled') return
+ if (error === 'accountBlocked') return
+ if (error === 'consentLacking') return
+ return
+ }
+
+ if (!roles.levels[account.role] || roles.levels[account.role] < roles.levels[requiredRole]) {
+ return
+ }
+
+ return children
+}
+
+export const UserVisitorContent = ({ userContent = null, visitorContent = null }) => {
+ const { account, setAccount, token } = useAccount()
+ const backend = useBackend()
+
+ const [ready, setReady] = useState(false)
+ const [error, setError] = useState(false)
+ const [refreshCount, setRefreshCount] = useState(0)
+
+ /*
+ * Avoid hydration errors
+ */
+ useEffect(() => {
+ const verifyUser = async () => {
+ const [status, data] = await backend.ping()
+ if (status === 200 && data.result === 'success') {
+ // Refresh account in local storage
+ setAccount({
+ ...account,
+ ...data.account,
+ bestBefore: Date.now() + 3600000,
+ })
+ } else {
+ if (data?.error?.error) setError(data.error.error)
+ }
+ setReady(true)
+ }
+ if (token) {
+ // Don't hammer the backend. Check once per hour.
+ if (!account.bestBefore || account.bestBefore < Date.now()) verifyUser()
+ }
+ setReady(true)
+ }, [refreshCount])
+
+ const refresh = () => {
+ setRefreshCount(refreshCount + 1)
+ setError(false)
+ }
+
+ if (!ready) return
+
+ return token && account.username ? userContent : visitorContent
+}
diff --git a/packages/react/components/SignIn/index.mjs b/packages/react/components/SignIn/index.mjs
new file mode 100644
index 00000000000..5331415e50a
--- /dev/null
+++ b/packages/react/components/SignIn/index.mjs
@@ -0,0 +1,430 @@
+// Utils
+import { horFlexClasses, horFlexClassesNoSm, capitalize, getSearchParam } from '@freesewing/utils'
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+// Hooks
+import React, { useState, useEffect, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Link } from '@freesewing/react/components/Link'
+import { Popout } from '@freesewing/react/components/Popout'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import {
+ EmailIcon,
+ KeyIcon,
+ LockIcon,
+ WarningIcon,
+ GoogleIcon,
+ GitHubIcon,
+ FreeSewingIcon,
+ UserIcon,
+} from '@freesewing/react/components/Icon'
+import { MfaInput, StringInput, PasswordInput } from '@freesewing/react/components/Input'
+import { H1, H2, H3, H4 } from '@freesewing/react/components/Heading'
+
+/*
+ * This SignIn component holds the entire sign-in form
+ *
+ * @param {object} props - All React props
+ * @param {function} props.onSuccess - Optional: A method to run when the sign in is successful
+ * @param {function} props.silent - Optional: Silently login the user if we have a valid session
+ */
+export const SignIn = ({ onSuccess = false, silent = false }) => {
+ const { account, setAccount, setToken, seenUser, setSeenUser } = useAccount()
+ const backend = useBackend()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ const [username, setUsername] = useState('')
+ const [password, setPassword] = useState('')
+ const [magicLink, setMagicLink] = useState(true)
+ const [signInFailed, setSignInFailed] = useState(false)
+ const [magicLinkSent, setMagicLinkSent] = useState(false)
+ const [seenBefore, setSeenBefore] = useState(false)
+ const [mfa, setMfa] = useState(false)
+ const [mfaCode, setMfaCode] = useState('')
+
+ useEffect(() => {
+ if (typeof window !== 'undefined' && signInFailed) {
+ window.setTimeout(() => setSignInFailed(false), 1750)
+ }
+ }, [signInFailed])
+
+ // Avoid SSR rendering mismatch by setting this in effect
+ useEffect(() => {
+ if (silent) {
+ const checkSession = async () => {
+ const result = await backend.ping()
+ const [status, body] = Array.isArray(result) ? result : [false, false]
+ // Silent sign-in succeeded
+ if (status === 200) {
+ setAccount(body.account)
+ setSeenUser(body.account.username)
+ setLoadingStatus([true, `Welcome back ${body.account.username}`, true, true])
+ // Call the onSuccess handler
+ if (typeof onSuccess === 'function') onSuccess(body)
+ }
+ }
+ checkSession()
+ }
+ if (seenUser) {
+ setSeenBefore(seenUser)
+ setUsername(seenUser)
+ } else {
+ setSeenBefore(false)
+ setUsername('')
+ }
+ }, [seenUser])
+
+ const triggerSubmit = (evt) => {
+ if (evt.key === 'Enter') signinHandler(evt)
+ }
+
+ const signinHandler = async (evt) => {
+ evt.preventDefault()
+ setLoadingStatus([true, 'Contacting FreeSewing backend'])
+ const result = magicLink
+ ? await backend.signIn({ username, password: false })
+ : await backend.signIn({ username, password, token: mfaCode })
+ const [status, body] = Array.isArray(result) ? result : [false, false]
+ if (!status) {
+ setSignInFailed('Unexpected error when attempting sign-in')
+ return setLoadingStatus([
+ true,
+ 'Unexpected error when attempting sign-in. Please report this.',
+ true,
+ false,
+ ])
+ }
+ // Sign-in succeeded
+ if (status === 200) {
+ if (magicLink) {
+ setLoadingStatus([true, 'Email sent', true, true])
+ setMagicLinkSent(true)
+ } else {
+ setAccount(body.account)
+ setToken(body.token)
+ setSeenUser(body.account.username)
+ setLoadingStatus([true, `Welcome back ${body.account.username}`, true, true])
+ // Call the onSuccess handler
+ if (typeof onSuccess === 'function') onSuccess(body)
+ }
+ }
+ // Sign-in failed
+ if (status === 401) {
+ const msg = magicLink ? 'Unable to find this user' : 'Sign-In failed'
+ setSignInFailed(msg)
+ setLoadingStatus([true, msg, true, false])
+ }
+ // Bad request
+ if (status === 400) {
+ let msg
+ if (result.data.error === 'usernameMissing') msg = 'Please provide your username'
+ else if (result.data.error === 'passwordMissing') msg = 'Please provide your password'
+ setSignInFailed(msg)
+ setLoadingStatus([true, msg, true, false])
+ }
+ // MFA active
+ if (status === 403 && body.error === 'mfaTokenRequired') {
+ setMfa(true)
+ setLoadingStatus([
+ true,
+ 'Please provide a one-time MFA code, or a backup scratch code',
+ true,
+ true,
+ ])
+ }
+ }
+
+ const initOauth = async (provider) => {
+ setLoadingStatus([true, 'Contacting the FreeSewing backend'])
+ const result = await backend.oauthInit({ provider, language: 'en' })
+ if (result.success) {
+ setLoadingStatus([true, `Contacting ${capitalize(provider)}`])
+ window.location.href = result.data.authUrl
+ }
+ }
+
+ const btnClasses = `tw-daisy-btn tw-capitalize tw-w-full tw-mt-4 ${
+ signInFailed ? 'tw-daisy-btn-warning' : 'tw-daisy-btn-primary'
+ } tw-transition-colors tw-ease-in-out tw-duration-300 ${horFlexClassesNoSm}`
+ const noBueno = (
+ <>
+
+ {signInFailed}
+
+ >
+ )
+
+ if (magicLinkSent)
+ return (
+
+ Email Sent
+
+ Go check your inbox for an email from FreeSewing.org
+
+
+ Click the sign-in link in that email to sign in to your FreeSewing account.
+
+
+ setMagicLinkSent(false)}
+ >
+ Back
+
+
+ Contact support
+
+
+
+ )
+
+ if (mfa)
+ return (
+
+ setMfa(false)}>
+ Back
+
+
+ Contact support
+
+
+ }
+ />
+ )
+
+ return (
+
+ {seenBefore ? `Welcome back ${seenUser}` : 'Welcome'}
+ Sign in to FreeSewing
+ {!seenBefore && (
+ val.length > 1}
+ />
+ )}
+ {magicLink ? (
+
+ {signInFailed ? (
+ noBueno
+ ) : (
+ <>
+
+
+
+ Email me a sign-in link
+
+
+
+ >
+ )}
+
+ ) : (
+ <>
+ val.length > 0}
+ onKeyDown={triggerSubmit}
+ />
+
+ {signInFailed ? (
+ noBueno
+ ) : (
+ <>
+
+
+
+ Sign in
+
+
+
+ >
+ )}
+
+ >
+ )}
+ setMagicLink(!magicLink)}
+ >
+ {magicLink ? : }
+ {magicLink ? 'Use your password' : 'Email me a sign-in link'}
+ {magicLink ? : }
+
+
+ {['Google', 'Github'].map((provider) => (
+ initOauth(provider)}
+ >
+ {provider === 'Google' ? : }
+ Sign in with {provider}
+
+ ))}
+
+ {seenBefore ? (
+ setSeenUser(false)}
+ >
+
+ Sign in as a different user
+
+ ) : (
+
+
+ Sign up here
+
+ )}
+
+ )
+}
+
+const WrapForm = ({ children }) => {children}
+
+const MfaForm = ({ mfaCode, setMfaCode, onSubmit, post = [] }) => (
+
+ MFA Code
+
+ Please provide a one-time MFA code, or a backup scratch code
+
+
+
+
+
+
+ Sign In
+
+
+
+
+ {post}
+
+)
+
+export const SignInConfirmation = ({ onSuccess = false }) => {
+ // State
+ const [error, setError] = useState(false)
+ const [id, setId] = useState()
+ const [check, setCheck] = useState()
+ const [mfa, setMfa] = useState()
+ const [mfaCode, setMfaCode] = useState()
+
+ // Hooks
+ const { setAccount, setToken } = useAccount()
+ const backend = useBackend()
+
+ // Context
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // Effects
+ useEffect(() => {
+ const newId = getSearchParam('id')
+ const newCheck = getSearchParam('check')
+ if (newId !== id) setId(newId)
+ if (newCheck !== check) setCheck(newCheck)
+ }, [id, check])
+
+ useEffect(() => {
+ // Call async method
+ if (id) getConfirmation()
+ }, [id])
+
+ // Gets the confirmation
+ const getConfirmation = async () => {
+ setLoadingStatus([true, 'Contacting the backend', true, true])
+ // Reach out to backend
+ const [status, body] = await backend.signInFromLink({ id, check, token: mfaCode })
+
+ // If it works, store account, which runs the onSuccess handler
+ if (body.token) return storeAccount(body)
+ // If it did not work, perhaps we need to handle MFA?
+ if (status === 403 && body.error === 'mfaTokenRequired') {
+ setMfa(true)
+ setLoadingStatus([
+ true,
+ 'Please provide a one-time MFA code, or a backup scratch code',
+ true,
+ true,
+ ])
+ return
+ }
+ // If we get here, we're not sure what's wrong
+ if (body.error) return setError(body.error)
+ return setError(true)
+ }
+
+ // Updates the (local) account data
+ const storeAccount = async (data) => {
+ if (data?.token && data?.account) {
+ setToken(data.token)
+ setAccount(data.account)
+ if (typeof onSuccess === 'function') onSuccess(data)
+ else navigate('/account', true)
+ } else {
+ setError(data)
+ }
+ }
+
+ // Short-circuit errors
+ if (error && mfa)
+ return error === 'signInFailed' ? (
+ <>
+
+
+ Your one-time token is either invalid of expired.
+
+ >
+ ) : (
+ <>
+
+ This error is unexpected. Please report this.
+ >
+ )
+
+ // Show MFA input if required
+ if (mfa) return
+
+ // If we do not (yet) have the data, show a loader
+ if (!id || !check)
+ return (
+ <>
+ One moment pleae
+
+ >
+ )
+
+ return fixme
+}
diff --git a/packages/react/components/SignUp/index.mjs b/packages/react/components/SignUp/index.mjs
new file mode 100644
index 00000000000..7e781f5b2c2
--- /dev/null
+++ b/packages/react/components/SignUp/index.mjs
@@ -0,0 +1,247 @@
+// Dependencies
+import { validateEmail, validateTld, getSearchParam } from '@freesewing/utils'
+
+// Hooks
+import React, { useState, useContext, useEffect } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+import { ModalContext } from '@freesewing/react/context/Modal'
+
+// Components
+import { Link } from '@freesewing/react/components/Link'
+import {
+ LeftIcon,
+ RightIcon,
+ HelpIcon,
+ GoogleIcon,
+ GitHubIcon,
+ KeyIcon,
+ EmailIcon,
+ DownIcon,
+} from '@freesewing/react/components/Icon'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { EmailInput } from '@freesewing/react/components/Input'
+import { IconButton } from '@freesewing/react/components/Button'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { Consent } from '@freesewing/react/components/Account'
+
+export const SignUp = ({ embed = false }) => {
+ // State
+ const [email, setEmail] = useState('')
+ const [emailValid, setEmailValid] = useState(false)
+ const [result, setResult] = useState(false)
+ const [showAll, setShowAll] = useState(false)
+
+ // Hooks
+ const backend = useBackend()
+
+ // Context
+ const { setModal } = useContext(ModalContext)
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ const updateEmail = (value) => {
+ setEmail(value)
+ const valid = (validateEmail(value) && validateTld(value)) || false
+ setEmailValid(valid === true ? true : false)
+ }
+
+ const signupHandler = async (evt) => {
+ evt.preventDefault()
+ if (!emailValid) {
+ setLoadingStatus([true, 'Please provide a valid email address', true, false])
+ return
+ }
+ const [status, body] = await backend.signUp({ email })
+ if (status === 201 && body.result === 'created') setResult('success')
+ else {
+ setModal(
+
+
+
An error occured while trying to process your request
+
+ Unfortunately, we cannot recover from this error, we need a human being to look into
+ this.
+
+
+ Feel free to try again, or reach out to support so we can assist you.
+
+
+ setResult(false)}>
+
+ Back
+
+
+
+ Contact support
+
+
+
+
+ )
+ }
+ }
+
+ const initOauth = async (provider) => {
+ setLoadingStatus([true, 'Contacting the backend'])
+ const result = await backend.oauthInit({ provider, language: 'en' })
+ if (result.success) {
+ setLoadingStatus([true, `Contacting ${provider}`])
+ window.location.href = result.data.authUrl
+ }
+ }
+ const Heading = embed
+ ? ({ children }) => {children}
+ : ({ children }) => {children}
+
+ return (
+
+
+ {result ? (
+ result === 'success' ? (
+ Now check your inbox
+ ) : (
+ An error occured while trying to process your request
+ )
+ ) : (
+ Create a FreeSewing account
+ )}
+
+
+ {result ? (
+ result === 'success' ? (
+ <>
+
+ Go check your inbox for an email from FreeSewing.org
+
+
+ Click your personal signup link in that email to create your FreeSewing account.
+
+
+ setResult(false)}>
+
+ Back
+
+
+
+ Contact support
+
+
+ >
+ ) : (
+ <>
+ robot here
+
+ Unfortunately, we cannot recover from this error, we need a human being to look into
+ this.
+
+
+ Feel free to try again, or reach out to support so we can assist you.
+
+
+ setResult(false)}>
+ Back
+
+
+ Contact support
+
+
+ >
+ )
+ ) : (
+ <>
+
To receive a sign-up link, enter your email address
+
+ {showAll ? (
+ <>
+
+ {['Google', 'GitHub'].map((provider) => (
+ initOauth(provider)}
+ >
+ {provider === 'Google' ? : }
+ Sign up with {provider}
+
+ ))}
+
+
+
+
+
+ Sign in here
+
+
+ setShowAll(false)}>
+
+ Fewer options
+
+
+
+ >
+ ) : (
+
+ setShowAll(true)}>
+
+ More options
+
+
+
+ )}
+ >
+ )}
+
+ )
+}
+
+export const SignUpConfirmation = ({ onSuccess = false }) => {
+ // State
+ const [id, setId] = useState()
+ const [check, setCheck] = useState()
+
+ // Effects
+ useEffect(() => {
+ const newId = getSearchParam('id')
+ const newCheck = getSearchParam('check')
+ if (newId !== id) setId(newId)
+ if (newCheck !== check) setCheck(newCheck)
+ }, [id, check])
+
+ // If we do not (yet) have the data, show a loader
+ if (!id || !check)
+ return (
+ <>
+ One moment pleae
+
+ >
+ )
+
+ return (
+ <>
+ One more thing
+
+ >
+ )
+}
diff --git a/packages/react/components/Spinner/index.mjs b/packages/react/components/Spinner/index.mjs
new file mode 100644
index 00000000000..bab761f3d2e
--- /dev/null
+++ b/packages/react/components/Spinner/index.mjs
@@ -0,0 +1,27 @@
+import React from 'react'
+
+/*
+ * A simple spinner
+ */
+export const Spinner = ({ className = 'tw-h-6 tw-w-6' }) => (
+
+
+
+
+)
diff --git a/packages/react/components/Stats/index.mjs b/packages/react/components/Stats/index.mjs
new file mode 100644
index 00000000000..25a2577f060
--- /dev/null
+++ b/packages/react/components/Stats/index.mjs
@@ -0,0 +1,165 @@
+// Dependencies
+import { linkClasses, formatNumber, orderBy, clone } from '@freesewing/utils'
+// Hooks
+import React, { useState, useEffect } from 'react'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+// Components
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { Link as WebLink } from '@freesewing/react/components/Link'
+import { ChartWrapper } from '@freesewing/react/components/Echart'
+
+const meta = {
+ title: 'FreeSewing by numbers',
+ description: 'Some high-level numbers about Freesewing',
+}
+
+const option = {
+ tooltip: {
+ trigger: 'axis',
+ show: true,
+ axisPointer: {
+ type: 'line',
+ lineStyle: {
+ type: 'dashed',
+ },
+ },
+ },
+ title: {
+ left: 'center',
+ },
+ grid: {
+ left: '40',
+ right: '60',
+ containLabel: true,
+ },
+ toolbox: {
+ feature: {
+ saveAsImage: {},
+ magicType: {
+ type: ['line', 'bar'],
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ },
+}
+
+export const Stats = ({ Link = false }) => {
+ if (!Link) Link = WebLink
+ const [stats, setStats] = useState()
+ const [error, setError] = useState(false)
+ const backend = useBackend()
+
+ useEffect(() => {
+ getStats(backend, setStats, setError)
+ }, [])
+
+ if (!stats)
+ return (
+
+
+
+ )
+
+ const designTop = orderBy(
+ Object.entries(stats.designs).map(([design, count]) => ({ design, count })),
+ 'count',
+ 'desc'
+ ).slice(0, 50)
+
+ const optionD = clone(option)
+ optionD.title.text = 'Top 50 FreeSewing Designs'
+ optionD.xAxis = {
+ type: 'category',
+ data: designTop.map((entry) => entry.design),
+ name: 'Design',
+ }
+ optionD.series = [
+ {
+ data: designTop.map((entry) => entry.count),
+ type: 'bar',
+ },
+ ]
+
+ const optionU = clone(option)
+ optionU.title.text = 'Top 25 FreeSewing Users'
+ optionU.xAxis = {
+ type: 'category',
+ data: stats.topUsers.map((user) => user.username),
+ name: 'User',
+ }
+ optionU.series = [
+ {
+ data: stats.topUsers.map((user) => user.calls),
+ type: 'bar',
+ },
+ ]
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
Top Users
+
+
+ Note: Ordered by JWT calls made to the FreeSewing backend
+
+
+
+ {stats.topUsers.map((u) => (
+
+
+ {u.username}
+
+ : {formatNumber(u.calls)}
+
+ ))}
+
+
+
Top Designs
+
+
+ Note: Ordered by patterns stored in the FreeSewing backend
+
+
+
+ {Object.entries(stats.designs).map(([d, c]) => (
+
+
+ {d}
+
+ : {formatNumber(c)}
+
+ ))}
+
+
+
+ >
+ )
+}
+
+const Stat = ({ title, value, desc = 'Total Number Stored' }) => (
+
+
+
{title}
+
{formatNumber(value)}
+
{desc}
+
+
+)
+
+const getStats = async (backend, setStats, setError) => {
+ const result = await backend.getStats()
+ if (result[0] === 200 && result[1]) setStats(result[1])
+ else setError(true)
+}
diff --git a/packages/react/components/Tab/index.mjs b/packages/react/components/Tab/index.mjs
new file mode 100644
index 00000000000..9f474df9509
--- /dev/null
+++ b/packages/react/components/Tab/index.mjs
@@ -0,0 +1,81 @@
+import React, { useState, useContext } from 'react'
+import { ModalContext } from '@freesewing/react/context/Modal'
+import { ModalWrapper } from '@freesewing/react/components/Modal'
+import { KioskIcon } from '@freesewing/react/components/Icon'
+
+/**
+ * FreeSewing Tabs component, typically used for dev examples
+ *
+ * @param {string} tabs - The list of tabs
+ * @param {number} active - The nr of the active tab
+ * @param {array} children - Content to render within the tabs
+ * @param {bool} withModal - Set to true to load tab content in a modal window when kiosk icon is clicked
+ */
+export const Tabs = ({ tabs = '', active = 0, children, withModal = false }) => {
+ const { setModal } = useContext(ModalContext)
+
+ // Keep active tab in state
+ const [activeTab, setActiveTab] = useState(active)
+
+ /*
+ * Parse tab list
+ * Comma-seperated tabs passed as a string are how it works in MDX
+ */
+ const tablist = Array.isArray(tabs) ? tabs : tabs.split(',').map((tab) => tab.trim())
+
+ if (!tablist) return null
+
+ // Pass down activeTab and tabId for conditional rendering
+ const childrenWithTabSetter = children.map((child, tabId) =>
+ React.cloneElement(child, { activeTab, tabId, key: tabId })
+ )
+
+ return (
+
+
+ {tablist.map((title, tabId) => {
+ const btnClasses = `tw-text-lg tw-font-bold tw-capitalize tw-daisy-tab tw-h-auto tw-daisy-tabs-bordered tw-grow tw-py-1 ${
+ activeTab === tabId ? 'tw-daisy-tab-active' : ''
+ } tw-border-b-2 tw-border-solid tw-border-x-0 tw-border-t-0 tw-bg-transparent`
+
+ return withModal && activeTab === tabId ? (
+
+ setModal(
+
+ {childrenWithTabSetter}
+
+ )
+ }
+ >
+ {title}
+
+
+ ) : (
+ setActiveTab(tabId)}>
+ {title}
+
+ )
+ })}
+
+
{childrenWithTabSetter}
+
+ )
+}
+
+/**
+ * FreeSewing Tab component, use it together with Tabs
+ *
+ * @param {number} tabId - The ID of this tab
+ * @param {number} activeTab - The ID of the active tab
+ * @param {array} children - Content to render within the tab
+ */
+export const Tab = ({ children, tabId, activeTab }) => (activeTab === tabId ? children : null)
diff --git a/packages/react/components/Table/index.mjs b/packages/react/components/Table/index.mjs
new file mode 100644
index 00000000000..71ad2e81371
--- /dev/null
+++ b/packages/react/components/Table/index.mjs
@@ -0,0 +1,9 @@
+import React from 'react'
+
+/*
+ * Tables on mobile will almost always break the layout
+ * unless we set the overflow behaviour explicitly
+ */
+export const TableWrapper = ({ children }) => (
+ {children}
+)
diff --git a/packages/react/components/Time/index.mjs b/packages/react/components/Time/index.mjs
new file mode 100644
index 00000000000..51d23f8c5b9
--- /dev/null
+++ b/packages/react/components/Time/index.mjs
@@ -0,0 +1,58 @@
+import React from 'react'
+import { DateTime, Interval } from 'luxon'
+
+const day = 86400000
+const hour = 3600000
+const minute = 60000
+const second = 1000
+
+export const DateAndTime = ({ iso }) => {
+ const dt = DateTime.fromISO(iso)
+ return dt.toLocaleString(DateTime.DATETIME_MED)
+}
+
+export const TimeForHumans = ({ iso, future = false }) => {
+ const suffix = future ? 'from now' : 'ago'
+ const dates = [DateTime.fromISO(iso), DateTime.now()]
+ if (future) dates.reverse()
+ const i = Interval.fromDateTimes(...dates)
+ .toDuration(['minutes', 'hours', 'days', 'months', 'years'])
+ .toObject()
+ const years = Math.floor(i.years)
+ const months = Math.floor(i.months)
+ const days = Math.floor(i.days)
+ const hours = Math.floor(i.hours)
+ const minutes = Math.floor(i.minutes)
+ if (years < 1 && months < 1 && days < 1 && hours < 1 && minutes < 1) return `seconds ${suffix}`
+ else if (years < 1 && months < 1 && days < 1 && hours < 1)
+ return minutes < 2 ? `one minute ${suffix}` : `${minutes} minutes ${suffix}`
+ else if (i.years < 1 && i.months < 1 && i.days < 1)
+ return hours < 2 ? `${hours * 60 + minutes} minutes ${suffix}` : `${hours} hours ${suffix}`
+ else if (years < 1 && months < 1)
+ return days < 2 ? `${days * 24 + hours} hours ${suffix}` : `${days} days ${suffix}`
+ else if (years < 1)
+ return months < 4 ? `${months} months and ${days} days ${suffix}` : `${months} months ${suffix}`
+ if (years < 3) return `${years * 12 + i.months} months ${suffix}`
+ return `${years} years ${suffix}`
+}
+
+export const TimeAgo = (props) =>
+export const TimeToGo = (props) =>
+
+export const TimeAgoBrief = ({ time }) => {
+ const d = Math.floor(Date.now() - time)
+ if (d > day) return `${Math.floor(d / day)}d ago`
+ if (d > hour) return `${Math.floor(d / hour)}h ago`
+ if (d > minute * 2) return `${Math.floor(d / minute)}m ago`
+ if (d > second) return `${Math.floor(d / second)}s ago`
+ return `${d}ms ago`
+}
+
+export const TimeToGoBrief = ({ time }) => {
+ const d = Math.floor(time * 1000 - Date.now())
+ if (d > day) return `${Math.floor(d / day)}d`
+ if (d > hour) return `${Math.floor(d / hour)}h`
+ if (d > minute * 2) return `${Math.floor(d / minute)}m`
+ if (d > second) return `${Math.floor(d / second)}s`
+ return `${d}s`
+}
diff --git a/packages/react/components/Uuid/index.mjs b/packages/react/components/Uuid/index.mjs
new file mode 100644
index 00000000000..fbdbdc6b54a
--- /dev/null
+++ b/packages/react/components/Uuid/index.mjs
@@ -0,0 +1,34 @@
+import React, { useState } from 'react'
+import { shortUuid } from '@freesewing/utils'
+import { Link } from '@freesewing/react/components/Link'
+import { CopyToClipboardButton } from '@freesewing/react/components/CopyToClipboardButton'
+
+/*
+ * Displays a UUID, but shorter
+ *
+ * @param {object} props - All React props
+ * @param {string} uuid - The UUID
+ * @param {string} href - An optional href to make this UUID a link
+ * @param {string} label - An optional label to show in the loading status
+ */
+export const Uuid = ({ uuid, href = false, label = false }) => {
+ const [full, setFull] = useState()
+ const short = shortUuid(uuid)
+
+ if (href === false)
+ return (
+
+ {shortUuid(uuid)}
+
+
+ )
+
+ return (
+
+
+ {shortUuid(uuid)}
+
+
+
+ )
+}
diff --git a/packages/react/components/Ux/index.mjs b/packages/react/components/Ux/index.mjs
new file mode 100644
index 00000000000..b68a13f56e8
--- /dev/null
+++ b/packages/react/components/Ux/index.mjs
@@ -0,0 +1,21 @@
+import React from 'react'
+import { CircleIcon } from '@freesewing/react/components/Icon'
+
+export const Ux = ({ ux = 0 }) => (
+
+ {[0, 1, 2, 3, 4].map((i) => (
+
+ ))}
+
+)
+
+export const UxMini = ({ ux = 0 }) => (
+
+
+
+)
diff --git a/packages/react/components/Xray/index.mjs b/packages/react/components/Xray/index.mjs
new file mode 100644
index 00000000000..ecf28f555e9
--- /dev/null
+++ b/packages/react/components/Xray/index.mjs
@@ -0,0 +1,67 @@
+import React, { forwardRef } from 'react'
+import { defaultComponents as patternComponents } from '@freesewing/react/components/Pattern'
+import { PointXray } from './point.mjs'
+import { PathXray } from './path.mjs'
+
+/*
+ * Allow people to override these components
+ */
+const defaultComponents = {
+ Point: PointXray,
+ Path: PathXray,
+}
+
+export const Xray = forwardRef((props, ref) => {
+ if (!props.renderProps) return null
+
+ // desctructure props
+ const {
+ renderProps = false,
+ t = (string) => string,
+ children = false,
+ className = 'freesewing pattern',
+ components = {},
+ drillProps = {},
+ } = props
+
+ // Merge pattern, default, and custom components
+ const mergedComponents = {
+ ...patternComponents,
+ ...defaultComponents,
+ ...components,
+ }
+
+ const { Svg, Defs, Stack, Group } = mergedComponents
+ const optionalProps = {}
+ if (className) optionalProps.className = className
+
+ return (
+
+
+
+
+ {children
+ ? children
+ : Object.keys(renderProps.stacks).map((stackName) => (
+
+ ))}
+
+
+ )
+})
diff --git a/packages/react/components/Xray/path.mjs b/packages/react/components/Xray/path.mjs
new file mode 100644
index 00000000000..07fce678e63
--- /dev/null
+++ b/packages/react/components/Xray/path.mjs
@@ -0,0 +1,226 @@
+import React, { useState } from 'react'
+import {
+ getProps,
+ defaultComponents as patternComponents,
+} from '@freesewing/react/components/Pattern'
+import { H5, H6 } from '@freesewing/react/components/Heading'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+import { Highlight } from '@freesewing/react/components/Highlight'
+import { round, pathLength } from '@freesewing/utils'
+
+const coords = (point) => `${point.x},${point.y}`
+
+const Cp = ({ at }) => (
+
+)
+
+export const PathXray = ({
+ stackName,
+ pathName,
+ part,
+ path,
+ settings,
+ components,
+ t,
+ drillProps = {},
+}) => {
+ /*
+ * We use the Path component from Pattern here
+ * If we would extract Path from the components passed down,
+ * we'd create a recursion loop as the Path we call below
+ * would be this very PathXray component.
+ */
+ const { Path } = patternComponents
+ const { info = {} } = drillProps
+
+ const output = []
+ let prev
+ let i = 0
+ for (const op of path.ops) {
+ if (op.type === 'curve') {
+ output.push(
+ ,
+ ,
+
+ )
+ }
+ prev = op
+ i++
+ }
+ output.push(
+ ,
+
+ info?.set ? info.set( ) : null
+ }
+ >
+
+
+ )
+
+ return (
+
+ {output}
+
+
+ )
+}
+
+const PathXrayInfo = ({ path, pathName, stackName, part }) => {
+ const [rounded, setRounded] = useState(true)
+ const log = (val) => console.log(val)
+ const rounder = rounded ? round : (val) => val
+
+ return (
+
+
+ Path {pathName}
of {stackName}
+
+ {Object.keys(path.attributes.list).length > 0 ? (
+ <>
+
Attributes
+
+ {Object.entries(path.attributes.list).map(([k, val]) => (
+
+ ))}
+
+
+ >
+ ) : null}
+
Dimensions
+
+
+
+ Type
+
+ Coordinates
+ setRounded(!rounded)}
+ >
+ {rounded ? 'Show raw' : 'Show rounded'}
+
+
+
+
+
+
+ TopLeft
+
+
+
+
+
+
+ BottomRight
+
+
+
+
+
+
+ Width
+
+
+
+
+
+ Height
+
+
+
+
+
+ Path Length
+
+
+
+
+
+
+
Drawing operations
+
+
+
+ Type
+
+ Coordinates
+ setRounded(!rounded)}
+ >
+ {rounded ? 'Show raw' : 'Show rounded'}
+
+
+
+
+
+ {path.ops.map((op, i) => (
+
+ {op.type}
+ {['move', 'line'].includes(op.type) ? (
+
+ To:
+
+
+
+ ) : null}
+ {op.type === 'close' ? : null}
+ {op.type === 'curve' ? (
+
+
+ Cp1:
+
+
+
+
+ Cp2:
+
+
+
+
+ To:
+
+
+
+
+ ) : null}
+
+ ))}
+
+
+
Pathstring
+
{path.d}
+
+ )
+}
diff --git a/packages/react/components/Xray/point.mjs b/packages/react/components/Xray/point.mjs
new file mode 100644
index 00000000000..a711702a1c2
--- /dev/null
+++ b/packages/react/components/Xray/point.mjs
@@ -0,0 +1,108 @@
+import React, { useState } from 'react'
+import {
+ withinPartBounds,
+ defaultComponents as patternComponents,
+} from '@freesewing/react/components/Pattern'
+import { H5, H6 } from '@freesewing/react/components/Heading'
+import { KeyVal } from '@freesewing/react/components/KeyVal'
+import { round } from '@freesewing/utils'
+
+export const PointXray = ({
+ stackName,
+ pointName,
+ part,
+ point,
+ settings,
+ components,
+ t,
+ drillProps = {},
+}) => {
+ // Don't include parts outside the part bounding box
+ if (!withinPartBounds(point, part)) return null
+
+ const { info = {} } = drillProps
+
+ /*
+ * We use the Point component from Pattern here
+ * If we would extract Point from the components passed down,
+ * we'd create a recursion loop as the Point we call below
+ * would be this very PointXray component.
+ */
+ const { Point } = patternComponents
+
+ return (
+ <>
+
+
+
+
+ info?.set
+ ? info.set( )
+ : null
+ }
+ >
+
+ {pointName}
+
+ {round(point.x)},{round(point.y)}
+
+
+
+ >
+ )
+}
+
+const PointXrayInfo = ({ point, pointName, stackName, part }) => {
+ const [rounded, setRounded] = useState(true)
+ const rounder = rounded ? round : (val) => val
+
+ return (
+
+
+ Point {pointName}
of {stackName}
+
+
+
+ Coordinates
+ setRounded(!rounded)}
+ >
+ {rounded ? 'Show raw' : 'Show rounded'}
+
+
+
+
+
+
+
+ {Object.keys(point.attributes.list).length > 0 ? (
+ <>
+
Attributes
+
+ {Object.entries(point.attributes.list).map(([k, val]) => (
+
+ ))}
+
+ >
+ ) : null}
+
+ )
+}
diff --git a/packages/react/components/Yaml/index.mjs b/packages/react/components/Yaml/index.mjs
new file mode 100644
index 00000000000..538bb48b740
--- /dev/null
+++ b/packages/react/components/Yaml/index.mjs
@@ -0,0 +1,20 @@
+import React from 'react'
+import { Highlight } from '@freesewing/react/components/Highlight'
+import hljs from 'highlight.js/lib/common'
+import yaml from 'js-yaml'
+
+export const Yaml = (props) => {
+ let code
+ if (props.json) code = yaml.dump(JSON.parse(props.json))
+ else if (props.js) code = yaml.dump(props.js)
+ else code = props.children
+
+ return (
+
+ )
+}
diff --git a/packages/react/config/freesewing/index.mjs b/packages/react/config/freesewing/index.mjs
new file mode 100644
index 00000000000..a92701f65d0
--- /dev/null
+++ b/packages/react/config/freesewing/index.mjs
@@ -0,0 +1,167 @@
+/*
+ * This configuration file has the following named exports:
+ *
+ * account: Fields and control levels, and other account related settings
+ * backend: URL of the FreeSewing backend
+ * editor: Configuration for the pattern editor
+ * monorepo: URL of the FreeSewing monorepo
+ * social : Social media and other account links for FreeSewing
+ * controlLevels: Consolidated object holding all control levels
+ */
+
+/*
+ * Structure of the various account fields and their control levels
+ */
+export const account = {
+ fields: {
+ data: {
+ bookmarks: 2,
+ sets: 1,
+ patterns: 1,
+ apikeys: 4,
+ },
+ info: {
+ username: 2,
+ bio: 2,
+ img: 2,
+ email: 3,
+ },
+ settings: {
+ language: 2,
+ units: 2,
+ newsletter: 2,
+ compare: 3,
+ control: 1,
+ consent: 2,
+ },
+ security: {
+ password: 2,
+ mfa: 3,
+ apikeys: 4,
+ },
+ identities: {
+ github: 3,
+ instagram: 3,
+ mastodon: 3,
+ reddit: 3,
+ twitch: 3,
+ tiktok: 3,
+ website: 3,
+ },
+ },
+ sets: {
+ name: 1,
+ img: 1,
+ public: 3,
+ units: 1,
+ notes: 2,
+ createdAt: 2,
+ updatedAt: 2,
+ id: 4,
+ },
+ patterns: {
+ name: 1,
+ img: 1,
+ public: 3,
+ notes: 2,
+ createdAt: 2,
+ updatedAt: 2,
+ id: 4,
+ },
+ statuses: {
+ 0: {
+ name: 'inactive',
+ color: 'neutral',
+ },
+ 1: {
+ name: 'active',
+ color: 'success',
+ },
+ '-1': {
+ name: 'paused',
+ color: 'warning',
+ },
+ '-2': {
+ name: 'disabled',
+ color: 'error',
+ },
+ },
+}
+
+/*
+ * URL of the FreeSewing backend
+ */
+export const backend = 'https://backend3.freesewing.org'
+
+/*
+ * The default control level in case we have nothing more specific
+ */
+export const defaultControlLevel = 3
+
+/*
+ * Editor control levels
+ */
+export const editor = {
+ core: {
+ sa: 2,
+ paperless: 2,
+ locale: 3,
+ units: 1,
+ complete: 4,
+ expand: 4,
+ only: 4,
+ scale: 4,
+ margin: 4,
+ },
+ ui: {
+ renderer: 4,
+ kiosk: 2,
+ },
+ views: {
+ draft: 1,
+ measies: 1,
+ test: 3,
+ time: 3,
+ print: 1,
+ export: 1,
+ save: 1,
+ edit: 4,
+ logs: 2,
+ inspect: 4,
+ docs: 1,
+ },
+}
+
+/*
+ * URL of the FreeSewing monorepo
+ */
+export const monorepo = 'https://github.com/freesewing/freesewing'
+
+/*
+ * Social media and other account links for FreeSewing
+ */
+export const social = {
+ YouTube: 'https://www.youtube.com/@freesewing',
+ Discord: 'https://discord.freesewing.org/',
+ Instagram: 'https://instagram.com/freesewing_org',
+ Facebook: 'https://www.facebook.com/groups/627769821272714/',
+ GitHub: 'https://github.com/freesewing',
+ Reddit: 'https://www.reddit.com/r/freesewing/',
+ Mastodon: 'https://freesewing.social/@freesewing',
+ Bluesky: 'https://bsky.app/profile/freesewing.org',
+}
+
+/*
+ * Consolidated object holding all control levels
+ */
+export const controlLevels = {
+ ...account.fields.data,
+ ...account.fields.info,
+ ...account.fields.settings,
+ ...account.fields.security,
+ ...account.fields.identities,
+ sets: account.sets,
+ core: editor.core,
+ ui: editor.ui,
+ views: editor.views,
+}
diff --git a/packages/react/context/LoadingStatus/index.mjs b/packages/react/context/LoadingStatus/index.mjs
new file mode 100644
index 00000000000..a0e94c76f7c
--- /dev/null
+++ b/packages/react/context/LoadingStatus/index.mjs
@@ -0,0 +1,122 @@
+import React, { useState, useEffect, createContext } from 'react'
+import { Spinner } from '@freesewing/react/components/Spinner'
+import { OkIcon, WarningIcon } from '@freesewing/react/components/Icon'
+
+/*
+ * The actual context
+ */
+export const LoadingStatusContext = createContext([false])
+
+/*
+ * Timeout in seconds before the loading status dissapears
+ */
+const timeout = 2
+
+/*
+ * The React component displaying the loading status
+ */
+const LoadingStatus = ({ loadingStatus }) => {
+ const [fade, setFade] = useState('tw-opacity-100')
+ const [timer, setTimer] = useState(false)
+
+ useEffect(() => {
+ if (loadingStatus[2]) {
+ if (timer) clearTimeout(timer)
+ setTimer(
+ window.setTimeout(
+ () => {
+ setFade('opacity-0')
+ },
+ timeout * 1000 - 350
+ )
+ )
+ }
+ }, [loadingStatus[2]])
+
+ if (!loadingStatus[0]) return null
+
+ let color = 'secondary'
+ let icon =
+ if (loadingStatus[2]) {
+ color = loadingStatus[3] ? 'success' : 'error'
+ icon = loadingStatus[3] ? (
+
+ ) : (
+
+ )
+ }
+
+ return (
+
+
+ {icon}
+ {loadingStatus[1]}
+
+
+ )
+}
+
+/*
+ * An animated loading state
+ */
+const LoadingProgress = ({ val = 0, max = 1, msg }) => (
+
+)
+
+/*
+ * The Context provider
+ */
+export const LoadingStatusContextProvider = ({ children }) => {
+ /*
+ * LoadingStatus should hold an array with 1 to 4 elements:
+ * 0 => Show loading status or not (true or false)
+ * 1 => Message to show
+ * 2 => Set this to true to make the loadingStatus dissapear after 2 seconds
+ * 3 => Set this to true to show success, false to show error (only when 2 is true)
+ */
+ const [timer, setTimer] = useState(false)
+
+ const [__loadingStatus, __setLoadingStatus] = useState({
+ status: [false],
+ setLoadingStatus,
+ loading: false,
+ LoadingStatus: () => ,
+ LoadingProgress,
+ })
+
+ useEffect(() => {
+ if (__loadingStatus.status[2]) {
+ if (timer) clearTimeout(timer)
+ setTimer(
+ window.setTimeout(() => {
+ setLoadingStatus([false])
+ }, timeout * 1000)
+ )
+ }
+ }, [__loadingStatus.status[2]])
+
+ function setLoadingStatus(newStatus) {
+ __setLoadingStatus({
+ ...__loadingStatus,
+ status: newStatus,
+ loading: newStatus[0] || false,
+ LoadingStatus: () => ,
+ })
+ }
+
+ return (
+
+ {children}
+
+ )
+}
diff --git a/packages/react/context/Modal/index.mjs b/packages/react/context/Modal/index.mjs
new file mode 100644
index 00000000000..e1fbb45e3b8
--- /dev/null
+++ b/packages/react/context/Modal/index.mjs
@@ -0,0 +1,33 @@
+import React, { createContext, useState } from 'react'
+
+/*
+ * The actual context
+ */
+export const ModalContext = createContext(null)
+
+/*
+ * The context provider
+ */
+export const ModalContextProvider = ({ children }) => {
+ function clearModal() {
+ __setModal({
+ ...__modal,
+ modalContent: null,
+ })
+ }
+
+ function setModal(content) {
+ __setModal({
+ ...__modal,
+ modalContent: content,
+ })
+ }
+
+ const [__modal, __setModal] = useState({
+ setModal,
+ clearModal,
+ modalContent: null,
+ })
+
+ return {children}
+}
diff --git a/packages/react/hooks/useAccount/index.mjs b/packages/react/hooks/useAccount/index.mjs
new file mode 100644
index 00000000000..ecfb6fa1b6d
--- /dev/null
+++ b/packages/react/hooks/useAccount/index.mjs
@@ -0,0 +1,103 @@
+import useLocalStorageState from 'use-local-storage-state'
+import { control as defaultControlLevel } from '@freesewing/config'
+
+/*
+ * When there is no account, we use this making it easy to check for username
+ * or control
+ */
+const noAccount = { username: false, control: defaultControlLevel }
+
+/*
+ * FreeSewing's useAccount hook. Grants access to the (data in the) user's account
+ */
+export function useAccount() {
+ /*
+ * Account is stored in persisted state (saved to local storage)
+ */
+ const [account, setAccount] = useLocalStorageState('fs-account', { defaultValue: noAccount })
+
+ /*
+ * Admins are allowed to inpersonate a user.
+ * When that happens, we store the admin's account in this admin field (saved in local storage).
+ * When the admin ends the impersonation, we copy the account data under the admin key back into
+ * the regular account key.
+ * With this, admins would have to re-login after impersonating a user.
+ */
+ const [admin, setAdmin] = useLocalStorageState('fs-admin', { defaultValue: noAccount })
+
+ /*
+ * This holds the JSON Web Token (JWT) returned from the backend after authentication
+ */
+ const [token, setToken] = useLocalStorageState('fs-token', { defaultValue: null })
+
+ /*
+ * We use this to allow 'welcome back' style UI, asking for password, not username
+ */
+ const [seenUser, setSeenUser] = useLocalStorageState('fs-seen-user', { defaultValue: false })
+
+ /*
+ * Clear user data when signing out
+ */
+ const signOut = () => {
+ console.log('SIGN OUT')
+ setAccount(noAccount)
+ setToken(null)
+ }
+
+ /*
+ * Impersonate a user.
+ * Only admins can do this but that is enforced at the backend.
+ */
+ const impersonate = (data) => {
+ /*
+ * Store token and account data in admin, so we can restore them later
+ */
+ setAdmin({ token, account })
+
+ /*
+ * Create new account object based on the data passed in
+ */
+ const newAccount = {
+ ...data.account,
+ impersonatingAdmin: { id: account.id, username: account.username },
+ }
+
+ /*
+ * Now set the new account and token
+ */
+ setAccount(newAccount)
+ setToken(data.token)
+ }
+
+ /*
+ * When impersonation ends, restore the original admin account
+ */
+ const stopImpersonating = () => {
+ setAccount(admin.account)
+ setToken(admin.token)
+ clearAdmin()
+ }
+
+ /*
+ * Don't keep account data lingering in the admin key
+ */
+ const clearAdmin = () => setAdmin(noAccount)
+
+ /*
+ * Return everything this hook provides
+ */
+ return {
+ account,
+ setAccount,
+ token,
+ setToken,
+ seenUser,
+ setSeenUser,
+ signOut,
+ admin,
+ clearAdmin,
+ impersonate,
+ stopImpersonating,
+ control: account?.control || 2,
+ }
+}
diff --git a/packages/react/hooks/useBackend/index.mjs b/packages/react/hooks/useBackend/index.mjs
new file mode 100644
index 00000000000..6882e0b76df
--- /dev/null
+++ b/packages/react/hooks/useBackend/index.mjs
@@ -0,0 +1,830 @@
+import { useMemo } from 'react'
+import { urls } from '@freesewing/config'
+import { RestClient } from '@freesewing/react/lib/RestClient'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+
+/*
+ * Get backend URL from config
+ */
+const { backend } = urls
+
+/**
+ * The useBackend hook
+ *
+ * This hook provides access to the FreeSewing backend
+ */
+export function useBackend() {
+ /*
+ * Load the token via the useAccount hook
+ */
+ const { token } = useAccount()
+
+ /*
+ * Memoize this call for efficiency
+ */
+ const backend = useMemo(() => new Backend(token), [token])
+
+ /*
+ * This backend object rovides the following methods:
+ *
+ * - backend.adminSearchUsers
+ * - backend.adminLoadUser
+ * - backend.adminUpdateUser
+ * - backend.adminImpersonateUser
+ * - backend.adminLoadSubscribers
+ * - backend.adminPing
+ * - backend.acceptCset
+ * - backend.confirmMfa
+ * - backend.confirmSignup
+ * - backend.createApikey
+ * - backend.createBookmark
+ * - backend.createSocialImage
+ * - backend.createDiscussion
+ * - backend.createIssue
+ * - backend.createPattern
+ * - backend.createPostPr
+ * - backend.createSet
+ * - backend.disableMfa
+ * - backend.enableMfa
+ * - backend.exportAccount
+ * - backend.getApikey
+ * - backend.getApikeys
+ * - backend.getBookmark
+ * - backend.getBookmarks
+ * - backend.getConfirmation
+ * - backend.getCuratedSet
+ * - backend.getCuratedSets
+ * - backend.getPattern
+ * - backend.getPatterns
+ * - backend.getPublicPattern
+ * - backend.getPublicSet
+ * - backend.getSet
+ * - backend.getSets
+ * - backend.getStats
+ * - backend.getSuggestedPacks
+ * - backend.getSuggestedSets
+ * - backend.getUserCount
+ * - backend.getUserData
+ * - backend.getUserProfile
+ * - backend.isPostSlugAvailable
+ * - backend.isUsernameAvailable
+ * - backend.newsletterConfirmSubscribe
+ * - backend.newsletterSubscribe
+ * - backend.newsletterUnsubscribe
+ * - backend.oauthInit
+ * - backend.oauthSignIn
+ * - backend.ping
+ * - backend.reloadAccount
+ * - backend.removeAccount
+ * - backend.removeApikey
+ * - backend.removeBookmark
+ * - backend.removeCuratedSet
+ * - backend.removeImage
+ * - backend.removePattern
+ * - backend.removeSet
+ * - backend.removeSuggestedSet
+ * - backend.restrictAccount
+ * - backend.signIn
+ * - backend.signInFromLink
+ * - backend.signUp
+ * - backend.suggestCset
+ * - backend.suggestOpack
+ * - backend.updateAccount
+ * - backend.updateCuratedSet
+ * - backend.updateConsent
+ * - backend.updatePattern
+ * - backend.updateSet
+ * - backend.uploadImage
+ * - backend.uploadImageAnon
+ */
+ return backend
+}
+
+/**
+ * This helper function creates the authentication headers
+ *
+ * @param {string} token - The JSON Web Token to authenticate to the backend
+ * @return {object} headers - An object holding headers for the REST API call
+ */
+function authenticationHeaders(token) {
+ return token ? { Authorization: 'Bearer ' + token } : {}
+}
+
+/**
+ * This creates a backend instance and stores the authentication data
+ *
+ * @param {string} token - The JWT token to use for authentication to the backend
+ */
+function Backend(token) {
+ this.token = token
+ this.headers = authenticationHeaders(token)
+ this.restClient = new RestClient(backend, this.headers)
+ this.delete = this.restClient.delete
+ this.get = this.restClient.get
+ this.patch = this.restClient.patch
+ this.put = this.restClient.put
+ this.post = this.restClient.post
+}
+
+/**
+ * Admin: Search user
+ *
+ * @param {string} q - The search query
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.adminSearchUsers = async function (q) {
+ return await this.post('/admin/search/users/jwt', { q })
+}
+
+/*
+ * Admin: Load user
+ *
+ * @param {number} id - The user ID to load
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.adminLoadUser = async function (id) {
+ return await this.get(`/admin/user/${id}/jwt`)
+}
+
+/**
+ * Admin: Update user
+ *
+ * @param {object} data
+ * @param {number} data.id - The user ID to update
+ * @param {object} data.data - The data for the API request
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.adminUpdateUser = async function ({ id, data }) {
+ return await this.patch(`/admin/user/${id}/jwt`, data)
+}
+
+/**
+ * Admin: Impersonate user
+ *
+ * @param {number} id - The user ID to impersonate
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.adminImpersonateUser = async function (id) {
+ return await this.get(`/admin/impersonate/${id}/jwt`)
+}
+
+/*
+ * Load newsletter subscribers (admin method)
+ */
+Backend.prototype.adminLoadSubscribers = async function () {
+ return await this.get(`/admin/subscribers/jwt`)
+}
+
+/*
+ * Verify an admin account while impersonating another user
+ */
+Backend.prototype.adminPing = async function (token) {
+ console.log('admin ping called', token)
+ return await this.get(`/whoami/jwt`, { Authorization: `Bearer: ${token}` })
+}
+/*
+ * Create a curated set from a suggested measurements set
+ */
+Backend.prototype.acceptCset = async function (id) {
+ return await this.post(`/curated-sets/from/${id}/jwt`)
+}
+
+/*
+ * Confirm MFA
+ *
+ * @param {object} data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.confirmMfa = async function (data) {
+ return await this.post(`/account/mfa/jwt`, { ...data, mfa: true })
+}
+
+/*
+ * Confirm a signup
+ *
+ * @param {object} data
+ * @param {string} data.id - The confirmation ID
+ * @param {string} data.consent - The consent data
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.confirmSignup = async function ({ id, consent }) {
+ return await this.post(`/confirm/signup/${id}`, { consent })
+}
+
+/**
+ * Create API key
+ *
+ * @param {object} data - The data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createApikey = async function (data) {
+ return await this.post(`/apikeys/jwt`, data)
+}
+
+/**
+ * Create bookmark
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createBookmark = async function (data) {
+ return await this.post(`/bookmarks/jwt`, data)
+}
+
+/**
+ * Generate a social media image
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createSocialImage = async function (data) {
+ return await this.post('/img', data)
+}
+
+/**
+ * Create GitHub discussion
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createDiscussion = async function (data) {
+ return await this.post(`/discussions`, data)
+}
+
+/**
+ * Create GitHub issue
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createIssue = async function (data) {
+ return await this.post(`/issues`, data)
+}
+
+/**
+ * Create pattern
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createPattern = async function (data) {
+ return await this.post(`/patterns/jwt`, data)
+}
+
+/**
+ * Create a pull request for a showcase or blog post
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createPostPr = async function (type, data) {
+ return await this.post(`/flows/pr/${type}/jwt`, data)
+}
+
+/**
+ * Create measurements set
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.createSet = async function (data) {
+ return await this.post(`/sets/jwt`, data)
+}
+
+/**
+ * Disable MFA for the current user
+ *
+ * @param {object} data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.disableMfa = async function (data) {
+ return await this.post(`/account/mfa/jwt`, { ...data, mfa: false })
+}
+
+/**
+ * Enable MFA for the current user
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.enableMfa = async function () {
+ return await this.post(`/account/mfa/jwt`, { mfa: true })
+}
+
+/**
+ * Export account data for the current user
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.exportAccount = async function () {
+ return await this.get(`/account/export/jwt`)
+}
+
+/**
+ * Get API key
+ *
+ * @param {string} id - The API Key ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getApikey = async function (id) {
+ return await this.get(`/apikeys/${id}/jwt`)
+}
+
+/**
+ * Get API keys for the current user
+ */
+Backend.prototype.getApikeys = async function () {
+ return await this.get(`/apikeys/jwt`)
+}
+
+/**
+ * Get bookmark
+ *
+ * @param {string} id - The bookmark ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getBookmark = async function (id) {
+ return await this.get(`/bookmarks/${id}/jwt`)
+}
+
+/**
+ * Get bookmarks (for the current user)
+ */
+Backend.prototype.getBookmarks = async function () {
+ return await this.get(`/bookmarks/jwt`)
+}
+
+/**
+ * Get data for a confirmation
+ *
+ * @param {object} data
+ * @param {string} data.id - The confirmation ID
+ * @param {string} data.check - The confirmation check value
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getConfirmation = async function ({ id, check }) {
+ return await this.get(`/confirmations/${id}/${check}`)
+}
+
+/**
+ * Get curated measurements set
+ *
+ * @param {number} id - The curated measurements set ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getCuratedSet = async function (id) {
+ return await this.get(`/curated-sets/${id}`)
+}
+
+/**
+ * Get curated measurements sets
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getCuratedSets = async function () {
+ return await this.get(`/curated-sets`)
+}
+
+/**
+ * Get pattern
+ *
+ * @param {number} id - The pattern ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getPattern = async function (id) {
+ return await this.get(`/patterns/${id}/jwt`)
+}
+
+/**
+ * Get patterns for the current user
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getPatterns = async function () {
+ return await this.get(`/patterns/jwt`)
+}
+
+/**
+ * Get public pattern
+ *
+ * @param {number} id - The pattern ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getPublicPattern = async function (id) {
+ return await this.get(`/patterns/${id}.json`)
+}
+
+/**
+ * Get public measurements set
+ *
+ * @param {number} id - The public measurements set ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getPublicSet = async function (id) {
+ return await this.get(`/sets/${id}.json`)
+}
+
+/**
+ * Get measurements set
+ *
+ * @param {number} id - The measurements set ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getSet = async function (id) {
+ return await this.get(`/sets/${id}/jwt`)
+}
+
+/*
+ * Get measurements sets for the current user
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getSets = async function () {
+ return await this.get(`/sets/jwt`)
+}
+
+/*
+ * Get stats (info about how many users, patterns, and so on)
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getStats = async function () {
+ return await this.get(`/info/stats`)
+}
+
+/*
+ * Get option packs suggested for curation
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getSuggestedPacks = async function () {
+ return await this.get(`/suggested-packs/jwt`)
+}
+
+/**
+ * Get measurements sets suggested for curation
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getSuggestedSets = async function () {
+ return await this.get(`/suggested-sets/jwt`)
+}
+
+/**
+ * Get user count (how many users FreeSewing has)
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getUserCount = async function () {
+ return await this.get(`/info/users`)
+}
+
+/**
+ * Get user data
+ *
+ * @param {number} uid - The user ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getUserData = async function (uid) {
+ return await this.get(`/users/${uid}/jwt`)
+}
+
+/**
+ * Get user profile
+ *
+ * @param {number} uid - The user ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.getUserProfile = async function (uid) {
+ return await this.get(`/users/${uid}`)
+}
+
+/*
+ * Check whether a slug for a blog or showcase post is available
+ *
+ * @param {object} data
+ * @param {string} data.slug - The slug to check
+ * @param {string} data.type - One of 'blog' or 'showcase'
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.isPostSlugAvailable = async function ({ slug, type }) {
+ const response = await this.get(`/slugs/${type}/${slug}/jwt`, this.auth)
+
+ // 404 means username is available, which is success in this case
+ return response[0] === 404
+ ? { success: true, data: false, available: true, response }
+ : { success: false, available: false, response }
+}
+
+/**
+ * Checks whether a username is available
+ *
+ * @param {string} username - The username to check
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.isUsernameAvailable = async function (username) {
+ const response = await this.post(`/available/username/jwt`, { username })
+
+ /*
+ * Status 404 means username is available, which is success in this case
+ */
+ return response[0] === 404
+ ? { success: true, data: false, available: true, response }
+ : { success: false, available: false, response }
+}
+
+/**
+/*
+ * Confirm newsletter subscribe
+ *
+ * @param {object} data
+ * @param {string} data.id - The confirmation ID
+ * @param {string} data.ehash - The ehash value
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.newsletterConfirmSubscribe = async function ({ id, ehash }) {
+ return await this.put('/subscriber', { id, ehash })
+}
+
+/**
+ * Subscribe to newsletter
+ *
+ * @param {string} email - The email to subscribe
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.newsletterSubscribe = async function (email) {
+ return await this.post('/subscriber', { email, language: 'en' })
+}
+
+/*
+ * Newsletter unsubscribe
+ *
+ * @param {string} ehash - The ehash to unsubscribe
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.newsletterUnsubscribe = async function (ehash) {
+ return await this.delete(`/subscriber/${ehash}`)
+}
+
+/*
+ * Newsletter start unsubscribe flow
+ *
+ * @param {string} ehash - The email address for which to start the unsubscribe flow
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.newsletterStartUnsubscribe = async function (email) {
+ return await this.post(`/subscriber/remove`, { email })
+}
+
+/*
+ * Init Oauth flow for oauth provider
+ *
+ * @param {object} data
+ * @param {string} data.provider - ID of the OAuth provider
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.oauthInit = async function (provider) {
+ return await this.post('/signin/oauth/init', { provider })
+}
+
+/*
+ * User sign in via oauth provider
+ *
+ * @param {object} data
+ * @param {string} data.state - The Oath state
+ * @param {code} data.code - The OAuth code
+ * @param {string} data.provider - ID of the OAuth provider
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.oauthSignIn = async function ({ state, code, provider }) {
+ return await this.post('/signin/oauth', { state, code, provider })
+}
+
+/**
+ * Ping backend to see if current token is still valid
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.ping = async function () {
+ console.log('ping called')
+ return await this.get(`/whoami/jwt`)
+}
+
+/**
+ * Reload account - Useful for when local state gets out of sync
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.reloadAccount = async function () {
+ console.log('reloadAccount called')
+ return await this.get(`/whoami/jwt`)
+}
+
+/**
+ * Remove account (the current logged in user)
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeAccount = async function () {
+ return await this.delete(`/account/jwt`)
+}
+
+/**
+ * Remove API key
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeApikey = async function (id) {
+ return await this.delete(`/apikeys/${id}/jwt`, this.auth)
+}
+
+/*
+ * Remove bookmark
+ *
+ * @param {string} id - The bookmark ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeBookmark = async function (id) {
+ return await this.delete(`/bookmarks/${id}/jwt`)
+}
+
+/**
+ * Remove curated measurements set
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeCuratedSet = async function (id) {
+ return await this.delete(`/curated-sets/${id}/jwt`)
+}
+
+/**
+ * Remove an uploaded image
+ *
+ * @param {string} id - The image ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeImage = async function (id) {
+ return await this.delete(`/images/${id}/jwt`)
+}
+
+/**
+ * Remove pattern
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removePattern = async function (id) {
+ return await this.delete(`/patterns/${id}/jwt`, this.auth)
+}
+
+/**
+ * Remove measurements set
+ *
+ * @param {string} id - The measurements set ID
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.removeSet = async function (id) {
+ return await this.delete(`/sets/${id}/jwt`)
+}
+
+/*
+ * Remove suggested measurements set
+ */
+Backend.prototype.removeSuggestedSet = async function (id) {
+ return await this.delete(`/suggested-sets/${id}/jwt`)
+}
+
+/**
+ * Restrict processing of account data
+ *
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.restrictAccount = async function () {
+ return await this.get(`/account/restrict/jwt`)
+}
+
+/**
+ * User signin/login
+ *
+ * @param {object} data
+ * @param {string} data.username - The account username
+ * @param {string} data.password - The account password
+ * @param {string} data.token - The (optional) MFA token
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.signIn = async function ({ username, password = false, token = false }) {
+ return password === false
+ ? await this.post('/signinlink', { username })
+ : await this.post('/signin', { username, password, token })
+}
+
+/**
+ * Trade in sign-in link id & check for JWT token
+ *
+ * @param {object} data
+ * @param {string} data.id - The confirmation ID
+ * @param {string} data.check - The confirmation check value
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.signInFromLink = async function ({ id, check, token }) {
+ return await this.post(`/signinlink/${id}/${check}`, { token })
+}
+
+/**
+ * User signup
+ *
+ * @param {object} data
+ * @param {string} data.email - The Email address to sign up
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.signUp = async function ({ email }) {
+ return await this.post('/signup', { email, language: 'en' })
+}
+
+/*
+ * Suggest a measurements set for curation
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.suggestCset = async function (data) {
+ return await this.post(`/curated-sets/suggest/jwt`, data)
+}
+
+/*
+ * Suggest an option pack for curation
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.suggestOpack = async function (data) {
+ return await this.post(`/option-packs/suggest/jwt`, data)
+}
+
+/**
+ * Generic update account method
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.updateAccount = async function (data) {
+ return await this.patch(`/account/jwt`, data)
+}
+
+/**
+ * Generic update curated measurements set method
+ *
+ * @param {object} consent
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.updateCuratedSet = async function (id, data) {
+ return await this.patch(`/curated-sets/${id}/jwt`, data)
+}
+
+/**
+ * Update consent (uses the jwt-guest middleware)
+ *
+ * @param {object} consent
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.updateConsent = async function (consent) {
+ return await this.patch(`/consent/jwt`, { consent })
+}
+
+/**
+ * Generic update pattern set method
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.updatePattern = async function (id, data) {
+ return await this.patch(`/patterns/${id}/jwt`, data)
+}
+
+/**
+ * Generic update measurements set method
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.updateSet = async function (id, data) {
+ return await this.patch(`/sets/${id}/jwt`, data)
+}
+
+/**
+ * Upload an image
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.uploadImage = async function (data) {
+ return await this.post('/images/jwt', data)
+}
+
+/**
+ * Upload an image anonymously
+ *
+ * @param {object} data - Data for the API call
+ * @return {array} result - The REST response, a [status, data] array
+ */
+Backend.prototype.uploadImageAnon = async function (data) {
+ return await this.post('/images', data)
+}
diff --git a/packages/react/hooks/useControl/index.mjs b/packages/react/hooks/useControl/index.mjs
new file mode 100644
index 00000000000..5afb9255e02
--- /dev/null
+++ b/packages/react/hooks/useControl/index.mjs
@@ -0,0 +1,46 @@
+// Context
+import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus'
+
+// Hooks
+import React, { useState, useContext } from 'react'
+import { useAccount } from '@freesewing/react/hooks/useAccount'
+import { useBackend } from '@freesewing/react/hooks/useBackend'
+
+/**
+ * Control can be updated from many places in the UI.
+ * So this shared state handler keeps this DRY
+ */
+export const useControl = () => {
+ // Hooks
+ const backend = useBackend()
+ const { account, setAccount, token } = useAccount()
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+
+ // State
+ const [control, setControl] = useState(account.control)
+
+ // Method to update the control setting
+ const updateControl = async (newControl) => {
+ if (newControl !== control) {
+ if (token) {
+ setLoadingStatus([true, 'Updating preferences'])
+ const [status, body] = await backend.updateAccount({ control: newControl })
+ if (status === 200) {
+ setControl(newControl)
+ setAccount(body.account)
+ setLoadingStatus([true, 'Preferences updated', true, true])
+ } else
+ setLoadingStatus([true, 'Failed to update preferences. Please report this', true, true])
+ } else {
+ /*
+ * Control is used even when people are not logged in
+ * So this ensures control is always available, even if people are not authenticated
+ */
+ setAccount({ ...account, control: newControl })
+ setControl(newControl)
+ }
+ }
+ }
+
+ return { control, updateControl }
+}
diff --git a/packages/react/hooks/useDesign/index.mjs b/packages/react/hooks/useDesign/index.mjs
new file mode 100644
index 00000000000..f529bdd7ced
--- /dev/null
+++ b/packages/react/hooks/useDesign/index.mjs
@@ -0,0 +1,125 @@
+import { Aaron as aaron } from '@freesewing/aaron'
+import { Albert as albert } from '@freesewing/albert'
+import { Bee as bee } from '@freesewing/bee'
+import { Bella as bella } from '@freesewing/bella'
+import { Benjamin as benjamin } from '@freesewing/benjamin'
+import { Bent as bent } from '@freesewing/bent'
+import { Bibi as bibi } from '@freesewing/bibi'
+import { Bob as bob } from '@freesewing/bob'
+import { Breanna as breanna } from '@freesewing/breanna'
+import { Brian as brian } from '@freesewing/brian'
+import { Bruce as bruce } from '@freesewing/bruce'
+import { Carlita as carlita } from '@freesewing/carlita'
+import { Carlton as carlton } from '@freesewing/carlton'
+import { Cathrin as cathrin } from '@freesewing/cathrin'
+import { Charlie as charlie } from '@freesewing/charlie'
+import { Cornelius as cornelius } from '@freesewing/cornelius'
+import { Diana as diana } from '@freesewing/diana'
+import { Florence as florence } from '@freesewing/florence'
+import { Florent as florent } from '@freesewing/florent'
+import { Gozer as gozer } from '@freesewing/gozer'
+import { Hi as hi } from '@freesewing/hi'
+import { Holmes as holmes } from '@freesewing/holmes'
+import { Hortensia as hortensia } from '@freesewing/hortensia'
+import { Huey as huey } from '@freesewing/huey'
+import { Hugo as hugo } from '@freesewing/hugo'
+import { Jaeger as jaeger } from '@freesewing/jaeger'
+import { Jane as jane } from '@freesewing/jane'
+import { Lucy as lucy } from '@freesewing/lucy'
+import { Lumina as lumina } from '@freesewing/lumina'
+import { Lumira as lumira } from '@freesewing/lumira'
+import { Lunetius as lunetius } from '@freesewing/lunetius'
+import { Noble as noble } from '@freesewing/noble'
+import { Octoplushy as octoplushy } from '@freesewing/octoplushy'
+import { Onyx as onyx } from '@freesewing/onyx'
+import { Opal as opal } from '@freesewing/opal'
+import { Otis as otis } from '@freesewing/otis'
+import { Paco as paco } from '@freesewing/paco'
+import { Penelope as penelope } from '@freesewing/penelope'
+import { Sandy as sandy } from '@freesewing/sandy'
+import { Shelly as shelly } from '@freesewing/shelly'
+import { Shin as shin } from '@freesewing/shin'
+import { Simon as simon } from '@freesewing/simon'
+import { Simone as simone } from '@freesewing/simone'
+import { Skully as skully } from '@freesewing/skully'
+import { Sven as sven } from '@freesewing/sven'
+import { Tamiko as tamiko } from '@freesewing/tamiko'
+import { Teagan as teagan } from '@freesewing/teagan'
+import { Tiberius as tiberius } from '@freesewing/tiberius'
+import { Titan as titan } from '@freesewing/titan'
+import { Trayvon as trayvon } from '@freesewing/trayvon'
+import { Tristan as tristan } from '@freesewing/tristan'
+import { Uma as uma } from '@freesewing/uma'
+import { Umbra as umbra } from '@freesewing/umbra'
+import { Wahid as wahid } from '@freesewing/wahid'
+import { Walburga as walburga } from '@freesewing/walburga'
+import { Waralee as waralee } from '@freesewing/waralee'
+import { Yuri as yuri } from '@freesewing/yuri'
+import { Lily as lily } from '@freesewing/lily'
+import { Bonny as bonny } from '@freesewing/bonny'
+
+export const designs = {
+ aaron,
+ albert,
+ bee,
+ bella,
+ benjamin,
+ bent,
+ bibi,
+ bob,
+ breanna,
+ brian,
+ bruce,
+ carlita,
+ carlton,
+ cathrin,
+ charlie,
+ cornelius,
+ diana,
+ florence,
+ florent,
+ gozer,
+ hi,
+ holmes,
+ hortensia,
+ huey,
+ hugo,
+ jaeger,
+ jane,
+ lucy,
+ lumina,
+ lumira,
+ lunetius,
+ noble,
+ octoplushy,
+ onyx,
+ opal,
+ otis,
+ paco,
+ penelope,
+ sandy,
+ shelly,
+ shin,
+ simon,
+ simone,
+ skully,
+ sven,
+ tamiko,
+ teagan,
+ tiberius,
+ titan,
+ trayvon,
+ tristan,
+ uma,
+ umbra,
+ wahid,
+ walburga,
+ waralee,
+ yuri,
+ lily,
+ bonny,
+}
+
+export const useDesign = (design) => (designs[design] ? designs[design] : false)
+
+export const collection = Object.keys(designs)
diff --git a/packages/react/hooks/useDesignTranslation/index.mjs b/packages/react/hooks/useDesignTranslation/index.mjs
new file mode 100644
index 00000000000..1dac8252af3
--- /dev/null
+++ b/packages/react/hooks/useDesignTranslation/index.mjs
@@ -0,0 +1,122 @@
+import { i18n as aaron } from '@freesewing/aaron'
+import { i18n as albert } from '@freesewing/albert'
+import { i18n as bee } from '@freesewing/bee'
+import { i18n as bella } from '@freesewing/bella'
+import { i18n as benjamin } from '@freesewing/benjamin'
+import { i18n as bent } from '@freesewing/bent'
+import { i18n as bibi } from '@freesewing/bibi'
+import { i18n as bob } from '@freesewing/bob'
+import { i18n as breanna } from '@freesewing/breanna'
+import { i18n as brian } from '@freesewing/brian'
+import { i18n as bruce } from '@freesewing/bruce'
+import { i18n as carlita } from '@freesewing/carlita'
+import { i18n as carlton } from '@freesewing/carlton'
+import { i18n as cathrin } from '@freesewing/cathrin'
+import { i18n as charlie } from '@freesewing/charlie'
+import { i18n as cornelius } from '@freesewing/cornelius'
+import { i18n as diana } from '@freesewing/diana'
+import { i18n as florence } from '@freesewing/florence'
+import { i18n as florent } from '@freesewing/florent'
+import { i18n as gozer } from '@freesewing/gozer'
+import { i18n as hi } from '@freesewing/hi'
+import { i18n as holmes } from '@freesewing/holmes'
+import { i18n as hortensia } from '@freesewing/hortensia'
+import { i18n as huey } from '@freesewing/huey'
+import { i18n as hugo } from '@freesewing/hugo'
+import { i18n as jaeger } from '@freesewing/jaeger'
+import { i18n as jane } from '@freesewing/jane'
+import { i18n as lucy } from '@freesewing/lucy'
+import { i18n as lumina } from '@freesewing/lumina'
+import { i18n as lumira } from '@freesewing/lumira'
+import { i18n as lunetius } from '@freesewing/lunetius'
+import { i18n as noble } from '@freesewing/noble'
+import { i18n as octoplushy } from '@freesewing/octoplushy'
+import { i18n as onyx } from '@freesewing/onyx'
+import { i18n as opal } from '@freesewing/opal'
+import { i18n as otis } from '@freesewing/otis'
+import { i18n as paco } from '@freesewing/paco'
+import { i18n as penelope } from '@freesewing/penelope'
+import { i18n as sandy } from '@freesewing/sandy'
+import { i18n as shelly } from '@freesewing/shelly'
+import { i18n as shin } from '@freesewing/shin'
+import { i18n as simon } from '@freesewing/simon'
+import { i18n as simone } from '@freesewing/simone'
+import { i18n as skully } from '@freesewing/skully'
+import { i18n as sven } from '@freesewing/sven'
+import { i18n as tamiko } from '@freesewing/tamiko'
+import { i18n as teagan } from '@freesewing/teagan'
+import { i18n as tiberius } from '@freesewing/tiberius'
+import { i18n as titan } from '@freesewing/titan'
+import { i18n as trayvon } from '@freesewing/trayvon'
+import { i18n as tristan } from '@freesewing/tristan'
+import { i18n as uma } from '@freesewing/uma'
+import { i18n as umbra } from '@freesewing/umbra'
+import { i18n as wahid } from '@freesewing/wahid'
+import { i18n as walburga } from '@freesewing/walburga'
+import { i18n as waralee } from '@freesewing/waralee'
+import { i18n as yuri } from '@freesewing/yuri'
+import { i18n as lily } from '@freesewing/lily'
+
+export const designTranslations = {
+ aaron,
+ albert,
+ bee,
+ bella,
+ benjamin,
+ bent,
+ bibi,
+ bob,
+ breanna,
+ brian,
+ bruce,
+ carlita,
+ carlton,
+ cathrin,
+ charlie,
+ cornelius,
+ diana,
+ florence,
+ florent,
+ gozer,
+ hi,
+ holmes,
+ hortensia,
+ huey,
+ hugo,
+ jaeger,
+ jane,
+ lucy,
+ lumina,
+ lumira,
+ lunetius,
+ noble,
+ octoplushy,
+ onyx,
+ opal,
+ otis,
+ paco,
+ penelope,
+ sandy,
+ shelly,
+ shin,
+ simon,
+ simone,
+ skully,
+ sven,
+ tamiko,
+ teagan,
+ tiberius,
+ titan,
+ trayvon,
+ tristan,
+ uma,
+ umbra,
+ wahid,
+ walburga,
+ waralee,
+ yuri,
+ lily,
+}
+
+export const useDesignTranslation = (design) =>
+ designTranslations[design] ? designTranslations[design] : false
diff --git a/packages/react/hooks/useSelection/index.mjs b/packages/react/hooks/useSelection/index.mjs
new file mode 100644
index 00000000000..ac3825ef3c0
--- /dev/null
+++ b/packages/react/hooks/useSelection/index.mjs
@@ -0,0 +1,40 @@
+import React, { useState } from 'react'
+
+export const useSelection = (items) => {
+ const [selection, setSelection] = useState({})
+
+ /*
+ * This variable keeps track of how many are selected
+ */
+ const count = Object.keys(selection).length
+
+ /*
+ * This method toggles a single item in the selection
+ */
+ const toggle = (id) => {
+ const newSelection = { ...selection }
+ if (newSelection[id]) delete newSelection[id]
+ else newSelection[id] = 1
+ setSelection(newSelection)
+ }
+
+ /*
+ * This method toggles all on or off
+ */
+ const toggleAll = () => {
+ if (count === items.length) setSelection({})
+ else {
+ const newSelection = {}
+ for (const item of items) newSelection[item.id] = 1
+ setSelection(newSelection)
+ }
+ }
+
+ return {
+ count,
+ selection,
+ setSelection,
+ toggle,
+ toggleAll,
+ }
+}
diff --git a/packages/react/hooks/useStateObject/index.mjs b/packages/react/hooks/useStateObject/index.mjs
new file mode 100644
index 00000000000..71e48aa7a53
--- /dev/null
+++ b/packages/react/hooks/useStateObject/index.mjs
@@ -0,0 +1,48 @@
+import React, { useState } from 'react'
+import set from 'lodash/set.js'
+import unset from 'lodash/unset.js'
+
+/*
+ * Helper method to handle object updates
+ *
+ * This is a wrapper around lodash.set() with extra support for unsetting data.
+ *
+ * @param {object} obj - The object to update
+ * @param {array|string} path - The path to the property to update either as an array or string in dot notation
+ * @param {mixed} val - The value to set. If the value holds the string 'unset' the property will be removed
+ *
+ * @return {object} obj - The mutated object
+ */
+export const objUpdate = (obj = {}, path, val = undefined) => {
+ if (val === undefined) {
+ if (Array.isArray(path) && Array.isArray(path[0])) {
+ for (const [ipath, ival = undefined] of path) {
+ if (ival === undefined) unset(obj, ipath)
+ else set(obj, ipath, ival)
+ }
+ } else unset(obj, path)
+ } else set(obj, path, val)
+
+ return obj
+}
+
+/*
+ * This hooks provides an React state update with an
+ * update method that allows us to set deeply nested
+ * properties.
+ */
+export const useStateObject = (dflt = {}) => {
+ const [obj, setObj] = useState(dflt)
+
+ const replace = (val) => setObj(val)
+
+ const update = (path, val, altObj = false) => {
+ const newObj = altObj ? { ...altObj } : { ...obj }
+ objUpdate(newObj, path, val)
+ setObj(newObj)
+
+ return newObj
+ }
+
+ return [obj, update, replace]
+}
diff --git a/packages/react/lib/RestClient/index.mjs b/packages/react/lib/RestClient/index.mjs
new file mode 100644
index 00000000000..cf8e8d94b88
--- /dev/null
+++ b/packages/react/lib/RestClient/index.mjs
@@ -0,0 +1,136 @@
+/**
+ * A simple HTTP REST client
+ *
+ * We use this in the useBackend hook, but it's also possible to use this with
+ * any other REST API.
+ * This uses the fetch API, so it has no dependencies.
+ * However, that means you cannot use this with a REST API using a non-trusted X.509 certificate, since fetch does not provide an escape hatch for that.
+ * If that's your use-case, use Axios instead.
+ *
+ * @param {string} baseUrl - The base URL of the API that will be used as a prefix for all calls
+ * @param {string} baseHeaders - Any headers to add to each request. Eg for authentication
+ * @return {object} client - An object with get, post, and put methods
+ */
+export function RestClient(baseUrl = '', baseHeaders = {}) {
+ this.baseUrl = baseUrl
+ this.baseHeaders = baseHeaders
+
+ this.delete = async function (url, headers, raw, log) {
+ return withoutBody('DELETE', baseUrl + url, { ...baseHeaders, ...headers }, raw, log)
+ }
+
+ this.get = async function (url, headers, raw, log) {
+ return withoutBody('GET', baseUrl + url, { ...baseHeaders, ...headers }, raw, log)
+ }
+
+ this.head = async function (url, headers, raw, log) {
+ return withoutBody('HEAD', baseUrl + url, { ...baseHeaders, ...headers }, raw, log)
+ }
+
+ this.patch = async function (url, data, headers, raw, log) {
+ return withBody('PATCH', baseUrl + url, data, { ...baseHeaders, ...headers }, raw, log)
+ }
+
+ this.post = async function (url, data, headers, raw, log) {
+ return withBody('POST', baseUrl + url, data, { ...baseHeaders, ...headers }, raw, log)
+ }
+
+ this.put = async function (url, data, headers, raw, log) {
+ return withBody('PUT', baseUrl + url, data, { ...baseHeaders, headers }, raw, log)
+ }
+
+ return this
+}
+
+/*
+ * General purpose method to call a REST API without a body (eg: GET or DELETE requests)
+ *
+ * @param {string} url - The URL to call
+ * @param {object} headers - Any request headers to add
+ * @param {bool} raw - Set this to something truthy to not parse the result as JSON
+ * @param {function} log - Optional custom logging method to log errors
+ * @return {response} array - An array with status code followed by either the result parse as JSON, the raw result, or false in case of trouble
+ */
+async function withoutBody(method = 'GET', url, headers = {}, raw = false, log = console.log) {
+ let response
+ try {
+ response = await fetch(url, { method, headers })
+ } catch (err) {
+ if (log) console.log({ url, err })
+ }
+
+ if (!response) return [false, false]
+
+ /*
+ * Can we parse the response as JSON?
+ */
+ let body
+ try {
+ body = raw ? await response.text() : await response.json()
+ } catch (err) {
+ try {
+ body = await response.text()
+ } catch (err) {
+ body = false
+ }
+ }
+
+ return [response.status || false, body]
+}
+
+/*
+ * General purpose method to call a REST API with a body (eg: PATCH, PUT, or POST requests)
+ *
+ * @param {url} string - The URL to call
+ * @param {data} string - The data to send
+ * @param {object} headers - Any request headers to add
+ * @param {raw} string - Set this to something truthy to not parse the result as JSON
+ * @param {function} log - Optional logging method to log errors
+ * @return {response} array - An array with status code followed by either the result parse as JSON, the raw result, or false in case of trouble
+ */
+async function withBody(method = 'POST', url, data, headers, raw = false, log = console.log) {
+ const request = { method, headers }
+ if (data && typeof data === 'object' && Object.keys(data).length > 0) {
+ request.body = JSON.stringify(data)
+ request.headers['Content-Type'] = 'application/json'
+ }
+
+ let response
+ try {
+ response = await fetch(url, request)
+ } catch (err) {
+ if (log) log(err)
+ }
+
+ /*
+ * Some status codes have no response body
+ */
+ if (response.status && [204].includes(response.status)) return [response.status, {}]
+ else if (response.status && response.status < 400) {
+ let data
+ try {
+ data = raw ? await response.text() : await response.json()
+ } catch (err) {
+ if (log) log(err)
+ return raw ? [response.status, { err }] : [response.status, data]
+ }
+ return [response.status, data]
+ }
+
+ /*
+ * If we end up here, status code is 400 or higher so it's an error
+ * We still attempt to parse the body though
+ */
+ let body
+ try {
+ body = raw ? await response.text() : await response.json()
+ } catch (err) {
+ try {
+ body = await response.text()
+ } catch (err) {
+ body = false
+ }
+ }
+
+ return [response.status || 500, body]
+}
diff --git a/packages/react/lib/collection/index.mjs b/packages/react/lib/collection/index.mjs
new file mode 100644
index 00000000000..2c24c35a2cc
--- /dev/null
+++ b/packages/react/lib/collection/index.mjs
@@ -0,0 +1,121 @@
+import { Aaron as aaron } from '@freesewing/aaron'
+import { Albert as albert } from '@freesewing/albert'
+import { Bee as bee } from '@freesewing/bee'
+import { Bella as bella } from '@freesewing/bella'
+import { Benjamin as benjamin } from '@freesewing/benjamin'
+import { Bent as bent } from '@freesewing/bent'
+import { Bibi as bibi } from '@freesewing/bibi'
+import { Bob as bob } from '@freesewing/bob'
+import { Breanna as breanna } from '@freesewing/breanna'
+import { Brian as brian } from '@freesewing/brian'
+import { Bruce as bruce } from '@freesewing/bruce'
+import { Carlita as carlita } from '@freesewing/carlita'
+import { Carlton as carlton } from '@freesewing/carlton'
+import { Cathrin as cathrin } from '@freesewing/cathrin'
+import { Charlie as charlie } from '@freesewing/charlie'
+import { Cornelius as cornelius } from '@freesewing/cornelius'
+import { Diana as diana } from '@freesewing/diana'
+import { Florence as florence } from '@freesewing/florence'
+import { Florent as florent } from '@freesewing/florent'
+import { Gozer as gozer } from '@freesewing/gozer'
+import { Hi as hi } from '@freesewing/hi'
+import { Holmes as holmes } from '@freesewing/holmes'
+import { Hortensia as hortensia } from '@freesewing/hortensia'
+import { Huey as huey } from '@freesewing/huey'
+import { Hugo as hugo } from '@freesewing/hugo'
+import { Jaeger as jaeger } from '@freesewing/jaeger'
+import { Jane as jane } from '@freesewing/jane'
+import { Lucy as lucy } from '@freesewing/lucy'
+import { Lumina as lumina } from '@freesewing/lumina'
+import { Lumira as lumira } from '@freesewing/lumira'
+import { Lunetius as lunetius } from '@freesewing/lunetius'
+import { Noble as noble } from '@freesewing/noble'
+import { Octoplushy as octoplushy } from '@freesewing/octoplushy'
+import { Onyx as onyx } from '@freesewing/onyx'
+import { Opal as opal } from '@freesewing/opal'
+import { Otis as otis } from '@freesewing/otis'
+import { Paco as paco } from '@freesewing/paco'
+import { Penelope as penelope } from '@freesewing/penelope'
+import { Sandy as sandy } from '@freesewing/sandy'
+import { Shelly as shelly } from '@freesewing/shelly'
+import { Shin as shin } from '@freesewing/shin'
+import { Simon as simon } from '@freesewing/simon'
+import { Simone as simone } from '@freesewing/simone'
+import { Skully as skully } from '@freesewing/skully'
+import { Sven as sven } from '@freesewing/sven'
+import { Tamiko as tamiko } from '@freesewing/tamiko'
+import { Teagan as teagan } from '@freesewing/teagan'
+import { Tiberius as tiberius } from '@freesewing/tiberius'
+import { Titan as titan } from '@freesewing/titan'
+import { Trayvon as trayvon } from '@freesewing/trayvon'
+import { Tristan as tristan } from '@freesewing/tristan'
+import { Uma as uma } from '@freesewing/uma'
+import { Umbra as umbra } from '@freesewing/umbra'
+import { Wahid as wahid } from '@freesewing/wahid'
+import { Walburga as walburga } from '@freesewing/walburga'
+import { Waralee as waralee } from '@freesewing/waralee'
+import { Yuri as yuri } from '@freesewing/yuri'
+import { Lily as lily } from '@freesewing/lily'
+
+export const designs = {
+ aaron,
+ albert,
+ bee,
+ bella,
+ benjamin,
+ bent,
+ bibi,
+ bob,
+ breanna,
+ brian,
+ bruce,
+ carlita,
+ carlton,
+ cathrin,
+ charlie,
+ cornelius,
+ diana,
+ florence,
+ florent,
+ gozer,
+ hi,
+ holmes,
+ hortensia,
+ huey,
+ hugo,
+ jaeger,
+ jane,
+ lucy,
+ lumina,
+ lumira,
+ lunetius,
+ noble,
+ octoplushy,
+ onyx,
+ opal,
+ otis,
+ paco,
+ penelope,
+ sandy,
+ shelly,
+ shin,
+ simon,
+ simone,
+ skully,
+ sven,
+ tamiko,
+ teagan,
+ tiberius,
+ titan,
+ trayvon,
+ tristan,
+ uma,
+ umbra,
+ wahid,
+ walburga,
+ waralee,
+ yuri,
+ lily,
+}
+
+export const collection = Object.keys(designs)
diff --git a/packages/react/lib/force-tailwind.mjs b/packages/react/lib/force-tailwind.mjs
new file mode 100644
index 00000000000..072213cb1d2
--- /dev/null
+++ b/packages/react/lib/force-tailwind.mjs
@@ -0,0 +1,14 @@
+import React from 'react'
+
+const html = (
+ <>
+
+
+ Code
+
+
+ Joost De Cock
+
+
+ >
+)
diff --git a/packages/react/package.json b/packages/react/package.json
new file mode 100644
index 00000000000..12fe7e4634a
--- /dev/null
+++ b/packages/react/package.json
@@ -0,0 +1,133 @@
+{
+ "name": "@freesewing/react",
+ "version": "4.0.0",
+ "description": "React components, hooks and context by/for FreeSewing",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "freesewing"
+ ],
+ "type": "module",
+ "module": "src/index.mjs",
+ "exports": {
+ ".": {
+ "internal": "./src/index.mjs",
+ "default": "./dist/index.mjs"
+ },
+ "./linedrawings": "./src/linedrawings/index.mjs",
+ "./pattern": "./src/pattern/index.mjs",
+ "./xray": "./src/pattern-xray/index.mjs",
+ "./components/Account": "./components/Account/index.mjs",
+ "./components/Admin": "./components/Admin/index.mjs",
+ "./components/Breadcrumbs": "./components/Breadcrumbs/index.mjs",
+ "./components/Button": "./components/Button/index.mjs",
+ "./components/Collection": "./components/Collection/index.mjs",
+ "./components/Control": "./components/Control/index.mjs",
+ "./components/CopyToClipboardButton": "./components/CopyToClipboardButton/index.mjs",
+ "./components/Design": "./components/Design/index.mjs",
+ "./components/DiffViewer": "./components/DiffViewer/index.mjs",
+ "./components/Docusaurus": "./components/Docusaurus/index.mjs",
+ "./components/Echart": "./components/Echart/index.mjs",
+ "./components/Editor": "./components/Editor/index.mjs",
+ "./components/Heading": "./components/Heading/index.mjs",
+ "./components/Highlight": "./components/Highlight/index.mjs",
+ "./components/Icon": "./components/Icon/index.mjs",
+ "./components/Input": "./components/Input/index.mjs",
+ "./components/Json": "./components/Json/index.mjs",
+ "./components/KeyVal": "./components/KeyVal/index.mjs",
+ "./components/Layout": "./components/Layout/index.mjs",
+ "./components/LineDrawing": "./components/LineDrawing/index.mjs",
+ "./components/Link": "./components/Link/index.mjs",
+ "./components/Logo": "./components/Logo/index.mjs",
+ "./components/Markdown": "./components/Markdown/index.mjs",
+ "./components/Mini": "./components/Mini/index.mjs",
+ "./components/Modal": "./components/Modal/index.mjs",
+ "./components/New": "./components/New/index.mjs",
+ "./components/Newsletter": "./components/Newsletter/index.mjs",
+ "./components/Null": "./components/Null/index.mjs",
+ "./components/Number": "./components/Number/index.mjs",
+ "./components/Pattern": "./components/Pattern/index.mjs",
+ "./components/Patrons": "./components/Patrons/index.mjs",
+ "./components/Popout": "./components/Popout/index.mjs",
+ "./components/Profile": "./components/Profile/index.mjs",
+ "./components/Role": "./components/Role/index.mjs",
+ "./components/SignIn": "./components/SignIn/index.mjs",
+ "./components/SignUp": "./components/SignUp/index.mjs",
+ "./components/Spinner": "./components/Spinner/index.mjs",
+ "./components/Stats": "./components/Stats/index.mjs",
+ "./components/Tab": "./components/Tab/index.mjs",
+ "./components/Table": "./components/Table/index.mjs",
+ "./components/Time": "./components/Time/index.mjs",
+ "./components/Uuid": "./components/Uuid/index.mjs",
+ "./components/Ux": "./components/Ux/index.mjs",
+ "./components/Yaml": "./components/Yaml/index.mjs",
+ "./components/Xray": "./components/Xray/index.mjs",
+ "./context/LoadingStatus": "./context/LoadingStatus/index.mjs",
+ "./context/Modal": "./context/Modal/index.mjs",
+ "./hooks/useAccount": "./hooks/useAccount/index.mjs",
+ "./hooks/useBackend": "./hooks/useBackend/index.mjs",
+ "./hooks/useControl": "./hooks/useControl/index.mjs",
+ "./hooks/useDesign": "./hooks/useDesign/index.mjs",
+ "./hooks/useDesignTranslation": "./hooks/useDesignTranslation/index.mjs",
+ "./hooks/useSelection": "./hooks/useSelection/index.mjs",
+ "./hooks/useStateObject": "./hooks/useStateObject/index.mjs",
+ "./lib/RestClient": "./lib/RestClient/index.mjs",
+ "./lib/logoPath": "./components/Logo/path.mjs"
+ },
+ "scripts": {
+ "lint": "eslint 'components/**/*.mjs' 'hooks/**/*.mjs' 'lib/**/*.mjs' 'context/**/*.mjs' 'config/**/*.mjs'",
+ "prettier": "npx prettier --write 'components/**/*.mjs' 'hooks/**/*.mjs' 'lib/**/*.mjs' 'context/**/*.mjs' 'config/**/*.mjs'"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ },
+ "dependencies": {
+ "@codemirror/lang-yaml": "^6.1.2",
+ "@uiw/react-codemirror": "^4.23.8",
+ "d3-drag": "3.0.0",
+ "d3-selection": "3.0.0",
+ "diff": "^7.0.0",
+ "echarts": "^5.6.0",
+ "echarts-for-react": "^3.0.2",
+ "file-saver": "^2.0.5",
+ "highlight.js": "^11.11.1",
+ "html-react-parser": "^5.2.2",
+ "jotai": "^2.12.1",
+ "jotai-location": "^0.5.5",
+ "luxon": "^3.5.0",
+ "mustache": "^4.2.0",
+ "pdfkit": "^0.16.0",
+ "react-diff-viewer-continued": "^4.0.5",
+ "react-dropzone": "^14.3.5",
+ "react-zoom-pan-pinch": "^3.7.0",
+ "svg-to-pdfkit": "^0.1.8",
+ "use-local-storage-state": "^19.5.0",
+ "web-worker": "^1.5.0",
+ "yaml": "^2.7.0"
+ },
+ "devDependencies": {},
+ "files": [
+ "components/",
+ "context/",
+ "hooks/",
+ "lib/",
+ "README.md"
+ ],
+ "publishConfig": {
+ "access": "public",
+ "tag": "latest"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+}
diff --git a/packages/rehype-highlight-lines/CHANGELOG.md b/packages/rehype-highlight-lines/CHANGELOG.md
deleted file mode 100644
index 5fec38ace70..00000000000
--- a/packages/rehype-highlight-lines/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Change log for: rehype-highlight-lines
-
-
-## 3.0.0 (2023-09-30)
-
-### Changed
-
- - All FreeSewing packages are now ESM only.
- - All FreeSewing packages now use named exports.
- - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
-
-
-This is the **initial release**, and the start of this change log.
-
-> Prior to version 2, FreeSewing was not a JavaScript project.
-> As such, that history is out of scope for this change log.
-
diff --git a/packages/rehype-highlight-lines/README.md b/packages/rehype-highlight-lines/README.md
deleted file mode 100644
index f04bb0dd065..00000000000
--- a/packages/rehype-highlight-lines/README.md
+++ /dev/null
@@ -1,162 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-# rehype-highlight-lines
-
-A Rehype plugin to add highlighted lines to code blocks
-
-
-
-# FreeSewing
-
-> [!TIP]
->#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
->
-> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
->
-> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
-
-## What am I looking at? 🤔
-
-This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
-
-This folder holds: rehype-highlight-lines
-
-If you're not entirely sure what to do or how to start, type this command:
-
-```
-npm run tips
-```
-
-> [!NOTE]
-> If you don't want to set up a dev environment, you can run it in your browser:
->
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
->
-> We recommend that you fork our repository and then
-> put `gitpod.io/# to start up a browser-based dev environment of your own.
-
-## About FreeSewing 💀
-
-Where the world of makers and developers collide, that's where you'll find FreeSewing.
-
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
-sewing patterns adapted to your measurements.
-
-If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
-The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
-for parametric design of sewing patterns. But FreeSewing also provides a range
-of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
-functionality of the platform.
-
-If you have NodeJS installed, you can try it right now by running:
-
-```bash
-npx @freesewing/new-design
-```
-
-Getting started guides are available for:
-- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
-- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
-- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
-
-The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
-show you how to create your first parametric design.
-
-## Getting started ⚡
-
-To get started with FreeSewing, you can spin up our development environment with:
-
-```bash
-npx @freesewing/new-design
-```
-
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
-
-```bash
-git clone git@github.com:freesewing/freesewing.git
-cd freesewing
-yarn kickstart
-```
-
-## Links 👩💻
-
-**Official channels**
-
- - 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- - ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
- [Issues](https://github.com/freesewing/freesewing/issues) &
- [Discussions](https://github.com/freesewing/freesewing/discussions) on
- [GitHub](https://github.com/freesewing/freesewing)
-
-**Social media**
-
- - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
-
-**Places the FreeSewing community hangs out**
-
- - 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
-
-## License: MIT 🤓
-
-© [Joost De Cock](https://github.com/joostdecock).
-See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
-
-## Where to get help 🤯
-
-For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
-please use the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
-
diff --git a/packages/rehype-highlight-lines/data.mjs b/packages/rehype-highlight-lines/data.mjs
deleted file mode 100644
index 16d0a898da3..00000000000
--- a/packages/rehype-highlight-lines/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = 'rehype-highlight-lines'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/rehype-highlight-lines/package.json b/packages/rehype-highlight-lines/package.json
deleted file mode 100644
index 94529f97252..00000000000
--- a/packages/rehype-highlight-lines/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "name": "rehype-highlight-lines",
- "version": "3.3.0-rc.1",
- "description": "A Rehype plugin to add highlighted lines to code blocks",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/freesewing/freesewing/issues"
- },
- "funding": {
- "type": "individual",
- "url": "https://freesewing.org/patrons/join"
- },
- "keywords": [
- "freesewing",
- "freesewing"
- ],
- "type": "module",
- "module": "dist/index.mjs",
- "exports": {
- ".": {
- "internal": "./src/index.mjs",
- "default": "./dist/index.mjs"
- }
- },
- "scripts": {
- "clean": "rimraf dist",
- "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
- "test": "echo \"rehype-highlight-lines: No tests configured. Perhaps you could write some?\" && exit 0",
- "lab": "cd ../../sites/lab && yarn start",
- "tips": "node ../../scripts/help.mjs",
- "lint": "npx eslint 'src/*.mjs'"
- },
- "peerDependencies": {},
- "dependencies": {
- "unist-util-remove": "4.0.0"
- },
- "devDependencies": {},
- "files": [
- "dist/*",
- "README.md"
- ],
- "publishConfig": {
- "access": "public",
- "tag": "next"
- },
- "engines": {
- "node": ">= 18.17.0 <22"
- }
-}
diff --git a/packages/rehype-highlight-lines/src/index.mjs b/packages/rehype-highlight-lines/src/index.mjs
deleted file mode 100644
index 484bbb1bf89..00000000000
--- a/packages/rehype-highlight-lines/src/index.mjs
+++ /dev/null
@@ -1,155 +0,0 @@
-import { visit } from 'unist-util-visit'
-import { remove } from 'unist-util-remove'
-
-const dflts = {
- commentTag: 'span',
- commentClass: 'hljs-comment',
- openingCommentHighlight: 'highlight-start',
- closingCommentHighlight: 'highlight-end',
- openingCommentStrikeout: 'strikeout-start',
- closingCommentStrikeout: 'strikeout-end',
- highlightTag: 'section',
- highlightClass: 'highlight-lines',
- strikeoutClass: 'strikeout-lines',
- swallow: true,
-}
-
-export default (userOptions = {}) => {
- // Merge defaults with user-supplied options
- const options = {
- ...dflts,
- ...userOptions,
- }
-
- const splitParams = (node) => {
- if (node.children.length === 1 && node.children[0].type === 'text') {
- const content = node.children[0].value.split('\n')
- node.children = content.map((value) =>
- value.includes('//')
- ? {
- type: 'element',
- tagName: 'span',
- properties: {
- className: options.commentClass,
- },
- children: [{ type: 'text', value }],
- }
- : { type: 'text', value: value + '\n', isParamLine: true }
- )
- }
- }
-
- // Keep track of whether we've opened a highlight block
- let isOpen = 0
- let children = {}
-
- // Detect opening or closing comment
- const isOpeningOrClosingComment = (node) => {
- if (
- node &&
- node.tagName === options.commentTag &&
- node.properties?.className.includes(options.commentClass)
- ) {
- if (node.children[0].value.includes(options.openingCommentHighlight))
- return ['opening', 'highlight']
- if (node.children[0].value.includes(options.closingCommentHighlight))
- return ['closing', 'highlight']
- if (node.children[0].value.includes(options.openingCommentStrikeout))
- return ['opening', 'strikeout']
- if (node.children[0].value.includes(options.closingCommentStrikeout))
- return ['closing', 'strikeout']
- }
-
- return [false, 'highlight']
- }
-
- // Visitor method
- const visitor = (node, i, parent) => {
- const [type, variant] = isOpeningOrClosingComment(node)
- if (type) {
- if (type === 'opening') {
- isOpen = 1
-
- // Deal with extra linebreaks in the element before the start
- const prev = parent.children[i - 1]
- if (prev?.type === 'text' && prev.value.includes('\n'))
- prev.value = prev.value.replace(/\n/g, '') + '\n'
-
- if (options.swallow) node.__remove_dupes = true
- } else if (type === 'closing') {
- // Deal with extra linebreaks in the element before the end
- const prev = children[i - 1]
- if (prev.type === 'text' && prev.value.includes('\n') && !node.isParamLine)
- prev.value = prev.value.trimEnd()
-
- isOpen = 0
- const curNode = { ...node }
- parent.children[i] = {
- type: 'element',
- tagName: options.highlightTag,
- properties: {
- className: Array.isArray(options[`${variant}Class`])
- ? options[`${variant}Class`]
- : [options[`${variant}Class`]],
- },
- children: [
- {
- type: 'element',
- tagName: 'div',
- properties: {
- className: ['code-section-inner'],
- },
- children: [...Object.values(children)],
- },
- ],
- }
-
- if (!options.swallow) parent[i].children.push(curNode)
- children = {}
- }
- } else if (isOpen) {
- if (
- parent.tagName === 'code' ||
- (parent.tagName === 'span' &&
- parent.properties?.className &&
- parent.properties.className.includes('hljs-params'))
- ) {
- if (node.type === 'text' && node.value === '\n') {
- // Linebreak
- node.type = 'element'
- node.tagName = 'span'
- node.children = [
- {
- type: 'text',
- value: '\n',
- },
- {
- type: 'element',
- tagName: 'span',
- properties: {
- className: ['code-line-break'],
- },
- },
- ]
- }
- // On the first highlighted line, trim the previous linebreak (not for param lines)
- if (isOpen === 1 && node.type === 'text' && !node.isParamLine)
- node.value = node.value.replace('\n', '')
- children[i] = { ...node }
- isOpen++
- node.__remove_dupes = true
- }
- }
- }
-
- const isParamsNode = (node) =>
- node?.properties?.className && node.properties.className.includes('hljs-params')
-
- const transform = (tree) => {
- visit(tree, (node) => isParamsNode(node), splitParams)
- visit(tree, () => true, visitor)
- remove(tree, (node) => node.__remove_dupes === true)
- }
-
- return transform
-}
diff --git a/packages/rehype-jargon/CHANGELOG.md b/packages/rehype-jargon/CHANGELOG.md
deleted file mode 100644
index 7ae0a302653..00000000000
--- a/packages/rehype-jargon/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Change log for: rehype-jargon
-
-
-## 3.0.0 (2023-09-30)
-
-### Changed
-
- - All FreeSewing packages are now ESM only.
- - All FreeSewing packages now use named exports.
- - Dropped support for NodeJS 14. NodeJS 18 (LTS/hydrogen) or more recent is now required.
-
-
-This is the **initial release**, and the start of this change log.
-
-> Prior to version 2, FreeSewing was not a JavaScript project.
-> As such, that history is out of scope for this change log.
-
diff --git a/packages/rehype-jargon/README.md b/packages/rehype-jargon/README.md
deleted file mode 100644
index 0f534b398de..00000000000
--- a/packages/rehype-jargon/README.md
+++ /dev/null
@@ -1,288 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-# rehype-jargon
-
-A Rehype plugin for jargon terms
-
-## About
-
-This [Rehype](https://github.com/rehypejs/rehype) plugin allows you to use _jargon_ in your
-markdown/mdx/html content and use a centrally managed file of jargon terms and their definitions.
-
-
-
-## Install
-
-To install this plugin, run:
-
-```
-npm install --save rehype-jargon
-```
-
-## Getting started
-
-> **Tip**: See https://github.com/joostdecock/rehype-jargon-example for a minimal repository that uses this plugin
-
-### Create your jargon file
-
-This plugin requires a _jargon file_ with terms defenitions. For example:
-
-```js
-export const jargon = {
- rehype: "rehype is a tool that transforms HTML with plugins. These plugins can inspect and change the HTML. You can use rehype on the server, the client, CLIs, deno, etc.",
- freesewing: "FreeSewing is an open source platform for made-to-measure sewing patterns. See freesewing.org "
-}
-```
-
-### Import the plugin
-
-Now import the plugin, and pass it your jargon:
-
-```js
-var remark = require('remark')
-var html = require('remark-html')
-var plugin = require('remark-jargon')
-var jargon = require('./jargon.js')
-
-remark()
- .use(html)
- .use(plugin, { jargon: jargon })
- .process('This is a plugin for _remark_ originally written for _freesewing_.', function (err, file) {
- console.log(String(file))
- })
-```
-
-> **Note**
->
-> This plugin will only add markup to your jargon if you _emphasize_ it.
-
-
-### Style your jargon
-
-You will need to add CSS to style your jargon properly, and hide the definition by default.
-Below is an example to get you started:
-
-```css
-// Add a dashed line under jargon terms
-.jargon-term {
- text-decoration: underline dotted #228be6
-}
-// Add a question mark behind/above jargon terms
-.jargon-term::after {
- content: "?";
- font-weight: bold;
- display: inline-block;
- transform: translate(0, -0.5em);
- font-size: 75%;
- color: #228be6;
- margin-left: 3px;
-}
-// Hover behavior for the therm itself
-.jargon-term:hover {
- position: relative;
- text-decoration: none;
- cursor: help;
-}
-// Hide info by default
-.jargon-term .jargon-info {
- display: none
-}
-// Show info on hover
-.jargon-term:hover .jargon-info {
- display: block;
- position: absolute;
- top: 1.5em;
- left: 0;
- background: #F8F8F8;
- border: 1px solid #DCDCDC;
- padding: 1rem;
- border-radius: 4px;
- font-size: 90%;
- min-width: 250px;
- max-width: 450px;
- z-index: 1;
-}
-```
-
-## Tips for using jargon
-
-### Lowercase your terms in the jargon file
-
-When looking for terms to match, we lowercase the term your emphazised.
-So in the jargon file, you should use `msf`, but in your text, you can use `MSF`, `Msf`, or `msf`.
-
-### If you use HTML, only use inline elements
-
-Your jargon term definition can contain HTML, but only inline elements.
-Typically, you will want to stick to:
-
- - Making things **bold**
- - Inserting [links](#)
-
-## Getting help
-
-This plugin is written by/for [FreeSewing](https://github.com/freesewing).
-For help or feedback, please stop by [the FreeSewing chat room](https://gitter.im/freesewing/development) or
-[create an issue](https://github.com/freesewing/freesewing/issues/new).
-
-
-## Use with Gatsby
-
-Please see [gatsby-remark-jargon](https://github.com/freesewing/freesewing/tree/develop/packages/gatsby-remark-jargon) for
-info and instructions on how to use this plugin with [Gatsby](https://www.gatsbyjs.org/).
-
-
-# FreeSewing
-
-> [!TIP]
->#### Support FreeSewing: Become a patron, or make a one-time donation 🥰
->
-> FreeSewing is an open source project maintained by Joost De Cock and financially supported by the FreeSewing patrons.
->
-> If you feel FreeSewing is worthwhile, and you can spend a few coins without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
-
-## What am I looking at? 🤔
-
-This repository is the FreeSewing *monorepo* holding all FreeSewing's websites, documentation, designs, plugins, and other NPM packages.
-
-This folder holds: rehype-jargon
-
-If you're not entirely sure what to do or how to start, type this command:
-
-```
-npm run tips
-```
-
-> [!NOTE]
-> If you don't want to set up a dev environment, you can run it in your browser:
->
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
->
-> We recommend that you fork our repository and then
-> put `gitpod.io/# to start up a browser-based dev environment of your own.
-
-## About FreeSewing 💀
-
-Where the world of makers and developers collide, that's where you'll find FreeSewing.
-
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
-sewing patterns adapted to your measurements.
-
-If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
-The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
-for parametric design of sewing patterns. But FreeSewing also provides a range
-of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
-functionality of the platform.
-
-If you have NodeJS installed, you can try it right now by running:
-
-```bash
-npx @freesewing/new-design
-```
-
-Getting started guides are available for:
-- [Linux](https://freesewing.dev/tutorials/getting-started-linux/)
-- [MacOS](https://freesewing.dev/tutorials/getting-started-mac/)
-- [Windows](https://freesewing.dev/tutorials/getting-started-windows/)
-
-The [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) will
-show you how to create your first parametric design.
-
-## Getting started ⚡
-
-To get started with FreeSewing, you can spin up our development environment with:
-
-```bash
-npx @freesewing/new-design
-```
-
-To work with FreeSewing's monorepo, you'll need [NodeJS v18](https://nodejs.org), [lerna](https://lerna.js.org/) and [yarn](https://yarnpkg.com/) on your system.
-Once you have those, clone (or fork) this repo and run `yarn kickstart`:
-
-```bash
-git clone git@github.com:freesewing/freesewing.git
-cd freesewing
-yarn kickstart
-```
-
-## Links 👩💻
-
-**Official channels**
-
- - 💻 Makers website: [FreeSewing.org](https://freesewing.org)
- - 💻 Developers website: [FreeSewing.dev](https://freesewing.dev)
- - ✅ [Support](https://github.com/freesewing/freesewing/issues/new/choose),
- [Issues](https://github.com/freesewing/freesewing/issues) &
- [Discussions](https://github.com/freesewing/freesewing/discussions) on
- [GitHub](https://github.com/freesewing/freesewing)
-
-**Social media**
-
- - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
-
-**Places the FreeSewing community hangs out**
-
- - 💬 [Discord](https://discord.freesewing.org/)
- - 💬 [Facebook](https://www.facebook.com/groups/627769821272714/)
- - 💬 [Reddit](https://www.reddit.com/r/freesewing/)
-
-## License: MIT 🤓
-
-© [Joost De Cock](https://github.com/joostdecock).
-See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
-
-## Where to get help 🤯
-
-For [Support](https://github.com/freesewing/freesewing/issues/new/choose),
-please use the [Issues](https://github.com/freesewing/freesewing/issues) &
-[Discussions](https://github.com/freesewing/freesewing/discussions) on
-[GitHub](https://github.com/freesewing/freesewing).
-
diff --git a/packages/rehype-jargon/build.mjs b/packages/rehype-jargon/build.mjs
deleted file mode 100644
index 3a823a29828..00000000000
--- a/packages/rehype-jargon/build.mjs
+++ /dev/null
@@ -1,49 +0,0 @@
-/* This script will build the package with esbuild */
-import esbuild from 'esbuild'
-import pkg from './package.json' assert { type: 'json' }
-
-// Create banner based on package info
-const banner = `/**
- * ${pkg.name} | v${pkg.version}
- * ${pkg.description}
- * (c) ${new Date().getFullYear()} ${pkg.author}
- * @license ${pkg.license}
- */`
-
-// Shared esbuild options
-const options = {
- banner: { js: banner },
- bundle: true,
- entryPoints: ['src/index.mjs'],
- format: 'esm',
- outfile: 'dist/index.mjs',
- external: [ 'unist-util-visit', 'hast-util-from-html' ],
- metafile: process.env.VERBOSE ? true : false,
- minify: process.env.NO_MINIFY ? false : true,
- sourcemap: true,
-}
-
-// Let esbuild generate the build
-let result
-(async () => {
- result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-
- // Also build a version that has all dependencies bundled
- // This makes it easy to run tests
- await esbuild
- .build({
- ...options,
- minify: false,
- sourcemap: false,
- outfile: 'tests/dist/index.mjs',
- external: [],
- })
- .catch(() => process.exit(1))
-
-})()
-
diff --git a/packages/rehype-jargon/data.mjs b/packages/rehype-jargon/data.mjs
deleted file mode 100644
index 390ad93d7e1..00000000000
--- a/packages/rehype-jargon/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = 'rehype-jargon'
-export const version = '3.3.0-rc.1'
-export const data = { name, version }
diff --git a/packages/rehype-jargon/example.png b/packages/rehype-jargon/example.png
deleted file mode 100644
index f4c8c76162ab47d59dc8ea0a488b8589b7cb669a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 57644
zcmeAS@N?(olHy`uVBq!ia0y~yU~6JvU{c^M!OU5{VK&b;HXyL#LpAsBFCH5b5Kz5
zNXO%30e1mbd1b*`hr%7v>BlZsud7N=sy=V|N`L;J3-?#;dYxUqcGatU@8#q6&$+yN
zO;q;PU*96PUfW+?{a=6q2Byrf7yrTw<1sk!GC9IIsa+0mg$^^71Xy4)0n0d87-5_#
znxk4^VKFpAtXBM+YFx0c=+vJ{tIxZ}|1aEn{lhKMwez1^On6>9?dv?N!_})~@9{g<
zeaLZ;XkD+zT-mA+u&;Xn~kmrPkpw`YUQdm(^mZw%gpQd3je>uNB`}Ko3$6d
zNA$gT&h&6$8DHabrjUjF%m-u|7dWYyEj_>Fb3o6DKWi6N+fC~1>oD2A&9gXr_LVAG
zj$3jQ{a0q2n`g4+H~P-lbLw5hw@PV~%FtiUCyMIK6e1q3KJ5@Ub;prbop0_-wk->^
zJgB3B%LXE|%}+Z$I&(^J=MH%DUyMzkmNS>nu6GWVP|4*X6Eh>zeDIZF063
z=iuL3%wZ!wMdRW=^;!vrIz@qyjwAbewr!W>3pympacS2C{kN~Ito3gfuH?Gea`Iq7
z@=ZRa(?4%ED70?WW3CL%dN(cU=AM;nCa=5Ne&GE{-BaP58{f<~_j0z{as8I+<>zVF
zE2rIkxb4jTY`J?A^KW@B`CTiSl`eEt|4VV>h5+mK1H}imRd0V^!q0p_ou#Skn^yGS
zSyvbNDsL(+)xMuMXV@e`)g`uJyY^
z|0dkoc0SN0dOg?E)ge#6oS*yb?%5`n%aip@3nS}K{XhFSYki1e=OgZ4I~^jXWFJ@(
zGynDPP`+CKUj}lVsrQ%;Dhq^cVbab#yFcFlZ#9#n7zayj`FS>$&Xe~qImWd{JcYM6#f3jVVyVK0=4j(vJM0*`3h&3wIPyM`^(J|@M_L2$VsVXhZW~aheYOSfS
zvzd7}Xz8kY_c*5dzW369V-$2wnI;6SJI{LD>BjdZ{K4lcxmo%h0xoi}WD0V83b(YE
z7En>E_hzpQb#t;vSX?u8)uCU{chy~G_`7Ps#q+F(7R4~DJ^d9^pwj~K>C-t7H>|zk
zaG`yVYTVP0FRw1|ux(uM;B-&CF*nq(@cot|7986P!a=gi2N^WrBQ?X9)kS9Cj4bKU086{RZC
zt4|x58*3MTKD}vQxnlXO+Hh}efiGJ3{mN2OGaZ+ur={j)2A7?e=i)!1D);1#LG|93
zKT{)b-kAPax>WYmr^;>VJ8kYvIr=l@X53A?N#4zedAB|-xVt)?d-0LxId5}Mo%++{
zb6)4fqgTshcGO*O{$5nCc)WV{rb#Qe2R(iE>gMG?m#%qV{(O4VroH;d!>^?}`Nn?J
zx_|Eb=I@hE?Y=uX`|j4$_Wpa;)-z?7hdj+@$aOu*k#JzywwlVT<=oo+zoq2v-~Mji
z8C3W5Y=7Ol_}Zz9SZ|cIDEIQ5Di5q(BUBk*bD})`?~5d6wN;mP-zaia(70cI?LBYm
zh6PuC8N_{Ow_T<0G;_P%lcV3i{9B~J($p2^pjvCHJ@Hi5$`zfbcilbxqeSubzxXC2vB_!O)xOUsUT
z*S4>j|0=fXcTa8>$~9f7AG9i}IyLF>p+)yL>09fEXB*wRnG`2K=XdCI+Y=xEbhym!
zd2hZlaF#WDYEtHXqZ2Ee=2t#S{VVLVd$B=$_Zt7hpZacZ)>rp??RvTV_JXzL-kCo?
zEqE`MQ}_G#y44T2)aU(M({^kBshO9nFZeo0bf1ZN{%3de%-1HrYrA`-rq=2ok@O8x4wZ>3!Hbf10Icl-4W5+41G
zX}kXP(7&DgbW0@88+4lfG@P!1lR2!gt2>
zzSds+%k1SV`H2@#o;R|RnZE7{!@`C2!FuL<=1j1j)Y)g2nU_2H*)q4YPwMAhF<-*%oVmt-pO;A}Tj}@w8xh&3O0v7JWWBT9R;3$#_$0I3
z>ZsjI@+)H0)a*}RaL`$9d_`&F(m!n9^O6JXwr=y>yzb-r$+y1zzG$bkn=SQyk=m@k
zwaW|Hm5bkA+vXz|X1dk0INQbT`b)BKPk4lJ&MX@4ddX+^+iWji9^@?;OK^DbK8Pn))vG
z#VPII^Lj<6e5>VJzHI*Mz}+vr|FM~#`>^SKz>YhgVpr?lZ~wh%-)+PgEID+y^pV_mw~P-g~x2N$uKyYS*{ot4G$#ocaDrtxc-!``X2~!%ttDdQ$oE$)DT5^H=V^KT+|l
zxcR>ztQK{?jGCH($z6
zUwAERWtRMuowjGY7944o@hM$uW%-M7&8l5*ZU^aHUYIRsymI+{`zLw%F?LsPl<(Q|
zJb2!h9`8LXqoj7(Kfi8o{O;9!gDuwco~^$AHFLrH9o6f$t^AP4&A#-hx9fdfmY-{1
z#fEG9++JmKqASfccdBQD-gWP)(2U>dk2!rplUbM6%9mgHQoJ`${OZ&Eg2z0iwd}|9
zWTw6U9&S0iKUIClnR}(@?@zyU>U+}fi|d#jPrXv_Ki&HHdDXPdKO>CZFq*Td_V)
z^y>MA@4kyEHJ>0^Co-aAe&Us-K%)9c0Czs_;r+?Fid
z6t$|#%=eT_)uRJxpFaL|zBjLIiT>S_E99r>&h~u1XVX19J@&T$YIE1kVqCLnm(T92
z?k@Wx)~QuZeSF1Q!bjmmyUj}z@9T5QudMpV>AL%I>b_Mg{F`fz-{roV5R>^c=xRB)
z-TtY2UY}~s7E+yi?Pb-`jMqVX(<9&K`%L9sY!hM;#*wLTVt3uT?{Aax{zYwdmpc-u$M|b?K^2
zQLApbr)Zy8A3OER`Na3%cZsjsm+pAzYP;dCedT`-en3RXtnZBrj=yz0n_jJJl=9nY
z@2Phiwk_KFs>S;Kk-M2nr$wjs3T?kFr?zo^OysLg2aAqub_kg5Gbh5PJ
zmDRt0R_MMvi)~%HZ~ZslMz6OwzkJWO6)ZAa`IqU~GjI93n~$b^w3|^B9-?sK;Dbo}
z2Wuv0+`A_1xvPA8W(=Q?Ra|=T#FTk2?X2gS{!IB3TE;%9`T9QI&sC2(
zIXT%(^6P?sobJ0H$L?FT3LN-cmlI-Ae+Jzw=eF7(y65$))?6Xi`_HcP-B{DNH*!LT
z@79nj$5Zbvh|!SMZZQ*h;%oo?ZLI6=73bq`Up>F>llhFowpII@7w><&t496ziLGky
zckTMVwB*y?8FgDOZjL&uxWX%c{pr@l&%I*O%T}#;`$y}z-Tcp)5p6c>=O4cRzEs<%
z_WYriwfvLoYuEp3PJDG<kk>9%jZvrSi&-|D=)|BC3>
zX1;gIwksd3J6LpNwL`$=9bawl>U&RLrYL1=@+;O)&eEpDe|vtt@A`)f2i68vo8A3;
zYfAs|-ng?ZvF}!ytWGc9q~!0rQ(H|S-ftzNA+
zGfsBn`xUBXDsl5yZMTtRdHMR>pXSoFr+#(3bjh%rT6(j!=3-6k1)Dv=kLJ!#`gElG
zm%7f|zVM%`HrVNQmfP%~!(uHF9=T8C`(37U`S0(S+PCBjx$Z7?clGrN(-B)Mvs~=3
zNsp}L7haL++c&T^F=zWou#e8ajZ>M*K)S)zB#cXZPU`gN7Zhbi_b4!^-tEl`oaDeOwzhW
zPYyC{y)y6Y)xYm}U$KQPd!D(s{zPm8pZ{z&30Je68SVgEwF#{AKs!l4=bfC69e{jN2M(ORjWC%Mt_I=+=nH6j)7Ix
zv3hUjy-o{$wDPn5toHARH(&7f{2RmdH?G|2@^_sGj^76FUp=4K^bV1d`rd^2YiGN#+nv61Y+?-CUL!S;%18VDac;T$Q7K;Z`truTkM%G@^0CUP>}THd
zQ|zSjKTp5MwPDrmly2UuPj#0xD)^tCH>u1p-Dp{9OkeM(@~ziH|FM~!3%F9gAvELX
zw_jC#ub*E!@xAHyMakCliWQUY#ZBk#eqLo0KSA$o64&SA0Hy`2>hv1x)=MvZSuLj1
zQ!7z_tgi2!Yhb;b<-Pb8mc|8(L<2nUzdt>_(Xo?X|M`Ej=L_z)B`#0*eByHX_WoV}
z|J-c;U2(H7U0usbf@4#@fUHRbTf3q7q91F8z24u9xw~FZz(k3C+WD|wjS8=w!#DSB
zom?FjZ+~~ar_W|C_x<8OGK;ts-(E9Oe|%}q&ODcW8S}qtemxrccfm<73&fgWM=jo-S?(p6$8obUe^PSwpmv6KG?-$|n
zows9sJyU*p*V*u^xvm25D;S-OK_$eL?{}Nd=AXY`8sAbZ^z?0(;!X*jsdhha&x~3A
zi%l$j?FzkoMP8Q5ux}#Ux@R7(d->)phgv)$bBsU13@H
z&td-+m!zr##-$T?UVH5JY40|>J67pSi&KyM3V2?`#j^Bn{E2Iq(qF#Lxy&oKHOt!m
z^tz+}KHlRBo;M{yVa1J_(0gG&{`QHhnKXY4;%8xyV)#t=o_1jl|p1bCq
zd5W<5Qc;ee+j`IP9!FeVd;i%pRoMllllSlIHx5}ou{Vf^WvatIVUD72F((Vtr~Aym
zbLwM?%l4;%_sclKcKr^tZ{K!*^@=_1x)C4#DJH%>+>-jnUEze2yeD;TGMjd}|0PCIVb-TVb5i9wW?h$=CjQ}CLH_%b-wiJ_URd+TFHbUL`uBgY
z+5XLBX1Y8%OlSh>FMEX1&+_m8x`_Xn{20ET@-)eqt0vF-k`up
z^@~5F!&7fw{}s
z{O0+KxP8;tKHPWtyZ9?X4y{?o8x@|i^I6-zFw|);leUdN(751^&8u&(Hh6vadVAAL
zUtr4`&GK80b2l2lT{8Q$!-UP}Gvre?Mo+dkEu6jfmYM0xNmkrSwH+0{>(@MgCtCd}
za{tr|Ki$i$m70w;OG<7h-QX#^Z+~RFLjcFCO~*f*O1`?l_TiPvwC%DJm=>NAR{!e%
zq4H_wzF!x^e*Ekc*Dz@=och$e^1kkkKWYL`OlyC~TW^>=C&Pbw`>%?+xL=X?rhKct
z^Ks7`%{=kRU*aE|@+{xCXLtOxbyAbduWHr*l}rCI$?e^#^1$=&!~e>B0)@^Jt-X8o
z#MRDUo%%cG`|L~0ZS_|iUVb!Y*-Md_zcO8Q>z%>n%$!<@r^WvBzNbSv`J7CSuAeOg
zrtD62*}J)MSDk3k+=KHTXZmelTs7fn-rHIps~!E}H)S)v80eZD65-G?=)ZT*{z=~N
z)koObRP7A3+2v#u;;HGckYPESZPNV1>!
zQ|I-pUn{rOyT9W*zI5TGoYv>A_rjcBGM|!e>tFL;|9NrJZ~Zy*QunI=u1;-KSXz2>
zbB*=>37bE&|K3x5YvK;I_ccH7ScOzRTJn$6d-vl|a5(;g-~QCky||Y}@k`(#e^1y>S75<(+F`Il4wA8QV*bua@D-
zKF7OKev0m8@e4n9s_b&iO6~qDrqrqYS7qz;#s$AqeV1kiblTrN_3`9HnK>~hw$I`6
zKFZSe+veAV?cbwkzV-=!vRUl6k99aCtdH!=W8L{Q;fH7Sgzb}0PMEWnLq_J-+WUUT
z(q7N-sXJ!+@`kqaU)^c4%f2+2{^a976_7r6bJ2q6he5h$CySeXUlwn7l))+c@<)KYWN+H$AVpFy|Fxy|;6vNy%enqs4ILE_Kfit~Dn|9B~jpSOSY;OFM(^leXjng6Vse|XOOf2>VcmVz33Ka2OCx)~Bu
zA9umc;W?}3%K6@_@4s%DUwi)jN`B$Ko$BIWH$N(D&EB)01Dty81g6~SzxL#V6s(lZnl`X>!}ygD3y!75cma)SCn)>F?~3Z`PE3(6c-JZo{{PSoO(@JKHB;
z^GtbmXp!>D^V7SQIo>Qa(YSk&*K6`iN%QvxPuH;c{##pUx#4ZZi|~2jTk5vmv3gkO
zFMTCQnjI=b|LtIg>S_b{Wqxd3x+-n2grx
z*{48ZKHYZf+eO>{yi{8?=h@`Qf4{8GebDZ`Gv&SM?C+1FmRSewH=on-X=NQ>;lAIJ
z96{4TEfVwdrP|$hXX&?O?@BqRmhnD!zMZe@-YuuM#boi8+$nbEKcyd79NunH6u573@N%`=g|;W&MX3C~dVHa$)bAks
zcJupxd08}l^4Fhko&9{*_59T#SMy|5LQCsreg9g#@@w_mpBKOXk^60M>e;-SnZHZS
z*FE^l`|fXR6-yJ>#2eEuelyF=^Ub22>`0%mk9%@!fGpko!HHirIeOcY>amS$Px7PI4
zg?GKycm3)p;q5tn%L>Y8Qk5vm+xisH_!B{6)#e_)FQ?S+zIrd#sT;fd7t3GQ?=$mXH58sM*Io3p
zIxSjLV&~Mab$?$?U3F~+kFV~DN3UkB(K&nSh{JS~kTCDu@8L6FT)U?I^Xb8TZ&d2-
zQ$E|gdbKI%xOU~<6<>VyPMrESQD%&y??iSW9{LpGrrOBFaEC7
ziNE(1)P}ad_x16{Ia5EI7Dno)2_4P+zsFYX^32eM=T2pB`k%P{*PXTLk?%F%^%$o<
z^^Lr*&XaoncG<<4b30SkK3>N^lRs(B!+a^xxPATn-&1Q}ZvK+Ww}0Dvc~CP_^M3bx
zcX8wP1$ukC^~L#TRULk^^VVXciFW%Rr$zn>%Jp_WC%*IM{r)FDt5&_Zyu2dLetO(~
z^ZEa4&%a;FFMI_&uABIn>)!o@UveL~!PCB`@$xq`3w}@9vYb0|{+YQP*H-7gpW4aW
zyq?48+t;bhoi8T+JaX#p$)+RLQoa9keP2G(`Nl!hK&z8FSMalkYQya}5
zzYaI^Dlw8?d+lv!{_j2fn{MPzw-c+jwvWC2EHE^9I?q}8N~6Yrtn<%a)qM^-E_EVj
zc9HI7*|PJ`E-q~N?*3`%@g;ArmY;m#R@AUCd(GBc`%gvQEA0(iV0+@APmJBnJ?po=
zEu3kslMt}>ZvVBD|2Bqi7V`WbdtEsAe36a4hTvwS$*c7DsTPG9%oiPd`eDS+rK|`jsnz6aPit+_iDmhO6&3-`8+1dp^Cz#DCAK`lg)nJ!iw;
zzq(wo=kd3vzU4Po+}!*vU&{Z+&WzXH3%Ar%UIJCCe=DxXpWE-{a`~QUEyMQ5|8{;m
zotXY~>!M9jS~58kA5Q!BW`7g&oK>f0Puk~iacbW5w~IvI*8QF+x%_tb(`W1VKjztg
zdBu-UvFf~Ym5s_DZKz+ftBx;lpZNWLy*fU}$SUzry)UTyWJY
z|M`y!|Hc&ky=U|9yY2qzc0K!x{kdLsHysn*v;W{%+Xw7Sj;fC%_590HY9Vu(RcVf5
z=4DTQoI1MvnOwylt4V9Grp}x_bLz{Vsgd`szdlbeeQSFs<9(u|nEAJ-Z{p4>UVryF
z!+y5=XYNfqb}6$z=jY-RcyhDpLq+kd;D7p0);;)?zfsijk>fegbdufIb?fs^<*i&=
z`Y2M5zdS`XIIU@=zR%|%$JlR0^}3*G&rMq0I))%^BUbC$G)h%&Za5cYO2wY;lXm
zuv3+f(&K*4T>o>0zwFc9{<(W^eG={47d>O|9hsA-{xs?2iQB!5x^zjn=j+~0abL2$
zOrM^;z0d!|l#tyL0k;KbnVizR51K{YsDIqNb=v!&mGe(8J--0loW2)uZ@GV9pnd)M
zzj51Z&%fWtzqsf7*Vfs4p8h?1w);{={X>~X1qP0m(|flC-V+kP$(*ZwJ0+w469dE3
zx1oK(zb~8f$Qv$TYbbJ}S&FPP?n$E0!cKz+k
zUHi3)zbP^-m~s)SM;xZ-o5Jp3Wuw{`9~LAtICOe!{c5`RSM!ni-%?j-R=y~nlk3i~
zzz5l)1Lp2V7cZ)vU7LI9&Ml>_Q*Sy1gx3Dr@2;}X@i{X?!=>r5UjlC%DqUWky=l{z
z&_{1i{(YXk`}&jU2j4ju7#JQ@J1B54)NI!OI4kGFai5ZxW-Q;i7#O-1|Nj-fdfVsC
zZ|;pNFfq}uH^~l;evhPluy3};$?3q({{>;jmd#8xO5Tqtvkb?d}rUipUo
zGqc@E@#YZn(aJpAn>7Bb23y;lP#iMpmB{?En0W
z{HHhZ|NnTs`A^Mvb)IL>y!qFX~?pa3)W*B9D4>&%~ad+*qDN7C(~lpS{nApre7V16w4$xY>38~yJCIZ@1uYsAc@q0CPx*ht
zm;13rYHSVfd7(xmx+!olaD80Q`SbPui|gzDCq6sB>31>5J6?uAF16t3b66qB!L;DO
z+B2nL-mad%lT@_@|`{V{HA-s=`-rL9{#Pk!=B-w=GI@1snssg>q>71G&2Q89-_wl^e_jCz
z=3WX|FBwv@{$%Wh^OL^k>_2hp*!(Bvmg$Lq%D$&p^8C7YN~V-8M0=%C*^fx2wBWfw#EOuL+y%%x!-RsnRarc&}XgP$v6LGui*UcqR;SuO4Q#4n`{@YWoB3~
zMUcbEU|pK(qL(h=U-M_lIrIvZZ&tW?Mq#1%v%EER|Fxq3-sC*{?Bt*I?MwR?j8Tc5tEo0=aU
zo8bS2iNh=ND!DwmR>ouxD>Jw+aKJcEi>r+*}
z!S1LvnRn7wZ|9zwaduj_UGw^OrqAp3KZV=do#5a9-?Q%bcK=Vi|Nr=Z@|69bPqOQ(
z_}NO?=4h|+Er~yN=+d`+r`Fw{98`CueU~ds;LLqoyJB`8d=jA{64>UIy-3_3;8JPE
zj`_>CykZ9}BUI>i2(a{c<88BfZrEa;x2+H6<-GqHvaI^nl7*T|8&Asq6#MemVdm+X
z9%Zey=VyI&dH8o$No&f4>Cff=>6F^rd7OTC{^0%7-#e_B{X}o6?b1zNm|49(b(gZW
zpm1zez<=|N$Z>s|Fu~fYA*mPV^d1-8S&%71?XYaext~l#UasSDU0SW>w?;}00FML=x@6sxH(CWzs9VW+A
zhwXEHFYk~6S*B7Ry|;FDf7A;-$+@y?K_a>je
zG-qG`thmUJ3;RATwd1+CWPY_zUn^6iLd|)vU3|RXKTiq!3o3mXQUp1)nA0ccp4)zp
z>CcxfY8z+0S&;kg*sJgBH!b~HwW9Kq$&cUHD{6kZp8NOXnBohE6F;x2wJm+SH@Yj8
z`Ni7!r)S#tzx1w^SmbH{eTED-E0g1oc~eVdrQSW)T>GmLv@-OBlE9OR(|>bY-n%_z
z>QYu%)el`vwrowfgi)
zBh$?a#j9s;Dy>i~?<|P<{PC5?HnVA|d3KS{u7CG?I{TYd`{SEy@6B?1a^O?dt%ELe
zzvPNcDD%4XCVghy-^G8Pfy+zw%-er&9_PHDzSHLB^shd9Hz{@WTB?&nptsvqS=uh*9Bv#g5y+Y%D`zfWy_{L^*k(%S2^+h*7;u-rcbW>
zcV%&voo^p#9aw?-@4RKd=ed5h6^Swa{;PWSCZqZ9v~y22uG$kI#Nl=I`N}VvzxD>r
zy|*mx>Fi~79?xA5mhL)!{^9u@uOjvM%_rwR`_r^0NB-o}qv3u1;qEK#_PKvu`N}3p
z#6ok$`4_G~18%DA(D_|=h5z1OX0f+{7rz!x%#BU>D$l@hU!Td*wPMe$=|@jGc5X|v
zZgyK01zyK=_~az^$Tw#HtKD`@lY8>^Z{#&o;qaNv>-gXPf42SSx+`K9X|nmv+1L3`
zl_*Em{A8u`A
zD=?Mq@cx4ktRPx0fBjFb``^-*uD`qF&UF`+eN%MamwU(F{C{t6+TN?t
z=dL^Fu~leY(s}9oFYj^xC+Dn7pWEf-pS16=ePQlr_{^O+&L{p
z_V3j#eR(hbXtA@-O@HEEyFy1`Lsk%cgo)(Imek1x3=^2RQ#2>*Sq@7Z~K0AZnoUwtsz&ocwE1-Z{Pl^{rd5{
zqBli1zWP)fbImsXPN0vRXw*N^uactIwDaygf3i2`_BKw@slA_8RtM}`Bll8#+s_dD
z6*Hp^vikR|>gVQRVGaAw$iTql$XY$&s9$coj+(P^_NJ}nD(vd+MH}{Nb_Xk8nmW^E
z_2g%bzCWLxyl*#EUl!D+R6FZ?t1oHpm2J!Z?e?4QGr#`C?cc3F<=Z@+C)XJyn+AUU
z_D?b2-&!dDRM~{b)o%Mw$L(Hd_w~%&TgGvIPrcKB)orQYe{Rp^3OntK*QPx&Ep1*n
zLnkiwM3TSvx1F=2mRwt4{PJX0!TooS9m|#{-PF%`wOD9=%(Sn2l`So7Cf$8&I`iC1
zlkn0rr)EA?nREQQ&z)1h3S7eLvZ9kOncL_IPoAGzqA*P=#KbG-YgCyjv+C`&_qN3I
zTh7}NHZe`ge*dZW|DGwPKl&W`?_GLn>FLuyH+|Wf_I~@qp=e%8e(xv>9?W(tt-d88HUXcv@ZX$esTJtQi&M!SDrvEgJynk={
z-MzArGp|fpe5#{HQ;FkQu9ZZ!P2{wNd}m!;s(sp)iKV0_yO(|cmRh?>dv@BobGNya
z*4jP!_#u0n%{BKW`9+Rl+rB@2@F9ecuRNvp-{vDFj+(g}c3d#Km@BFM<-NpIUSFwe
zE-Gebv#ai<>@_vNsXf2s>Cq?igsd-3{~5dZ$oDT#*R6`Xtd{-y?L6P_=^K6q$;+K=
zQS04W8FV{k$}z*kCg0XU()8V93u?Tk?)AAFaCt`Uwr_%m%RW4opw&oOI>PzJ3aS>%*j3C$J^aE?cS&({5LT6
zUSw|d)3?PHmg_dX{-5&s(we>;xqJS8o9@5&*mG6wezbea_069zb)8-8bb9~yTDSAB
zMfq>HMCHyd*rEU0J3e)VvHFecdHb%en)S=^>K&)N>L;nSZ|np_V*au-Fxlnd9szTlp|&USDA^tT7!BpfJvy>?6V%*!PvYt>)GKh4ov^!kKbE|dFo
zJV$1mrdkBx5KR|;Lb_fu;0?x)vR-;q7%HGP}#?O!)9Gw+#t
z*Zq;xvt654zmck%=DR(y?RTeJ42-EaHqwIl!Ytg9F2@~N#0T@pEOerk!E{l}ZzesA7&H8cFQ&}E)FrOEEc
zR{x#Xm$FFNx-e1Pq@wz~f{`)cWkBE7$g)3OJ|r@%U<4
z$*b$?)_0y<^m=_$%{qSWyKEkbwy)+~KDqIVc*E4IK^L!R7nf-t+xouis>41O?|*Q5NS1cAidp@v|M^1KHyKT^&0oD}lk20~a1u3js!eJqr}c3RuJ
z^_$k+eWqEc&Hj1stOFHWO?ci%?-%yEbbDsL_r{#v25Fz-_SB!ad#^%GAXkdx(;v$#
zy{kWc-UL}!xS91DcwJ%k>BQMRa&f1<$`^-hJ(im1zd3Zd59wc#H#1A`|^6W6qNYg|*$<$b+>x$jGA
zm=*u2Y3Zwv*?n=GmAAY-bpNSq4%>=DuWrt~r@1$B+PXQMr`rrydmeoq(taUHN%#3_
ze)Y*6x14usYpq_o>hWfo8A}%H`DQ(umlwVGnO$D$UVCf9h^v|3k9O5*FSy0Hm~p}N
z>owEvCZ64Vz2xMUt1VOWHatr?@J(wsb1&cN8LLc;%gTSQ|8)Dl{fYdve=7BVzteC@@~Q&DJrrI=wc>4ZHI4@lp$xBkTGtDDlUCeHq{cGmiwE4j%xb_P6Y*|4ajV*k|A
zvkZF|raSiezMB7d;~SO6SOK#STVDB3KkL@{-jYXRc8+Oe#OxRQdPKjK%YFG8c0Ap3
z+aK%oMH9}sPd0m!XSz(=UetH*ri#=#ZTi)-9!$OZ%~I^oYJPjJIbVXK`>md*6uogQ
zJH99=G*UP8t@5VS->RMeZc4GOQ9l-UZhw}T!d1cvl;ajc=We4AdTl(2fE}YpYa{ngu$apEHe4CBX7QJ3`?9)qYrbVXoH@PnN#W1(tLY&j=l*60-;+;Sy8NP<
z|J5t}tL`yQ{kn0sL%;-3o6bX7Af)B^Y;Mcq5{~bipUE)&?$mqEWxwWEkag!(JMHOe
z*YC^bO}wMqyQ<3UtaaW?zv$QLm(Rca8eeBI)8&li@rBF0pXpfr?_a%l*8OAM@oU%p
zu-mfw|D4*l6E>GNyelX$y)XKJt&XYPJU96&;)35V-`u#M?!v7}R`*Z+*gjo)^QY9Tg$>0naZit){5|b+sEhOY
zO;0VO-o5VO|68UvRrk{N#L%>2=83HH9G95L&U>1mvs*Vgcl*`+txxYBO!1tM`E|?6
zo43}S{-!;3`di1$75Nii^aNIiSImB~4ivfjbTh-Gtp9A%{hS)!UT9srU@fy&w93BR
z!1B1WUM|KfgFF;YgtPkmTDi`B?&g^?-ZAO>>{h(}lO=V*wBAhp3!fr~dNSq|4_!ZhbSpGG(Dj?d+Rs!s=qFp3)xMeptV{bh}eo@+`}5*(>(#k1yT1
zqI8z6bkC~i0jBFNJx@JSG|~HAlm6*nvD4qT)}*e~>))gM|J|>iQ>S+7=Q?fDTjkrE
zI+wL+&r10#dzrOfCqHjoknq}`fnkE1!U^&9o374(dtyf3%xAO84g{!w%ze(dO#JLN
z$7Rnq&QVwIU1gP)>biT@%D<~UA871;wX*V3&VwcYrB41k-T$PRFEi|{dB1FA*#!Bm
z+Dm31v%Mqbcd*vxtw&6;ulw9P%g?^iGFa@m>iP9EoUgXrTATEL!XD@Jx92n}ZwQfZw_5dS4Fq|1&+U5Rh2fmgbtibh55$
z5!1wV=M{qH^Y!0uzUf#Q9J6hW+8m+ZH_MmQxs)BA6BfRCmgs!lOWOm_Obck;)|q!Y
zg0WtG`Mp(d?-za(y?AoXkzL6`vkiAGkDht?%GuB|MxDE_Zt49NJ?>a+`*Qg{xzck<
zMQ>hu>?={bzccOjuk%lC>YQ75!7Kl2bYP^eD5%-K#Y@&1{lNYg~Nh$>OUCC+<#{&wnp(xq8N1_NblF-zv6Mc^s^L5wX!BsVcxF3{~S)d&fX`}_u||3GO-gi*J^E3qo4WD$v?eB=`7Rq8`oJSwXNQ6
zTjz1|X4Cms0qJ)aTs=E2a-QAu)^~GOw*50@XFsrOy>W@-wWby$lN)FIb}m0>n<00v{GR>EO0(thTVIL&4cT_$
z!oo+{vuysWyZ>!tkGxV_`u3ps-8kQt?>Dy2v=%zQr@L3^{%1}8*poLGt=beNW#yid
z_xn(6{ekx9AF5)WYUzJx+x$K9a`xW6B~HIxSBu9-R!wn_14qr&r-z%(4z4y_`21`0
zrE-VV+BXIQA{C&9*d-1Y(Z?^rOa7)VIaeXdQFZegPuQ$ubLGSS{!83#_3~*!%q;E6
z?dtdU)}Ofju;ZC!ull}sVQaT<@LU#oPGwQE(A4ml7rXC*$4y5;M=&yUtyhF6bU#|8x%jWbqgKq9#}P`|R3v
z_Nba{-NQf!t2>$7opPkM$Ie_Gdod@LUCTrJ`n=*-GjjG`ykn^${Movw=CMvjP{HgM
zn|gNsx6a#ss>I`aYyaPwOuMFTEsM`=YrO4gFaIj=`6u<`a_7aDcyB&*>tBxb=k(Pp
z@=wkdF}V`5yn6kvX>wQMENIvpBZvd*AZ(o7@?<^yS+NpcRs@
z*H7Ow-K>+ZX4=kP<(*ric@})K6zN?Z^K_|Rf?bBN!S!phx<;>#md%cPGV%S>`^!H)
z44?g=@|VR5`6>HAMOu5~0)s2{3=9t7=JC6iA^S=)tkg{fU(UWYrFk`bk__yrFmg`|k^^k5?HpPMCgV^PRgfr*EFzw?_Z$sUr?Pc2}SCaAhkA#hY?uRMh$Y
zJ-D-P`>oSAU!ASm@a)kULD5Vxwq2Zevoa;hs@{2>%W}V*EB&=OEI(||?hhqem*>uU
zaJ=EL!iC@Mzpb3VZ(Y2(vp@gyEY6~4&j-gt-_8s(Gm=+dK76&v?Cma&Ug+yv@%KJ9c!b4
z{-+b)KfMpO{Jz%rgH^2zThkP9Wz&A0&l{9oI9NoVg^G);SkV(9FSJrcAmqow8=k*5
zvu;^^Oy2xaP;{g&@2$;BLbuM}`h33iM2>!l{C1m$pn8SvlRaJjE`PaA*5Pi;?7v)@
z&qeMWzt{0vG=A$_L&;e;rx