1
0
Fork 0

Merge pull request #5849 from freesewing/tristan

Add `tristan` to FreeSewing
This commit is contained in:
Joost De Cock 2024-02-04 10:08:18 +01:00 committed by GitHub
commit aac82a06d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
219 changed files with 5184 additions and 90 deletions

View file

@ -834,6 +834,21 @@
"lining"
]
},
"tristan": {
"code": "Wouter van Wageningen",
"description": "A FreeSewing pattern for a fitted top with prince(ss) seams",
"design": "Natalia Sayang",
"difficulty": 3,
"lab": true,
"org": true,
"tags": [
"tops"
],
"techniques": [
"curvedSeam",
"precision"
]
},
"uma": {
"code": "Joost De Cock",
"description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern",

View file

@ -37,6 +37,10 @@
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"backDartHeight": {
"t": "Controls the height of the back dart",
"d": "Back dart height"

View file

@ -24,7 +24,6 @@ export const backPoints = {
const aDown = points.dartBottomRight.angle(points.dartTip)
const aDiff = Math.abs(aUp - aDown)
// let dartCpAdjustment = Math.abs( options.shoulderDartPosition -.5) +.05
const dartCpAdjustment = aDiff / 50
points.shoulderDartCpUp = points.shoulderDart.shiftFractionTowards(
@ -48,7 +47,7 @@ export const backPoints = {
let diff = 0
let angle = 0
do {
if (length.o) angle = diff * (length.o > length.i ? -0.1 : 0.1)
if (length.o) angle = (diff / (length.i / 1300)) * (length.o > length.i ? -0.1 : 0.1)
points.dartBottomRight = points.dartBottomRight.rotate(angle, points.waistSide)

View file

@ -1,15 +1,78 @@
import { frontSideDart as bellaFront } from '@freesewing/bella'
import { hidePresets } from '@freesewing/core'
import { cbqc, hidePresets } from '@freesewing/core'
import * as options from './options.mjs'
const createRightDartPoints = (points, Path, diff, utils) => {
const radius = points.waistDartRight.dist(points.sideHemInitial)
points.waistDartRight = points.waistDartRight.rotate(
utils.rad2deg(Math.atan(diff / radius)),
points.sideHemInitial
)
let outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
points.waistUpDartRight = outsideSeam.shiftAlong(
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
)
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
0.25
)
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
-0.6
)
points.waistCpUp = points.waistDartRight
.shiftTowards(points.sideHemInitial, points.waistDartRight.dist(points.waistUpDartRight) * 0.25)
.rotate(90, points.waistDartRight)
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
points.armholeDartTipCpDownInside,
-0.5 * cbqc * points.armholeDartInside.dist(points.armholeDartTip)
)
return new Path()
.move(points.waistDartRight)
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
.curve(
points.waistUpDartRightCpUp,
points.shoulderDartTipCpDownOutside,
points.shoulderDartOutside
)
.length()
}
const createArmholeDartPoints = (points, paths, Path, direction) => {
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
points.waistUpDartRight,
direction
)
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
points.armholeDartTipInside,
dist
)
paths.armholeTempCircleOutside = new Path()
.move(points.armholeDartOutside)
.curve(points.armholeCircleOutsideCp1, points.waistCircleOutsideCp1, points.waistUpDartRight)
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
.hide()
paths.armholeTempCircleInside = new Path()
.move(points.armholeDartInside)
.curve(points.armholeCircleInsideCp1, points.waistCircleInsideCp1, points.armholeDartTipInside)
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
.hide()
}
export const frontPoints = {
name: 'noble.frontPoints',
from: bellaFront,
hide: hidePresets.HIDE_ALL,
options,
draft: ({ log, points, Path, paths, snippets, options, macro, part }) => {
const bCircle = 0.552284749831
draft: ({ log, points, Path, paths, snippets, options, macro, part, utils }) => {
// Hide Bella paths
for (const key of Object.keys(paths)) paths[key].hide()
for (const i in snippets) delete snippets[i]
@ -18,6 +81,13 @@ export const frontPoints = {
macro('rmtitle')
macro('rmscalebox')
const waistDartSize = points.waistDartLeft.dist(points.waistDartRight)
const waistDartMove = (waistDartSize / 2) * options.waistdartposition
points.waistDartLeft = points.waistDartLeft.shiftTowards(points.cfHem, waistDartMove * -1)
points.waistDartLeftCp = points.waistDartLeftCp.shift(0, waistDartMove)
points.waistDartRight = points.waistDartRight.shiftTowards(points.sideHemInitial, waistDartMove)
points.shoulderDartInside = points.hps.shiftFractionTowards(
points.shoulder,
options.dartPosition == 'shoulder' ? options.shoulderDartPosition : 0.5
@ -54,7 +124,7 @@ export const frontPoints = {
points.armholeCircleInsideCp1 = points.armholeDartInside.shift(
armholeDartAngle,
bCircle * points.armholeDartInside.dist(points.armholeDartTip)
cbqc * points.armholeDartInside.dist(points.armholeDartTip)
)
points.armholeCircleOutsideCp1 = points.armholeCircleInsideCp1.clone()
@ -176,14 +246,12 @@ export const frontPoints = {
points.bust,
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
)
// points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside.rotate( options.dartOutsideCP *10, points.shoulderDartOutside )
points.shoulderDartTipCpDownInside = points.shoulderDartInside.shiftFractionTowards(
points.shoulderDartTip,
1 + (1 - options.upperDartLength) + (1 - options.waistDartLength) * dartRatio
)
points.armholeDartTipCpDownInside = points.armholeDartTip.shiftFractionTowards(
// points.waistDartHem,
points.waistDartLeft,
1 - options.upperDartLength + (1 - options.waistDartLength) * dartRatio
)
@ -219,7 +287,7 @@ export const frontPoints = {
)
points.waistCircleInsideCp1 = points.waistUpDartLeft.shiftTowards(
points.waistDartLeft,
-0.5 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
-0.5 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
)
points.shoulderDartTipCpDownOutside = points.shoulderDartTipCpDownOutside
.rotate(-2.5, points.shoulderDartOutside)
@ -227,102 +295,37 @@ export const frontPoints = {
let iteration = 1
let diff = 0
let rightDartLength = createRightDartPoints(points, Path, diff, utils)
do {
points.waistDartRight = points.waistDartRight.rotate(diff * 0.1, points.sideHemInitial)
rightDartLength = createRightDartPoints(points, Path, diff, utils)
let outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.bustAcp, points.shoulderDartTipCpDownOutside, points.shoulderDartOutside)
points.waistUpDartRight = outsideSeam.shiftAlong(
points.waistDartRight.dist(points.waistDartRightCp) * 0.5
)
points.waistUpDartRightCpDown = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
0.25
)
// points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards( points.waistDartRight, -.25 )
points.waistUpDartRightCpUp = points.waistUpDartRight.shiftFractionTowards(
points.waistDartRight,
-0.6
)
points.waistCpUp = points.waistDartRight
.shiftTowards(
points.sideHemInitial,
points.waistDartRight.dist(points.waistUpDartRight) * 0.25
)
.rotate(90, points.waistDartRight)
points.waistCircleInsideCp1 = points.armholeDartTip.shiftTowards(
points.armholeDartTipCpDownInside,
-0.5 * bCircle * points.armholeDartInside.dist(points.armholeDartTip)
)
outsideSeam = new Path()
.move(points.waistDartRight)
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
.curve(
points.waistUpDartRightCpUp,
points.shoulderDartTipCpDownOutside,
points.shoulderDartOutside
)
diff = shoulderInsideSeam.length() - outsideSeam.length()
diff = shoulderInsideSeam.length() - rightDartLength
iteration++
} while ((diff > 1 || diff < -1) && iteration < 200)
if (iteration >= 200) {
} while ((diff > 1 || diff < -1) && iteration < 100)
if (iteration >= 100) {
log.error('Something is not quite right here!')
}
points.waistDartRightCp = points.bustAcp.clone()
points.armholeDartTipInside = points.armholeDartTip.clone()
points.waistCircleOutsideCp1 = points.waistUpDartRight.shiftTowards(
points.waistDartRight,
-1 * bCircle * points.armholeDartOutside.dist(points.armholeDartTip)
-1 * cbqc * points.armholeDartOutside.dist(points.armholeDartTip)
)
diff = 0
createArmholeDartPoints(points, paths, Path, 0)
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
iteration = 0
do {
const dist = points.armholeDartTipInside.dist(points.armholeDartTipCpDownInside)
if (points.armholeDartTipInside.x > points.waistCircleOutsideCp1) {
points.armholeDartTipInside.x = points.armholeDartTipInside.x - 0.5
points.armholeDartTipInside.y = points.armholeDartTipInside.y + 0.5
} else {
points.waistCircleOutsideCp1 = points.waistCircleOutsideCp1.shiftTowards(
points.waistUpDartRight,
diff > 0 ? 1 : -1
)
}
points.armholeDartTipCpDownInside = points.waistCircleInsideCp1.shiftOutwards(
points.armholeDartTipInside,
dist
)
paths.armholeTempCircleOutside = new Path()
.move(points.armholeDartOutside)
.curve(
points.armholeCircleOutsideCp1,
points.waistCircleOutsideCp1,
points.waistUpDartRight
)
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
.hide()
.attr('class', 'lining')
paths.armholeTempCircleInside = new Path()
.move(points.armholeDartInside)
.curve(
points.armholeCircleInsideCp1,
points.waistCircleInsideCp1,
points.armholeDartTipInside
)
.curve(points.armholeDartTipCpDownInside, points.waistDartLeftCp, points.waistDartLeft)
.hide()
.attr('class', 'lining')
createArmholeDartPoints(points, paths, Path, diff)
diff = paths.armholeTempCircleOutside.length() - paths.armholeTempCircleInside.length()
iteration++
} while ((diff < -1 || diff > 1) && iteration < 200)
if (iteration >= 200) {
log.error('Something is not quite right here!')
} while ((diff < -1 || diff > 1) && iteration < 100)
if (iteration >= 100) {
log.error('Something is not quite right here too!')
}
return part

View file

@ -9,6 +9,7 @@ export const bustSpanEase = { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'
export const backHemSlope = { deg: 2.5, min: 0, max: 5, menu: 'advanced' }
export const upperDartLength = { pct: 90, min: 80, max: 95, menu: 'darts' }
export const dartPosition = { dflt: 'shoulder', list: ['shoulder', 'armhole'], menu: 'darts' }
export const waistdartposition = { pct: 0, min: -100, max: 100, menu: 'darts' }
export const shoulderDartPosition = {
pct: 50,
min: 10,

View file

@ -0,0 +1,17 @@
# Change log for: @freesewing/tristan
## 3.0.0 (2022-09-30)
### Changed
- All FreeSewing pacakges are now ESM only.
- All FreeSewing pacakges 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.

143
designs/tristan/README.md Normal file
View file

@ -0,0 +1,143 @@
![FreeSewing](https://static.freesewing.org/banner.png)
<p align='center'><a
href="https://www.npmjs.com/package/@freesewing/tristan"
title="@freesewing/tristan on NPM"
><img src="https://img.shields.io/npm/v/@freesewing/tristan.svg"
alt="@freesewing/tristan on NPM"/>
</a><a
href="https://opensource.org/licenses/MIT"
title="License: MIT"
><img src="https://img.shields.io/npm/l/@freesewing/tristan.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%3Atristan"
title="Open issues tagged pkg:tristan"
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:tristan.svg?label=Issues"
alt="Open issues tagged pkg:tristan"/>
</a><a
href="#contributors-"
title="All Contributors"
><img src="https://img.shields.io/badge/all_contributors-113-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/tristan
A FreeSewing pattern for a fitted top
## 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/tristan
If you're not entirely sure what to do or how to start, type this command:
```
npm run tips
```
> If you don't want to set up a dev environment, you can run it in your browser:
>
> [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freesewing/freesewing)
>
> We recommend that you fork our repository and then
> put `gitpod.io/#<entire-url-of-your-fork` into a browser
> to start up a browser-based dev environment of your own.
## About FreeSewing 💀
Where the world of makers and developers collide, that's where you'll find FreeSewing.
If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
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 create-freesewing-pattern
```
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.
## Support FreeSewing: Become a patron 🥰
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 coind without
hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
## 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/tristan/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/tristan/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/tristan'
export const version = '3.0.0'
export const data = { name, version }

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

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,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

View file

@ -0,0 +1,178 @@
{
"t": "Tristan",
"d": "Tristan is a fitted tank top with prince(ss) seams.",
"p": {
"backInside": "Back inside",
"backOutside": "Back outside",
"backPoints": "Back base",
"frontInside": "Front inside",
"frontOutside": "Front outside",
"frontPoints": "Front base",
"peplumFront": "Peplum front",
"peplumBack": "Peplum back"
},
"s": {
"strapWidthAdjusted.t": "The strap width has been adjusted",
"strapWidthAdjusted.d": "The strap width has been adjusted to {{{ width }}} to allow for the position of the strap on the shoulder.",
"peplumWidth.t": "Peplum size",
"peplumWidth.d": "The peplum will be {{{ peplumWidth }}} long.",
"frontOutside": "Outside front",
"frontInside": "Inside front",
"backOutside": "Outside back",
"backInside": "Inside back",
"frontPeplum": "Peplum front",
"backPeplum": "Peplum back",
"hem": "Hem"
},
"o": {
"bustSpanEase": {
"t": "Bust span ease",
"d": "Controls the amount of ease along the bust span"
},
"chestEase": {
"t": "Chest ease",
"d": "Controls the amount of ease at the chest"
},
"shoulderToShoulderEase": {
"t": "Shoulder to shoulder ease",
"d": "Controls the amount of ease along the shoulder to shoulder measurement"
},
"fullChestEaseReduction": {
"t": "Full chest ease reduction",
"d": "Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area"
},
"waistEase": {
"t": "Waist ease",
"d": "Controls the amount of ease at the waist"
},
"waistdartposition": {
"t": "Waist dart position",
"d": "Controls the position of the waist 'dart', moving it to the center (negative) or side (positive)"
},
"frontShoulderWidth": {
"t": "Front shoulder width",
"d": "Controls how much width is added to the shoulder in the front"
},
"highBustWidth": {
"t": "High bust width",
"d": "Controls the width of the high bust"
},
"armholeDepth": {
"t": "Depth of the Armhole",
"d": "Controls how deep the armhole is"
},
"cutDepthBack": {
"t": "Depth of the cut in the back",
"d": "Controls the depth of the cut in the back"
},
"cutDepthFront": {
"t": "Depth of the cut in the front",
"d": "Controls the depth of the cut in the front"
},
"cutRoundnessBack": {
"t": "Roundness of the cut in the back",
"d": "Controls how 'round' the cut in the back is, from V to round to square"
},
"cutRoundnessFront": {
"t": "Roundness of the cut in the front",
"d": "Controls how 'round' the cut in the front is, from V to round to square"
},
"shoulderDartPosition": {
"t": "Shoulder dart position",
"d": "Controls the position of the shoulder dart"
},
"strapWidth": {
"t": "Width of the straps",
"d": "Controls the width of the straps"
},
"upperDartLength": {
"t": "Upper dart length",
"d": "Controls the length of the upper dart"
},
"waistDartLength": {
"t": "Waist dart length",
"d": "Controls the length of the waist dart"
},
"zipperLocation": {
"t": "Zipper location",
"d": "The location of the zipper: side, back, or front"
},
"zipperLocation.front": {
"t": "Front zipper location",
"d": "The location of the zipper will be in the front"
},
"zipperLocation.side": {
"t": "Side zipper location",
"d": "The location of the zipper will be on the side"
},
"zipperLocation.back": {
"t": "Back zipper location",
"d": "The location of the zipper will be in the back"
},
"hem": {
"t": "Hem option",
"d": "Add a hem."
},
"hemYes": {
"t": "Add a hem",
"d": "Add a hem at the waist"
},
"hemNo": {
"t": "Do not add a hem",
"d": "Do not add a hem at the waist"
},
"hemSize": {
"t": "Size of the hem",
"d": "Size of the hem, a percentage of the distance between the neckline and the waist"
},
"lacing": {
"t": "Lacing option",
"d": "This removes part of the seam to create an opening for lacing"
},
"lacingYes": {
"t": "Add Lacing",
"d": "Remove part of the seam to create an opening for lacing"
},
"lacingNo": {
"t": "No lacing",
"d": "Close the seams normally"
},
"lacingLocation": {
"t": "Location of the lacing",
"d": "Lacing in the front, or the back"
},
"lacingLocation.back": {
"t": "Lacing in the back",
"d": "The lacing will be in the back"
},
"lacingLocation.front": {
"t": "Lacing in the front",
"d": "The lacing will be in the front"
},
"lacingWidth": {
"t": "Lacing width",
"d": "Width of the lacing opening"
},
"peplum": {
"t": "Peplum",
"d": "Add a peplum"
},
"peplumYes": {
"t": "Add a peplum",
"d": "This will generate the peplum part."
},
"peplumNo": {
"t": "No peplum",
"d": "Pattern will be generated without a peplum"
},
"peplumSize": {
"t": "Peplum size",
"d": "Controls the size of the peplum"
},
"peplumFullness": {
"t": "Peplum fullness",
"d": "Controls the 'fullness' of the peplum. Basically from a half-circle to a full-circle."
}
}
}

View file

@ -0,0 +1,73 @@
{
"name": "@freesewing/tristan",
"version": "3.0.0",
"description": "A FreeSewing pattern for a fitted top",
"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.0.0"
},
"dependencies": {},
"devDependencies": {
"mocha": "10.2.0",
"chai": "4.3.10",
"@freesewing/models": "3.0.0",
"@freesewing/plugin-timing": "3.0.0"
},
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public",
"tag": "latest"
},
"engines": {
"node": "18",
"npm": "9"
}
}

View file

@ -0,0 +1,158 @@
import { backPoints } from './backpoints.mjs'
export const backInside = {
name: 'tristan.backInside',
from: backPoints,
draft: ({ sa, Point, points, Path, paths, Snippet, snippets, options, store, macro, part }) => {
const lacing = true == options.lacing && 'back' == options.lacingLocation
macro('rmtitle')
store.cutlist.removeCut()
paths.cut = new Path()
.move(points.strapInside)
.curve(points.strapInsideCp, points.cbCutCp, lacing ? points.lacingCut : points.cbCut)
if (lacing) {
paths.cut.line(points.lacingWaist)
paths.originalSide = new Path()
.move(points.lacingCut)
.line(points.cbCut)
.curve_(points.cbCutCp2, points.waistCenter)
.line(points.lacingWaist)
.setClass('note dashed')
const lacingDistance = points.lacingWaist.y - points.lacingCut.y
if (lacingDistance > 15 * 5) {
const numberOfEyelets = Math.floor(lacingDistance / 15)
const eyeletDistance = lacingDistance / (numberOfEyelets + 1)
const pEyelets = new Path().move(points.lacingCut).line(points.lacingWaist).offset(-10)
for (let i = 1; i <= numberOfEyelets; i++) {
points['eyelet' + i] = pEyelets.shiftAlong(i * eyeletDistance)
snippets['eyelet' + i] = new Snippet('eyelet', points['eyelet' + i])
}
}
} else {
paths.cut.curve_(points.cbCutCp2, points.waistCenter)
}
if (options.hem && !options.peplum) {
paths.hem = new Path()
.move(lacing ? points.lacingWaist : points.waistCenter)
.line(points.waistCenterHem)
.line(points.dartBottomLeftHem)
.line(points.dartBottomLeft)
.hide()
paths.hemFold = new Path()
.move(points.waistCenter)
.line(points.dartBottomLeft)
.addClass('note dashed')
.addText('hem', 'center note')
} else {
paths.hem = new Path()
.move(lacing ? points.lacingWaist : points.waistCenter)
.line(points.dartBottomLeft)
.hide()
}
paths.seamSA = new Path()
.move(points.dartBottomLeft)
.curve(points.dartLeftCp, points.shoulderDartCpDown, points.dartTip)
.curve(points.shoulderDartCpUp, points.shoulderDart, points.shoulderDart)
.line(points.strapInside)
.join(paths.cut)
paths.seam = paths.seamSA.clone().join(paths.hem).close().attr('class', 'fabric')
points.grainlineFrom = new Point(points.dartBottomLeft.x - 10, points.cbCut.y)
points.grainlineTo = new Point(points.dartBottomLeft.x - 10, points.waistSide.y)
macro('grainline', {
from: points.grainlineFrom,
to: points.grainlineTo,
})
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.titleAnchor = points.dartBottomLeft.shiftFractionTowards(
lacing ? points.lacingCut : points.cbCut,
0.75
)
macro('title', {
at: points.titleAnchor,
nr: 3,
title: 'tristan:backInside',
})
if (sa) {
if (options.hem && !options.peplum) {
paths.sa = new Path()
.move(points.dartBottomLeftHem)
.join(
new Path()
.move(points.dartBottomLeftHem)
.line(points.dartBottomLeft)
.join(paths.seamSA)
.line(points.waistCenterHem)
.offset(sa)
)
.line(points.waistCenterHem)
.attr('class', 'fabric sa')
} else {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
}
macro('hd', {
from: points.cbCut,
to: points.strapInside,
y: points.strapInside.y - sa - 15,
id: 'cutWidth',
})
macro('hd', {
from: points.cbCut,
to: points.shoulderDart,
y: points.strapInside.y - sa - 25,
id: 'cutToDart',
})
macro('hd', {
from: lacing ? points.lacingWaist : points.waistCenter,
to: points.dartBottomLeft,
y: points.waistCenter.y + sa + 15,
id: 'waistCenterToSide',
})
macro('hd', {
from: points.cbCut,
to: points.dartBottomLeft,
y: points.waistCenter.y + sa + 25,
id: 'waistCutToSide',
})
macro('vd', {
from: lacing ? points.lacingWaist : points.waistCenter,
to: points.cbCut,
x: points.cbCut.x - sa - 15,
id: 'waistToCut',
})
macro('vd', {
from: lacing ? points.lacingWaist : points.waistCenter,
to: points.strapInside,
x: points.cbCut.x - sa - 25,
id: 'waistToStrap',
})
macro('vd', {
from: points.dartBottomLeft,
to: points.shoulderDart,
x: points.shoulderDart.x + sa + 15,
id: 'dartToDart',
})
macro('vd', {
from: points.dartBottomLeft,
to: points.strapInside,
x: points.shoulderDart.x + sa + 25,
id: 'dartToStrap',
})
return part
},
}

View file

@ -0,0 +1,146 @@
import { backPoints } from './backpoints.mjs'
export const backOutside = {
name: 'tristan.backOutside',
from: backPoints,
draft: ({ sa, Point, points, Path, paths, options, store, macro, part }) => {
store.cutlist.removeCut()
paths.cut = new Path()
.move(points.armhole)
.curve(points.armholeCutCp, points.strapOutsideCp, points.strapOutside)
.hide()
paths.dart = new Path()
.move(points.shoulderDart)
.curve(points.shoulderDart, points.shoulderDartCpUp, points.dartTip)
.curve(points.shoulderDartCpDown, points.dartRightCp, points.dartBottomRight)
.hide()
if (options.hem && !options.peplum) {
paths.hem = new Path()
.move(points.dartBottomRight)
.line(points.dartBottomRightHem)
.line(points.waistSideHem)
.line(points.waistSide)
.hide()
paths.hemFold = new Path()
.move(points.dartBottomRight)
.line(points.waistSide)
.addClass('note dashed')
.addText('hem', 'center note')
} else {
paths.hem = new Path().move(points.dartBottomRight).line(points.waistSide).hide()
}
paths.seamSA = new Path()
.move(points.waistSide)
.curve_(points.waistSideCp2, points.armhole)
.join(paths.cut)
.join(paths.dart)
paths.seam = paths.seamSA.clone().join(paths.hem).close().attr('class', 'fabric')
points.grainlineTo = new Point(points.dartBottomRight.x * 1.1, points.dartBottomRight.y * 0.95)
points.grainlineFrom = new Point(points.grainlineTo.x, points.dartTip.y)
macro('grainline', {
from: points.grainlineFrom,
to: points.grainlineTo,
})
store.cutlist.removeCut('fabric')
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.titleAnchor = points.dartBottomRight.shiftFractionTowards(points.armholeCpTarget, 0.5)
macro('title', {
at: points.titleAnchor,
nr: 4,
title: 'tristan:backOutside',
})
if (sa) {
if (options.hem && !options.peplum) {
paths.sa = new Path()
.move(points.waistSideHem)
.join(
new Path()
.move(points.waistSideHem)
.line(points.waistSide)
.join(paths.seamSA)
.line(points.dartBottomRightHem)
.offset(sa)
)
.line(points.dartBottomRightHem)
.attr('class', 'fabric sa')
} else {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
}
const pLeft = paths.dart.edge('left')
macro('hd', {
from: pLeft,
to: points.shoulderDart,
y: points.shoulderDart.y - sa - 15,
id: 'leftToDart',
})
macro('hd', {
from: pLeft,
to: points.strapOutside,
y: points.shoulderDart.y - sa - 25,
id: 'leftToStrap',
})
macro('hd', {
from: pLeft,
to: points.armhole,
y: points.shoulderDart.y - sa - 35,
id: 'leftToArmhole',
})
macro('hd', {
from: pLeft,
to: points.waistSide,
y: points.dartBottomRight.y + sa + 25,
id: 'leftToWaistSide',
})
macro('hd', {
from: points.dartBottomRight,
to: points.waistSide,
y: points.dartBottomRight.y + sa + 15,
id: 'dartToWaistSide',
})
macro('vd', {
from: points.dartBottomRight,
to: pLeft,
x: pLeft.x - sa - 15,
id: 'leftToDart',
})
macro('vd', {
from: points.dartBottomRight,
to: points.shoulderDart,
x: pLeft.x - sa - 25,
id: 'dartToDart',
})
macro('vd', {
from: points.dartBottomRight,
to: points.strapOutside,
x: points.armhole.x + sa + 35,
id: 'dartToStrap',
})
macro('vd', {
from: points.waistSide,
to: points.strapOutside,
x: points.armhole.x + sa + 25,
id: 'sideToStrap',
})
macro('vd', {
from: points.waistSide,
to: points.armhole,
x: points.armhole.x + sa + 15,
id: 'sideToArmhole',
})
return part
},
}

View file

@ -0,0 +1,162 @@
import { backPoints as nobleBackPoints } from '@freesewing/noble'
import { hidePresets } from '@freesewing/core'
import { frontPoints } from './frontpoints.mjs'
export const backPoints = {
name: 'tristan.backPoints',
from: nobleBackPoints,
after: frontPoints,
hide: hidePresets.HIDE_ALL,
draft: ({ points, Path, paths, options, snippets, macro, utils, store, part }) => {
const lacing = true == options.lacing && 'back' == options.lacingLocation
// Hide Noble paths
for (const key of Object.keys(paths)) paths[key].hide()
for (const i in snippets) delete snippets[i]
delete points.bustDartLeft
delete points.bustDartLeftCp
const strapWidth = store.get('strapWidth')
points.strapInside = points.shoulderDart.shiftTowards(points.hps, strapWidth / 2)
points.strapOutside = points.shoulderDart.shiftTowards(points.shoulder, strapWidth / 2)
points.cbCut = new Path()
.move(points.cbNeck)
.curve_(points.cbNeckCp2, points.waistCenter)
.shiftFractionAlong(options.cutDepthBack)
points.cbCutCp2 = new Path()
.move(points.cbNeck)
.curve_(points.cbNeckCp2, points.waistCenter)
.split(points.cbCut)[1].ops[1].cp1
points.cutSeamInside = new Path()
.move(points.dartBottomLeft)
.curve(points.dartLeftCp, points.shoulderDartCpDown, points.dartTip)
.curve(points.shoulderDartCpUp, points.shoulderDart, points.shoulderDart)
.intersectsY(points.cbCut.y)[0]
points.cutSeamOutside = new Path()
.move(points.shoulderDart)
.curve(points.shoulderDart, points.shoulderDartCpUp, points.dartTip)
.curve(points.shoulderDartCpDown, points.dartRightCp, points.dartBottomRight)
.intersectsY(points.cbCut.y)[0]
points.cbCutCp = points.cbCut.shiftFractionTowards(
points.cutSeamInside,
1 - options.cutRoundnessBack
)
points.strapInsideCp = points.strapInside.shiftFractionTowards(
points.cutSeamInside.shift(
points.cutSeamInside.angle(points.shoulderDart) + 90,
strapWidth / 2
),
1 - options.cutRoundnessBack
)
points.armholeCutCp = points.armhole.shift(
180,
options.armholeBackIn * points.armhole.dist(points.dartTip)
)
points.strapOutsideCp = points.strapOutside.shiftFractionTowards(
points.dartTip.shift(points.dartTip.angle(points.shoulderDart) - 90, strapWidth / 2),
options.armholeFrontDepth
)
if (lacing) {
let lacingWidth = (points.strapInsideCp.x - points.cbCut.x) * options.lacingWidth
if (points.waistCenter.dist(points.dartBottomLeft) < lacingWidth) {
lacingWidth = points.waistCenter.dist(points.dartBottomLeft) * 0.95
}
points.lacingCut = points.cbCut.shift(0, lacingWidth)
points.lacingWaist = points.waistCenter.shiftTowards(points.dartBottomLeft, lacingWidth)
}
if (points.cbCutCp.x < (lacing ? points.lacingCut : points.cbCut).x) {
points.cbCutCp.x = (lacing ? points.lacingCut : points.cbCut).x
}
if (options.hem && !options.peplum) {
const hemSize = store.get('hemSize')
const waistCenterHemTemp1 = (lacing ? points.lacingWaist : points.waistCenter).shiftTowards(
lacing ? points.lacingCut : points.cbCut,
hemSize
)
const dartBottomLeftHemTemp = waistCenterHemTemp1.shift(
(lacing ? points.lacingWaist : points.cbWaist).angle(points.dartBottomLeft),
(lacing ? points.lacingWaist : points.cbWaist).dist(points.dartBottomLeft) * 1.5
)
const waistCenterHemTemp2 = dartBottomLeftHemTemp.shiftOutwards(waistCenterHemTemp1, 100)
if (lacing) {
points.waistCenterHem = utils.beamsIntersect(
waistCenterHemTemp2,
dartBottomLeftHemTemp,
points.lacingWaist,
points.cbCut
)
} else {
points.waistCenterHem = utils.beamIntersectsCurve(
waistCenterHemTemp2,
dartBottomLeftHemTemp,
points.waistCenter,
points.waistCenter,
points.cbCutCp2,
lacing ? points.lacingCut : points.cbCut
)
}
points.dartBottomLeftHem = utils.beamIntersectsCurve(
waistCenterHemTemp2,
dartBottomLeftHemTemp,
points.dartBottomLeft,
points.dartLeftCp,
points.shoulderDartCpDown,
points.dartTip
)
macro('mirror', {
clone: false,
mirror: [lacing ? points.lacingWaist : points.waistCenter, points.dartBottomLeft],
points: ['waistCenterHem', 'dartBottomLeftHem'],
})
const waistSideHemTemp1 = points.waistSide.shiftTowards(points.armhole, hemSize)
const waistDartRightHemTemp = waistSideHemTemp1.shift(
points.waistSide.angle(points.dartBottomRight),
points.waistSide.dist(points.dartBottomRight) * 1.5
)
const waistSideHemTemp2 = waistDartRightHemTemp.shiftOutwards(waistSideHemTemp1, 100)
points.waistSideHem = utils.beamIntersectsCurve(
waistSideHemTemp2,
waistDartRightHemTemp,
points.waistSide,
points.waistSideCp2,
points.armhole,
points.armhole
)
points.dartBottomRightHem = utils.beamIntersectsCurve(
waistSideHemTemp2,
waistDartRightHemTemp,
points.dartTip,
points.shoulderDartCpDown,
points.dartRightCp,
points.dartBottomRight
)
macro('mirror', {
clone: false,
mirror: [points.dartBottomRight, points.waistSide],
points: ['waistSideHem', 'dartBottomRightHem'],
})
}
store.set('backOutsideWaistLength', points.dartBottomRight.dist(points.waistSide))
store.set('backInsideWaistLength', points.dartBottomLeft.dist(points.waistCenter))
return part
},
}

View file

@ -0,0 +1,209 @@
import { frontPoints } from './frontpoints.mjs'
export const frontInside = {
name: 'tristan.frontInside',
from: frontPoints,
draft: ({ store, sa, Point, points, Path, paths, Snippet, snippets, options, macro, part }) => {
delete points.waistDartHem
delete points.waistDartRight
delete points.waistDartRightCp
delete points.waistDartCpBottom
delete points.bustDartBottom
delete points.bustDartCpBottom
delete points.bustDartTip
delete points.bustDartTop
delete points.shoulderDartTipCpDownOutside
delete points.ex
delete points.bustB
delete points.shoulder
delete points.shoulderDartShoulder
delete points.shoulderDartOutside
delete points.pitchMax
delete points.armholeCpTarget
delete points.armholePitch
delete points.armholePitchCp1
delete points.armholePitchCp2
delete points.armhole
delete points.armholeCp2
delete points.bustDartCpTop
delete points.bustSide
delete points.bustDartMiddle
delete points.bustDartEdge
const lacing = true == options.lacing && 'front' == options.lacingLocation
paths.cut = new Path()
.move(points.strapInside)
.curve(points.strapInsideCp, points.cfCutCp, lacing ? points.lacingCut : points.cfCut)
paths.insideSeamTemp = new Path()
.move(points.waistDartLeft)
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
.line(points.shoulderDartInside)
.join(paths.cut)
.hide()
if (options.hem && !options.peplum) {
paths.insideSeam = new Path()
.move(points.waistDartLeftHem)
.line(points.waistDartLeft)
.join(paths.insideSeamTemp)
paths.hemFold = new Path()
.move(lacing ? points.lacingWaist : points.cfWaist)
.line(points.waistDartLeft)
.addClass('note dashed')
.addText('hem', 'center note')
} else {
paths.insideSeam = new Path()
.move(lacing ? points.lacingWaist : points.cfWaist)
.line(points.waistDartLeft)
.join(paths.insideSeamTemp)
}
const lacingPath = lacing
? new Path().move(points.lacingCut).line(points.lacingWaist)
: new Path().move(points.cfCut).line(points.cfWaist)
if (options.hem && !options.peplum) {
lacingPath.line(points.cfHem)
}
paths.seam = paths.insideSeam.clone().join(lacingPath).close().attr('class', 'fabric')
store.set(
'shoulderDartTipNotch',
new Path()
.move(points.waistDartLeft)
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
.length()
)
if (lacing) {
store.cutlist.addCut({ cut: 2, from: 'fabric' })
paths.originalSide = new Path()
.move(points.lacingCut)
.line(points.cfCut)
.line(points.cfWaist)
.line(points.lacingWaist)
.setClass('note dashed')
const pGrainLineTo = points.waistDartLeft.shift(135, 10)
macro('grainline', {
from: new Point(pGrainLineTo.x, points.cfCut.y),
to: pGrainLineTo,
grainline: true,
})
const lacingDistance = points.lacingWaist.y - points.lacingCut.y
if (lacingDistance > 15 * 5) {
const numberOfEyelets = Math.floor(lacingDistance / 15)
const eyeletDistance = lacingDistance / (numberOfEyelets + 1)
for (let i = 0; i < numberOfEyelets; i++) {
points['eyelet' + i] = new Point(
points.lacingCut.x + 10,
points.lacingCut.y + i * eyeletDistance + eyeletDistance
)
snippets['eyelet' + i] = new Snippet('eyelet', points['eyelet' + i])
}
}
} else {
if ('front' == options.zipperLocation) {
store.cutlist.addCut({ cut: 2, from: 'fabric' })
macro('grainline', {
from: points.cfCut.shift(315, 10),
to: points.cfWaist.shift(45, 10),
grainline: true,
})
} else {
macro('cutonfold', {
from: points.cfCut,
to: points.cfWaist,
grainline: true,
})
store.cutlist.addCut({ cut: 1, from: 'fabric' })
}
}
snippets.shoulderDartTip = new Snippet('notch', points.shoulderDartTip)
points.titleAnchor = points.waistDartLeft.shiftFractionTowards(
lacing ? points.lacingCut : points.cfCut,
0.75
)
macro('title', {
at: points.titleAnchor,
nr: 1,
title: 'tristan:frontInside',
})
points.gridAnchor = points.hps.clone()
if (sa) {
if ('front' == options.zipperLocation) {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
} else {
if (options.hem && !options.peplum) {
paths.sa = new Path()
.move(points.waistDartLeftHem)
.join(paths.insideSeam.offset(sa))
.line(lacing ? points.lacingCut : points.cfCut)
.attr('class', 'fabric sa')
} else {
paths.sa = new Path()
.move(lacing ? points.lacingWaist : points.cfWaist)
.join(paths.insideSeam.offset(sa))
.line(lacing ? points.lacingCut : points.cfCut)
.attr('class', 'fabric sa')
}
}
}
macro('hd', {
from: lacing ? points.lacingWaist : points.cfWaist,
to: points.shoulderDartInside,
y: points.hps.y - 25,
id: 'hpsToDart',
})
macro('vd', {
from: points.cfWaist,
to: points.shoulderDartInside,
x: 0 - 30,
id: 'waistToDart',
})
macro('vd', {
from: points.cfWaist,
to: points.shoulderDartTip,
x: 0 - 10,
id: 'waistToDartTip',
})
macro('hd', {
from: lacing ? points.lacingWaist : points.cfWaist,
to: points.shoulderDartTip,
y: points.cfWaist.y + sa + 25,
id: 'middleToDartTip',
})
macro('vd', {
from: points.cfWaist,
to: lacing ? points.lacingCut : points.cfCut,
x: 0 - 20,
id: 'waistToNeck',
})
macro('vd', {
from: points.cfWaist,
to: points.strapInside,
x: 0 - 40,
id: 'waistToHps',
})
macro('hd', {
from: lacing ? points.lacingWaist : points.cfWaist,
to: points.waistDartLeft,
y: points.cfWaist.y + sa + 15,
id: 'middleToDart',
})
macro('hd', {
from: lacing ? points.lacingCut : points.cfCut,
to: points.strapInside,
y: points.strapInside.y - sa - 15,
id: 'middleToHps',
})
return part
},
}

View file

@ -0,0 +1,188 @@
import { frontPoints } from './frontpoints.mjs'
import { frontInside } from './frontinside.mjs'
export const frontOutside = {
name: 'tristan.frontOutside',
from: frontPoints,
after: frontInside,
draft: ({ store, sa, points, Path, paths, Snippet, snippets, options, macro, part }) => {
delete points.bustDartTop
delete points.bustSide
delete points.bustDartMiddle
delete points.bustDartBottom
delete points.bustDartCpBottom
delete points.bustB
delete points.bustDartEdge
paths.cut = new Path()
.move(points.armhole)
.curve(points.armholeCutCp, points.strapOutsideCp, points.strapOutside)
.hide()
paths.princessSeam = new Path()
.move(points.shoulderDartOutside)
.curve(
points.shoulderDartTipCpDownOutside,
points.waistUpDartRightCpUp,
points.waistUpDartRight
)
.curve(points.waistUpDartRightCpDown, points.waistCpUp, points.waistDartRight)
.hide()
paths.armhole = new Path()
.move(points.armhole)
.curve(points.armholeCp2, points.armholePitchCp1, points.armholePitch)
.curve_(points.armholePitchCp2, points.shoulder)
.hide()
if (options.hem && !options.peplum) {
paths.hem = new Path()
.move(points.waistDartRight)
.line(points.waistDartRightHem)
.line(points.sideWaistHem)
.line(points.sideWaist)
.hide()
paths.hemFold = new Path()
.move(points.waistDartRight)
.line(points.sideWaist)
.addClass('note dashed')
.addText('hem', 'center note')
} else {
paths.hem = new Path().move(points.waistDartRight).line(points.sideWaist).hide()
}
paths.seamSA = new Path()
.move(points.sideWaist)
.line(points.armhole)
.join(paths.cut)
.line(points.shoulderDartOutside)
.join(paths.princessSeam)
.line(points.waistDartRight)
.hide()
paths.seam = paths.seamSA.clone().join(paths.hem).close().unhide().attr('class', 'fabric')
points.grainTop = points.armhole.shift(225, 20)
points.grainBottom = points.sideWaistInitial.shift(135, 20)
macro('grainline', {
from: points.grainBottom,
to: points.grainTop,
})
store.cutlist.addCut({ cut: 2, from: 'fabric' })
points.snippet = paths.princessSeam.shiftAlong(
paths.princessSeam.length() - store.get('shoulderDartTipNotch')
)
snippets.shoulderDartTip = new Snippet('notch', points.snippet)
points.titleAnchor = points.waistDartRight
.shiftFractionTowards(points.armhole, 0.3)
.shiftFractionTowards(points.shoulderDartOutside, 0.2)
macro('title', {
at: points.titleAnchor,
nr: 2,
title: 'tristan:frontOutside',
})
points.gridAnchor = points.armholeCpTarget.clone()
points.scaleboxAnchor = points.titleAnchor.shiftFractionTowards(points.sideWaist, 0.5)
points.scaleboxAnchor.x = points.titleAnchor.x
macro('miniscale', { at: points.scaleboxAnchor })
if (sa) {
if (options.hem && !options.peplum) {
paths.sa = new Path()
.move(points.sideWaistHem)
.join(
new Path()
.move(points.sideWaistHem)
.join(paths.seamSA)
.line(points.waistDartRightHem)
.offset(sa)
)
.line(points.waistDartRightHem)
.attr('class', 'fabric sa')
} else {
paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
}
}
const pLeft = paths.princessSeam.edge('left')
macro('hd', {
from: points.waistDartRight,
to: points.armholeOutsidePitchCp1,
y: points.sideWaistInitial.y + sa + 35,
id: 'dartToArmhole',
})
macro('hd', {
from: points.waistDartRight,
to: points.sideWaistInitial,
y: points.sideWaistInitial.y + sa + 25,
id: 'dartToSide',
})
macro('hd', {
from: pLeft,
to: points.sideWaistInitial,
y: points.sideWaistInitial.y + sa + 15,
id: 'leftToSide',
})
macro('hd', {
from: points.shoulderDartOutside,
to: points.strapOutside,
y: points.shoulderDartOutside.y - sa - 15,
id: 'dartToShoulder',
})
macro('hd', {
from: points.snippet,
to: points.strapOutside,
y: points.shoulderDartOutside.y - sa - 25,
id: 'dartPointToShoulder',
})
macro('hd', {
from: pLeft,
to: points.strapOutside,
y: points.shoulderDartOutside.y - sa - 35,
id: 'leftToShoulder',
})
macro('vd', {
from: points.armholeOutsidePitchCp1,
to: points.sideWaistInitial,
x: points.sideWaistInitial.x + sa + 15,
id: 'waistToArmhole',
})
macro('vd', {
from: points.waistDartRight,
to: pLeft,
x: pLeft.x - sa - 15,
id: 'waistToLeft',
})
macro('vd', {
from: points.strapOutside,
to: points.sideWaistInitial,
x: points.sideWaistInitial.x + sa + 25,
id: 'waistToShoulder',
})
macro('vd', {
from: points.shoulderDartOutside,
to: points.sideWaistInitial,
x: points.shoulderDartOutside.x,
id: 'sideWaistToShoulderDart',
})
macro('vd', {
from: points.waistDartRight,
to: points.shoulderDartOutside,
x: pLeft.x - sa - 25,
id: 'waistToShoulderDart',
})
macro('vd', {
from: points.snippet,
to: points.shoulderDartOutside,
x: pLeft.x - sa - 15,
id: 'shoulderDartToDartPoint',
})
return part
},
}

View file

@ -0,0 +1,240 @@
import { frontPoints as nobleFrontPoints } from '@freesewing/noble'
import { pctBasedOn, hidePresets } from '@freesewing/core'
export const frontPoints = {
name: 'tristan.frontPoints',
from: nobleFrontPoints,
hide: hidePresets.HIDE_ALL,
options: {
// Static
armholeBackDepth: 0.6,
armholeBackIn: 0.6,
armholeDartPosition: 0.5,
armholeFrontDepth: 0.65,
armholeFrontIn: 0.2,
backArmholeCurvature: 0.63,
backArmholePitchDepth: 0.035,
backArmholeSlant: 5,
backDartHeight: 0.46,
backHemSlope: 2.5,
backNeckCutout: 0.06,
bustDartCurve: 1,
bustDartLength: 0.9,
dartPosition: 'shoulder',
frontArmholeCurvature: 0.63,
frontArmholePitchDepth: 0.29,
shoulderToShoulderCorrection: 0.995,
// Percentages
bustSpanEase: { pct: 0, min: -5, max: 20, ...pctBasedOn('bustSpan'), menu: 'fit' },
armholeDepth: { pct: 44, min: 38, max: 55, menu: 'style' },
cutDepthBack: { pct: 40, min: 5, max: 90, menu: 'style' },
cutDepthFront: { pct: 80, min: 0, max: 125, menu: 'style' },
cutRoundnessBack: { pct: 20, min: 0, max: 100, menu: 'style' },
cutRoundnessFront: { pct: 10, min: 0, max: 100, menu: 'style' },
shoulderDartPosition: { pct: 50, min: 10, max: 90, menu: 'style' },
strapWidth: { pct: 45, min: 5, max: 90, menu: 'style' },
hemSize: {
pct: 5.62,
min: 1,
max: 25,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) =>
mergedOptions.hem === false || mergedOptions.peplum === true ? false : 'options',
},
upperDartLength: { pct: 90, min: 80, max: 95, menu: 'advanced' },
waistDartLength: { pct: 90, min: 75, max: 95, menu: 'advanced' },
// Options
zipperLocation: { dflt: 'side', list: ['front', 'side', 'back'], menu: 'options' },
hem: {
bool: false,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions.peplum === true ? false : 'options'),
},
lacing: { bool: true, menu: 'options' },
lacingLocation: {
dflt: 'front',
list: ['front', 'back'],
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions.lacing === false ? false : 'options'),
},
lacingWidth: {
pct: 20,
min: 0,
max: 50,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions.lacing === false ? false : 'options'),
},
},
draft: ({ points, Path, paths, snippets, options, macro, store, utils, units, part }) => {
const lacing = true == options.lacing && 'front' == options.lacingLocation
// Hide Noble paths
for (const key of Object.keys(paths)) paths[key].hide()
for (const i in snippets) delete snippets[i]
// Remove macros from Noble
macro('rmtitle')
macro('rmscalebox')
macro('rmcutonfold')
points.sideWaist = points.sideHem.clone()
points.sideWaistInitial = points.sideHemInitial.clone()
points.cfWaist = points.cfHem.clone()
store.cutlist.removeCut()
const shoulderWidthInside = points.shoulderDartInside.dist(points.hps)
const shoulderWidthOutside = points.shoulderDartOutside.dist(points.shoulder)
let strapWidth = (shoulderWidthInside + shoulderWidthOutside) * options.strapWidth
if (strapWidth / 2 > shoulderWidthInside) {
strapWidth = shoulderWidthInside * 2
}
if (strapWidth / 2 > shoulderWidthOutside) {
strapWidth = shoulderWidthOutside * 2
}
store.set('strapWidth', strapWidth)
if (strapWidth != (shoulderWidthInside + shoulderWidthOutside) * options.strapWidth) {
store.flag.info({
msg: 'tristan:strapWidthAdjusted',
replace: {
width: units(strapWidth),
},
})
}
points.strapInside = points.shoulderDartInside.shiftTowards(points.hps, strapWidth / 2)
points.strapOutside = points.shoulderDartOutside.shiftTowards(points.shoulder, strapWidth / 2)
points.cfCut = points.cfNeck.shiftFractionTowards(points.cfBust, options.cutDepthFront)
paths.cutSeamInside = new Path()
.move(points.waistDartLeft)
.curve(points.waistDartLeftCp, points.shoulderDartTipCpDownInside, points.shoulderDartTip)
.line(points.shoulderDartInside)
.hide()
points.cutSeamInside = paths.cutSeamInside.intersectsY(points.cfCut.y)[0]
points.cutSeamOutside = new Path()
.move(points.waistDartRight)
.curve(points.waistCpUp, points.waistUpDartRightCpDown, points.waistUpDartRight)
.curve(
points.waistUpDartRightCpUp,
points.shoulderDartTipCpDownOutside,
points.shoulderDartOutside
)
.intersectsY(points.cfCut.y)[0]
points.cfCutCp = points.cfCut.shiftFractionTowards(
points.cutSeamInside,
1 - options.cutRoundnessFront
)
points.strapInsideCp = points.strapInside.shiftFractionTowards(
points.cutSeamInside.shift(
points.cutSeamInside.angle(points.shoulderDartInside) + 90,
strapWidth / 2
),
1 - options.cutRoundnessFront
)
points.armholeCutCp = points.armhole.shiftFractionTowards(
points.bustDartTip,
options.armholeFrontIn
)
points.strapOutsideCp = points.strapOutside.shiftFractionTowards(
points.bustDartTip.shift(
points.cutSeamOutside.angle(points.shoulderDartOutside) - 90,
strapWidth / 2
),
options.armholeFrontDepth
)
if (points.strapOutsideCp.x > points.armholeDartCpBottom.x) {
points.strapOutsideCp.x = points.armholeDartCpBottom.x
}
if (points.strapOutsideCp.y > points.armholeDartCpBottom.y) {
points.strapOutsideCp.y = points.armholeDartCpBottom.y
}
// armhole adjustment
// if (points.sideWaist.y < points.waistDartRight.y) {
// points.sideWaist.y = points.waistDartRight.y
// }
if (lacing) {
points.lacingCut = points.cfCut.shift(
0,
(points.strapInsideCp.x - points.cfCut.x) * options.lacingWidth
)
points.lacingWaist = points.cfWaist.shiftTowards(
points.waistDartLeft,
(points.strapInsideCp.x - points.cfCut.x) * options.lacingWidth
)
}
if (options.hem && !options.peplum) {
const hemSize = points.cfWaist.dist(points.cfNeck) * options.hemSize
store.set('hemSize', hemSize)
points.cfHem = (lacing ? points.lacingCut : points.cfCut).shiftOutwards(
lacing ? points.lacingWaist : points.cfWaist,
hemSize
)
points.cfHemIn = (lacing ? points.lacingWaist : points.cfWaist).shiftTowards(
lacing ? points.lacingCut : points.cfCut,
hemSize
)
const waistDartLeftHemInTemp = points.cfHemIn.shift(
points.cfWaist.angle(points.waistDartLeft),
points.cfWaist.dist(points.waistDartLeft) * 1.5
)
points.waistDartLeftHem = utils.beamIntersectsCurve(
points.cfHemIn,
waistDartLeftHemInTemp,
points.waistDartLeft,
points.waistDartLeftCp,
points.shoulderDartTipCpDownInside,
points.shoulderDartTip
)
points.sideWaistHem = points.armhole.shiftOutwards(points.sideWaist, hemSize)
points.sideWaistHemIn = points.sideWaist.shiftTowards(points.armhole, hemSize)
const waistDartRightHemInTemp = points.sideWaistHemIn.shift(
points.sideWaist.angle(points.waistDartRight),
points.sideWaist.dist(points.waistDartRight) * 1.5
)
points.waistDartRightHem = utils.beamIntersectsCurve(
points.sideWaistHemIn,
waistDartRightHemInTemp,
points.waistDartRight,
points.waistDartRightCp,
points.waistUpDartRightCpDown,
points.waistUpDartRight
)
macro('mirror', {
clone: false,
mirror: [points.cfWaist, points.waistDartLeft],
points: ['waistDartLeftHem'],
})
macro('mirror', {
clone: false,
mirror: [points.sideWaist, points.waistDartRight],
points: ['waistDartRightHem'],
})
}
store.set('frontOutsideWaistLength', points.waistDartRight.dist(points.sideWaist))
store.set(
'frontInsideWaistLength',
points.waistDartLeft.dist(lacing ? points.lacingWaist : points.cfWaist)
)
store.set('frontLength', points.cfNeck.dist(points.cfWaist))
store.set('sideSeamLength', points.armhole.dist(points.sideWaist))
return part
},
}

View file

@ -0,0 +1,43 @@
//
import { Design } from '@freesewing/core'
import { i18n } from '../i18n/index.mjs'
import { data } from '../data.mjs'
// Parts
import { frontPoints } from './frontpoints.mjs'
import { frontInside } from './frontinside.mjs'
import { frontOutside } from './frontoutside.mjs'
import { backPoints } from './backpoints.mjs'
import { backInside } from './backinside.mjs'
import { backOutside } from './backoutside.mjs'
import { peplumFront } from './peplumFront.mjs'
import { peplumBack } from './peplumBack.mjs'
// Create new design
const Tristan = new Design({
data,
parts: [
frontPoints,
frontInside,
frontOutside,
backPoints,
backInside,
backOutside,
peplumFront,
peplumBack,
],
})
// Named exports
export {
frontPoints,
frontInside,
frontOutside,
backPoints,
backInside,
backOutside,
peplumFront,
peplumBack,
i18n,
Tristan,
}

View file

@ -0,0 +1,32 @@
import { plugin as ringsectorPlugin } from '@freesewing/plugin-ringsector'
import { CreateShape, peplumFront } from './peplumFront.mjs'
export const peplumBack = {
name: 'tristan.peplumBack',
after: peplumFront,
plugins: [ringsectorPlugin],
draft: ({ points, paths, options, store, macro, sa, part }) => {
if (false == options.peplum) {
return part.hide()
}
const radius = store.get('peplumRadius')
const width = store.get('peplumWidth')
const ratio = store.get('peplumratio')
CreateShape({
points: points,
paths: paths,
options: options,
macro: macro,
store: store,
sa: sa,
type: 'back',
radius: radius,
width: width,
ratio: 1 - ratio,
})
return part
},
}

View file

@ -0,0 +1,143 @@
import { backPoints } from './backpoints.mjs'
import { plugin as ringsectorPlugin } from '@freesewing/plugin-ringsector'
export const CreateShape = ({
points,
paths,
options,
macro,
store,
sa,
type,
radius,
width,
ratio,
}) => {
const double =
type == options.zipperLocation || (true == options.lacing && type == options.lacingLocation)
macro('ringsector', {
id: type + 'Peblum',
angle: (options.peplumFullness / 2) * ratio * (double ? 0.5 : 1),
insideRadius: radius,
outsideRadius: radius + width,
rotate: false,
})
macro('cutOnFold', {
id: type,
from: points['__macro_ringsector_' + type + 'Peblum_in2Flipped'],
to: points['__macro_ringsector_' + type + 'Peblum_ex2Flipped'],
})
points[type + 'TitleAnchor'] = points[
'__macro_ringsector_' + type + 'Peblum_in2FlippedRotated'
].shiftFractionTowards(points['__macro_ringsector_' + type + 'Peblum_ex2FlippedRotated'], 0.5)
store.cutlist.addCut({ cut: double ? 2 : 1, from: 'fabric', onFold: true })
macro('title', {
nr: 10 + ('front' == type ? 0 : 1),
at: points[type + 'TitleAnchor'],
id: type + 'Peplum',
title: 'tristan:' + type + 'Peplum',
align: 'center',
scale: options.peplumSize * 2,
})
if (sa)
paths[type + 'SA'] = paths['__macro_ringsector_' + type + 'Peblum_path']
.offset(sa)
.attr('class', 'fabric sa')
macro('hd', {
id: 'topWidth',
from: points['__macro_ringsector_' + type + 'Peblum_in2Flipped'],
to: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'],
y: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'].y - 15 - sa,
})
macro('hd', {
id: 'bottomWidth',
from: points['__macro_ringsector_' + type + 'Peblum_ex2Flipped'],
to: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'],
y: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'].y + 15 + sa,
})
macro('ld', {
id: 'width',
from: points['__macro_ringsector_' + type + 'Peblum_in1Rotated'],
to: points['__macro_ringsector_' + type + 'Peblum_ex1Rotated'],
d: 15 + sa,
})
}
export const peplumFront = {
name: 'tristan.peplumFront',
after: backPoints,
options: {
// Options
peplum: { bool: false, menu: 'options' },
peplumSize: {
pct: 10,
min: 5,
max: 250,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions.peplum === false ? false : 'peplum'),
},
peplumFullness: {
deg: 180,
min: 180,
max: 360,
// eslint-disable-next-line no-unused-vars
menu: (settings, mergedOptions) => (mergedOptions.peplum === false ? false : 'peplum'),
},
},
plugins: [ringsectorPlugin],
draft: ({ sa, Point, points, paths, options, macro, store, units, part }) => {
if (false == options.peplum) {
return part.hide()
}
const backInsideWaistLength = store.get('backInsideWaistLength')
const backOutsideWaistLength = store.get('backOutsideWaistLength')
const frontInsideWaistLength = store.get('frontInsideWaistLength')
const frontOutsideWaistLength = store.get('frontOutsideWaistLength')
const length =
backInsideWaistLength +
backOutsideWaistLength +
frontInsideWaistLength +
frontOutsideWaistLength
const radius = ((length / Math.PI) * (360 / options.peplumFullness)) / 2
const width = options.peplumSize * store.get('frontLength')
const frontLength = frontInsideWaistLength + frontOutsideWaistLength
const ratio = frontLength / length
store.set('peplumRadius', radius)
store.set('peplumWidth', width)
store.set('peplumratio', ratio)
store.flag.note({
msg: `tristan:peplumWidth`,
replace: {
peblumWidth: units(width),
},
})
CreateShape({
Point: Point,
points: points,
paths: paths,
options: options,
macro: macro,
store: store,
sa: sa,
type: 'front',
radius: radius,
width: width,
offset: 0,
ratio: ratio,
})
return part
},
}

View file

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

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,11 @@
---
title: "Waist dart position"
---
***
The **waist dart position** option controls the position of the waist 'dart', moving it to the center (negative) or side (positive).

View file

@ -0,0 +1,25 @@
---
title: "Tristan Top: Cutting Instructions"
---
In **all versions**:
- Cut 2 **Front Outside** parts with _good sides together_.
- Cut 2 **Back Outside** parts with _good sides together_.
- Cut 2 **Back Inside** parts with _good sides together_.
Depending on your choice of closure, also cut the following parts.
With a **back zip**, **side zip**, or **lace-up back (with or without side zip)** closure:
- Cut 1 **Front Inside** part on the fold.
With a **lace-up front** closure:
- Cut 2 **Front Inside** parts with _good sides together_.
If you choose to add a peplum:
- Cut 1 **Peplum**.
In **all versions**, if you want to line your top, cut the same parts out of your lining fabric.

View file

@ -0,0 +1,8 @@
---
title: "Tristan top"
---
<DesignInfo design='tristan' docs />

View file

@ -0,0 +1,17 @@
---
title: "Tristan top: Fabric Options"
---
Tristan is designed for woven fabrics with little to no stretch.
For the **main fabric**, you can use most non-stretch fabrics, such as poplin, jacquard, or linen. Even quilting cotton will work. Fabrics with some structure will work best.
For the **lining**, if you would like a firm structure even without the use of boning, use a strong fabric, such as canvas, twill, or denim. Use something that will be comfortable against the skin.
<Tip>
##### Consider using contrasting fabrics
Consider using different fabrics for the inside and outside panels to highlight the prince(ss) seams.
</Tip>

View file

@ -0,0 +1,138 @@
---
title: "Tristan top: Sewing Instructions"
---
<Note>
##### There are many ways to sew a Tristan
These instructions are for a lined Tristan top with a center-front lacing closure and bias binding at the neckline, armhole, and hem.
</Note>
### Step 1: Cut your pieces
![Cut your pieces](step01.png)
Cut your pattern pieces. If you would like to add embroidery or other decoration, now is a good time to do so.
<Note>
##### Finishing methods affect the seam allowance
If using bias binding, you should cut the neckline and armholes without seam allowance.
</Note>
### Step 2: Sew the back inside parts together at center back
![Sew the back inside parts together](step02.png)
Align the back inside (Part 3) parts at center back. Sew them together with _good sides together_.
### Step 3: Attach back outside parts
![Attach the back outside parts](step03.png)
Attach one back outside (Part 4) part to its matching back inside (Part 3) part, _good sides together_, making sure to match any notches.
Do the same for the other back outside (Part 4) part.
### Step 4: Attach front outside parts at the side seams
![Attach the front outside parts](step04.png)
Attach one front outside (Part 2) part to its matching back outside (Part 3) part, _good sides together_.
Do the same for the other front outside (Part 2) part.
### Step 5: Attach front inside parts
![Attach the front inside parts](step05.png)
Finally, attach one front inside (Part 1) part to its matching front inside (Part 2) part, _good sides together_.
Do the same for the other front inside (Part 1) part.
![Press](step05b.png)
Press all the seam allowances flat.
### Step 6: Sew at the shoulders
![Attach the front inside parts](step06.png)
Sew at the shoulders to complete each armhole. Sew _good sides together_.
Press the seam allowances open.
<Note>
##### Check the fit
This is a good time to try on your garment and make any small adjustments. For example, if your shoulders have a different slope, you could make one shoulder strap a little shorter.
</Note>
### Step 7: Repeat with lining fabric
![Repeat with lining fabric](step07.png)
Repeat Steps 1 through 6 with your lining fabric.
You will now have two identical pieces, one with your main fabric and one with your lining.
Turn your lining piece inside out.
The red arrows in the illustration are to help you identify the center insides in the next step.
### Step 8: Begin the closure by sewing down center front
![Sew down center front](step08.png)
Place the center insides of the main and lining together, _good sides together_. This will become one side of your front opening.
Sew down center front.
Open flat.
### Step 9: Sew your first boning channel
![Sew your first boning channel](step09.png)
Turn right side out -- that is, put the two pieces together, _bad sides together_ -- and press.
Sew 2 mm (0.1 inch) in from center edge.
Allow enough space for your boning, then sew again.
Repeat Steps 8 through 10 on the other side.
<Note>
##### Leave enough room for your boning
Leave enough wiggle room to allow you to insert your boning. You want the channel to be snug, but not too tight.
</Note>
### Step 10: Sew your second boning channel
![Sew your second boning channel](step10.png)
Mark the locations of your eyelets. Allow enough space to install these later, then sew again.
Allow enough space for another row of boning, then sew again.
Repeat on the other side.
### Step 11: Insert your boning
Cap your boning if appropriate for the type of boning used. Then insert boning in the boning channels.
### Step 12: Install your eyelets
Install your eyelets between the two boning channels.
### Step 13: Bind and lace up your top
Apply bias binding to the neck hole, armholes, and hem.
Lace up your top.
### Step 14: You're done!
![You're done!](step14.png)
Enjoy your Tristan top!

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View file

@ -0,0 +1,5 @@
---
title: "Tristan top: Required Measurements"
---
<DesignMeasurements design='tristan' />

View file

@ -0,0 +1,27 @@
---
title: "Tristan top: What You Need"
---
To make Tristan, you will need the following:
- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies)
- About 1 meter (1.1 yards) of a suitable main fabric (see [Fabric options](/docs/designs/tristan/fabric))
- About 1 meter (1.1 yards) of a suitable lining fabric (if lining)
- Choice of closure - either **Zipper**, or **eyelets**, **reinforcement for the eyelets**, and **lacing**
- If finishing with bias binding, **Bias tape** (about 4 meters (4.4 yards))
<Tip>
##### Use a separating zipper
We recommend a separating invisible zipper for this garment. Using a separating zipper will make it easier for you to take the top on and off.
##### When making Tristan with the lacing option, reinforce the eyelets
When making Tristan with the lacing option, make sure you reinforce the eyelets. A binding, or sewn in interfacing could work to do so. Adding boning between the eyelets and the seam is another option.
Tristan is not a corset, and therefore doesn't require heavy boning. We would recommend using a flexible type of boning. That would create the neatest opening. Otherwise a double layer of hair canvas and put the eyelets close to the seam. Both would require lining, or an adequately sized hem or binding.
</Tip>

View file

@ -0,0 +1,15 @@
---
title: "Tristan top: Designer Notes"
---
Tristan is a fitted top with corset-inspired design elements.
Its the result of a collaboration between Wouter and Natalia. This was a dream come true for me, Natalia, because I think Wouter is brilliant.
The original version had a lace-up back and was made for the Renaissance fair. I made it by tracing a new neckline and armholes on Noble directly on the body. Wouter thought it looked nice and we decided to turn it into a published standalone top design, with Wouter doing the code. Many messages, sketches, and mock-ups later, the result is Tristan.
Tristan allows the user a lot of control over the options. Its a great introduction to prince(ss) seams, and since it doesnt use a lot of fabric, could be a good project to use up scraps. Although Tristan has options for corset-inspired lacing, it is not intended to be historically accurate.
I chose the name “Tristan top” because I wanted something that sounded romantic and pretty and followed the traditional FreeSewing convention of a first name that starts with the same letter as the type of design.
Natalia

View file

@ -0,0 +1,11 @@
---
title: "Armlochtiefe"
---
***
Die **Armlochtiefe** steuert die Tiefe des Armlochs.

View file

@ -0,0 +1,11 @@
---
title: "Armhole depth"
---
***
The **armhole depth** option controls the depth of the armhole.

View file

@ -0,0 +1,11 @@
---
title: "Profundidad del orificio"
---
***
La opción **de profundidad de armadura** controla la profundidad del orificio de armadura.

View file

@ -0,0 +1,11 @@
---
title: "Profondeur d'emmanchure"
---
***
L'option **de profondeur de blindage** contrôle la profondeur de l'armure.

View file

@ -0,0 +1,11 @@
---
title: "Diepte armsgat"
---
***
De **armsgat** optie bepaalt de diepte van het armsgat.

View file

@ -0,0 +1,11 @@
---
title: "Глибина пройми"
---
***
Параметр **глибина пройми** регулює глибину пройми.

View file

@ -0,0 +1,13 @@
---
title: "Büstenumfang leicht"
---
***
Die **Bustumpfschlanke** Option bestimmt, wie viel Leichtigkeit auf den Bustumpfbereich angewendet wird.
<Note>Dies wird das Kleidungsstück nicht leicht machen, sondern nur den Büstenpunkt beeinflussen</Note>

View file

@ -0,0 +1,13 @@
---
title: "Bust span ease"
---
***
The **bust span ease** option controls how much ease is applied to the bust span.
<Note>This will not add ease to the garment, but merely influence the bust point</Note>

View file

@ -0,0 +1,13 @@
---
title: "Facilidad de la expansión del polvo"
---
***
La opción **de reducción de polvo** controla la facilidad con la que se aplica a la gama de busto.
<Note>Esto no añadirá facilidad a la ropa, sino que simplemente influirá en el punto de busto</Note>

View file

@ -0,0 +1,13 @@
---
title: "Aisance de l'écart poitrine"
---
***
L'option **de facilité** de la boussole contrôle la quantité de facilité appliquée à la boussole.
<Note>Cela ne facilitera pas le vêtement, mais seulement le point de buste</Note>

View file

@ -0,0 +1,13 @@
---
title: "Overwijdte bustenwijdte"
---
***
De **bustewijdte overwijdte** optie bepaalt hoeveel overwijdte wordt toegepast op de bustewijdte.
<Note>Dit maakt het kledingstuk niet gemakkelijker, maar beïnvloedt alleen het bustepunt</Note>

View file

@ -0,0 +1,13 @@
---
title: "Легкість обхвату грудей"
---
***
Параметр **bust span ease** контролює, наскільки полегшено буде застосовано обхват бюста.
<Note>Це не додасть одягу легкості, а лише вплине на точку обхвату грудей</Note>

View file

@ -0,0 +1,11 @@
---
title: "Brustumfangszugabe"
---
***
Mit der Option **chest ease** kannst du den Grad der Entspannung an der vollsten Stelle deiner Brust einstellen.

View file

@ -0,0 +1,11 @@
---
title: "Chest ease"
---
***
The **chest ease** option controls the amount of ease at the fullest part of your chest.

View file

@ -0,0 +1,11 @@
---
title: "Holgura de pecho"
---
***
La opción de **facilidad de cofre** controla la cantidad de facilidad en la parte más completa del cofre.

View file

@ -0,0 +1,11 @@
---
title: "Aisance de poitrine"
---
***
L'option **facilité de poitrine** contrôle la quantité d'aisance à la partie la plus complète de votre poitrine.

View file

@ -0,0 +1,11 @@
---
title: "Overwijdte borst"
---
***
De optie **borst overwijdte** bepaalt de hoeveelheid overwijdte aan het grootste deel van je borst.

View file

@ -0,0 +1,11 @@
---
title: "Легкість у грудях"
---
***
Параметр **об'єму грудей** регулює об'єм грудей у найповнішій частині тіла.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the back"
---
***
The **Depth of the cut in the back** controls how deep the neckline will be in the back.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,11 @@
---
title: "Depth of the cut in the front"
---
***
The **Depth of the cut in the front** controls how deep the neckline will be in the front.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the back"
---
***
The **Roundness of the cut in the back** controls the shape of the neckline will be in the back.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,12 @@
---
title: "Roundness of the cut in the front"
---
***
The **Roundness of the cut in the front** controls the shape of the neckline will be in the front.
This will go from V-neck to U- shaped, with a round option between those extremes.

View file

@ -0,0 +1,5 @@
---
title: "Tristan top: Design Options"
---
<DesignOptions design='tristan' />

View file

@ -0,0 +1,5 @@
---
title: "Tristan top: Design Options"
---
<DesignOptions design='tristan' />

View file

@ -0,0 +1,5 @@
---
title: "Tristan top: Design Options"
---
<DesignOptions design='tristan' />

View file

@ -0,0 +1,5 @@
---
title: "Tristan top: Design Options"
---
<DesignOptions design='tristan' />

View file

@ -0,0 +1,11 @@
---
title: "Vordere Schulterbreite"
---
***
Die Option **Vorderschulterbreite** steuert die Breite der Schultern an der Vorderseite, relativ zur Rückseite.

View file

@ -0,0 +1,11 @@
---
title: "Front shoulder width"
---
***
The **front shoulder width** option controls the width of the shoulders at the front, relative to the back.

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