1
0
Fork 0

Merge branch 'develop' into jane

This commit is contained in:
Joost De Cock 2024-05-04 16:40:24 +02:00 committed by GitHub
commit b4a1216a5c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
669 changed files with 41070 additions and 1029 deletions

View file

@ -1167,6 +1167,33 @@
"contributions": [
"doc"
]
},
{
"login": "karlnippoldt",
"name": "Karl Nippoldt",
"avatar_url": "https://avatars.githubusercontent.com/u/7821608?v=4",
"profile": "https://karlnippoldt.com",
"contributions": [
"doc"
]
},
{
"login": "RockerKitten",
"name": "Corey",
"avatar_url": "https://avatars.githubusercontent.com/u/84648053?v=4",
"profile": "https://github.com/RockerKitten",
"contributions": [
"question"
]
},
{
"login": "GeniaHarrietBoeing",
"name": "Niabon",
"avatar_url": "https://avatars.githubusercontent.com/u/73827848?v=4",
"profile": "https://github.com/GeniaHarrietBoeing",
"contributions": [
"doc"
]
}
],
"skipCi": true,

View file

@ -9,8 +9,25 @@
- Always load plugin-bust due to its changes in how it handle conditionality.
### cathrin
#### Changed
- Allow negative values in backDrop option. Fixes
- Allow negative values for the frontRise options. Fixes
### charlie
#### Fixed
- Fix cut instructions for fly facing, only 1 to be cut. Fixes
### huey
#### 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
@ -23,6 +40,13 @@
- Add missing dimension id attributes
### noble
#### Fixed
- Fix 'cutonfold' text for Noble's back part. Fixes
- Improve dart shaping. Fixes
### onyx
#### Changed
@ -35,12 +59,30 @@
- Always load plugin-bust due to its changes in how it handle conditionality.
### simon
#### Changed
- Allow negative values for the buttonFreeLength option. Fixes
### simone
#### Fixed
- Added missing translation for various options
### tamiko
#### Changed
- Always load plugin-bust due to its changes in how it handle conditionality.
### teagan
#### Fixed
- Fix side seam when length is cropped. Fixes
### uma
#### Fixed
@ -65,6 +107,12 @@
- The `withCondition` named export is deprecated and will always return true.
### core
#### Added
- The `Path.rotate()` method was added to the core API.
## 3.2.0 (2024-02-11)

View file

@ -29,143 +29,148 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<tr>
<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>
<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/RockerKitten"><img src="https://avatars.githubusercontent.com/u/84648053?v=4?s=100" width="100px;" alt="Corey"/><br /><sub><b>Corey</b></sub></a><br /><a href="#question-RockerKitten" title="Answering Questions">💬</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/clegganator259"><img src="https://avatars.githubusercontent.com/u/3974250?v=4?s=100" width="100px;" alt="David Clegg"/><br /><sub><b>David Clegg</b></sub></a><br /><a href="#design-clegganator259" title="Design">🎨</a> <a href="https://github.com/freesewing/freesewing/commits?author=clegganator259" title="Code">💻</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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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://github.com/Himanshu1801"><img src="https://avatars.githubusercontent.com/u/78968566?v=4?s=100" width="100px;" alt="Himanshu Singh"/><br /><sub><b>Himanshu Singh</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Himanshu1801" 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>
<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/ibek"><img src="https://avatars.githubusercontent.com/u/1140579?v=4?s=100" width="100px;" alt="Ivo Bek"/><br /><sub><b>Ivo Bek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ibek" title="Documentation">📖</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>
</tr>
<tr>
<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>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HaasJona"><img src="https://avatars.githubusercontent.com/u/4310707?v=4?s=100" width="100px;" alt="Jonathan Haas"/><br /><sub><b>Jonathan Haas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=HaasJona" title="Code">💻</a></td>
<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>
</tr>
<tr>
<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="https://github.com/jpmunic"><img src="https://avatars.githubusercontent.com/u/13474972?v=4?s=100" width="100px;" alt="Josh Munic"/><br /><sub><b>Josh Munic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Ajpmunic" title="Bug reports">🐛</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://karlnippoldt.com"><img src="https://avatars.githubusercontent.com/u/7821608?v=4?s=100" width="100px;" alt="Karl Nippoldt"/><br /><sub><b>Karl Nippoldt</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=karlnippoldt" title="Documentation">📖</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>
<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>
</tr>
<tr>
<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>
<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/compilin"><img src="https://avatars.githubusercontent.com/u/40794281?v=4?s=100" width="100px;" alt="Lin"/><br /><sub><b>Lin</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=compilin" 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/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</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>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeniaHarrietBoeing"><img src="https://avatars.githubusercontent.com/u/73827848?v=4?s=100" width="100px;" alt="Niabon"/><br /><sub><b>Niabon</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=GeniaHarrietBoeing" 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>
<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/pvidas"><img src="https://avatars.githubusercontent.com/u/38463064?v=4?s=100" width="100px;" alt="Paula Vidas"/><br /><sub><b>Paula Vidas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=pvidas" title="Code">💻</a></td>
</tr>
<tr>
<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>
</tr>
<tr>
<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://rachel.ostic.ca"><img src="https://avatars.githubusercontent.com/u/65781290?v=4?s=100" width="100px;" alt="Rachel Ostic"/><br /><sub><b>Rachel Ostic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=rachelostic" title="Documentation">📖</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>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sohamtembhurne"><img src="https://avatars.githubusercontent.com/u/82658685?v=4?s=100" width="100px;" alt="Soham Tembhurne"/><br /><sub><b>Soham Tembhurne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sohamtembhurne" title="Code">💻</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="https://www.sophiah.gay/"><img src="https://avatars.githubusercontent.com/u/10786212?v=4?s=100" width="100px;" alt="Sophia"/><br /><sub><b>Sophia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SophiaH67" title="Code">💻</a></td>
</tr>
<tr>
<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://stefanocislaghi.com"><img src="https://avatars.githubusercontent.com/u/1659414?v=4?s=100" width="100px;" alt="Stefano"/><br /><sub><b>Stefano</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=LunaticMuch" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biswassushmita947"><img src="https://avatars.githubusercontent.com/u/145688707?v=4?s=100" width="100px;" alt="Sushmita Biswas"/><br /><sub><b>Sushmita Biswas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biswassushmita947" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheTanay902"><img src="https://avatars.githubusercontent.com/u/84577440?v=4?s=100" width="100px;" alt="Tanay Toshniwal"/><br /><sub><b>Tanay Toshniwal</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TheTanay902" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trentonTrama"><img src="https://avatars.githubusercontent.com/u/41126812?v=4?s=100" width="100px;" alt="Trent Trama"/><br /><sub><b>Trent Trama</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=trentonTrama" 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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ArcticCoder"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ArcticCoder" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VSinerva"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=VSinerva" title="Code">💻</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/Yash-Ambekar"><img src="https://avatars.githubusercontent.com/u/96481913?v=4?s=100" width="100px;" alt="Yash Anil Ambekar"/><br /><sub><b>Yash Anil Ambekar</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Yash-Ambekar" title="Documentation">📖</a></td>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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/evilrobotfromouterspace"><img src="https://avatars.githubusercontent.com/u/143673955?v=4?s=100" width="100px;" alt="evilrobotfromouterspace"/><br /><sub><b>evilrobotfromouterspace</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aevilrobotfromouterspace" title="Bug reports">🐛</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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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://github.com/marpants"><img src="https://avatars.githubusercontent.com/u/61366665?v=4?s=100" width="100px;" alt="marpants"/><br /><sub><b>marpants</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=marpants" title="Code">💻</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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"
@ -164,143 +164,148 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<tr>
<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>
<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/RockerKitten"><img src="https://avatars.githubusercontent.com/u/84648053?v=4?s=100" width="100px;" alt="Corey"/><br /><sub><b>Corey</b></sub></a><br /><a href="#question-RockerKitten" title="Answering Questions">💬</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/clegganator259"><img src="https://avatars.githubusercontent.com/u/3974250?v=4?s=100" width="100px;" alt="David Clegg"/><br /><sub><b>David Clegg</b></sub></a><br /><a href="#design-clegganator259" title="Design">🎨</a> <a href="https://github.com/freesewing/freesewing/commits?author=clegganator259" title="Code">💻</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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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://github.com/Himanshu1801"><img src="https://avatars.githubusercontent.com/u/78968566?v=4?s=100" width="100px;" alt="Himanshu Singh"/><br /><sub><b>Himanshu Singh</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Himanshu1801" 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>
<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/ibek"><img src="https://avatars.githubusercontent.com/u/1140579?v=4?s=100" width="100px;" alt="Ivo Bek"/><br /><sub><b>Ivo Bek</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ibek" title="Documentation">📖</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>
</tr>
<tr>
<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>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HaasJona"><img src="https://avatars.githubusercontent.com/u/4310707?v=4?s=100" width="100px;" alt="Jonathan Haas"/><br /><sub><b>Jonathan Haas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=HaasJona" title="Code">💻</a></td>
<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>
</tr>
<tr>
<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="https://github.com/jpmunic"><img src="https://avatars.githubusercontent.com/u/13474972?v=4?s=100" width="100px;" alt="Josh Munic"/><br /><sub><b>Josh Munic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Ajpmunic" title="Bug reports">🐛</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://karlnippoldt.com"><img src="https://avatars.githubusercontent.com/u/7821608?v=4?s=100" width="100px;" alt="Karl Nippoldt"/><br /><sub><b>Karl Nippoldt</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=karlnippoldt" title="Documentation">📖</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>
<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>
</tr>
<tr>
<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>
<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/compilin"><img src="https://avatars.githubusercontent.com/u/40794281?v=4?s=100" width="100px;" alt="Lin"/><br /><sub><b>Lin</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=compilin" 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/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luizfzs"><img src="https://avatars.githubusercontent.com/u/6039675?v=4?s=100" width="100px;" alt="Luiz Saggioro"/><br /><sub><b>Luiz Saggioro</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=luizfzs" title="Code">💻</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>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeniaHarrietBoeing"><img src="https://avatars.githubusercontent.com/u/73827848?v=4?s=100" width="100px;" alt="Niabon"/><br /><sub><b>Niabon</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=GeniaHarrietBoeing" 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>
<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/pvidas"><img src="https://avatars.githubusercontent.com/u/38463064?v=4?s=100" width="100px;" alt="Paula Vidas"/><br /><sub><b>Paula Vidas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=pvidas" title="Code">💻</a></td>
</tr>
<tr>
<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>
</tr>
<tr>
<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://rachel.ostic.ca"><img src="https://avatars.githubusercontent.com/u/65781290?v=4?s=100" width="100px;" alt="Rachel Ostic"/><br /><sub><b>Rachel Ostic</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=rachelostic" title="Documentation">📖</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>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sohamtembhurne"><img src="https://avatars.githubusercontent.com/u/82658685?v=4?s=100" width="100px;" alt="Soham Tembhurne"/><br /><sub><b>Soham Tembhurne</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=sohamtembhurne" title="Code">💻</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="https://www.sophiah.gay/"><img src="https://avatars.githubusercontent.com/u/10786212?v=4?s=100" width="100px;" alt="Sophia"/><br /><sub><b>Sophia</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=SophiaH67" title="Code">💻</a></td>
</tr>
<tr>
<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://stefanocislaghi.com"><img src="https://avatars.githubusercontent.com/u/1659414?v=4?s=100" width="100px;" alt="Stefano"/><br /><sub><b>Stefano</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=LunaticMuch" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/biswassushmita947"><img src="https://avatars.githubusercontent.com/u/145688707?v=4?s=100" width="100px;" alt="Sushmita Biswas"/><br /><sub><b>Sushmita Biswas</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=biswassushmita947" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheTanay902"><img src="https://avatars.githubusercontent.com/u/84577440?v=4?s=100" width="100px;" alt="Tanay Toshniwal"/><br /><sub><b>Tanay Toshniwal</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=TheTanay902" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trentonTrama"><img src="https://avatars.githubusercontent.com/u/41126812?v=4?s=100" width="100px;" alt="Trent Trama"/><br /><sub><b>Trent Trama</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=trentonTrama" 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>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ArcticCoder"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=ArcticCoder" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VSinerva"><img src="https://avatars.githubusercontent.com/u/39151688?v=4?s=100" width="100px;" alt="Vili Sinervä"/><br /><sub><b>Vili Sinervä</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=VSinerva" title="Code">💻</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/Yash-Ambekar"><img src="https://avatars.githubusercontent.com/u/96481913?v=4?s=100" width="100px;" alt="Yash Anil Ambekar"/><br /><sub><b>Yash Anil Ambekar</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=Yash-Ambekar" title="Documentation">📖</a></td>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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/evilrobotfromouterspace"><img src="https://avatars.githubusercontent.com/u/143673955?v=4?s=100" width="100px;" alt="evilrobotfromouterspace"/><br /><sub><b>evilrobotfromouterspace</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/issues?q=author%3Aevilrobotfromouterspace" title="Bug reports">🐛</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>
</tr>
<tr>
<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>
<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>
</tr>
<tr>
<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://github.com/marpants"><img src="https://avatars.githubusercontent.com/u/61366665?v=4?s=100" width="100px;" alt="marpants"/><br /><sub><b>marpants</b></sub></a><br /><a href="https://github.com/freesewing/freesewing/commits?author=marpants" title="Code">💻</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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>

View file

@ -1,7 +1,16 @@
Unreleased:
Added:
core:
- The `Path.rotate()` method was added to the core API.
Changed:
brian:
- Always load plugin-bust due to its changes in how it handle conditionality.
cathrin:
- Allow negative values in backDrop option. Fixes #6563
- Allow negative values for the frontRise options. Fixes #6563
huey:
- The lengthBonus option default was changed from 0% to 15%. Fixes #6596
onyx:
- Always load plugin-bust due to its changes in how it handle conditionality.
plugin-bust:
@ -10,6 +19,8 @@ Unreleased:
- The plugin will now always be loaded, but will check for each drafted set whether it should make any changes.
shelly:
- Always load plugin-bust due to its changes in how it handle conditionality.
simon:
- Allow negative values for the buttonFreeLength option. Fixes #6508
tamiko:
- Always load plugin-bust due to its changes in how it handle conditionality.
wahid:
@ -20,12 +31,21 @@ Unreleased:
- The `withCondition` named export is deprecated and will always return true.
Fixed:
charlie:
- Fix cut instructions for fly facing, only 1 to be cut. Fixes #6392
huey:
- Fixed an issue where ribbing height would distort the pocket under certain conditions. Fixes #6238
- Adding missing translation for ribbing option
- Hide unused ribbing parts when ribbing option is disabled
hugo:
- Add missing dimension id attributes
noble:
- Fix 'cutonfold' text for Noble's back part. Fixes #6447
- Improve dart shaping. Fixes #64547
simone:
- Added missing translation for various options
teagan:
- Fix side seam when length is cropped. Fixes #6480
uma:
- Fix back exposure when expand is off. Fixes #6239

View file

@ -85,6 +85,10 @@ jaeger:
'@freesewing/brian': *freesewing
'@freesewing/bent': *freesewing
'@freesewing/plugin-bust': *freesewing
lily:
peer:
'@freesewing/titan': *freesewing
'@freesewing/paco': *freesewing
new-design:
_:
'axios': &axios '1.6.8'
@ -192,9 +196,9 @@ backend:
'passport': '0.7.0'
'passport-http': '0.3.0'
'passport-jwt': '4.0.1'
'pino': '8.19.0'
'pino': '9.0.0'
'qrcode': '1.5.3'
'swagger-ui-dist': '5.12.0'
'swagger-ui-dist': '5.17.2'
'swagger-ui-express': '5.0.0'
dev:
'chai': *chai
@ -218,12 +222,12 @@ dev:
'lodash.orderby': &_orderby '4.6.0'
'lodash.set': *_set
'next': *next
'react': &react '18.2.0'
'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': '6.47.3'
'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'
@ -256,7 +260,7 @@ lab:
'd3-drag': &d3drag '3.0.0'
'd3-selection': &d3selection '3.0.0'
'daisyui': *daisyui
'i18next': &i18next '23.10.1'
'i18next': &i18next '23.11.2'
'lodash.get': *_get
'lodash.orderby': *_orderby
'lodash.set': *_set
@ -302,12 +306,18 @@ org:
'lodash.set': *_set
'luxon': '3.4.4'
'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.3'
'rehype-autolink-headings': *rehypeAutolinkHeadings
'rehype-highlight': *rehypeHighlight
'rehype-sanitize': *rehypeSanitize
@ -352,7 +362,7 @@ shared:
'react': *react
'react-dom': *react
'react-timeago': *reactTimeago
'react-zoom-pan-pinch': &zoompanpinch '3.4.3'
'react-zoom-pan-pinch': *zoompanpinch
'rehype-autolink-headings': *rehypeAutolinkHeadings
'rehype-highlight': *rehypeHighlight
'remark-frontmatter': &remarkfrontmatter '5.0.0'

View file

@ -36,6 +36,8 @@ packageJson:
author: SeaZeeZee (https://github.com/SeaZeeZee)
lab:
private: true
lily:
author: Anna Puk (https://github.com/anna-puk)
lucy:
author: SeaZeeZee (https://github.com/SeaZeeZee)
lunetius: &starf

View file

@ -103,6 +103,25 @@
"setSleeve"
]
},
"bibi": {
"code": "Jonathan Haas",
"description": "A FreeSewing pattern for a knit top body block",
"design": [
"Jonathan Haas"
],
"difficulty": 2,
"lab": true,
"org": true,
"tags": [
"blocks",
"tops"
],
"techniques": [
"curvedSeam",
"hem",
"flatSleeve"
]
},
"bob": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a bib",
@ -936,6 +955,22 @@
"curvedSeam"
]
},
"umbra": {
"code": "Joost De Cock, Jonathan Haas",
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",
"design": "Joost De Cock, Jonathan Haas",
"difficulty": 2,
"lab": true,
"org": true,
"tags": [
"bottoms",
"underwear"
],
"techniques": [
"elastic",
"curvedSeam"
]
},
"wahid": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a classic fitted waistcoat",
@ -1003,6 +1038,21 @@
"hem",
"button"
]
},
"lily": {
"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",
"hem"
]
}
}

35
config/trustees.mjs Normal file
View file

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

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -45,7 +45,7 @@ export const strap = {
msg: `albert:cutStrap`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
replace: {
width: units(strapWidth + extraSa),
width: units(strapWidth * 2 + extraSa),
length: units(strapLength + strapWidth * 2 + extraSa),
},
suggest: {

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -54,7 +54,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -0,0 +1 @@
config/config.js

17
designs/bibi/CHANGELOG.md Normal file
View file

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

162
designs/bibi/README.md Normal file
View file

@ -0,0 +1,162 @@
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/bibi"
title="@freesewing/bibi on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/bibi.svg"
alt="@freesewing/bibi on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/bibi.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%3Abibi"
title="Open issues tagged pkg:bibi"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:bibi.svg?label=Issues"
alt="Open issues tagged pkg:bibi"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-128-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/bibi
A FreeSewing pattern for a knit top body block
# 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/bibi
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:
>
> [![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
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).

35
designs/bibi/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/bibi/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/bibi'
export const version = '3.2.0'
export const data = { name, version }

50
designs/bibi/i18n/de.json Normal file
View file

@ -0,0 +1,50 @@
{
"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."
}
}
}

129
designs/bibi/i18n/en.json Normal file
View file

@ -0,0 +1,129 @@
{
"t": "Bibi body block",
"d": "Bibi is a multifunctional building block for knit tops and dresses.",
"p": {
"back": "Back",
"front": "Front",
"sleeve": "Sleeve"
},
"s": {
"dartNo.t": "No bust dart",
"dartNo.d": "Gather fabric instead",
"dartYes.t": "Create a bust dart",
"dartYes.d": "If necessary, draft a bust dart to match side seam lengths",
"sleevesNo.t": "Sleeveless",
"sleevesNo.d": "Draft the pattern without sleeves",
"sleevesYes.t": "With sleeves",
"sleevesYes.d": "Draft the pattern with sleeves",
"fitWaistNo.t": "Don't fit the waist",
"fitWaistNo.d": "Create a loose fit and a more rectangular shape",
"fitWaistYes.t": "Fit the waist",
"fitWaistYes.d": "Create a more body-fitting shape",
"length.underbust.t": "Underbust",
"length.underbust.d": "Create a bralette top that only covers the bust.",
"length.waist.t": "Waist",
"length.waist.d": "Create a crop top.",
"length.hips.t": "Hips",
"length.hips.d": "Create a hip-length top.",
"length.seat.t": "Seat",
"length.seat.d": "Create a seat-length top.",
"length.knee.t": "Knee",
"length.knee.d": "Create a knee-length dress.",
"length.floor.t": "Floor",
"length.floor.d": "Create a floor-length dress. Use a negative length bonus to prevent the garment from actually dragging on the floor."
},
"o": {
"draftForHighBust": {
"t": "Bust adjustment",
"d": "If the pattern should be drafted with a basic full bust adjustment (FBA). This will result in a more fitted garment for people with breasts."
},
"draftForHighBustYes": {
"t": "Draft with bust adjustment",
"d": "Suggested for most people with breasts. This option only has an effect if the optional bust-related measurements are available."
},
"draftForHighBustNo": {
"t": "Draft without bust adjustment",
"d": "Drafts a pattern using the chest measurement only."
},
"cuffEase": {
"t": "Sleeve fullness",
"d": "Controls how wide the sleeves are."
},
"sleeveLength": {
"t": "Sleeve length",
"d": "Controls the length of your sleeves"
},
"necklineBend": {
"t": "Front Neckline curvature",
"d": "Controls the curvature of the front neckline."
},
"backNeckBend": {
"t": "Back Neckline curvature",
"d": "Controls the curvature of the back neckline."
},
"necklineDepth": {
"t": "Front Neckline depth",
"d": "Controls how deep the neck opening plunges down at the front."
},
"backNeckCutout": {
"t": "Back Neckline depth",
"d": "Controls how deep the neck opening plunges down on the back."
},
"necklineWidth": {
"t": "Neckline width",
"d": "Controls the width of the neck opening."
},
"fitWaist": {
"t": "Fit the waist",
"d": "Whether or not to fit the waist."
},
"waistEase": {
"t": "Waist ease",
"d": "Ease at the waist (only applies when the waist is fitted)."
},
"hipsEase": {
"t": "Hips ease",
"d": "Ease at the hips."
},
"seatEase": {
"t": "Seat ease",
"d": "Ease at the seat."
},
"bustEase": {
"t": "Bust ease",
"d": "Ease at the bust. Only applies when bust adjustment is enabled."
},
"flare": {
"t": "Flare",
"d": "How much fabric to use at the bottom hem of the design. Only applies when the design goes below the seat."
},
"dart": {
"t": "Allow bust dart",
"d": "Allow creating a bust dart if this is necessary"
},
"sleeves": {
"t": "Sleeves",
"d": "Draft the pattern with sleeves"
},
"strapWidth": {
"t": "Strap width",
"d": "How wide the shoulder straps are. Only applies when sleeves are disabled."
},
"armholeCurveFront": {
"t": "Armhole curve front",
"d": "How round the armhole curve is at the front. Higher options expose more skin."
},
"armholeCurveBack": {
"t": "Armhole curve back",
"d": "How round the armhole curve is at the back. Higher options leave the shoulder blades free."
},
"armholeDropBack": {
"t": "Armhole drop back",
"d": "How much the back armhole curves towards the bottom."
},
"length": {
"t": "Length",
"d": "Which measurement line to use for the bottom hem. You can do fine adjustments using the bonus length option."
}
}
}

50
designs/bibi/i18n/es.json Normal file
View file

@ -0,0 +1,50 @@
{
"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."
}
}
}

50
designs/bibi/i18n/fr.json Normal file
View file

@ -0,0 +1,50 @@
{
"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."
}
}
}

View file

@ -0,0 +1,8 @@
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' }
export const i18n = { en, de, es, fr, nl, uk }

50
designs/bibi/i18n/nl.json Normal file
View file

@ -0,0 +1,50 @@
{
"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."
}
}
}

50
designs/bibi/i18n/uk.json Normal file
View file

@ -0,0 +1,50 @@
{
"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."
}
}
}

72
designs/bibi/package.json Normal file
View file

@ -0,0 +1,72 @@
{
"name": "@freesewing/bibi",
"version": "3.2.0",
"description": "A FreeSewing pattern for a knit top body block",
"author": "Joost De Cock <joost@joost.at> (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": "dist/index.mjs",
"exports": {
".": {
"internal": "./src/index.mjs",
"default": "./dist/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"
},
"peerDependencies": {
"@freesewing/core": "3.2.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "latest"
},
"engines": {
"node": ">= 18.17.0 <22"
}
}

273
designs/bibi/src/back.mjs Normal file
View file

@ -0,0 +1,273 @@
import { base } from '@freesewing/brian'
import {
adjustSidePoints,
constructBackHem,
constructBackPoints,
correctArmHole,
createArmHoles,
plotSideLineMeasurements,
} from './shared.mjs'
import { sleeve } from './sleeve.mjs'
export const back = {
name: 'bibi.back',
from: base,
measurements: ['hips', 'waist', 'hpsToWaistBack', 'chest', 'seat', 'seatBack', 'waistToSeat'],
optionalMeasurements: ['bustSpan', 'highBust', 'waistToUnderbust', 'waistToKnee', 'waistToFloor'],
hide: { from: true },
after: sleeve,
options: {
// Brian overrides
s3Collar: 0,
s3Armhole: 0,
brianFitSleeve: true,
brianFitCollar: false,
bicepsEase: 0.05,
collarEase: 0,
shoulderSlopeReduction: 0,
sleeveWidthGuarantee: 0.85,
frontArmholeDeeper: 0.01,
legacyArmholeDepth: false,
shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
// Note: we reuse Brian's cuff ease as "armhole fullness"
cuffEase: {
pct: 20,
min: 0,
max: 200,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
armholeDepth: {
pct: 2,
min: -10,
max: 50,
menu: (settings, mergedOptions) =>
mergedOptions?.legacyArmholeDepth ? false : 'style.sleeves',
},
armholeCurveBack: {
pct: 30,
min: -10,
max: 120,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
armholeDropBack: {
pct: 20,
min: -50,
max: 50,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
lengthBonus: { pct: 0, min: -30, max: 30, menu: 'style.length' },
draftForHighBust: { bool: true, menu: 'fit' },
// Bibi specific
fitWaist: { bool: true, menu: 'fit', order: 'EBA' },
waistEase: {
pct: 1,
min: -10,
max: 20,
menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false),
order: 'EBB',
},
hipsEase: { pct: 2, 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' },
length: {
dflt: 'seat',
list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'],
menu: 'style.length',
},
flare: {
pct: 5,
min: 0,
max: 150,
menu: (settings, mergedOptions) =>
(mergedOptions.length === 'seat' && mergedOptions.lengthBonus > 0) ||
mergedOptions.length === 'knee' ||
mergedOptions.length === 'floor'
? 'style.length'
: false,
},
necklineWidth: { pct: 30, min: 10, max: 90, menu: 'style' },
strapWidth: {
pct: 40,
min: 5,
max: 100,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
sleeves: { bool: true, menu: 'style.sleeves' },
backNeckCutout: { pct: 15, min: 6, max: 110, menu: 'style' },
backNeckBend: { pct: 50, min: 0, max: 70, menu: 'style' },
},
draft: bibiBack,
}
function bibiBack({
store,
sa,
Point,
points,
Path,
paths,
Snippet,
snippets,
options,
measurements,
macro,
complete,
utils,
part,
}) {
// Hide Brian paths
for (const key of Object.keys(paths)) paths[key].hide()
// Re-use points for deeper armhole at the front
points.armholePitchCp1 = points.backArmholePitchCp1
points.armholePitch = points.backArmholePitch
points.armholePitchCp2 = points.backArmholePitchCp2
// clean up some unnecessary/confusing points
delete points.frontArmholePitchCp1
delete points.frontArmholePitch
delete points.frontArmholePitchCp2
delete points.backArmholePitchCp1
delete points.backArmholePitch
delete points.backArmholePitchCp2
delete points.cfNeck
delete points.cfNeckCp1
constructBackPoints(points, Point, measurements, options)
adjustSidePoints(points, options)
correctArmHole(points, paths, Path, options, utils)
points.cbHem = new Point(0, points.cbWaist.y + measurements.waistToHips * options.lengthBonus)
constructBackHem(points, measurements, options, Point, paths, Path)
store.set('backSideSeamLength', paths.sideSeam.length())
const strapWidth = options.sleeves ? 0 : options.strapWidth
points.neck = points.hps.shiftFractionTowards(
points.shoulder,
options.necklineWidth * (1 - strapWidth)
)
points.cbNeck = new Point(
0,
points.neck.y + options.backNeckCutout * points.neck.dy(points.cbChest)
)
points.cbNeckCp1 = points.cbNeck.shift(0, points.hps.x * options.backNeckBend * 2)
points.neckCp2 = points.neck
.shiftTowards(points.shoulder, points.neck.dy(points.cbNeck) * (0.2 + options.backNeckBend))
.rotate(-90, points.neck)
paths.backNeck = new Path()
.move(points.neck)
.curve(points.neckCp2, points.cbNeckCp1, points.cbNeck)
.addClass('fabric')
createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
options.armholeCurveBack,
options.armholeDropBack,
utils,
'bnotch'
)
paths.centerLine = new Path().move(points.cbNeck).line(points.cbHem).addClass('fabric')
store.set(
'gatherAreaStart',
Math.min(points.armhole.dy(points.cbWaist) / 10, paths.sideSeam.length() * 0.1)
)
store.set(
'gatherAreaLength',
Math.min(paths.sideSeam.length() * 0.8, points.armhole.dy(points.cbWaist) * 0.5)
)
const reverse = paths.sideSeam.reverse()
snippets.gatherAreaStart = new Snippet('notch', reverse.shiftAlong(store.get('gatherAreaStart')))
snippets.gatherAreaBack = new Snippet(
'notch',
reverse.shiftAlong(store.get('gatherAreaStart') + store.get('gatherAreaLength'))
)
if (sa) {
paths.sa = new Path()
.move(points.cbHem)
.join(paths.hem.offset(sa * 3))
.join(paths.sideSeam.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.shoulder.offset(sa))
.join(paths.backNeck.offset(sa))
.line(points.cbNeck)
.attr('class', 'fabric sa')
}
macro('cutonfold', {
from: points.cbNeck,
to: points.cbHem,
grainline: true,
})
delete snippets.logo
points.title = points.cbHem.shift(45, 60)
macro('title', { at: points.title, nr: 2, title: 'back' })
if (complete && points.hem.y > points.waist.y)
paths.waist = new Path().move(points.cbWaist).line(points.waist).attr('class', 'help')
macro('pd', {
id: 'pArmhole',
path: paths.armhole.reverse(),
d: -1 * sa - 15,
})
macro('pd', {
id: 'pNeck',
path: paths.backNeck.reverse(),
d: -1 * sa - 15,
})
macro('pd', {
id: 'pShoulder',
path: paths.shoulder.reverse(),
d: -1 * sa - 15,
})
macro('hd', {
id: 'wAtHem',
from: points.cbHem,
to: points.hem,
y: points.cbHem.y + sa * 2.5 + 15,
})
macro('vd', {
id: 'hHemToNeck',
from: points.cbHem,
to: points.cbNeck,
x: points.cbHem.x - sa - 15,
})
macro('vd', {
id: 'hNeckToArmhole',
from: points.neck,
to: points.armhole,
x: points.armhole.x + sa + 15,
})
plotSideLineMeasurements(points, paths.sideSeam, utils, macro)
return part
}

359
designs/bibi/src/front.mjs Normal file
View file

@ -0,0 +1,359 @@
import { base } from '@freesewing/brian'
import { back } from './back.mjs'
import {
adjustSidePoints,
calculateFba,
constructFrontHem,
constructFrontPoints,
correctArmHole,
createArmHoles,
plotSideLineMeasurements,
} from './shared.mjs'
export const front = {
name: 'bibi.front',
from: base,
measurements: [
'hips',
'waist',
'hpsToWaistBack',
'chest',
'hpsToWaistFront',
'seat',
'seatBack',
'waistToSeat',
'hpsToBust',
],
optionalMeasurements: ['bustSpan', 'highBust', 'waistToUnderbust', 'waistToKnee', 'waistToFloor'],
hide: { from: true },
plugins: [],
after: back,
options: {
dart: { bool: false, menu: 'fit' },
bustEase: {
pct: 0,
min: 0,
max: 10,
menu: (settings, mergedOptions) => (mergedOptions.draftForHighBust ? 'fit' : false),
order: 'EAA',
},
necklineDepth: { pct: 25, min: 20, max: 110, menu: 'style' },
necklineBend: { pct: 50, min: 0, max: 70, menu: 'style' },
armholeCurveFront: {
pct: 15,
min: -10,
max: 30,
menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'),
},
},
draft: bibiFront,
}
function bibiFront({
store,
sa,
Point,
points,
Path,
paths,
Snippet,
snippets,
options,
measurements,
macro,
complete,
utils,
part,
}) {
// Hide Brian paths
for (const key of Object.keys(paths)) paths[key].hide()
// Re-use points for deeper armhole at the front
points.armholePitchCp1 = points.frontArmholePitchCp1
points.armholePitch = points.frontArmholePitch
points.armholePitchCp2 = points.frontArmholePitchCp2
// clean up some unnecessary/confusing points
delete points.frontArmholePitchCp1
delete points.frontArmholePitch
delete points.frontArmholePitchCp2
delete points.backArmholePitchCp1
delete points.backArmholePitch
delete points.backArmholePitchCp2
delete points.cbHem
delete points.cbNeck
constructFrontPoints(points, Point, measurements, options)
// FBA
points.originalChest = points.chest
points.originalArmhole = points.armhole
points.originalArmholeCp2 = points.armholeCp2
let fba
if (options.draftForHighBust && measurements.bustSpan && measurements.highBust) {
fba = calculateFba(
points.neck.shiftFractionTowards(points.shoulder, 0.5),
points.bust,
points.armholeHollow,
(measurements.bust * (1 + options.bustEase) - measurements.chest) / 2,
Point
)
points.bustOffset = fba.bustOffset
points.sideOffset0 = fba.sideOffset0
points.sideOffset1 = fba.sideOffset1
points.chest = fba.rotateLower(points.chest)
points.armhole = fba.rotateUpper(points.armhole)
points.armholeCp2 = fba.rotateUpper(points.armholeCp2)
points.armholeHollowCp1 = fba.rotateUpper(points.armholeHollowCp1)
points.armholeHollow = fba.rotateUpper(points.armholeHollow)
points.armholeHollowCp2 = fba.rotateUpper(points.armholeHollowCp2)
points.armholePitchCp1 = fba.rotateUpper(points.armholePitchCp1)
points.armholePitch = fba.rotateUpper(points.armholePitch)
points.armholePitchCp2 = fba.rotateUpper(points.armholePitchCp2)
points.shoulderCp1 = fba.rotateUpper(points.shoulderCp1)
points.shoulder = fba.rotateUpper(points.shoulder)
}
adjustSidePoints(points, options)
correctArmHole(points, paths, Path, options, utils)
const strapWidth = options.sleeves ? 0 : options.strapWidth
points.neck = points.hps.shiftFractionTowards(
points.shoulder,
options.necklineWidth * (1 - strapWidth)
)
points.cfNeck = new Point(
0,
points.neck.y + options.necklineDepth * points.neck.dy(points.cfBust)
)
points.cfNeckCp1 = points.cfNeck.shift(0, points.hps.x * options.necklineBend * 2)
points.neckCp2 = points.neck
.shiftTowards(points.shoulder, points.neck.dy(points.cfNeck) * (0.2 + options.necklineBend))
.rotate(-90, points.neck)
paths.frontNeck = new Path()
.move(points.neck)
.curve(points.neckCp2, points.cfNeckCp1, points.cfNeck)
.addClass('fabric')
constructFrontHem(points, measurements, options, Point, paths, Path)
store.set('frontSideSeamLength', paths.sideSeam.length())
const frontLength = store.get('frontSideSeamLength')
const backLength = store.get('backSideSeamLength') ?? 0
const dartLength = frontLength - backLength
const constructDart = (path, tip, dartLength) => {
const length = path.length()
dartLength = Math.max(0, Math.min(dartLength, length / 2))
const gatherArea = (store.get('gatherAreaLength') ?? 0) + dartLength
const offset = length - (store.get('gatherAreaStart') ?? 0) - gatherArea
const startSplit = path.shiftAlong(offset)
const startDartAlpha = path.shiftAlong(offset + (gatherArea - dartLength) * 0.5)
const endDartAlpha = path.shiftAlong(offset + (gatherArea + dartLength) * 0.5)
const endSplit = path.shiftAlong(offset + gatherArea)
let tmp = path.split(startSplit)
const pathBefore = tmp[0]
tmp = tmp[1].split(endSplit)
const pathGather = tmp[0]
const pathAfter = tmp[1]
const angleBefore = path.angleAt(startSplit)
const angleAfter = path.angleAt(endSplit)
const cpBefore = startSplit.shift(angleBefore, dartLength / 3)
const cpAfter = endSplit.shift(angleAfter, -dartLength / 3)
const dartDist = Math.max(tip.dist(startDartAlpha), tip.dist(endDartAlpha))
const startDart = tip.shiftTowards(startDartAlpha, dartDist)
const endDart = tip.shiftTowards(endDartAlpha, dartDist)
const dartMid = startDart.shiftFractionTowards(endDart, 0.5)
const tipShifted = tip.shiftFractionTowards(dartMid, 0.25)
const dartCpStart = tipShifted
.shiftFractionTowards(dartMid, 0.25)
.shiftFractionTowards(startDart, 0.25)
const dartCpEnd = tipShifted
.shiftFractionTowards(dartMid, 0.25)
.shiftFractionTowards(endDart, 0.25)
const dartAngleMain = startDart.angle(endDart)
const dartAngleBefore = startDartAlpha.angle(endDartAlpha)
const dartAngle = dartAngleBefore * 2 - dartAngleMain
let dartInnerAngle = tipShifted.angle(endDart) - tipShifted.angle(startDart)
if (dartInnerAngle < -180) dartInnerAngle += 360
const cpSplitStart = startDart.shift(dartAngle - dartInnerAngle / 2, -dartLength / 4)
const cpSplitEnd = endDart.shift(dartAngle + dartInnerAngle / 2, dartLength / 4)
return {
beforeDart: pathBefore.clone().curve(cpBefore, cpSplitStart, startDart),
dart: new Path().move(startDart)._curve(dartCpStart, tipShifted).curve_(dartCpEnd, endDart),
afterDart: new Path().move(endDart).curve(cpSplitEnd, cpAfter, endSplit).join(pathAfter),
dartMiddle: new Path().move(dartMid).line(tipShifted),
startGather: startSplit,
endGather: endSplit,
startDart: startDart,
endDart: endDart,
dartTip: tipShifted,
gatherArea: gatherArea,
gatherPath: pathGather,
dartLength: dartLength,
offset: offset,
}
}
const dart = constructDart(paths.sideSeam, points.bust, dartLength)
store.set('dart', dart)
points.startGather = dart.startGather
points.endGather = dart.endGather
points.startDart = dart.startDart
points.endDart = dart.endDart
points.dartTip = dart.dartTip
paths.sideSeamWithDart = paths.originalSideSeam = paths.sideSeam.clone().hide()
if (options.dart && dartLength > dart.gatherArea / 5) {
paths.sideSeam1 = dart.beforeDart.hide()
paths.dart = dart.dart.addClass('fabric')
paths.sideSeam2 = dart.afterDart.hide()
if (complete) {
paths.dartMiddle = dart.dartMiddle.addClass('help')
}
paths.sideSeam = paths.sideSeam1.clone().combine(paths.sideSeam2).addClass('fabric')
paths.sideSeamWithDart = paths.sideSeam1.clone().join(paths.dart).join(paths.sideSeam2).hide()
}
if (complete) {
snippets.startGather = new Snippet('notch', points.startGather)
snippets.endGather = new Snippet('notch', points.endGather)
if (dartLength > dart.gatherArea / 10 && !paths.dart) {
paths.gatherPath = new Path()
.move(points.startGather)
.join(dart.gatherPath.offset(-20))
.line(points.endGather)
.addClass('dashed various')
.addText('gather', 'center various help')
}
}
createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
options.armholeCurveFront,
0,
utils
)
paths.centerLine = new Path().move(points.cfNeck).line(points.cfHem).addClass('fabric')
points.title = points.bust.shift(0, 5)
macro('title', { at: points.title, nr: 1, title: 'front' })
macro('cutonfold', {
from: points.cfNeck,
to: points.cfHem,
grainline: true,
})
if (sa) {
if (paths.sideSeam1)
paths.sa = new Path()
.move(points.cfHem)
.join(paths.hem.offset(sa * 3))
.join(paths.sideSeam1.offset(sa))
.join(paths.sideSeam2.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.shoulder.offset(sa))
.join(paths.frontNeck.offset(sa))
.line(points.cfNeck)
.attr('class', 'fabric sa')
else
paths.sa = new Path()
.move(points.cfHem)
.join(paths.hem.offset(sa * 3))
.join(paths.sideSeam.offset(sa))
.join(paths.armhole.offset(sa))
.join(paths.shoulder.offset(sa))
.join(paths.frontNeck.offset(sa))
.line(points.cfNeck)
.attr('class', 'fabric sa')
}
// Waist line
if (complete && points.hem.y > points.waist.y)
paths.waist = new Path().move(points.cfWaist).line(points.waist).attr('class', 'help')
macro('pd', {
id: 'pArmhole',
path: paths.armhole.reverse(),
d: -1 * sa - 15,
})
macro('pd', {
id: 'pNeck',
path: paths.frontNeck.reverse(),
d: -1 * sa - 15,
})
macro('pd', {
id: 'pShoulder',
path: paths.shoulder.reverse(),
d: -1 * sa - 15,
})
macro('hd', {
id: 'wAtHem',
from: points.cfHem,
to: points.hem,
y: points.hem.y + sa * 2.5 + 15,
})
macro('vd', {
id: 'hHemToNeck',
from: points.cfHem,
to: points.cfNeck,
x: points.cfHem.x - sa - 15,
})
macro('vd', {
id: 'hNeckToArmhole',
from: points.neck,
to: points.armhole,
x: points.armhole.x + sa + 15,
})
if (paths.dart) {
macro('vd', {
id: 'hDart',
from: points.endDart,
to: points.startDart,
x: points.endDart.x + sa + 15,
})
macro('ld', {
id: 'pDartStart',
from: points.dartTip,
to: points.startDart,
d: -sa - 15,
})
macro('ld', {
id: 'pDartEnd',
from: points.dartTip,
to: points.endDart,
d: sa + 15,
})
}
snippets.bustPoint = new Snippet('notch', points.bust)
plotSideLineMeasurements(points, paths.sideSeamWithDart, utils, macro)
return part
}

View file

@ -0,0 +1,49 @@
import { Design, mergeI18n } from '@freesewing/core'
import { data } from '../data.mjs'
import { i18n as brianI18n } from '@freesewing/brian'
import { i18n as bibiI18n } from '../i18n/index.mjs'
import { front } from './front.mjs'
import { back } from './back.mjs'
import { sleeve } from './sleeve.mjs'
import {
constructFrontPoints,
constructBackPoints,
calculateFba,
correctArmHole,
constructSideSeam,
adjustSidePoints,
constructBackHem,
constructFrontHem,
createArmHoles,
plotSideLineMeasurements,
} from './shared.mjs'
// Setup our new design
const Bibi = new Design({
data,
parts: [sleeve, back, front],
})
// Merge translations
const i18n = mergeI18n([brianI18n, bibiI18n], {
o: { drop: ['sleeveLengthBonus'] },
})
// Named exports
export {
front,
back,
sleeve,
constructFrontPoints,
constructBackPoints,
calculateFba,
correctArmHole,
constructSideSeam,
adjustSidePoints,
constructBackHem,
constructFrontHem,
createArmHoles,
plotSideLineMeasurements,
Bibi,
i18n,
}

485
designs/bibi/src/shared.mjs Normal file
View file

@ -0,0 +1,485 @@
function createLowerPoints(points, measurements, options, prefix) {
// These lengths are typically not critical, so use a rough estimate if not given
// We don't want the user to need these measurements, as this design can also be used for shorter tops
if (typeof measurements.waistToKnee !== 'undefined') {
points[prefix + 'Knee'] = points[prefix + 'Waist'].translate(0, measurements.waistToKnee)
} else {
points[prefix + 'Knee'] = points[prefix + 'Waist'].translate(
0,
measurements.hpsToWaistBack * 1.5
)
}
if (typeof measurements.waistToFloor !== 'undefined') {
points[prefix + 'Floor'] = points[prefix + 'Waist'].translate(0, measurements.waistToFloor)
} else {
points[prefix + 'Floor'] = points[prefix + 'Waist'].translate(
0,
measurements.hpsToWaistBack * 2.5
)
}
points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * (1 + options.flare), 0)
}
export function constructFrontPoints(points, Point, measurements, options) {
points.cfBust = new Point(0, measurements.hpsToBust)
if (measurements.bustSpan) {
points.bust = new Point(measurements.bustSpan / 2, measurements.hpsToBust)
} else {
// Very rough estimate, but only used for potential dart construction
points.bust = new Point(measurements.chest / 8, measurements.hpsToBust)
}
points.chest = new Point(
(measurements.chest * (1 + options.chestEase)) / 4,
measurements.hpsToBust
)
points.cbWaist = new Point(0, measurements.hpsToWaistBack)
points.cfWaist = new Point(0, Math.max(measurements.hpsToWaistBack, measurements.hpsToWaistFront))
points.waist = new Point((measurements.waist * (1 + options.waistEase)) / 4, points.cfWaist.y)
points.cfArmhole = new Point(
0,
points.cbWaist.y -
measurements.waistToArmpit * (1 - options.armholeDepth - options.bicepsEase / 2)
)
points.armhole = new Point(points.armhole.x, points.cfArmhole.y)
points.armholeCp2 = points.armhole.shift(180, points._tmp1.dx(points.armhole) / 4)
points.cfUnderbust = new Point(
0,
points.cfWaist.y - (measurements.waistToUnderbust ?? measurements.hpsToWaistBack / 6)
)
points.underbust = new Point(
(measurements.chest * (1 + options.chestEase)) / 4,
points.cfUnderbust.y
)
points.cfHips = new Point(0, points.cfWaist.y + measurements.waistToHips)
points.hips = new Point((measurements.hips * (1 + options.hipsEase)) / 4, points.cfHips.y)
const seatFront = measurements.seat - measurements.seatBack
const seatExtra = (measurements.seatBack - seatFront) / 4
points.cfSeat = new Point(0, points.cfWaist.y + measurements.waistToSeat)
points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cfSeat.y)
points.seat = seatAdjustment(points.seatBase, points.hips, -seatExtra)
// points.cfSeat = points.cfSeat.shift(-90, -seatExtra * 2)
createLowerPoints(points, measurements, options, 'cf')
}
export function constructBackPoints(points, Point, measurements, options) {
points.chest = new Point(
(measurements.chest * (1 + options.chestEase)) / 4,
measurements.hpsToBust
)
points.cbWaist = new Point(0, measurements.hpsToWaistBack)
points.waist = new Point((measurements.waist * (1 + options.waistEase)) / 4, points.cbWaist.y)
points.cbUnderbust = new Point(
0,
points.cbWaist.y - (measurements.waistToUnderbust ?? measurements.hpsToWaistBack / 6)
)
points.underbust = new Point(
(measurements.chest * (1 + options.chestEase)) / 4,
points.cbUnderbust.y
)
points.cbHips = new Point(0, points.cbWaist.y + measurements.waistToHips)
points.hips = new Point((measurements.hips * (1 + options.hipsEase)) / 4, points.cbHips.y)
points.cbSeat = new Point(0, points.cbWaist.y + measurements.waistToSeat)
const seatFront = measurements.seat - measurements.seatBack
const seatExtra = (measurements.seatBack - seatFront) / 4
points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cbSeat.y)
points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra)
// points.cbSeat = points.cbSeat.shift(-90, seatExtra * 2)
createLowerPoints(points, measurements, options, 'cb')
}
function seatAdjustment(seatBase, anchor, seatExtra) {
const r = anchor.dist(seatBase)
return seatBase.rotate((seatExtra / r) * 90, anchor)
}
export function calculateFba(anchor, bust, side, dx, Point) {
const r = anchor.dist(bust)
const a0 = Math.asin((bust.x - anchor.x) / r)
let a1 = Math.asin((bust.x - anchor.x + dx) / r)
if (isNaN(a1)) {
a1 = Math.PI / 2
}
const bustOffset = new Point(anchor.x + r * Math.sin(a1), anchor.y + r * Math.cos(a1))
const dy = bustOffset.y - bust.y
const b = a1 - a0
const rotateUpper = (point) => point.rotate((b / Math.PI) * 180, anchor)
const sideOffset0 = rotateUpper(side)
const sideOffset1 = side.translate(dx, dy)
const c = sideOffset1.angle(bust) - sideOffset0.angle(bust)
const rotateLower = (point) => point.translate(dx, dy).rotate(-c, bust)
return {
dx: dx,
dy: dy,
rotateUpper: rotateUpper,
rotateLower: rotateLower,
bustOffset: bustOffset,
sideOffset0: sideOffset0,
sideOffset1: sideOffset1,
}
}
export function correctArmHole(points, paths, Path, options, utils) {
points.armholeCp1 = points.chest
if (!options.sleeves && points.armhole.y > points.chest.y) {
points.armhole = utils.beamIntersectsY(points.chest, points.waist, points.armhole.y)
points.armholeCp2 = points.armhole.shift(180, points._tmp1.dx(points.armhole) / 4)
}
if (points.armhole.y > points.armholeCp1.y * 0.8) {
const frac = Math.min(
1,
(points.armhole.y - points.armholeCp1.y * 0.8) / (0.2 * points.armholeCp1.y)
)
points.armholeCp1 = points.chest.shiftFractionTowards(
points.armholeCp2.rotate(90, points.armhole),
frac
)
}
}
function extendSideLine(points, intersectionY) {
const fraction = (intersectionY - points.seat.y) / points.seat.dy(points.sideTarget)
return points.seat.shiftFractionTowards(points.sideTarget, fraction)
}
export function constructSideSeam(Path, Point, points, height, bottomSmoothness) {
const base = new Path()
.move(points.armhole)
.curve(points.armholeCp1, points.waistCp2, points.waist)
.smurve(points.hipsCp2, points.hips)
.smurve(points.seatCp2, points.seat)
const intersectionY = Math.min(height, points.seat.y) - bottomSmoothness
let bottom = base.intersectsY(height)[0]
if (!bottom) {
// below seat
bottom = extendSideLine(points, height)
}
points.hem = bottom
let intersection = base.intersectsY(intersectionY)[0]
if (!intersection) {
if (intersectionY >= points.seat.y) {
// below seat
intersection = extendSideLine(points, intersectionY)
} else {
//above armhole
intersection = points.armhole
}
}
bottom.x = (bottom.x + intersection.x) / 2 // creates a smoother bottom as the bottom is vertical
points.intersection = intersection
const angle = base.angleAt(intersection)
if (!angle) {
return base
}
const intersectionCp1 = intersection.shift(angle, bottomSmoothness * 0.3)
const intersectionCp2 = new Point(bottom.x, bottom.y - bottomSmoothness * 0.3)
points.intersectionCp1 = intersectionCp1
points.intersectionCp2 = intersectionCp2
let result = base.split(intersection)[0]
if (!result.curve) {
result = new Path().move(points.armhole)
}
return result.curve(intersectionCp1, intersectionCp2, bottom).reverse()
}
export function adjustSidePoints(points, options) {
// Remove waist fitting if option is disabled
if (!options.fitWaist || points.waist.x > points.armhole.x) {
if (points.waist.x < points.armhole.x) {
points.waist.x = points.armhole.x
}
points.waistCp2 = points.waist.shiftFractionTowards(points.armhole, 0.2)
if (points.hips.x < points.waist.x) {
points.hips.x = points.waist.x
}
}
// prevent barrel shape
if (points.hips.x < points.waist.x) {
points.hips.x = points.waist.x
}
// prevent excessive hips narrowing
if (points.hips.x < (points.waist.x + points.seat.x) / 2) {
points.hips.x = (points.waist.x + points.seat.x) / 2
}
// prevent smaller seat than hips
if (points.seat.x < points.hips.x) {
points.seat.x = points.hips.x
}
// prevent excessive waist narrowing
if (points.waist.x < 2 * points.hips.x - points.seat.x) {
points.waist.x = 2 * points.hips.x - points.seat.x
}
// curve points
points.waistCp2 = points.waist.shift(90, points.armhole.dy(points.waist) * 0.2)
points.seatCp2 = points.seat.shift(90, points.hips.dy(points.seat) * 0.3)
points.hipsCp2 = points.waist.shiftFractionTowards(points.hips, 0.6)
}
function getBottomSmoothness(bottom, points) {
return (Math.min(bottom, points.seat.y) - points.armhole.y) * 0.3
}
export function constructBackHem(points, measurements, options, Point, paths, Path) {
let centerPoint
// Extra length for butt
let extraBackLength = 0
let bonusLengthMeasurement = measurements.hpsToWaistBack
switch (options.length) {
case 'underbust':
centerPoint = points.cbUnderbust
bonusLengthMeasurement = measurements.waistToUnderbust
break
case 'waist':
centerPoint = points.cbWaist
break
case 'hips':
centerPoint = points.cbHips
break
case 'seat':
centerPoint = points.cbSeat
extraBackLength = (measurements.seatBack - measurements.seat / 2) / 2
bonusLengthMeasurement *= 2
break
case 'knee':
centerPoint = points.cbKnee
extraBackLength = (measurements.seatBack - measurements.seat / 2) / 2
bonusLengthMeasurement *= 3
break
case 'floor':
centerPoint = points.cbFloor
extraBackLength = (measurements.seatBack - measurements.seat / 2) / 2
bonusLengthMeasurement *= 3
}
if (!centerPoint) {
centerPoint = points.cbSeat
}
const hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus
points.cbHem = new Point(
0,
centerPoint.y + bonusLengthMeasurement * options.lengthBonus + extraBackLength
)
points.midHem = new Point(points.hem.x * 0.66, points.cbHem.y)
paths.sideSeam = constructSideSeam(
Path,
Point,
points,
hemBottom,
getBottomSmoothness(hemBottom, points)
).addClass('fabric')
paths.hem = new Path()
.move(points.cbHem)
.curve(points.midHem, points.midHem, points.hem)
.addClass('fabric')
}
export function constructFrontHem(points, measurements, options, Point, paths, Path) {
let centerPoint
let bonusLengthMeasurement = measurements.hpsToWaistBack
switch (options.length) {
case 'underbust':
centerPoint = points.cfUnderbust
bonusLengthMeasurement = measurements.waistToUnderbust
break
case 'waist':
centerPoint = points.cfWaist
break
case 'hips':
centerPoint = points.cfHips
break
case 'seat':
centerPoint = points.cfSeat
bonusLengthMeasurement *= 2
break
case 'knee':
centerPoint = points.cfKnee
bonusLengthMeasurement *= 3
break
case 'floor':
centerPoint = points.cfFloor
bonusLengthMeasurement *= 3
}
if (!centerPoint) {
centerPoint = points.cfSeat
}
const hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus
points.cfHem = new Point(0, centerPoint.y + bonusLengthMeasurement * options.lengthBonus)
points.midHem = new Point(points.hem.x * 0.66, points.cfHem.y)
paths.sideSeam = constructSideSeam(
Path,
Point,
points,
hemBottom,
getBottomSmoothness(hemBottom, points)
).addClass('fabric')
paths.hem = new Path()
.move(points.cfHem)
.curve(points.midHem, points.midHem, points.hem)
.addClass('fabric')
}
export function createArmHoles(
options,
store,
points,
paths,
Path,
snippets,
Snippet,
strapWidth,
armholeCurve,
armholeDrop,
utils,
notchType = 'notch'
) {
if (options.sleeves) {
if (store.get('capSleeves')) {
const sleeveCapFactor = (options.sleeveLength + 0.2) * 4
const capLength = sleeveCapFactor * store.get('sleeveCapHeight')
points.sleeveCap = points.shoulder.shift(
points.neck.angle(points.shoulder) - 15 + options.cuffEase * 15,
capLength
)
points.sleeveCapStart = points.shoulder.shift(
points.neck.angle(points.shoulder),
capLength * -0.2
)
points.sleeveCapCp = points.sleeveCap
.shiftTowards(points.armholePitchCp1, capLength * 0.2)
.rotate(-90, points.sleeveCap)
paths.shoulder = new Path()
.move(points.sleeveCap)
.curve(points.sleeveCapCp, points.shoulder, points.sleeveCapStart)
.line(points.neck)
.addClass('fabric')
paths.armhole = new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.sleeveCap)
.addClass('fabric')
} else {
paths.shoulder = new Path().move(points.shoulder).line(points.neck).addClass('fabric')
paths.armhole = new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.armholeHollowCp1, points.armholeHollow)
.curve(points.armholeHollowCp2, points.armholePitchCp1, points.armholePitch)
.curve(points.armholePitchCp2, points.shoulderCp1, points.shoulder)
.addClass('fabric')
snippets.armholePitchNotch = new Snippet(notchType, points.armholePitch)
}
} else {
points.strapTop = points.neck.shift(
points.shoulder.angle(points.hps),
-strapWidth * points.shoulder.dist(points.hps)
)
points.strapTopCp1 = points.strapTop
.shiftTowards(points.hps, 0.2 * points.strapTop.dy(points.armhole))
.rotate(90, points.strapTop)
// Increase weight of armhole control points because we don't use armholeHollow here anymore
points.armholeCp2 = points.armhole.shiftFractionTowards(points.armholeCp2, 3)
points.armholeIntersection = utils.beamsIntersect(
points.strapTop,
points.strapTopCp1,
points.armhole,
points.armholeCp2
)
points.armholeIntersectionDrop = points.armholeIntersection.shiftFractionTowards(
points.strapTop,
-armholeDrop
)
points.armholeCp2 = points.armholeCp2.shiftFractionTowards(
points.armholeIntersection,
armholeCurve
)
points.strapTopCp1 = points.strapTopCp1.shiftFractionTowards(
points.armholeIntersectionDrop,
armholeCurve
)
paths.armhole = new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.strapTopCp1, points.strapTop)
.addClass('fabric')
paths.shoulder = new Path().move(points.strapTop).line(points.neck).addClass('fabric')
}
}
export function plotSideLineMeasurements(points, sideSeam, utils, macro) {
const offsets = {
seat: points.seat.y,
hips: points.hips.y,
waist: points.waist.y,
underbust: points.underbust.y,
dart: points.dartTip?.y,
armhole: points.armhole.y + 0.01,
}
let prevY = (points.cfHem ?? points.cbHem).y
const strings = Object.keys(offsets)
for (let i = 0; i < strings.length; i++) {
const key = strings[i]
let y = offsets[key]
if (!y || y > points.hem.y) {
continue
}
let intersects = sideSeam.intersectsY(y)
if (intersects.length === 0) {
// Intersecting the path exactly on the corner points sometimes doesn't work
// See issue #3367
y += 0.001
intersects = sideSeam.intersectsY(y)
}
if (intersects.length > 0) {
const sidePoint = intersects[0]
const centerPoint = sidePoint.clone()
centerPoint.x = 0
const prevPoint = centerPoint.clone()
prevPoint.y = prevY
prevY = y
macro('hd', {
id: 'wAt' + utils.capitalize(key),
from: centerPoint,
to: sidePoint,
y: y,
})
macro('vd', {
id: 'hBelow' + utils.capitalize(key),
from: centerPoint,
to: prevPoint,
x: 30,
})
}
}
}

146
designs/bibi/src/sleeve.mjs Normal file
View file

@ -0,0 +1,146 @@
import { sleevecap as brianSleeveCap } from '@freesewing/brian'
import { hidePresets } from '@freesewing/core'
export const sleeve = {
name: 'bibi.sleeve',
from: brianSleeveCap,
hide: hidePresets.HIDE_TREE,
options: {
sleeveLength: {
pct: 20,
min: -20,
max: 110,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
cuffEase: {
pct: 20,
min: 0,
max: 200,
menu: (settings, mergedOptions) =>
mergedOptions.sleeves === false ? false : 'style.sleeves',
},
},
measurements: ['shoulderToWrist', 'wrist'],
draft: bibiSleeve,
}
function bibiSleeve({
options,
store,
measurements,
points,
paths,
Point,
Path,
sa,
macro,
snippets,
Snippet,
part,
}) {
points.sleeveTip = paths.sleevecap.edge('top')
points.sleeveTop = new Point(0, points.sleeveTip.y) // Always in center
// Determine the sleeve length
store.set('sleeveLength', measurements.shoulderToWrist * options.sleeveLength)
store.set('capSleeves', options.sleeveLength < 0.05)
store.set('sleeveCapHeight', -points.sleeveTop.y)
if (store.get('capSleeves')) {
return part.hide()
}
if (!options.sleeves) {
store.set('sleeveLength', 0)
return part.hide()
}
// Wrist
points.centerWrist = points.sleeveTop.shift(-90, measurements.shoulderToWrist)
points.wristRight = points.centerWrist.shift(0, (measurements.wrist * (1 + options.cuffEase)) / 2)
points.wristLeft = points.wristRight.rotate(180, points.centerWrist)
points.cuffRight = points.bicepsRight.shiftFractionTowards(
points.wristRight,
options.sleeveLength
)
points.cuffLeft = points.bicepsLeft.shiftFractionTowards(points.wristLeft, options.sleeveLength)
points.centerCuff = points.cuffRight.shiftFractionTowards(points.cuffLeft, 0.5)
// Paths
paths.sleevecap.hide()
paths.seam = new Path()
.move(points.bicepsLeft)
.move(points.cuffLeft)
.move(points.cuffRight)
.line(points.bicepsRight)
.join(paths.sleevecap)
.close()
.attr('class', 'fabric')
if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
/*
* Annotations
*/
// Anchor point for sampling
points.gridAnchor = new Point(0, 0)
// Grainline
macro('grainline', {
from: points.centerCuff,
to: points.centerBiceps,
})
// Cut list
store.cutlist.addCut({ cut: 2, from: 'fabric' })
// Logo
points.logo = points.centerBiceps.shiftFractionTowards(points.centerCuff, 0.3)
snippets.logo = new Snippet('logo', points.logo)
// Title
macro('title', { at: points.centerBiceps, nr: 3, title: 'sleeve' })
// Notches
points.frontNotch = paths.sleevecap.shiftAlong(store.get('frontArmholeToArmholePitch'))
points.backNotch = paths.sleevecap.reverse().shiftAlong(store.get('backArmholeToArmholePitch'))
snippets.frontNotch = new Snippet('notch', points.frontNotch)
snippets.backNotch = new Snippet('bnotch', points.backNotch)
// Dimensions
macro('vd', {
id: 'hCuffToArmhole',
from: points.cuffLeft,
to: points.bicepsLeft,
x: points.bicepsLeft.x - sa - 15,
})
macro('vd', {
id: 'hFull',
from: points.cuffLeft,
to: points.sleeveTip,
x: points.bicepsLeft.x - sa - 30,
})
macro('hd', {
id: 'wFull',
from: points.bicepsLeft,
to: points.bicepsRight,
y: points.sleeveTip.y - sa - 30,
})
macro('hd', {
id: 'wCuff',
from: points.cuffLeft,
to: points.cuffRight,
y: points.cuffLeft.y + sa + 30,
})
macro('pd', {
id: 'lSleevevap',
path: paths.sleevecap.reverse(),
d: -1 * sa - 15,
})
return part
}

View file

@ -0,0 +1,20 @@
// This file is auto-generated | Any changes you make will be overwritten.
import { Bibi, 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(Bibi)
// Test translation
testPatternI18n(Bibi, i18n)
// Test drafting - Change the second parameter to `true` to log errors
testPatternDrafting(Bibi, false)
// Test sampling - Change the second parameter to `true` to log errors
testPatternSampling(Bibi, false)

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -54,7 +54,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -54,7 +54,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -57,7 +57,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -56,7 +56,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -98,8 +98,8 @@ export const base = {
panels: { list: ['11', '13'], dflt: '13', menu: 'fit' },
backOpening: { pct: 4, min: 3, max: 10, menu: 'style' },
backRise: { pct: 15, min: 1, max: 25, menu: 'style' },
backDrop: { pct: 2, min: 0, max: 5, menu: 'style' },
frontRise: { pct: 4, min: 0.1, max: 8, menu: 'style' },
backDrop: { pct: 2, min: -10, max: 5, menu: 'style' },
frontRise: { pct: 4, min: -10, max: 8, menu: 'style' },
frontDrop: { pct: 5, min: 0, max: 10, menu: 'style' },
hipRise: { pct: 5, min: 0, max: 15, menu: 'style' },
},

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -33,7 +33,7 @@ function draftCharlieFlyFacing({ points, Point, paths, Path, macro, snippets, st
/*
* Annotations
*/
store.cutlist.setCut({ cut: 2, from: 'fabric' })
store.cutlist.setCut({ cut: 1, from: 'fabric' })
// Grainline
points.grainlineTop = points.flyTop.shiftFractionTowards(points.styleWaistIn, 0.5)

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -49,7 +49,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -56,7 +56,7 @@
"@freesewing/plugin-gore": "3.2.0"
},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -101,6 +101,8 @@ export const back = {
ribbing: { bool: true, menu: 'style' },
ribbingHeight: { pct: 10, min: 5, max: 15, menu: 'style' },
hipsEase: { pct: 8, min: 4, max: 12, menu: 'fit' },
// Override Brian's lengthbonus. See #6596
lengthBonus: { pct: 15, min: -4, max: 60, menu: 'style' },
},
draft: draftHueyBack,
}

View file

@ -117,7 +117,7 @@ export function draftRibbing(part, length) {
msg: `huey:cut${capitalize(part.name.split('.')[1])}`,
notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'],
replace: {
w: units(height + extraSa),
w: units(2 * height + extraSa),
l: units(length + extraSa),
},
suggest: {

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -55,7 +55,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -56,7 +56,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

View file

@ -21,7 +21,7 @@
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-125-pink.svg"
><img src="https://img.shields.io/badge/all_contributors-128-pink.svg"
alt="All Contributors"/>
</a></p><p align='center'><a
href="https://twitter.com/freesewing_org"

View file

@ -53,7 +53,7 @@
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"mocha": "10.4.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"

17
designs/lily/CHANGELOG.md Normal file
View file

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

162
designs/lily/README.md Normal file
View file

@ -0,0 +1,162 @@
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/lily"
title="@freesewing/lily on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/lily.svg"
alt="@freesewing/lily on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/lily.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%3Alily"
title="Open issues tagged pkg:lily"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:lily.svg?label=Issues"
alt="Open issues tagged pkg:lily"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-126-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/lily
A FreeSewing pattern for basic leggings
# 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/lily
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:
>
> [![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
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).

35
designs/lily/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/lily/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/lily'
export const version = '3.2.0'
export const data = { name, version }

View file

@ -0,0 +1,7 @@
{
"t": "Lily",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

24
designs/lily/i18n/en.json Normal file
View file

@ -0,0 +1,24 @@
{
"t": "Lily",
"d": "A FreeSewing pattern for basic leggings",
"p": {
"back": "Back",
"front": "Front",
"waistband": "Waistband"
},
"s": {
"adjustEase.t": "Adjust ease settings to match fabric stretch",
"adjustEase.d": "Knee, seat and waist ease should be set to fabric stretch * -1/10; click the button to adjust all three.",
"adjustEase": "adjust ease"
},
"o": {
"lengthReduction": {
"t": "Length reduction",
"d": "Controls how much the leggings are shortened with respect to ankle length"
},
"fabricStretch": {
"t": "Fabric stretch",
"d": "How much the fabric can stretch horizontally; this is used to calculate ease"
}
}
}

View file

@ -0,0 +1,7 @@
{
"t": "Lily",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,7 @@
{
"t": "Lily",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,8 @@
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' }
export const i18n = { en, de, es, fr, nl, uk }

View file

@ -0,0 +1,7 @@
{
"t": "Lily",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

View file

@ -0,0 +1,7 @@
{
"t": "Lily",
"d": "A FreeSewing pattern that needs a description",
"p": { },
"s": { },
"o": { }
}

74
designs/lily/package.json Normal file
View file

@ -0,0 +1,74 @@
{
"name": "@freesewing/lily",
"version": "3.2.0",
"description": "A FreeSewing pattern for basic leggings",
"author": "Anna Puk (https://github.com/anna-puk)",
"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": {
".": {
"internal": "./src/index.mjs",
"default": "./dist/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"
},
"peerDependencies": {
"@freesewing/core": "3.2.0",
"@freesewing/titan": "3.2.0",
"@freesewing/paco": "3.2.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.3.0",
"chai": "5.1.0",
"@freesewing/models": "3.2.0",
"@freesewing/plugin-timing": "3.2.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "latest"
},
"engines": {
"node": ">= 18.17.0 <22"
}
}

590
designs/lily/src/back.mjs Normal file
View file

@ -0,0 +1,590 @@
import { back as titanBack } from '@freesewing/titan'
function draftLilyBack({
points,
Point,
paths,
Path,
measurements,
options,
complete,
paperless,
store,
macro,
utils,
snippets,
Snippet,
sa,
absoluteOptions,
part,
log,
units,
}) {
//TODO: implement stretch setting to replace ease
// work-around: flag it
const stretchAsEase = -options.fabricStretch / 10
const easeTol = 0.005
if (
Math.abs(options.waistEase - stretchAsEase) > easeTol ||
Math.abs(options.seatEase - stretchAsEase) > easeTol ||
Math.abs(options.kneeEase - stretchAsEase) > easeTol
) {
store.flag.note({
msg: `lily:adjustEase`,
replace: {
stretch: units(options.fabricStretch),
ease: stretchAsEase,
},
suggest: {
text: 'adjustEase',
icon: 'options',
update: {
settings: [
'options',
{
...options,
waistEase: stretchAsEase,
seatEase: stretchAsEase,
kneeEase: stretchAsEase,
},
],
},
},
})
}
/*
* Helper method to draw the inseam path
*/
const drawInseam = () =>
new Path()
.move(points.fork)
.curve(points.forkCp2, points.kneeInCp1, points.kneeIn)
.curve(points.kneeInCp2, points.floorInCp2, points.floorIn)
/*
* Helper method to draw the outseam path
*/
const drawOutseam = () => {
const waistOut = points.styleWaistOutLily || points.waistOut
if (points.waistOut.x > points.seatOut.x)
return new Path()
.move(points.floorOut)
.curve(points.floorOutCp2, points.kneeOutCp1, points.kneeOut)
.curve(points.kneeOutCp2, points.seatOut, waistOut)
else
return new Path()
.move(points.floorOut)
.curve(points.floorOutCp2, points.kneeOutCp1, points.kneeOut)
.curve(points.kneeOutCp2, points.seatOutCp1, points.seatOut)
.curve_(points.seatOutCp2, waistOut)
}
/*
* Helper method to draw the outline path
*/
const drawPath = () => {
const waistIn = points.styleWaistInLily || points.waistIn
return drawInseam()
.line(points.floorOut)
.join(drawOutseam())
.line(waistIn)
.line(points.crossSeamCurveStart)
.curve(points.crossSeamCurveCp1, points.crossSeamCurveCp2, points.fork)
.close()
}
/*
* Helper method to calculate the length of the cross seam
*/
const crossSeamDelta = () =>
new Path()
.move(points.waistIn)
.line(points.crossSeamCurveStart)
.curve(points.crossSeamCurveCp1, points.crossSeamCurveCp2, points.fork)
.length() - measurements.crossSeamBack
/*
* Helper method to (re)draw the cross seam
*/
const drawCrossSeam = () => {
points.crossSeamCurveStart = points.waistIn.shiftFractionTowards(
points.cbSeat,
options.crossSeamCurveStart
)
points.crossSeamCurveMax = utils.beamsIntersect(
points.waistIn,
points.cbSeat,
points.fork,
points.fork.shift(0, 1) // beams have infinite length anyway
)
points.crossSeamCurveCp1 = points.crossSeamCurveStart.shiftFractionTowards(
points.crossSeamCurveMax,
options.crossSeamCurveBend
)
points.crossSeamCurveCp2 = points.fork
.shiftFractionTowards(points.crossSeamCurveMax, options.crossSeamCurveBend)
.rotate(options.crossSeamCurveAngle, points.fork)
}
// NOTE: majority of points re-used from titan
// shape at the ankle (unlike titan)
const halfAnkle =
measurements.ankle * (1 + options.fabricStretch) > measurements.heel
? (1 - options.fabricStretch / 10) * (measurements.ankle / 4)
: measurements.heel / 4 / (1 + options.fabricStretch)
// NOTE: for shortened leggings, this may not have been necessary...
points.floorOut = points.floor.shift(0, halfAnkle)
points.floorIn = points.floorOut.flipX(points.floor)
store.set('halfAnkle', halfAnkle)
points.floorInCp2 = points.floorIn.shift(90, points.knee.dy(points.floor) / 3)
points.kneeInCp2 = points.kneeIn.shift(90, -points.knee.dy(points.floor) / 3)
points.floorOutCp2 = points.floorOut.shift(90, points.knee.dy(points.floor) / 3)
points.kneeOutCp1 = points.kneeOut.shift(90, -points.knee.dy(points.floor) / 3)
// other control points have already been calculated in titan:
// Control points to shape the legs towards the seat
// Balance the waist
// Cross seam
drawCrossSeam()
//Uncomment the line below to see the seam prior to fitting the cross seam
// paths.seam1 = drawPath().attr('class', 'dashed lining')
// Should we fit the cross seam?
if (options.fitCrossSeam && options.fitCrossSeamBack) {
let delta = crossSeamDelta()
let run = 0
do {
run++
// Remedy A: Slash and spread
for (const i of ['waistIn', 'waistOut'])
points[i] = points[i].rotate(delta / 15, points.seatOut)
// Remedy B: Nudge the fork inwards/outwards
points.fork = points.fork.shift(0, delta / 5)
points.forkCp2 = points.crossSeamCurveCp2.rotate(-90, points.fork)
drawCrossSeam()
delta = crossSeamDelta()
// Uncomment the line beloe this to see all iterations
// paths[`try${run}`] = drawPath().attr('class', 'dotted')
} while (Math.abs(delta) > 1 && run < 15)
}
// Store inseam & outseam length
store.set('inseamBack', drawInseam().length())
store.set('outseamBack', drawOutseam().length())
// Only now style the waist lower if requested
// Note: redo this for lily even though it was already done for titan;
// calculation for titan happened using its own seam lengths
store.set('waistbandWidth', absoluteOptions.waistbandWidth) // used in lilyWaistband
if (options.waistHeight < 1 || absoluteOptions.waistbandWidth > 0) {
points.styleWaistOutLily = drawOutseam()
.reverse()
.shiftAlong(
measurements.waistToHips * (1 - options.waistHeight) + absoluteOptions.waistbandWidth
)
points.styleWaistInLily = utils.beamsIntersect(
points.styleWaistOutLily,
points.styleWaistOutLily.shift(points.waistOut.angle(points.waistIn), 10),
points.waistIn,
points.crossSeamCurveStart
)
} else {
points.styleWaistInLily = points.waistIn.clone()
points.styleWaistOutLily = points.waistOut.clone()
}
// Adapt the vertical placement of the seat control point to the lowered waist
points.seatOutCp2.y = points.seatOut.y - points.styleWaistOutLily.dy(points.seatOut) / 2
let test = points.styleWaistInLily.dist(points.styleWaistOutLily)
console.log('back waist length', test)
store.set('backWaist', points.styleWaistInLily.dist(points.styleWaistOutLily))
// Paths
paths.seam = drawPath().attr('class', 'fabric')
// adjust the length (at the bottom)
let extendBeyondKnee = 1
if (options.lengthReduction > 0) {
let requestedLength = (1 - options.lengthReduction) * measurements.waistToFloor
// leggings must reach to fork at least, so define a minimum
const waistToFork = points.waistX.dy(points.fork)
if (waistToFork >= 0.999 * requestedLength) {
log.warn('length reduction capped; cutting off at fork')
// add one percent to waistToFork to ensure that path length is nonzero
requestedLength = waistToFork * 1.01
}
// work-around to avoid splitting exactly at the knee
// (due to a bug, splitting a path at a node is not possible)
if (
0.999 < requestedLength / measurements.waistToKnee &&
requestedLength / measurements.waistToKnee < 1.001
) {
requestedLength = 1.001 * measurements.waistToKnee
}
points.bottom = points.waistX.shift(270, requestedLength)
let upperPoint, upperCp
if (requestedLength < measurements.waistToKnee) {
extendBeyondKnee = 0
// 'cut' between fork and knee
if (points.waistOut.x > points.seatOut.x) {
upperPoint = points.styleWaistOutLily
upperCp = points.seatOut
} else {
upperPoint = points.seatOut
upperCp = points.seatOutCp1
}
points.bottomOut = utils.beamIntersectsCurve(
points.bottom.shift(0, 999),
points.bottom.shift(180, 999),
points.kneeOut,
points.kneeOutCp2,
upperCp,
upperPoint
)
points.bottomIn = utils.beamIntersectsCurve(
points.bottom.shift(0, 999),
points.bottom.shift(180, 999),
points.kneeIn,
points.kneeInCp1,
points.forkCp2,
points.fork
)
} else {
// 'cut' between knee and 'floor'
points.bottomOut = utils.beamIntersectsCurve(
points.bottom.shift(0, 999),
points.bottom.shift(180, 999),
points.kneeOut,
points.kneeOutCp1,
points.floorOutCp2,
points.floorOut
)
points.bottomIn = utils.beamIntersectsCurve(
points.bottom.shift(0, 999),
points.bottom.shift(180, 999),
points.kneeIn,
points.kneeInCp2,
points.floorInCp2,
points.floorIn
)
}
// define the three parts of the path, then combine
paths.bottom = new Path().move(points.bottomIn).line(points.bottomOut)
const halves = paths.seam.split(points.bottomIn)
paths.upperInseam = halves[0]
const halves2 = halves[1].split(points.bottomOut)
paths.upperOutseam = halves2[1]
paths.seam = paths.upperInseam.join(paths.bottom).join(paths.upperOutseam)
// store requestedLength for use in front part
store.set('requestedLength', requestedLength)
} else {
// define the same three parts of the path as when length reduction is enabled, then combine
// first define the points (also used for paperless)
points.bottom = points.floor
points.bottomIn = points.floorIn
points.bottomOut = points.floorOut
paths.bottom = new Path().move(points.bottomIn).line(points.bottomOut)
// note: upperOutseam contains waist and cross seam as well
paths.upperInseam = drawInseam()
paths.upperOutseam = drawOutseam().join(
new Path()
.move(points.styleWaistOutLily)
.line(points.styleWaistInLily)
.line(points.crossSeamCurveStart)
.curve(points.crossSeamCurveCp1, points.crossSeamCurveCp2, points.fork)
)
paths.bottom.hide()
paths.upperInseam.hide()
paths.upperOutseam.hide()
}
points.grainlineTop.y = points.styleWaistOutLily.y
points.grainlineBottom.y = points.bottom.y
macro('grainline', {
from: points.grainlineTop,
to: points.grainlineBottom,
})
points.logoAnchor = new Point(points.crossSeamCurveStart.x / 2, points.fork.y)
snippets.logo = new Snippet('logo', points.logoAnchor)
points.scalebox = points.logoAnchor.shiftFractionTowards(
points.styleWaistOutLily.shiftFractionTowards(points.styleWaistInLily, 0.5),
0.5
)
macro('scalebox', { at: points.scalebox })
points.titleAnchor = points.logoAnchor.shift(-90, 60)
macro('title', {
nr: 1,
title: 'back',
at: points.titleAnchor,
})
//notches
if (options.fitGuides) {
points.waistMid = points.waistOut.shiftFractionTowards(points.waistIn, 0.5)
// shift + rotate (below) is equivalent to shifting measurements.waistToSeat perpendicular to the waistIn-waistMid line
points.seatMid = points.waistMid
.shiftTowards(points.waistIn, measurements.waistToSeat)
.rotate(90, points.waistMid)
points.seatInTarget = points.seatOut.shiftOutwards(points.seatMid, measurements.seat / 4)
points.seatOutTarget = points.seatMid.shiftTowards(points.seatOut, measurements.seat / 4)
// shift + rotate (below) is equivalent to shifting measurements.waistToHips perpendicular to the waistIn-waistOut line
points.hipsInTarget = points.waistIn
.shiftTowards(points.waistOut, measurements.waistToHips)
.rotate(-90, points.waistIn)
points.hipsOutTarget = points.waistOut
.shiftTowards(points.waistIn, measurements.waistToHips)
.rotate(90, points.waistOut)
points.hipsIn = utils.beamsIntersect(
points.hipsOutTarget,
points.hipsInTarget,
points.waistIn,
points.crossSeamCurveStart
)
points.crossSeamCurveStartMid = utils.beamsIntersect(
points.crossSeamCurveStart,
points.crossSeamCurveStart.shift(points.waistIn.angle(points.waistOut), 1),
points.waistMid,
points.seatMid
)
if (points.seatMid.y > points.crossSeamCurveStartMid.y) {
points.seatIn = utils.lineIntersectsCurve(
points.seatMid,
points.seatInTarget,
points.crossSeamCurveStart,
points.crossSeamCurveCp1,
points.crossSeamCurveCp2,
points.fork
)
} else {
points.seatIn = utils.beamsIntersect(
points.seatMid,
points.seatInTarget,
points.waistIn,
points.crossSeamCurveStart
)
}
if (points.waistOut.x > points.seatOut.x) {
points.hipsOut = utils.lineIntersectsCurve(
points.hipsIn,
points.hipsIn.rotate(180, points.hipsOutTarget),
points.kneeOut,
points.kneeOutCp2,
points.seatOut,
points.waistOut
)
points.seatOutNotch = utils.lineIntersectsCurve(
points.seatMid,
points.seatOutTarget,
points.kneeOut,
points.kneeOutCp2,
points.seatOut,
points.waistOut
)
} else {
points.hipsOut = utils.lineIntersectsCurve(
points.hipsIn,
points.hipsIn.rotate(180, points.hipsOutTarget),
points.seatOut,
points.seatOutCp2,
points.waistOut,
points.waistOut
)
points.seatOutNotch = points.seatOut
}
points.kneeOutNotch = points.kneeOut
points.kneeInNotch = points.kneeIn
macro('sprinkle', {
snippet: 'notch',
on: ['seatOutNotch'],
})
if (extendBeyondKnee) {
macro('sprinkle', {
snippet: 'notch',
on: ['kneeInNotch', 'kneeOutNotch'],
})
}
macro('sprinkle', {
snippet: 'bnotch',
on: ['crossSeamCurveStart', 'seatIn'],
})
if (complete) {
paths.seatline = new Path()
.move(points.seatIn)
.line(points.seatOutNotch)
.addClass('fabric help')
.addText('Seat Line', 'center')
if (
measurements.waistToHips * (1 - options.waistHeight) + absoluteOptions.waistbandWidth <
measurements.waistToHips
) {
snippets.hipsIn = new Snippet('bnotch', points.hipsIn)
snippets.hipsOut = new Snippet('notch', points.hipsOut)
paths.hipline = new Path()
.move(points.hipsIn)
.line(points.hipsOut)
.addClass('fabric help')
.addText('Hip Line', 'center')
}
}
}
if (sa) {
paths.saBase = paths.upperOutseam.join(paths.upperInseam).hide()
paths.hemBase = paths.bottom.hide()
paths.sa = paths.hemBase
.offset(sa * 3)
.join(paths.saBase.offset(sa))
.close()
.addClass('fabric sa')
}
if (paperless) {
// Help construct cross seam
paths.hint = new Path()
.move(points.crossSeamCurveStart)
.line(points.crossSeamCurveMax)
.line(points.fork)
.addClass('note lashed')
macro('hd', {
id: 'wHem',
from: points.bottomIn,
to: points.bottomOut,
y: points.bottomIn.y - 30,
})
macro('hd', {
id: 'wHemLeft',
from: points.bottomIn,
to: points.bottom,
y: points.bottomIn.y - 15,
})
macro('hd', {
id: 'wHemRight',
from: points.bottom,
to: points.bottomOut,
y: points.bottomIn.y - 15,
})
macro('vd', {
id: 'hHemToSideWaist',
from: points.bottomOut,
to: points.styleWaistOutLily,
x:
(points.seatOut.x > points.styleWaistOutLily.x
? points.seatOut.x
: points.styleWaistOutLily.x) +
sa +
15,
})
macro('vd', {
id: 'hHemToFork',
from: points.bottomIn,
to: points.fork,
x: points.fork.x - sa - 15,
})
macro('vd', {
id: 'hForkToCbWaist',
from: points.fork,
to: points.styleWaistInLily,
x: points.fork.x - sa - 15,
})
macro('vd', {
id: 'hFull',
from: points.bottomIn,
to: points.styleWaistInLily,
x: points.fork.x - sa - 30,
})
macro('vd', {
id: 'hStartCrotchCurveToCbWaist',
from: points.crossSeamCurveStart,
to: points.styleWaistInLily,
x: points.crossSeamCurveStart.x - sa - 15,
})
macro('hd', {
id: 'wCbWaistToPleat',
from: points.styleWaistInLily,
to: points.grainlineTop,
y: points.styleWaistInLily.y - sa - 15,
})
macro('hd', {
id: 'wStartCrotchCurveToPleat',
from: points.crossSeamCurveStart,
to: points.grainlineTop,
y: points.styleWaistInLily.y - sa - 30,
})
macro('hd', {
id: 'wForkProjectionToPleat',
from: points.crossSeamCurveMax,
to: points.grainlineTop,
y: points.styleWaistInLily.y - sa - 45,
})
macro('hd', {
id: 'wForkToPleat',
from: points.fork,
to: points.grainlineTop,
y: points.styleWaistInLily.y - sa - 60,
})
macro('hd', {
id: 'wPleatToSideWaist',
from: points.grainlineTop,
to: points.styleWaistOutLily,
y: points.styleWaistInLily.y - sa - 15,
})
if (points.seatOut.x > points.styleWaistOutLily.x) {
macro('hd', {
id: 'wPleatToSideWaistAlt',
from: points.grainlineTop,
to: points.seatOut,
y: points.styleWaistInLily.y - sa - 30,
})
}
}
return part
}
export const back = {
name: 'lily.back',
from: titanBack,
//after: titanFront,
measurements: [
'ankle',
'heel', // secondary measurement, used instead of ankle
],
options: {
fitGuides: { bool: false, menu: 'advanced' },
fitKnee: { bool: true, hide: true },
legBalance: 0.5, // between back and front parts
waistBalance: 0.5,
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,
//test: {pct: back.options.fabricStretch/2, min: 0, max: 50, menu: 'fit'},
lengthBonus: 0,
lengthReduction: {
pct: 0,
min: 0,
max: 100,
toAbs: (pct, { measurements }) => measurements.waistToFloor * pct,
menu: 'style',
},
waistbandWidth: { ...titanBack.options.waistbandWidth, menu: 'style' },
},
hide: 'HIDE_TREE',
draft: draftLilyBack,
}

Some files were not shown because too many files have changed in this diff Show more