1
0
Fork 0

feat: Adding magde, a bike messenger bag pattern

This commit is contained in:
David Clegg 2023-04-05 21:19:56 +02:00
parent cf599fbd93
commit 65f86a187b
19 changed files with 1821 additions and 0 deletions

View file

@ -35,6 +35,8 @@ packageJson:
author: SeaZeeZee (https://github.com/SeaZeeZee)
lunetius: &starf
author: Starfetch (https://github.com/starfetch)
magde:
author: clegganator259 (https://github.com/clegganator259)
new-design:
exports: '!'
bin:

View file

@ -63,6 +63,13 @@
"difficulty": 2,
"tags": ["accessories", "historical", "bags"]
},
"magde": {
"description": "A FreeSewing pattern for a bike messenger bag",
"code": "clegganator259",
"design": "clegganator259",
"difficulty": 3,
"tags": ["accessories", "bags"]
},
"octoplushy": {
"description": "A FreeSewing pattern for an octopus plushy toy",
"code": "Wouter Van Wageningen",

View file

@ -0,0 +1,9 @@
# Change log for: @freesewing/magde
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.

296
designs/magde/README.md Normal file
View file

@ -0,0 +1,296 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/magde"
title="@freesewing/magde on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/magde.svg"
alt="@freesewing/magde on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/magde.svg?label=License"
alt="License: MIT"/>
</a><a
href="https://deepscan.io/dashboard#view=project&tid=2114&pid=2993&bid=23256"
title="Code quality on DeepScan"
><img src="https://deepscan.io/api/teams/2114/projects/2993/branches/23256/badge/grade.svg"
alt="Code quality on DeepScan"/>
</a><a
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Amagde"
title="Open issues tagged pkg:magde"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:magde.svg?label=Issues"
alt="Open issues tagged pkg:magde"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-104-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
alt="Follow @freesewing_org on Twitter"/>
</a><a
href="https://chat.freesewing.org"
title="Chat with us on Discord"
><img src="https://img.shields.io/discord/698854858052075530?label=Chat%20on%20Discord"
alt="Chat with us on Discord"/>
</a><a
href="https://freesewing.org/patrons/join"
title="Become a FreeSewing Patron"
><img src="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"/>
</a><a
href="https://instagram.com/freesewing_org"
title="Follow @freesewing_org on Twitter"
><img src="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"/>
</a></p>
# @freesewing/magde
A FreeSewing pattern for a bike messenger bag
> #### Note: Version 3 is a work in progress
>
> We are working on a new major version (v3) but it is not ready for prime-time.
> For production use, please refer to our v2 packages (the `latest` on NPM)
> or [the `v2` branch in our monorepo](https://github.com/freesewing/freesewing/tree/v2).
>
> We the `main` branch and `next` packages on NPM holds v3 code. But it's alpha for now.
## What am I looking at? 🤔
This repository is our *monorepo* holding all our NPM designs, plugins, other NPM packages, and (web)sites.
This folder holds: @freesewing/magde
If you're not entirely sure what to do or how to start, type this command:
```
npm run tips
```
> If you don't want to set up a dev environment, you can run it in your browser:
>
> [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/#<entire-url-of-your-fork` into a browser
> 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
our sewing patterns adapted to your measurements.
If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/).
Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
for parametric design of sewing patterns. But we also provide 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 create-freesewing-pattern
```
Or, consult our getting started guides
for [Linux](https://freesewing.dev/tutorials/getting-started-linux/),
[MacOS](https://freesewing.dev/tutorials/getting-started-mac/),
or [Windows](https://freesewing.dev/tutorials/getting-started-windows/).
We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that
walks you through your first parametric design,
and [a friendly community](https://freesewing.org/community/where/) with
people who can help you when you get stuck.
## Support FreeSewing: Become a patron 🥰
FreeSewing is an open source project run by a community,
and financially supported by our patrons.
If you feel what we do is worthwhile, and you can spend a few coind without
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
## Links 👩‍💻
- 💻 Makers website: [freesewing.org](https://freesewing.org)
- 💻 Developers website: [freesewing.dev](https://freesewing.dev)
- 💬 Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/)
- ✅ Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/)
- 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
## 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 🤯
Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions,
share your feedback, or just hang out.
If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new).
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://adamrtomkins.github.io/"><img src="https://avatars.githubusercontent.com/u/5709603?v=4?s=100" width="100px;" alt="Adam Tomkins"/><br /><sub><b>Adam Tomkins</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AdamRTomkins" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://polymerisation-des-concepts.fr/"><img src="https://avatars.githubusercontent.com/u/365999?v=4?s=100" width="100px;" alt="Alexandre Ignjatovic"/><br /><sub><b>Alexandre Ignjatovic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bankair" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AlfaLyr"><img src="https://avatars.githubusercontent.com/u/39273729?v=4?s=100" width="100px;" alt="AlfaLyr"/><br /><sub><b>AlfaLyr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=AlfaLyr" title="Code">💻</a> <a href="#plugin-AlfaLyr" title="Plugin/utility libraries">🔌</a> <a href="#design-AlfaLyr" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://thelettereph.com"><img src="https://avatars.githubusercontent.com/u/357684?v=4?s=100" width="100px;" alt="Andrew James"/><br /><sub><b>Andrew James</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ephphatha" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/annekecaramin"><img src="https://avatars.githubusercontent.com/u/38046191?v=4?s=100" width="100px;" alt="Anneke"/><br /><sub><b>Anneke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=annekecaramin" title="Documentation">📖</a> <a href="#translation-annekecaramin" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anniekao"><img src="https://avatars.githubusercontent.com/u/1550506?v=4?s=100" width="100px;" alt="Annie Kao"/><br /><sub><b>Annie Kao</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anniekao" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anternative"><img src="https://avatars.githubusercontent.com/u/81079850?v=4?s=100" width="100px;" alt="Anternative"/><br /><sub><b>Anternative</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Anternative" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Quiltmaster"><img src="https://avatars.githubusercontent.com/u/71795777?v=4?s=100" width="100px;" alt="Anthony"/><br /><sub><b>Anthony</b></sub></a><br /><a href="#question-Quiltmaster" title="Answering Questions">💬</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arigrayzel"><img src="https://avatars.githubusercontent.com/u/33040950?v=4?s=100" width="100px;" alt="Ari Grayzel-student"/><br /><sub><b>Ari Grayzel-student</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=arigrayzel" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bart-PXL"><img src="https://avatars.githubusercontent.com/u/45118788?v=4?s=100" width="100px;" alt="Bart"/><br /><sub><b>Bart</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Bart-PXL" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BenJamesBen"><img src="https://avatars.githubusercontent.com/u/109869956?v=4?s=100" width="100px;" alt="BenJamesBen"/><br /><sub><b>BenJamesBen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=BenJamesBen" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3ABenJamesBen" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/camerondubas"><img src="https://avatars.githubusercontent.com/u/6216460?v=4?s=100" width="100px;" alt="Cameron Dubas"/><br /><sub><b>Cameron Dubas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=camerondubas" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cabi"><img src="https://avatars.githubusercontent.com/u/2596253?v=4?s=100" width="100px;" alt="Carsten Biebricher"/><br /><sub><b>Carsten Biebricher</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cabi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cathyzoller"><img src="https://avatars.githubusercontent.com/u/2120275?v=4?s=100" width="100px;" alt="Cathy Zoller"/><br /><sub><b>Cathy Zoller</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=cathyzoller" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chantalbijoux"><img src="https://avatars.githubusercontent.com/u/39673694?v=4?s=100" width="100px;" alt="Chantal Lapointe"/><br /><sub><b>Chantal Lapointe</b></sub></a><br /><a href="#translation-Chantalbijoux" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dpiquet"><img src="https://avatars.githubusercontent.com/u/4688628?v=4?s=100" width="100px;" alt="Damien PIQUET"/><br /><sub><b>Damien PIQUET</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=dpiquet" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.darigovresearch.com/"><img src="https://avatars.githubusercontent.com/u/30328618?v=4?s=100" width="100px;" alt="Darigov Research"/><br /><sub><b>Darigov Research</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=darigovresearch" title="Documentation">📖</a> <a href="#ideas-darigovresearch" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ElenaFdR"><img src="https://avatars.githubusercontent.com/u/5113815?v=4?s=100" width="100px;" alt="Elena FdR"/><br /><sub><b>Elena FdR</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ElenaFdR" title="Documentation">📖</a> <a href="#blog-ElenaFdR" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://emmanuelnyachoke.com/"><img src="https://avatars.githubusercontent.com/u/1908926?v=4?s=100" width="100px;" alt="Emmanuel Nyachoke"/><br /><sub><b>Emmanuel Nyachoke</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=enyachoke" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://enochriese.com"><img src="https://avatars.githubusercontent.com/u/5298929?v=4?s=100" width="100px;" alt="Enoch Riese"/><br /><sub><b>Enoch Riese</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eriese" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EvEkSwed"><img src="https://avatars.githubusercontent.com/u/39723451?v=4?s=100" width="100px;" alt="EvEkSwed"/><br /><sub><b>EvEkSwed</b></sub></a><br /><a href="#translation-EvEkSwed" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fantastik-Maman"><img src="https://avatars.githubusercontent.com/u/39785382?v=4?s=100" width="100px;" alt="Fantastik-Maman"/><br /><sub><b>Fantastik-Maman</b></sub></a><br /><a href="#translation-Fantastik-Maman" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.forresto.com/"><img src="https://avatars.githubusercontent.com/u/395307?v=4?s=100" width="100px;" alt="Forrest O."/><br /><sub><b>Forrest O.</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=forresto" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fmatray"><img src="https://avatars.githubusercontent.com/u/8267716?v=4?s=100" width="100px;" alt="Frédéric"/><br /><sub><b>Frédéric</b></sub></a><br /><a href="#translation-fmatray" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/glennfmatthews/"><img src="https://avatars.githubusercontent.com/u/5603551?v=4?s=100" width="100px;" alt="Glenn Matthews"/><br /><sub><b>Glenn Matthews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=glennmatthews" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://greg.technology/"><img src="https://avatars.githubusercontent.com/u/1017304?v=4?s=100" width="100px;" alt="Greg Sadetsky"/><br /><sub><b>Greg Sadetsky</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=gregsadetsky" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://kirby.zone"><img src="https://avatars.githubusercontent.com/u/75245963?v=4?s=100" width="100px;" alt="Igor Couto"/><br /><sub><b>Igor Couto</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aiocouto" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=eltociear" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Irapeke"><img src="https://avatars.githubusercontent.com/u/39604334?v=4?s=100" width="100px;" alt="Irapeke"/><br /><sub><b>Irapeke</b></sub></a><br /><a href="#translation-Irapeke" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jsawo"><img src="https://avatars.githubusercontent.com/u/1294706?v=4?s=100" width="100px;" alt="Jacek Sawoszczuk"/><br /><sub><b>Jacek Sawoszczuk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jsawo" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jgfichte"><img src="https://avatars.githubusercontent.com/u/1787162?v=4?s=100" width="100px;" alt="Jason Williams"/><br /><sub><b>Jason Williams</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jgfichte" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jejacks0n"><img src="https://avatars.githubusercontent.com/u/13765?v=4?s=100" width="100px;" alt="Jeremy Jackson"/><br /><sub><b>Jeremy Jackson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jejacks0n" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://jeroenhoek.nl"><img src="https://avatars.githubusercontent.com/u/683699?v=4?s=100" width="100px;" alt="Jeroen Hoek"/><br /><sub><b>Jeroen Hoek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jdhoek" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joeschofield0"><img src="https://avatars.githubusercontent.com/u/47668691?v=4?s=100" width="100px;" alt="Joe Schofield"/><br /><sub><b>Joe Schofield</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joeschofield0" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Joebidido"><img src="https://avatars.githubusercontent.com/u/39796210?v=4?s=100" width="100px;" alt="Joebidido"/><br /><sub><b>Joebidido</b></sub></a><br /><a href="#translation-Joebidido" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://joost.at/"><img src="https://avatars.githubusercontent.com/u/1708494?v=4?s=100" width="100px;" alt="Joost De Cock"/><br /><sub><b>Joost De Cock</b></sub></a><br /><a href="#maintenance-joostdecock" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joshessman"><img src="https://avatars.githubusercontent.com/u/9941074?v=4?s=100" width="100px;" alt="Josh Essman"/><br /><sub><b>Josh Essman</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=joshessman" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.earth.li/~kake/"><img src="https://avatars.githubusercontent.com/u/1956810?v=4?s=100" width="100px;" alt="Kake"/><br /><sub><b>Kake</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=KakeLP" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/kapunahele"><img src="https://avatars.githubusercontent.com/u/4116963?v=4?s=100" width="100px;" alt="Kapunahele Wong"/><br /><sub><b>Kapunahele Wong</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kapunahelewong" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tangerineshark"><img src="https://avatars.githubusercontent.com/u/70777269?v=4?s=100" width="100px;" alt="Karen"/><br /><sub><b>Karen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=tangerineshark" title="Documentation">📖</a> <a href="#eventOrganizing-tangerineshark" title="Event Organizing">📋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mcgnly"><img src="https://avatars.githubusercontent.com/u/5653631?v=4?s=100" width="100px;" alt="Katie McGinley"/><br /><sub><b>Katie McGinley</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=mcgnly" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.kieranklaassen.com/"><img src="https://avatars.githubusercontent.com/u/209089?v=4?s=100" width="100px;" alt="Kieran Klaassen"/><br /><sub><b>Kieran Klaassen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kieranklaassen" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kittycatou"><img src="https://avatars.githubusercontent.com/u/48165583?v=4?s=100" width="100px;" alt="Kittycatou"/><br /><sub><b>Kittycatou</b></sub></a><br /><a href="#translation-Kittycatou" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.krishoward.org/"><img src="https://avatars.githubusercontent.com/u/5946286?v=4?s=100" width="100px;" alt="Kris"/><br /><sub><b>Kris</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=web-goddess" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kristinruben"><img src="https://avatars.githubusercontent.com/u/17237479?v=4?s=100" width="100px;" alt="Kristin Ruben"/><br /><sub><b>Kristin Ruben</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=kristinruben" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loudepeuter"><img src="https://avatars.githubusercontent.com/u/38081954?v=4?s=100" width="100px;" alt="Loudepeuter"/><br /><sub><b>Loudepeuter</b></sub></a><br /><a href="#translation-Loudepeuter" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lucibytes"><img src="https://avatars.githubusercontent.com/u/77203781?v=4?s=100" width="100px;" alt="Lucian"/><br /><sub><b>Lucian</b></sub></a><br /><a href="#eventOrganizing-lucibytes" title="Event Organizing">📋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MA-TATAS"><img src="https://avatars.githubusercontent.com/u/125549564?v=4?s=100" width="100px;" alt="MA-TATAS"/><br /><sub><b>MA-TATAS</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=MA-TATAS" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/manufakturedelweiss"><img src="https://avatars.githubusercontent.com/u/38063391?v=4?s=100" width="100px;" alt="Marcus"/><br /><sub><b>Marcus</b></sub></a><br /><a href="#translation-manufakturedelweiss" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/martintribo"><img src="https://avatars.githubusercontent.com/u/1613442?v=4?s=100" width="100px;" alt="Martin Tribo"/><br /><sub><b>Martin Tribo</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=martintribo" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nadege"><img src="https://avatars.githubusercontent.com/u/3792171?v=4?s=100" width="100px;" alt="Nadege Michel"/><br /><sub><b>Nadege Michel</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Tests">⚠️</a> <a href="https://github.com/freesewing/freesewing/commits?author=nadege" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nataliasayang"><img src="https://avatars.githubusercontent.com/u/48160791?v=4?s=100" width="100px;" alt="Natalia"/><br /><sub><b>Natalia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nataliasayang" title="Code">💻</a> <a href="#design-nataliasayang" title="Design">🎨</a> <a href="#blog-nataliasayang" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://yergler.net/"><img src="https://avatars.githubusercontent.com/u/510875?v=4?s=100" width="100px;" alt="Nathan Yergler"/><br /><sub><b>Nathan Yergler</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nyergler" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nicholasdower"><img src="https://avatars.githubusercontent.com/u/9117775?v=4?s=100" width="100px;" alt="Nick Dower"/><br /><sub><b>Nick Dower</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=nicholasdower" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/issues?q=author%3Anicholasdower" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nchilada"><img src="https://avatars.githubusercontent.com/u/692925?v=4?s=100" width="100px;" alt="Nikhil Chelliah"/><br /><sub><b>Nikhil Chelliah</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=nchilada" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OysteinHoiby"><img src="https://avatars.githubusercontent.com/u/49735055?v=4?s=100" width="100px;" alt="OysteinHoiby"/><br /><sub><b>OysteinHoiby</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=OysteinHoiby" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://pat.forringer.com/"><img src="https://avatars.githubusercontent.com/u/136456?v=4?s=100" width="100px;" alt="Patrick Forringer"/><br /><sub><b>Patrick Forringer</b></sub></a><br /><a href="#plugin-destos" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://pd75.github.io/"><img src="https://avatars.githubusercontent.com/u/10294795?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=PD75" title="Documentation">📖</a> <a href="#blog-PD75" title="Blogposts">📝</a> <a href="#translation-PD75" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/phillipthelen"><img src="https://avatars.githubusercontent.com/u/298062?v=4?s=100" width="100px;" alt="Phillip Thelen"/><br /><sub><b>Phillip Thelen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=phillipthelen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Pixieish"><img src="https://avatars.githubusercontent.com/u/32991415?v=4?s=100" width="100px;" alt="Pixieish"/><br /><sub><b>Pixieish</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Pixieish" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.uza.be/persoon/prof-dr-sorcha-ni-dhubhghaill"><img src="https://avatars.githubusercontent.com/u/30624634?v=4?s=100" width="100px;" alt="Prof. dr. Sorcha Ní Dhubhghaill"/><br /><sub><b>Prof. dr. Sorcha Ní Dhubhghaill</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sorchanidhubhghaill" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/QuentinFelix"><img src="https://avatars.githubusercontent.com/u/5288091?v=4?s=100" width="100px;" alt="Quentin FELIX"/><br /><sub><b>Quentin FELIX</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=QuentinFelix" title="Code">💻</a> <a href="#design-QuentinFelix" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RikHekker"><img src="https://avatars.githubusercontent.com/u/31843274?v=4?s=100" width="100px;" alt="Rik Hekker"/><br /><sub><b>Rik Hekker</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ARikHekker" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://resume.livingston-gray.com/faq.html"><img src="https://avatars.githubusercontent.com/u/6462?v=4?s=100" width="100px;" alt="Sam Livingston-Gray"/><br /><sub><b>Sam Livingston-Gray</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=geeksam" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sannek"><img src="https://avatars.githubusercontent.com/u/17491062?v=4?s=100" width="100px;" alt="Sanne"/><br /><sub><b>Sanne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=sannek" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Tyrannogina"><img src="https://avatars.githubusercontent.com/u/19556565?v=4?s=100" width="100px;" alt="Sara Latorre"/><br /><sub><b>Sara Latorre</b></sub></a><br /><a href="#translation-Tyrannogina" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SeaZeeZee"><img src="https://avatars.githubusercontent.com/u/86711383?v=4?s=100" width="100px;" alt="SeaZeeZee"/><br /><sub><b>SeaZeeZee</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=SeaZeeZee" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SimonbJohnson"><img src="https://avatars.githubusercontent.com/u/2110742?v=4?s=100" width="100px;" alt="SimonbJohnson"/><br /><sub><b>SimonbJohnson</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3ASimonbJohnson" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SirCharlotte"><img src="https://avatars.githubusercontent.com/u/63847870?v=4?s=100" width="100px;" alt="SirCharlotte"/><br /><sub><b>SirCharlotte</b></sub></a><br /><a href="#translation-SirCharlotte" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.instagram.com/celine_mge/"><img src="https://avatars.githubusercontent.com/u/57619777?v=4?s=100" width="100px;" alt="Slylele"/><br /><sub><b>Slylele</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Slylele" title="Documentation">📖</a> <a href="#translation-Slylele" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Soazillon"><img src="https://avatars.githubusercontent.com/u/40845940?v=4?s=100" width="100px;" alt="Soazillon"/><br /><sub><b>Soazillon</b></sub></a><br /><a href="#translation-Soazillon" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SoneaTheBest"><img src="https://avatars.githubusercontent.com/u/64635425?v=4?s=100" width="100px;" alt="SoneaTheBest"/><br /><sub><b>SoneaTheBest</b></sub></a><br /><a href="#translation-SoneaTheBest" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://metafly.info/"><img src="https://avatars.githubusercontent.com/u/961256?v=4?s=100" width="100px;" alt="Stefan Sydow"/><br /><sub><b>Stefan Sydow</b></sub></a><br /><a href="#translation-stsydow" title="Translation">🌍</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Documentation">📖</a> <a href="https://github.com/freesewing/freesewing/commits?author=stsydow" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TriploidTree"><img src="https://avatars.githubusercontent.com/u/4170521?v=4?s=100" width="100px;" alt="Tríona"/><br /><sub><b>Tríona</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TriploidTree" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/theUnmutual"><img src="https://avatars.githubusercontent.com/u/22374635?v=4?s=100" width="100px;" alt="Unmutual"/><br /><sub><b>Unmutual</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=theUnmutual" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woutervdub"><img src="https://avatars.githubusercontent.com/u/24414629?v=4?s=100" width="100px;" alt="Wouter van Wageningen"/><br /><sub><b>Wouter van Wageningen</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woutervdub" title="Code">💻</a> <a href="#design-woutervdub" title="Design">🎨</a> <a href="#tool-woutervdub" title="Tools">🔧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amysews"><img src="https://avatars.githubusercontent.com/u/25280778?v=4?s=100" width="100px;" alt="amysews"/><br /><sub><b>amysews</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=amysews" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anna-puk"><img src="https://avatars.githubusercontent.com/u/100537439?v=4?s=100" width="100px;" alt="anna-puk"/><br /><sub><b>anna-puk</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=anna-puk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/beautifulsummermoon"><img src="https://avatars.githubusercontent.com/u/40396388?v=4?s=100" width="100px;" alt="beautifulsummermoon"/><br /><sub><b>beautifulsummermoon</b></sub></a><br /><a href="#translation-beautifulsummermoon" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/berce"><img src="https://avatars.githubusercontent.com/u/10439709?v=4?s=100" width="100px;" alt="berce"/><br /><sub><b>berce</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=berce" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biou"><img src="https://avatars.githubusercontent.com/u/1340376?v=4?s=100" width="100px;" alt="biou"/><br /><sub><b>biou</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biou" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bobgeorgethe3rd"><img src="https://avatars.githubusercontent.com/u/16866285?v=4?s=100" width="100px;" alt="bobgeorgethe3rd"/><br /><sub><b>bobgeorgethe3rd</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=bobgeorgethe3rd" title="Documentation">📖</a> <a href="#design-bobgeorgethe3rd" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brmlyklr"><img src="https://avatars.githubusercontent.com/u/22308713?v=4?s=100" width="100px;" alt="brmlyklr"/><br /><sub><b>brmlyklr</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=brmlyklr" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.chrisbarrett.fr"><img src="https://avatars.githubusercontent.com/u/2373249?v=4?s=100" width="100px;" alt="chri5b"/><br /><sub><b>chri5b</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=chri5b" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dingcycle"><img src="https://avatars.githubusercontent.com/u/1681985?v=4?s=100" width="100px;" alt="dingcycle"/><br /><sub><b>dingcycle</b></sub></a><br /><a href="#translation-dingcycle" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/drowned-in-books"><img src="https://avatars.githubusercontent.com/u/100040772?v=4?s=100" width="100px;" alt="drowned-in-books"/><br /><sub><b>drowned-in-books</b></sub></a><br /><a href="#question-drowned-in-books" title="Answering Questions">💬</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/econo202"><img src="https://avatars.githubusercontent.com/u/34138153?v=4?s=100" width="100px;" alt="econo202"/><br /><sub><b>econo202</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=econo202" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ericamattos"><img src="https://avatars.githubusercontent.com/u/4341417?v=4?s=100" width="100px;" alt="ericamattos"/><br /><sub><b>ericamattos</b></sub></a><br /><a href="#translation-ericamattos" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fightingrabbit"><img src="https://avatars.githubusercontent.com/u/25751445?v=4?s=100" width="100px;" alt="fightingrabbit"/><br /><sub><b>fightingrabbit</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=fightingrabbit" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DocSpencer77"><img src="https://avatars.githubusercontent.com/u/43393580?v=4?s=100" width="100px;" alt="gaylyndie"/><br /><sub><b>gaylyndie</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=DocSpencer77" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/grimlokason"><img src="https://avatars.githubusercontent.com/u/5112238?v=4?s=100" width="100px;" alt="grimlokason"/><br /><sub><b>grimlokason</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=grimlokason" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://weblog.redisdead.net"><img src="https://avatars.githubusercontent.com/u/6494414?v=4?s=100" width="100px;" alt="hellgy"/><br /><sub><b>hellgy</b></sub></a><br /><a href="#design-hellgy" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jackseye"><img src="https://avatars.githubusercontent.com/u/27834526?v=4?s=100" width="100px;" alt="jackseye"/><br /><sub><b>jackseye</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=jackseye" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marckiesel"><img src="https://avatars.githubusercontent.com/u/39653780?v=4?s=100" width="100px;" alt="marckiesel"/><br /><sub><b>marckiesel</b></sub></a><br /><a href="#translation-marckiesel" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://tech.lgbt/@mergerg"><img src="https://avatars.githubusercontent.com/u/64447714?v=4?s=100" width="100px;" alt="mergerg"/><br /><sub><b>mergerg</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=raphaelsiz" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mesil"><img src="https://avatars.githubusercontent.com/u/14284175?v=4?s=100" width="100px;" alt="mesil"/><br /><sub><b>mesil</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Amesil" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starfetch"><img src="https://avatars.githubusercontent.com/u/80041179?v=4?s=100" width="100px;" alt="starfetch"/><br /><sub><b>starfetch</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Code">💻</a> <a href="https://github.com/freesewing/freesewing/commits?author=starfetch" title="Documentation">📖</a> <a href="#translation-starfetch" title="Translation">🌍</a> <a href="#design-starfetch" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/timorl"><img src="https://avatars.githubusercontent.com/u/4363804?v=4?s=100" width="100px;" alt="timorl"/><br /><sub><b>timorl</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=timorl" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ttimearl"><img src="https://avatars.githubusercontent.com/u/77916590?v=4?s=100" width="100px;" alt="ttimearl"/><br /><sub><b>ttimearl</b></sub></a><br /><a href="#content-ttimearl" title="Content">🖋</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/chrisgloom"><img src="https://avatars.githubusercontent.com/u/15905991?v=4?s=100" width="100px;" alt="tuesgloomsday"/><br /><sub><b>tuesgloomsday</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=chrisgloom" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/valadaptive"><img src="https://avatars.githubusercontent.com/u/79560998?v=4?s=100" width="100px;" alt="valadaptive"/><br /><sub><b>valadaptive</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=valadaptive" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/viocky"><img src="https://avatars.githubusercontent.com/u/39279173?v=4?s=100" width="100px;" alt="viocky"/><br /><sub><b>viocky</b></sub></a><br /><a href="#translation-viocky" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woolishboy"><img src="https://avatars.githubusercontent.com/u/57816321?v=4?s=100" width="100px;" alt="woolishboy"/><br /><sub><b>woolishboy</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=woolishboy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cloutiy"><img src="https://avatars.githubusercontent.com/u/8433147?v=4?s=100" width="100px;" alt="yc"/><br /><sub><b>yc</b></sub></a><br /><a href="#translation-cloutiy" title="Translation">🌍</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

35
designs/magde/build.mjs Normal file
View file

@ -0,0 +1,35 @@
/* 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()

4
designs/magde/data.mjs Normal file
View file

@ -0,0 +1,4 @@
// This file is auto-generated | All changes you make will be overwritten.
export const name = '@freesewing/magde'
export const version = '3.0.0-alpha.8'
export const data = { name, version }

View file

@ -0,0 +1,69 @@
{
"name": "@freesewing/magde",
"version": "3.0.0-alpha.8",
"description": "A FreeSewing pattern for a bike messenger bag",
"author": "clegganator259 (https://github.com/clegganator259)",
"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": "dist/index.mjs",
"exports": {
".": "./dist/index.mjs"
},
"scripts": {
"build": "node build.mjs",
"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": "npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
"cibuild_step5": "node build.mjs",
"wbuild": "node build.mjs",
"wcibuild_step5": "node build.mjs"
},
"peerDependencies": {
"@freesewing/core": "3.0.0-alpha.8",
"@freesewing/plugin-bundle": "3.0.0-alpha.8"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.0.0",
"chai": "4.2.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "next"
},
"engines": {
"node": ">=16.0.0",
"npm": ">=8"
}
}

View file

@ -0,0 +1,130 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftBackPanel({
options,
Point,
Path,
points,
paths,
complete,
sa,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const depth = options.size * 150
const taperWidth = width * options.taperRatio
points.origin = new Point(0, 0)
points.topRightCorner = new Point(width, 0)
points.bottomRightCorner = new Point(taperWidth + depth, height)
points.baseFlapBackRight = new Point(taperWidth, height)
points.baseFlapFrontRight = new Point(taperWidth, height + depth)
points.bottomLeftCorner = new Point(0, height + depth)
paths.seam = new Path()
.move(points.bottomLeftCorner)
.line(points.baseFlapFrontRight)
.line(points.baseFlapBackRight)
.line(points.bottomRightCorner)
.line(points.topRightCorner)
.line(points.origin)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.bottomLeftCorner,
})
macro('title', {
at: new Point(taperWidth / 2, height / 2),
title: 'Back Panel',
nr: '1',
})
paths.foldLine = new Path()
.move(new Point(0, points.baseFlapBackRight.y))
.line(points.baseFlapBackRight)
.setClass('dotted note')
.addText('Base Fold', 'center note')
if (sa) {
var bottomSeam = new Path()
.move(points.bottomLeftCorner)
.line(points.baseFlapFrontRight)
.addText('Flat fell', 'center text-sm')
.offset(2 * sa)
var sideFlapSeam = new Path()
.move(points.baseFlapFrontRight)
.line(points.baseFlapBackRight)
.line(points.bottomRightCorner)
.offset(2 * sa)
.trim()
var sideSeam = new Path()
.move(points.bottomRightCorner)
.line(points.topRightCorner)
.offset(sa)
var topSeam = new Path()
.move(points.topRightCorner)
.line(points.origin)
.offset(2 * sa)
paths.sa = bottomSeam
.join(sideFlapSeam)
.join(sideSeam)
.join(topSeam)
.trim()
.setClass('fabric sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.topRightCorner,
y: -(2 * sa + 15),
})
macro('hd', {
from: points.topRightCorner,
to: points.bottomRightCorner,
y: -(2 * sa + 15),
})
macro('hd', {
from: points.bottomRightCorner,
to: points.baseFlapBackRight,
y: points.baseFlapFrontRight.y + 2 * sa + 15,
})
macro('hd', {
from: points.baseFlapBackRight,
to: points.origin,
y: points.baseFlapFrontRight.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.bottomRightCorner,
x: points.bottomRightCorner.x + 2 * sa + 15,
})
macro('vd', {
from: points.bottomRightCorner,
to: points.baseFlapFrontRight,
x: points.bottomRightCorner.x + 2 * sa + 15,
})
}
return part
}
export const backPanel = {
name: 'backPanel',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftBackPanel,
}

View file

@ -0,0 +1,212 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftBodyLiner({
options,
Point,
Path,
points,
paths,
complete,
sa,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const depth = options.size * 150
const taperWidth = width * options.taperRatio
const openingWidth = taperWidth * options.openingRatio
const openingHeight = height * options.openingRatio
const frontFlapHeight = height * options.flapHeightRatio
const frontFlapWidth = taperWidth * 0.8
points.origin = new Point(0, 0)
points.bodyTopRight = new Point(width, 0)
points.sideFlapFrontPoint = new Point(taperWidth + depth, height)
points.sideFlapBackPoint = new Point(taperWidth, height)
points.baseFrontRight = new Point(taperWidth, height + depth)
points.frontFlapMidRight = new Point(width, 2 * height + depth)
points.falseFrontFlapRight = new Point(frontFlapWidth, frontFlapHeight + 2 * height + depth)
points.frontFlapPeakRight = points.frontFlapMidRight.shiftFractionTowards(
points.falseFrontFlapRight,
0.2
)
points.frontOpeningRight = new Point(openingWidth, openingHeight + height + depth)
points.frontOpeningLeft = new Point(0, openingHeight + height + depth)
paths.seam = new Path()
.move(points.frontOpeningLeft)
.line(points.frontOpeningRight)
.line(points.frontFlapPeakRight)
.line(points.frontFlapMidRight)
.line(points.baseFrontRight)
.line(points.sideFlapBackPoint)
.line(points.sideFlapFrontPoint)
.line(points.bodyTopRight)
.line(points.origin)
.close()
.attr('class', 'lining')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.frontOpeningLeft,
})
points.label = new Point(taperWidth / 2, height / 2)
macro('title', {
at: points.label,
nr: '5',
title: 'Body Lining',
})
paths.foldLineSideFlap = new Path()
.move(points.bodyTopRight)
.line(points.sideFlapBackPoint)
.setClass('dotted note')
.addText('SideFlap Fold', 'center note')
paths.foldLineBaseBack = new Path()
.move(new Point(0, points.sideFlapBackPoint.y))
.line(points.sideFlapBackPoint)
.setClass('dotted note')
.addText('Base Fold', 'center note')
paths.foldLineBaseFront = new Path()
.move(new Point(0, points.baseFrontRight.y))
.line(points.baseFrontRight)
.setClass('dotted note')
.addText('Base Fold', 'center note')
if (sa) {
points.temp = points.baseFrontRight.shiftFractionTowards(points.sideFlapBackPoint, -0.2)
var baseFrenchSeams = new Path()
.move(points.baseFrontRight)
.line(points.sideFlapBackPoint)
.line(points.sideFlapFrontPoint)
.offset(2 * sa)
.addText('French Seam')
var openingBindingTop = new Path()
.move(points.frontOpeningLeft)
.line(points.frontOpeningRight)
.offset(-sa)
var openingBindingSideRough = new Path()
.move(points.frontOpeningRight)
.line(points.frontFlapPeakRight)
.offset(-sa)
var openingBinding = openingBindingTop
.join(
new Path()
.move(openingBindingSideRough.start())
.line(
openingBindingSideRough.intersects(
new Path()
.move(points.frontFlapPeakRight)
.line(points.frontFlapMidRight)
.line(points.baseFrontRight)
)[0]
)
)
.addText('Bind with seamtape', 'center text-sm')
.setClass('lining sa')
var frontSideSa = new Path()
.move(points.frontFlapMidRight)
.line(points.baseFrontRight)
.offset(sa)
var sideFlapSa = new Path()
.move(points.sideFlapFrontPoint)
.line(points.bodyTopRight)
.offset(sa)
paths.openingBinding = openingBinding
paths.baseSa = new Path()
.move(points.baseFrontRight)
.join(baseFrenchSeams)
.addText('French Seam', 'center text-lg')
.join(sideFlapSa)
.join(
new Path()
.move(points.bodyTopRight)
.line(points.origin)
.offset(2 * sa)
)
.trim()
.setClass('lining sa')
paths.frontAndTopSa = new Path()
.move(points.frontFlapMidRight)
.line(frontSideSa.start())
.line(frontSideSa.intersects(paths.baseSa)[0])
.trim()
.setClass('lining sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.bodyTopRight,
to: points.sideFlapFrontPoint,
y: points.bodyTopRight.y - 2 * sa - 15,
})
macro('hd', {
from: points.origin,
to: points.sideFlapFrontPoint,
y: points.bodyTopRight.y - 2 * sa - 25,
})
macro('hd', {
from: points.sideFlapBackPoint,
to: points.sideFlapFrontPoint,
y: points.sideFlapBackPoint.y - 15,
})
macro('hd', {
from: points.frontOpeningLeft,
to: points.frontOpeningRight,
y: points.frontOpeningRight.y + 2 * sa + 15,
})
macro('hd', {
from: points.frontOpeningLeft,
to: points.frontFlapPeakRight,
y: points.frontFlapPeakRight.y + 2 * sa,
})
macro('hd', {
from: points.frontFlapPeakRight,
to: points.frontFlapMidRight,
y: points.frontFlapPeakRight.y + 2 * sa,
})
macro('vd', {
from: points.bodyTopRight,
to: points.sideFlapFrontPoint,
x: points.sideFlapFrontPoint.x + 2 * sa,
})
macro('vd', {
from: points.sideFlapFrontPoint,
to: points.baseFrontRight,
x: points.sideFlapFrontPoint.x + 2 * sa,
})
macro('vd', {
from: points.baseFrontRight,
to: points.frontFlapMidRight,
x: points.sideFlapFrontPoint.x + 2 * sa,
})
macro('vd', {
from: points.frontFlapMidRight,
to: points.frontFlapPeakRight,
x: points.sideFlapFrontPoint.x + 2 * sa,
})
}
return part
}
export const bodyLiner = {
name: 'bodyLiner',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftBodyLiner,
}

View file

@ -0,0 +1,96 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftFrontOrganiserBase({
options,
Point,
Path,
Snippet,
points,
paths,
complete,
sa,
snippets,
paperless,
macro,
part,
}) {
// Width is *not halved* as this is not cut on fold unlike most other pattern
// pieces
const width = options.size * 500
const height = options.size * 300
const taperWidth = width * options.taperRatio
const openingWidth = taperWidth * options.openingRatio
const openingHeight = height * options.openingRatio
points.origin = new Point(0, 0)
points.bottomRight = new Point(openingWidth, openingHeight)
points.bottomLeft = new Point(0, openingHeight)
points.topRight = new Point(openingWidth, 0)
paths.seam = new Path()
.move(points.origin)
.line(points.bottomLeft)
.line(points.bottomRight)
.line(points.topRight)
.line(points.origin)
.close()
.setClass('fabric')
// Complete?
if (complete) {
points.label = new Point(openingWidth / 4, openingHeight / 2)
macro('title', {
at: points.label,
title: 'Organiser Base',
nr: '7',
})
if (sa) {
paths.sa = paths.seam.offset(2 * sa).setClass('fabric sa')
paths.leftHem = new Path()
.move(points.bottomLeft)
.line(points.origin)
.addText('Rolled Hem', 'center')
paths.RighHem = new Path()
.move(points.topRight)
.line(points.bottomRight)
.addText('Rolled Hem', 'center')
paths.topHem = new Path()
.move(points.origin)
.line(points.topRight)
.addText('Rolled Hem', 'center')
paths.bottomSeam = new Path()
.move(points.bottomRight)
.line(points.bottomLeft)
.addText('Baste into Front Panel SA', 'center')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.bottomRight,
y: points.origin.y - 2 * sa - 15,
})
macro('vd', {
from: points.origin,
to: points.bottomRight,
x: points.bottomRight.x + 2 * sa + 15,
})
}
return part
}
export const frontOrganiserBase = {
name: 'frontOrganiserBase',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftFrontOrganiserBase,
}

View file

@ -0,0 +1,119 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftFrontOrganiserFront({
options,
Point,
Path,
Snippet,
points,
paths,
complete,
sa,
snippets,
paperless,
macro,
part,
}) {
// Width is *not halved* as this is not cut on fold unlike most other pattern
// pieces
const width = options.size * 500
const height = options.size * 300
const taperWidth = width * options.taperRatio
const openingWidth = taperWidth * options.openingRatio
const openingHeight = height * options.openingRatio
const penInsertXCoords = [
openingWidth / 2,
(5 * openingWidth) / 8,
(6 * openingWidth) / 8,
(7 * openingWidth) / 8,
]
points.origin = new Point(0, 0)
points.bottomRight = new Point(openingWidth, openingHeight * 0.66)
points.bottomLeft = new Point(0, openingHeight * 0.66)
points.topRight = new Point(openingWidth, 0)
paths.seam = new Path()
.move(points.origin)
.line(points.bottomLeft)
.line(points.bottomRight)
.line(points.topRight)
.line(points.origin)
.close()
.setClass('fabric')
// Complete?
if (complete) {
points.label = new Point(openingWidth * 0.1, openingHeight / 2)
macro('title', {
at: points.label,
title: 'Organiser Front',
nr: '8',
})
if (sa) {
penInsertXCoords.forEach(function (xVal, i) {
paths[`penInsert${i}`] = new Path()
.move(new Point(xVal, 0))
.line(new Point(xVal, points.bottomRight.y))
.setClass('note sa')
.addText('Divider Seam', 'center text-color-note')
})
paths.sa = paths.seam.offset(2 * sa).setClass('fabric sa')
paths.leftHem = new Path()
.move(points.bottomLeft)
.line(points.origin)
.addText('Rolled Hem', 'center')
paths.RighHem = new Path()
.move(points.topRight)
.line(points.bottomRight)
.addText('Rolled Hem', 'center')
paths.topHem = new Path()
.move(points.origin)
.line(points.topRight)
.addText('Rolled Hem', 'center')
paths.bottomSeam = new Path()
.move(points.bottomRight)
.line(points.bottomLeft)
.addText('Baste into Front Panel SA', 'center')
}
}
// Paperless?
if (paperless) {
var verticalSeamsXCoords = [0].concat(penInsertXCoords).concat([openingWidth])
for (var i = 0; i < verticalSeamsXCoords.length - 1; i++) {
var thisX = verticalSeamsXCoords[i]
var nextX = verticalSeamsXCoords[i + 1]
macro('hd', {
from: new Point(thisX, 0),
to: new Point(nextX, 0),
y: points.bottomRight.y / 4,
})
}
macro('hd', {
from: points.origin,
to: points.bottomRight,
y: points.origin.y - 2 * sa - 15,
})
macro('vd', {
from: points.origin,
to: points.bottomRight,
x: points.bottomRight.x + 2 * sa + 15,
})
}
return part
}
export const frontOrganiserFront = {
name: 'frontOrganiserFront',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftFrontOrganiserFront,
}

View file

@ -0,0 +1,187 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftFrontPanel({
options,
Point,
Path,
Snippet,
points,
paths,
complete,
sa,
snippets,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const openingWidth = taperWidth * options.openingRatio
const openingHeight = height * options.openingRatio
const frontFlapHeight = height * options.flapHeightRatio
const frontFlapWidth = taperWidth * 0.8
points.origin = new Point(0, 0)
points.frontFlapMidRight = new Point(width, height)
points.frontFlapBottom = new Point(taperWidth, 0)
points.falseFrontFlapRight = new Point(frontFlapWidth, frontFlapHeight + height)
points.frontFlapPeakRight = points.frontFlapMidRight.shiftFractionTowards(
points.falseFrontFlapRight,
0.2
)
points.frontOpeningRight = new Point(openingWidth, openingHeight)
points.frontOpeningLeft = new Point(0, openingHeight)
paths.seam = new Path()
.move(points.frontOpeningLeft)
.line(points.frontOpeningRight)
.line(points.frontFlapPeakRight)
.line(points.frontFlapMidRight)
.line(points.frontFlapBottom)
.line(points.origin)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.frontOpeningLeft,
})
points.label = new Point(openingWidth / 4, openingHeight / 2)
macro('title', {
at: points.label,
title: 'Front Panel',
nr: '2',
})
paths.FrontOrganiserAlignment = new Path()
.move(new Point(points.frontOpeningRight.x, 0))
.line(points.frontOpeningRight)
.setClass('note dotted')
paths.velcro = paths.FrontOrganiserAlignment.join(
new Path()
.move(new Point(points.falseFrontFlapRight.x, points.frontOpeningRight.y))
.line(new Point(points.falseFrontFlapRight.x, 0))
).setClass('various fill-various')
var midVelcroX = (points.frontOpeningRight.x + points.falseFrontFlapRight.x) / 2
paths.velcroLabel = new Path()
.move(new Point(midVelcroX, points.frontOpeningRight.y))
.line(new Point(midVelcroX, 0))
.addText('Velcro loop', 'note center')
.addClass('no-stroke')
snippets.webbingNotch = new Snippet('notch', new Point(midVelcroX, 0))
if (sa) {
var saPath = new Path()
.move(points.frontFlapMidRight)
.line(points.frontFlapBottom)
.line(points.origin)
.offset(sa * 2)
paths.sa = new Path().move(points.frontFlapMidRight).join(saPath).setClass('fabric sa')
var openingBindingTop = new Path()
.move(points.frontOpeningLeft)
.line(points.frontOpeningRight)
.offset(-sa)
var openingBindingSideRough = new Path()
.move(points.frontOpeningRight)
.line(points.frontFlapPeakRight)
.offset(-sa)
paths.openingBinding = openingBindingTop
.join(
new Path()
.move(openingBindingSideRough.start())
.line(
openingBindingSideRough.intersects(
new Path()
.move(points.frontFlapPeakRight)
.line(points.frontFlapMidRight)
.line(points.frontFlapBottom)
)[0]
)
)
.addText('Bind with seamtape', 'center text-sm')
.setClass('fabric sa')
var lidBindingRough = new Path()
.move(points.frontFlapPeakRight)
.line(points.frontFlapMidRight)
.offset(-sa)
lidBindingRough = new Path()
.move(lidBindingRough.start())
.line(lidBindingRough.start().shiftFractionTowards(lidBindingRough.end(), 3))
paths.lidBinding = new Path()
.move(
lidBindingRough.intersects(
new Path().move(points.frontOpeningRight).line(points.frontFlapPeakRight)
)[0]
)
.line(
lidBindingRough.intersects(
new Path().move(points.frontFlapMidRight).line(points.frontFlapBottom)
)[0]
)
.addText('Bind with lid', 'center text-sm')
.setClass('fabric sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.frontFlapBottom,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.frontFlapBottom,
to: points.frontFlapMidRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.frontFlapMidRight,
to: points.frontFlapPeakRight,
y: points.frontFlapPeakRight.y + 2 * sa + 15,
})
macro('hd', {
from: points.frontFlapPeakRight,
to: points.frontOpeningRight,
y: points.frontFlapPeakRight.y + 2 * sa + 15,
})
macro('hd', {
from: points.frontOpeningRight,
to: points.frontOpeningLeft,
y: points.frontFlapPeakRight.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.frontOpeningLeft,
x: points.origin.x - 15,
})
macro('vd', {
from: points.origin,
to: points.frontFlapMidRight,
x: points.frontFlapMidRight.x + 15,
})
macro('vd', {
from: points.frontFlapMidRight,
to: points.frontFlapPeakRight,
x: points.frontFlapMidRight.x + 15,
})
}
return part
}
export const frontPanel = {
name: 'frontPanel',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftFrontPanel,
}

View file

@ -0,0 +1,35 @@
//
import { Design } from '@freesewing/core'
import { data } from '../data.mjs'
// Parts
import { bodyLiner } from './bodyLiner.mjs'
import { frontPanel } from './frontPanel.mjs'
import { frontOrganiserBase } from './frontOrganiserBase.mjs'
import { frontOrganiserFront } from './frontOrganiserFront.mjs'
import { backPanel } from './backPanel.mjs'
import { lidOnePiece } from './lidOnePiece.mjs'
import { twoPieceLidTop } from './twoPieceLidTop.mjs'
import { twoPieceLidBottom } from './twoPieceLidBottom.mjs'
import { lidLiner } from './lidLiner.mjs'
import { strapAttachments } from './strapAttachments.mjs'
// Create new design
const Magde = new Design({
data,
parts: [
backPanel,
frontPanel,
frontOrganiserBase,
frontOrganiserFront,
lidOnePiece,
twoPieceLidTop,
twoPieceLidBottom,
strapAttachments,
bodyLiner,
lidLiner,
],
})
// Named exports
export { bodyLiner, Magde }

View file

@ -0,0 +1,124 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftLidLiner({
options,
Point,
Path,
points,
paths,
complete,
sa,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const lidFlapHeight = height * options.flapHeightRatio
const lidFlapWidth = taperWidth * 0.8
points.origin = new Point(0, 0)
points.lidTopRight = new Point(lidFlapWidth, 0)
points.lidBottomRight = new Point(width, lidFlapHeight)
points.lidBottomLeft = new Point(0, lidFlapHeight)
paths.seam = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.line(points.lidTopRight)
.line(points.origin)
.close()
.attr('class', 'lining')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.lidBottomLeft,
})
points.label = new Point(lidFlapWidth / 2, lidFlapHeight / 2)
macro('title', {
at: points.label,
title: 'Lid Liner',
nr: '6',
})
points.velcroPoint = new Path()
.move(new Point(0, 0.1 * height))
.line(new Point(points.lidBottomRight.x, 0.1 * height))
.intersects(new Path().move(points.lidTopRight).line(points.lidBottomRight))[0]
paths.velcro = new Path()
.move(new Point(0, points.velcroPoint.y))
.line(points.velcroPoint)
.line(points.lidTopRight)
.line(points.origin)
.close()
.setClass('various fill-various')
paths.velcroLabel = new Path()
.move(new Point(0, points.velcroPoint.y / 1.5))
.line(new Point(points.velcroPoint.x, points.velcroPoint.y / 1.5))
.addText('Velcro hook', 'text-note center')
.addClass('no-stroke')
if (sa) {
paths.sa = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.offset(2 * sa)
.addText('Flat fell seam', 'left')
.line(points.lidBottomRight)
.setClass('lining sa')
}
var topBindingLineRough = new Path().move(points.lidTopRight).line(points.origin).offset(-sa)
var sideBindingLineRough = new Path()
.move(points.lidBottomRight)
.line(points.lidTopRight)
.offset(-sa)
paths.boundLine = new Path()
.move(sideBindingLineRough.intersectsY(lidFlapHeight)[0])
.line(topBindingLineRough.intersects(sideBindingLineRough)[0])
.line(topBindingLineRough.end())
.addText('Bind with tape once finished', 'center')
.setClass('lining sa')
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.lidTopRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidTopRight,
to: points.lidBottomRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidBottomRight,
to: points.lidBottomLeft,
y: points.lidBottomLeft.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.lidBottomRight,
x: points.lidBottomRight.x + 2 * sa + 15,
})
}
return part
}
export const lidLiner = {
name: 'lidLiner',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftLidLiner,
}

View file

@ -0,0 +1,117 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftLidOnePiece({
options,
Point,
Path,
Snippet,
points,
paths,
complete,
sa,
snippets,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const lidFlapHeight = height * options.flapHeightRatio
const lidFlapWidth = taperWidth * 0.8
const openingWidth = taperWidth * options.openingRatio
points.origin = new Point(0, 0)
points.lidTopRight = new Point(lidFlapWidth, 0)
points.lidBottomRight = new Point(width, lidFlapHeight)
points.lidBottomLeft = new Point(0, lidFlapHeight)
paths.seam = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.line(points.lidTopRight)
.line(points.origin)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.lidBottomLeft,
})
points.label = new Point(lidFlapWidth / 2, lidFlapHeight / 2)
macro('title', {
at: points.label,
title: 'Lid - One Piece',
nr: '3',
})
points.notchPoint = new Point((openingWidth + lidFlapWidth) / 2, lidFlapHeight * 0.2).addText(
'Webbing Notch',
'center'
)
snippets.webbingNotch = new Snippet('notch', points.notchPoint)
if (sa) {
paths.sa = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.offset(2 * sa)
.addText('Flat fell seam', 'left')
.line(points.lidBottomRight)
.setClass('fabric sa')
}
var topBindingLineRough = new Path().move(points.lidTopRight).line(points.origin).offset(-sa)
var sideBindingLineRough = new Path()
.move(points.lidBottomRight)
.line(points.lidTopRight)
.offset(-sa)
paths.boundLine = new Path()
.move(sideBindingLineRough.intersectsY(lidFlapHeight)[0])
.line(topBindingLineRough.intersects(sideBindingLineRough)[0])
.line(topBindingLineRough.end())
.addText('Bind with tape once finished', 'center')
.setClass('fabric sa')
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.lidTopRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidTopRight,
to: points.lidBottomRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidBottomRight,
to: points.lidBottomLeft,
y: points.lidBottomLeft.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.lidBottomRight,
x: points.lidBottomRight.x + 2 * sa + 15,
})
}
if (!options.onePieceLid) part.hide()
return part
}
export const lidOnePiece = {
name: 'lidOnePiece',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
onePieceLid: { bool: false, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftLidOnePiece,
}

View file

@ -0,0 +1,136 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftStrapAttachments({
options,
Point,
Path,
Snippet,
points,
paths,
snippets,
complete,
sa,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const idealWebbingSize = height / 7.5
var webbingSize = idealWebbingSize
if (options.useCommonWebbingSizes) {
var lowerBound = 6
var upperBound = idealWebbingSize
const commonWebbingSizes = [6, 10, 12, 15, 20, 25, 30, 40, 45, 50]
// get the bigest size smaller than the ideal
var smallerSizes = commonWebbingSizes.filter(function (webbing) {
return webbing < idealWebbingSize
})
lowerBound = smallerSizes.length >= 1 ? smallerSizes.at(-1) : lowerBound
// get the smallest size bigger than the ideal
var largerSizes = commonWebbingSizes.filter(function (webbing) {
return webbing >= idealWebbingSize
})
upperBound = largerSizes.length >= 1 ? largerSizes[0] : upperBound
// Pick the value closest to ideal defaulting to smaller
if (upperBound - idealWebbingSize > idealWebbingSize - lowerBound) {
webbingSize = lowerBound
} else {
webbingSize = upperBound
}
} else {
webbingSize = idealWebbingSize
}
points.origin = new Point(0, 0)
points.webbingOpeningBottom = new Point(1.25 * webbingSize, 0)
points.bagAttachmentTop = new Point(0, 1.25 * webbingSize)
points.fakeBagCorner = new Point(height, points.bagAttachmentTop.y + (width - taperWidth))
points.frontFlapBottom = new Point(taperWidth, 0)
points.bagAttachmentBottom = points.bagAttachmentTop.shiftFractionTowards(
points.fakeBagCorner,
0.33
)
paths.seam = new Path()
.move(points.bagAttachmentTop)
.line(points.bagAttachmentBottom)
.line(points.webbingOpeningBottom)
.line(points.origin)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.origin,
to: points.bagAttachmentTop,
})
points.label = points.origin.shiftFractionTowards(points.bagAttachmentBottom, 0.55)
macro('title', {
at: new Point(webbingSize, webbingSize),
cutlist: true,
title: 'Strap Attachment',
nr: '4',
scale: 0.3,
})
points.webbingCenterNotch = points.origin.shiftFractionTowards(points.webbingOpeningBottom, 0.5)
points.webbingCenterLabel = points.webbingCenterNotch
.clone()
.translate(0, -5)
.addText(`Center of webbing (${webbingSize}mm)`, 'center text-xs')
snippets.webbingCenter = new Snippet('notch', points.webbingCenterNotch)
if (sa) {
var bagAttachSeam = new Path().move(points.bagAttachmentTop).line(points.bagAttachmentBottom)
var attachSeamAllowance = bagAttachSeam.offset(sa)
var bagAttachmentSa = new Path()
.move(attachSeamAllowance.intersectsX(0)[0])
.line(attachSeamAllowance.end())
var restOfSa = new Path()
.move(points.bagAttachmentBottom)
.line(points.webbingOpeningBottom)
.line(points.origin)
.offset(sa)
paths.sa = bagAttachmentSa.join(restOfSa).close().setClass('fabric sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.webbingOpeningBottom,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.origin,
to: points.bagAttachmentBottom,
y: points.bagAttachmentBottom.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.bagAttachmentBottom,
x: points.bagAttachmentBottom.x + 2 * sa,
})
}
return part
}
export const strapAttachments = {
name: 'strapAttachments',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
useCommonWebbingSizes: { bool: true, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftStrapAttachments,
}

View file

@ -0,0 +1,110 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftTwoPieceLidBottom({
options,
Point,
Path,
points,
paths,
complete,
sa,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const lidFlapHeight = height * options.flapHeightRatio
const lidFlapWidth = taperWidth * 0.8
points.origin = new Point(0, 0)
points.lidTopRight = new Point(lidFlapWidth, 0)
points.lidBottomRight = new Point(width, lidFlapHeight)
points.lidBottomLeft = new Point(0, lidFlapHeight)
points.lidSeamRight = points.lidTopRight.shiftFractionTowards(points.lidBottomRight, 0.25)
points.lidSeamLeft = new Point(0, points.lidSeamRight.y)
paths.seam = new Path()
.move(points.lidSeamLeft)
.line(points.lidSeamRight)
.line(points.lidTopRight)
.line(points.origin)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
// macro('cutonfold', {
// from: points.lidTopLeft,
// to: points.lidSeamLeft,
// })
points.label = new Point(points.lidSeamRight.x / 3, points.lidSeamRight.y / 1.5)
macro('title', {
at: points.label,
title: 'Lid Bottom - Two Piece',
nr: '3.2',
scale: 0.4,
})
if (sa) {
var bindingLineSideRough = new Path()
.move(points.lidSeamRight)
.line(points.lidTopRight)
.offset(-sa)
var bindingLineTopRough = new Path().move(points.lidTopRight).line(points.origin).offset(-sa)
// points.tmp1 = bindingLineSideRough.intersectsY(points.lidSeamRight.y)[0]
paths.bindingLine = new Path()
.move(bindingLineSideRough.intersectsY(points.lidSeamLeft.y)[0])
.line(bindingLineSideRough.intersects(bindingLineTopRough)[0])
.line(bindingLineTopRough.end())
.addClass('fabric sa')
paths.sa = new Path()
.move(points.lidSeamLeft)
.line(points.lidSeamRight)
.offset(2 * sa)
.line(points.lidSeamRight)
.setClass('fabric sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.lidSeamRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidTopRight,
to: points.lidSeamRight,
y: points.origin.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidSeamRight,
to: points.lidSeamLeft,
y: points.lidSeamLeft.y + 2 * sa + 15,
})
macro('vd', {
from: points.origin,
to: points.lidSeamLeft,
x: points.lidSeamRight.x + 2 * sa,
})
}
if (options.onePieceLid) part.hide()
return part
}
export const twoPieceLidBottom = {
name: 'twoPieceLidBottom',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
onePieceLid: { bool: false, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftTwoPieceLidBottom,
}

View file

@ -0,0 +1,117 @@
import { pluginBundle } from '@freesewing/plugin-bundle'
function draftTwoPieceLidTop({
options,
Point,
Path,
Snippet,
points,
paths,
complete,
sa,
snippets,
paperless,
macro,
part,
}) {
// Width is halved as this is cut on a fold
const width = (options.size * 500) / 2
const height = options.size * 300
const taperWidth = width * options.taperRatio
const lidFlapHeight = height * options.flapHeightRatio
const lidFlapWidth = taperWidth * 0.8
const openingWidth = taperWidth * options.openingRatio
points.origin = new Point(0, 0)
points.lidTopRight = new Point(lidFlapWidth, 0)
points.lidBottomRight = new Point(width, lidFlapHeight)
points.lidBottomLeft = new Point(0, lidFlapHeight)
points.lidSeamRight = points.lidTopRight.shiftFractionTowards(points.lidBottomRight, 0.2)
points.lidSeamLeft = new Point(0, points.lidSeamRight.y)
paths.seam = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.line(points.lidSeamRight)
.line(points.lidSeamLeft)
.close()
.attr('class', 'fabric')
// Complete?
if (complete) {
macro('cutonfold', {
from: points.lidSeamLeft,
to: points.lidBottomLeft,
})
points.label = new Point(lidFlapWidth / 2, lidFlapHeight / 2)
macro('title', {
at: points.label,
title: 'Lid Top - Two Piece',
nr: '3.1',
})
points.notchPoint = new Point((openingWidth + lidFlapWidth) / 2, points.lidSeamLeft.y).addText(
'Webbing Notch',
'center'
)
snippets.webbingNotch = new Snippet('bnotch', points.notchPoint)
if (sa) {
paths.topSa = new Path()
.move(points.lidSeamRight)
.join(
new Path()
.move(points.lidSeamRight)
.line(points.lidSeamLeft)
.offset(2 * sa)
)
.setClass('fabric sa')
paths.bottomSa = new Path()
.move(points.lidBottomLeft)
.line(points.lidBottomRight)
.offset(2 * sa)
.line(points.lidBottomRight)
.setClass('fabric sa')
}
}
// Paperless?
if (paperless) {
macro('hd', {
from: points.origin,
to: points.lidSeamRight,
y: points.lidSeamLeft.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidSeamRight,
to: points.lidBottomRight,
y: points.lidSeamLeft.y - 2 * sa - 15,
})
macro('hd', {
from: points.lidBottomRight,
to: points.lidBottomLeft,
y: points.lidBottomLeft.y + 2 * sa + 15,
})
macro('vd', {
from: points.lidSeamRight,
to: points.lidBottomRight,
x: points.lidBottomRight.x + 2 * sa,
})
}
if (options.onePieceLid) part.hide()
return part
}
export const twoPieceLidTop = {
name: 'twoPieceLidTop',
options: {
size: { pct: 100, min: 15, max: 200, menu: 'style' },
taperRatio: { pct: 60, min: 50, max: 100, menu: 'style' },
flapHeightRatio: { pct: 83, min: 60, max: 100, menu: 'style' },
openingRatio: { pct: 66, min: 30, max: 90, menu: 'style' },
onePieceLid: { bool: false, menu: 'style' },
},
plugins: [pluginBundle],
draft: draftTwoPieceLidTop,
}

View file

@ -0,0 +1,16 @@
// This file is auto-generated | Any changes you make will be overwritten.
import { Magde } from '../src/index.mjs'
// Shared tests
import { testPatternConfig } from '../../../tests/designs/config.mjs'
import { testPatternDrafting } from '../../../tests/designs/drafting.mjs'
import { testPatternSampling } from '../../../tests/designs/sampling.mjs'
// Test config
testPatternConfig(Magde)
// Test drafting - Change the second parameter to `true` to log errors
testPatternDrafting(Magde, false)
// Test sampling - Change the second parameter to `true` to log errors
testPatternSampling(Magde, false)