diff --git a/config/software/designs.json b/config/software/designs.json
index 3c1d790ee60..e220d1e72cd 100644
--- a/config/software/designs.json
+++ b/config/software/designs.json
@@ -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",
diff --git a/designs/noble/i18n/en.json b/designs/noble/i18n/en.json
index 8ced1a99810..1226ebf3dcd 100644
--- a/designs/noble/i18n/en.json
+++ b/designs/noble/i18n/en.json
@@ -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"
diff --git a/designs/noble/src/backpoints.mjs b/designs/noble/src/backpoints.mjs
index f4fdf616e2a..b3cadc3369e 100644
--- a/designs/noble/src/backpoints.mjs
+++ b/designs/noble/src/backpoints.mjs
@@ -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)
diff --git a/designs/noble/src/frontpoints.mjs b/designs/noble/src/frontpoints.mjs
index d7cc8195f7c..5d02fdf988a 100644
--- a/designs/noble/src/frontpoints.mjs
+++ b/designs/noble/src/frontpoints.mjs
@@ -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
diff --git a/designs/noble/src/options.mjs b/designs/noble/src/options.mjs
index 8e6357e87cb..012fea26ae8 100644
--- a/designs/noble/src/options.mjs
+++ b/designs/noble/src/options.mjs
@@ -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,
diff --git a/designs/tristan/CHANGELOG.md b/designs/tristan/CHANGELOG.md
new file mode 100644
index 00000000000..83acfea0b8e
--- /dev/null
+++ b/designs/tristan/CHANGELOG.md
@@ -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.
+
diff --git a/designs/tristan/README.md b/designs/tristan/README.md
new file mode 100644
index 00000000000..133db2d0023
--- /dev/null
+++ b/designs/tristan/README.md
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+# @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:
+>
+> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
+>
+> We recommend that you fork our repository and then
+> put `gitpod.io/# to start up a browser-based dev environment of your own.
+
+## About FreeSewing 💀
+
+Where the world of makers and developers collide, that's where you'll find FreeSewing.
+
+If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
+sewing patterns adapted to your measurements.
+
+If you're a developer, the FreeSewing documentation lives at [freesewing.dev](https://freesewing.dev/).
+The FreeSewing [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
+for parametric design of sewing patterns. But FreeSewing also provides a range
+of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
+functionality of the platform.
+
+If you have NodeJS installed, you can try it right now by running:
+
+```bash
+npx 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).
+
diff --git a/designs/tristan/build.mjs b/designs/tristan/build.mjs
new file mode 100644
index 00000000000..99ace216bc8
--- /dev/null
+++ b/designs/tristan/build.mjs
@@ -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()
diff --git a/designs/tristan/data.mjs b/designs/tristan/data.mjs
new file mode 100644
index 00000000000..f703aaa2bd8
--- /dev/null
+++ b/designs/tristan/data.mjs
@@ -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 }
diff --git a/designs/tristan/i18n/de.json b/designs/tristan/i18n/de.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/de.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/i18n/en.json b/designs/tristan/i18n/en.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/en.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/i18n/es.json b/designs/tristan/i18n/es.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/es.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/i18n/fr.json b/designs/tristan/i18n/fr.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/fr.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/i18n/index.mjs b/designs/tristan/i18n/index.mjs
new file mode 100644
index 00000000000..36aac928b67
--- /dev/null
+++ b/designs/tristan/i18n/index.mjs
@@ -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 }
diff --git a/designs/tristan/i18n/nl.json b/designs/tristan/i18n/nl.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/nl.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/i18n/uk.json b/designs/tristan/i18n/uk.json
new file mode 100644
index 00000000000..079db5e0e0d
--- /dev/null
+++ b/designs/tristan/i18n/uk.json
@@ -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."
+ }
+
+ }
+}
diff --git a/designs/tristan/package.json b/designs/tristan/package.json
new file mode 100644
index 00000000000..90436d077ab
--- /dev/null
+++ b/designs/tristan/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "@freesewing/tristan",
+ "version": "3.0.0",
+ "description": "A FreeSewing pattern for a fitted top",
+ "author": "Joost De Cock (https://github.com/joostdecock)",
+ "homepage": "https://freesewing.org/",
+ "repository": "github:freesewing/freesewing",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/freesewing/freesewing/issues"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://freesewing.org/patrons/join"
+ },
+ "keywords": [
+ "freesewing",
+ "design",
+ "diy",
+ "fashion",
+ "made to measure",
+ "parametric design",
+ "pattern",
+ "sewing",
+ "sewing pattern"
+ ],
+ "type": "module",
+ "module": "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"
+ }
+}
diff --git a/designs/tristan/src/backinside.mjs b/designs/tristan/src/backinside.mjs
new file mode 100644
index 00000000000..d1deb383abf
--- /dev/null
+++ b/designs/tristan/src/backinside.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/backoutside.mjs b/designs/tristan/src/backoutside.mjs
new file mode 100644
index 00000000000..5a5cfed4a68
--- /dev/null
+++ b/designs/tristan/src/backoutside.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/backpoints.mjs b/designs/tristan/src/backpoints.mjs
new file mode 100644
index 00000000000..3b022d1de58
--- /dev/null
+++ b/designs/tristan/src/backpoints.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/frontinside.mjs b/designs/tristan/src/frontinside.mjs
new file mode 100644
index 00000000000..4f98fb57b0e
--- /dev/null
+++ b/designs/tristan/src/frontinside.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/frontoutside.mjs b/designs/tristan/src/frontoutside.mjs
new file mode 100644
index 00000000000..9b66adc8fd1
--- /dev/null
+++ b/designs/tristan/src/frontoutside.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/frontpoints.mjs b/designs/tristan/src/frontpoints.mjs
new file mode 100644
index 00000000000..83e41c9599d
--- /dev/null
+++ b/designs/tristan/src/frontpoints.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/index.mjs b/designs/tristan/src/index.mjs
new file mode 100644
index 00000000000..bf3a9aab97d
--- /dev/null
+++ b/designs/tristan/src/index.mjs
@@ -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,
+}
diff --git a/designs/tristan/src/peplumBack.mjs b/designs/tristan/src/peplumBack.mjs
new file mode 100644
index 00000000000..57047fa4093
--- /dev/null
+++ b/designs/tristan/src/peplumBack.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/src/peplumFront.mjs b/designs/tristan/src/peplumFront.mjs
new file mode 100644
index 00000000000..087936ca9b7
--- /dev/null
+++ b/designs/tristan/src/peplumFront.mjs
@@ -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
+ },
+}
diff --git a/designs/tristan/tests/shared.test.mjs b/designs/tristan/tests/shared.test.mjs
new file mode 100644
index 00000000000..87be117e2ed
--- /dev/null
+++ b/designs/tristan/tests/shared.test.mjs
@@ -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)
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/de.md b/markdown/org/docs/designs/noble/options/waistdartposition/de.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/de.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/en.md b/markdown/org/docs/designs/noble/options/waistdartposition/en.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/en.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/es.md b/markdown/org/docs/designs/noble/options/waistdartposition/es.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/es.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/fr.md b/markdown/org/docs/designs/noble/options/waistdartposition/fr.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/fr.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/nl.md b/markdown/org/docs/designs/noble/options/waistdartposition/nl.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/nl.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/noble/options/waistdartposition/uk.md b/markdown/org/docs/designs/noble/options/waistdartposition/uk.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/noble/options/waistdartposition/uk.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/cutting/en.md b/markdown/org/docs/designs/tristan/cutting/en.md
new file mode 100644
index 00000000000..96ceef2f17a
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/cutting/en.md
@@ -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.
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/en.md b/markdown/org/docs/designs/tristan/en.md
new file mode 100644
index 00000000000..25daf4612a4
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/en.md
@@ -0,0 +1,8 @@
+---
+title: "Tristan top"
+---
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/fabric/en.md b/markdown/org/docs/designs/tristan/fabric/en.md
new file mode 100644
index 00000000000..f214eaca6a6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/fabric/en.md
@@ -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.
+
+
+
+##### Consider using contrasting fabrics
+
+Consider using different fabrics for the inside and outside panels to highlight the prince(ss) seams.
+
+
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/instructions/en.md b/markdown/org/docs/designs/tristan/instructions/en.md
new file mode 100644
index 00000000000..c00d9fde418
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/instructions/en.md
@@ -0,0 +1,138 @@
+---
+title: "Tristan top: Sewing Instructions"
+---
+
+
+##### 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.
+
+
+### Step 1: Cut your pieces
+
+
+
+Cut your pattern pieces. If you would like to add embroidery or other decoration, now is a good time to do so.
+
+
+
+##### Finishing methods affect the seam allowance
+
+If using bias binding, you should cut the neckline and armholes without seam allowance.
+
+
+
+### Step 2: Sew the back inside parts together at center back
+
+
+
+Align the back inside (Part 3) parts at center back. Sew them together with _good sides together_.
+
+### Step 3: Attach back outside parts
+
+
+
+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 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
+
+
+
+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 all the seam allowances flat.
+
+### Step 6: Sew at the shoulders
+
+
+
+Sew at the shoulders to complete each armhole. Sew _good sides together_.
+
+Press the seam allowances open.
+
+
+##### 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.
+
+
+### Step 7: Repeat with lining fabric
+
+
+
+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
+
+
+
+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
+
+
+
+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.
+
+
+##### 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.
+
+
+### Step 10: Sew your second boning channel
+
+
+
+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!
+
+
+
+Enjoy your Tristan top!
diff --git a/markdown/org/docs/designs/tristan/instructions/step01.png b/markdown/org/docs/designs/tristan/instructions/step01.png
new file mode 100644
index 00000000000..8276dc12b4f
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step01.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step02.png b/markdown/org/docs/designs/tristan/instructions/step02.png
new file mode 100644
index 00000000000..9f136080075
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step02.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step03.png b/markdown/org/docs/designs/tristan/instructions/step03.png
new file mode 100644
index 00000000000..e359d0b3eb2
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step03.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step04.png b/markdown/org/docs/designs/tristan/instructions/step04.png
new file mode 100644
index 00000000000..7c8e7490bc6
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step04.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step05.png b/markdown/org/docs/designs/tristan/instructions/step05.png
new file mode 100644
index 00000000000..e07274eb561
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step05.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step05b.png b/markdown/org/docs/designs/tristan/instructions/step05b.png
new file mode 100644
index 00000000000..58a903d9d21
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step05b.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step06.png b/markdown/org/docs/designs/tristan/instructions/step06.png
new file mode 100644
index 00000000000..7b80bbef1eb
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step06.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step07.png b/markdown/org/docs/designs/tristan/instructions/step07.png
new file mode 100644
index 00000000000..678fdc77682
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step07.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step08.png b/markdown/org/docs/designs/tristan/instructions/step08.png
new file mode 100644
index 00000000000..4f9ebc4f721
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step08.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step09.png b/markdown/org/docs/designs/tristan/instructions/step09.png
new file mode 100644
index 00000000000..c03d7e656ab
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step09.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step10.png b/markdown/org/docs/designs/tristan/instructions/step10.png
new file mode 100644
index 00000000000..3b9ac26d8fe
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step10.png differ
diff --git a/markdown/org/docs/designs/tristan/instructions/step14.png b/markdown/org/docs/designs/tristan/instructions/step14.png
new file mode 100644
index 00000000000..4982f21d94b
Binary files /dev/null and b/markdown/org/docs/designs/tristan/instructions/step14.png differ
diff --git a/markdown/org/docs/designs/tristan/measurements/en.md b/markdown/org/docs/designs/tristan/measurements/en.md
new file mode 100644
index 00000000000..420db2e9640
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/measurements/en.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Required Measurements"
+---
+
+
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/needs/en.md b/markdown/org/docs/designs/tristan/needs/en.md
new file mode 100644
index 00000000000..92410690295
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/needs/en.md
@@ -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))
+
+
+
+##### 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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/notes/en.md b/markdown/org/docs/designs/tristan/notes/en.md
new file mode 100644
index 00000000000..48b14a26169
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/notes/en.md
@@ -0,0 +1,15 @@
+---
+title: "Tristan top: Designer Notes"
+---
+
+Tristan is a fitted top with corset-inspired design elements.
+
+It’s 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. It’s a great introduction to prince(ss) seams, and since it doesn’t 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
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/de.md b/markdown/org/docs/designs/tristan/options/armholedepth/de.md
new file mode 100644
index 00000000000..d3a9a18e691
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/de.md
@@ -0,0 +1,11 @@
+---
+title: "Armlochtiefe"
+---
+
+***
+
+Die **Armlochtiefe** steuert die Tiefe des Armlochs.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/en.md b/markdown/org/docs/designs/tristan/options/armholedepth/en.md
new file mode 100644
index 00000000000..8a2d03c3831
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/en.md
@@ -0,0 +1,11 @@
+---
+title: "Armhole depth"
+---
+
+***
+
+The **armhole depth** option controls the depth of the armhole.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/es.md b/markdown/org/docs/designs/tristan/options/armholedepth/es.md
new file mode 100644
index 00000000000..7a33ec2c36e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/es.md
@@ -0,0 +1,11 @@
+---
+title: "Profundidad del orificio"
+---
+
+***
+
+La opción **de profundidad de armadura** controla la profundidad del orificio de armadura.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/fr.md b/markdown/org/docs/designs/tristan/options/armholedepth/fr.md
new file mode 100644
index 00000000000..56eaa99c431
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Profondeur d'emmanchure"
+---
+
+***
+
+L'option **de profondeur de blindage** contrôle la profondeur de l'armure.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/nl.md b/markdown/org/docs/designs/tristan/options/armholedepth/nl.md
new file mode 100644
index 00000000000..cabe409240f
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Diepte armsgat"
+---
+
+***
+
+De **armsgat** optie bepaalt de diepte van het armsgat.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/armholedepth/uk.md b/markdown/org/docs/designs/tristan/options/armholedepth/uk.md
new file mode 100644
index 00000000000..5d34e1507e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/armholedepth/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Глибина пройми"
+---
+
+***
+
+Параметр **глибина пройми** регулює глибину пройми.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/de.md b/markdown/org/docs/designs/tristan/options/bustspanease/de.md
new file mode 100644
index 00000000000..4a7c3c32c75
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/de.md
@@ -0,0 +1,13 @@
+---
+title: "Büstenumfang leicht"
+---
+
+***
+
+Die **Bustumpfschlanke** Option bestimmt, wie viel Leichtigkeit auf den Bustumpfbereich angewendet wird.
+
+Dies wird das Kleidungsstück nicht leicht machen, sondern nur den Büstenpunkt beeinflussen
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/en.md b/markdown/org/docs/designs/tristan/options/bustspanease/en.md
new file mode 100644
index 00000000000..072a5e40a5c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/en.md
@@ -0,0 +1,13 @@
+---
+title: "Bust span ease"
+---
+
+***
+
+The **bust span ease** option controls how much ease is applied to the bust span.
+
+This will not add ease to the garment, but merely influence the bust point
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/es.md b/markdown/org/docs/designs/tristan/options/bustspanease/es.md
new file mode 100644
index 00000000000..603f5c7e57b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/es.md
@@ -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.
+
+Esto no añadirá facilidad a la ropa, sino que simplemente influirá en el punto de busto
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/fr.md b/markdown/org/docs/designs/tristan/options/bustspanease/fr.md
new file mode 100644
index 00000000000..768cb018428
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/fr.md
@@ -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.
+
+Cela ne facilitera pas le vêtement, mais seulement le point de buste
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/nl.md b/markdown/org/docs/designs/tristan/options/bustspanease/nl.md
new file mode 100644
index 00000000000..1c7bbc8c1f0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/nl.md
@@ -0,0 +1,13 @@
+---
+title: "Overwijdte bustenwijdte"
+---
+
+***
+
+De **bustewijdte overwijdte** optie bepaalt hoeveel overwijdte wordt toegepast op de bustewijdte.
+
+Dit maakt het kledingstuk niet gemakkelijker, maar beïnvloedt alleen het bustepunt
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/bustspanease/uk.md b/markdown/org/docs/designs/tristan/options/bustspanease/uk.md
new file mode 100644
index 00000000000..5c8bb89370c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/bustspanease/uk.md
@@ -0,0 +1,13 @@
+---
+title: "Легкість обхвату грудей"
+---
+
+***
+
+Параметр **bust span ease** контролює, наскільки полегшено буде застосовано обхват бюста.
+
+Це не додасть одягу легкості, а лише вплине на точку обхвату грудей
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/de.md b/markdown/org/docs/designs/tristan/options/chestease/de.md
new file mode 100644
index 00000000000..d8ed9e0e9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/de.md
@@ -0,0 +1,11 @@
+---
+title: "Brustumfangszugabe"
+---
+
+***
+
+Mit der Option **chest ease** kannst du den Grad der Entspannung an der vollsten Stelle deiner Brust einstellen.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/en.md b/markdown/org/docs/designs/tristan/options/chestease/en.md
new file mode 100644
index 00000000000..ed8fef65d30
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/en.md
@@ -0,0 +1,11 @@
+---
+title: "Chest ease"
+---
+
+***
+
+The **chest ease** option controls the amount of ease at the fullest part of your chest.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/es.md b/markdown/org/docs/designs/tristan/options/chestease/es.md
new file mode 100644
index 00000000000..93c0f52f2bc
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/es.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/fr.md b/markdown/org/docs/designs/tristan/options/chestease/fr.md
new file mode 100644
index 00000000000..391552a9d03
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/fr.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/nl.md b/markdown/org/docs/designs/tristan/options/chestease/nl.md
new file mode 100644
index 00000000000..3795d57fd2a
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Overwijdte borst"
+---
+
+***
+
+De optie **borst overwijdte** bepaalt de hoeveelheid overwijdte aan het grootste deel van je borst.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/chestease/uk.md b/markdown/org/docs/designs/tristan/options/chestease/uk.md
new file mode 100644
index 00000000000..08c814a15e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/chestease/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Легкість у грудях"
+---
+
+***
+
+Параметр **об'єму грудей** регулює об'єм грудей у найповнішій частині тіла.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/de.md b/markdown/org/docs/designs/tristan/options/cutdepthback/de.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/de.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/en.md b/markdown/org/docs/designs/tristan/options/cutdepthback/en.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/en.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/es.md b/markdown/org/docs/designs/tristan/options/cutdepthback/es.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/es.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/fr.md b/markdown/org/docs/designs/tristan/options/cutdepthback/fr.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/fr.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/nl.md b/markdown/org/docs/designs/tristan/options/cutdepthback/nl.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/nl.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthback/uk.md b/markdown/org/docs/designs/tristan/options/cutdepthback/uk.md
new file mode 100644
index 00000000000..df7cf684865
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthback/uk.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/de.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/de.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/de.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/en.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/en.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/en.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/es.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/es.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/es.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/fr.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/fr.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/fr.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/nl.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/nl.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/nl.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutdepthfront/uk.md b/markdown/org/docs/designs/tristan/options/cutdepthfront/uk.md
new file mode 100644
index 00000000000..7fa0a4002aa
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutdepthfront/uk.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/de.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/de.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/de.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/en.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/en.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/en.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/es.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/es.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/es.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/fr.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/fr.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/fr.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/nl.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/nl.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/nl.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessback/uk.md b/markdown/org/docs/designs/tristan/options/cutroundnessback/uk.md
new file mode 100644
index 00000000000..23c941ab9a0
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessback/uk.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/de.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/de.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/de.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/en.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/en.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/en.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/es.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/es.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/es.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/fr.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/fr.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/fr.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/nl.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/nl.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/nl.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/cutroundnessfront/uk.md b/markdown/org/docs/designs/tristan/options/cutroundnessfront/uk.md
new file mode 100644
index 00000000000..11d3564969c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/cutroundnessfront/uk.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/de.md b/markdown/org/docs/designs/tristan/options/de.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/de.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/en.md b/markdown/org/docs/designs/tristan/options/en.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/en.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/es.md b/markdown/org/docs/designs/tristan/options/es.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/es.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/fr.md b/markdown/org/docs/designs/tristan/options/fr.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fr.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/de.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/de.md
new file mode 100644
index 00000000000..414c2783f0e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/de.md
@@ -0,0 +1,11 @@
+---
+title: "Vordere Schulterbreite"
+---
+
+***
+
+Die Option **Vorderschulterbreite** steuert die Breite der Schultern an der Vorderseite, relativ zur Rückseite.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/en.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/en.md
new file mode 100644
index 00000000000..a891f275dcf
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/en.md
@@ -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.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/es.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/es.md
new file mode 100644
index 00000000000..9d47ee1a0db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/es.md
@@ -0,0 +1,11 @@
+---
+title: "Ancho del hombro frontal"
+---
+
+***
+
+La opción **de ancho del hombro frontal** controla el ancho de los hombros en el frente, relativo a la espalda.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/fr.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/fr.md
new file mode 100644
index 00000000000..e266cef2e45
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Largeur d'épaule devant"
+---
+
+***
+
+L'option **de largeur d'épaule avant** contrôle la largeur des épaules à l'avant par rapport à l'arrière.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/nl.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/nl.md
new file mode 100644
index 00000000000..d448e072bb5
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Schouderbreedte vooraan"
+---
+
+***
+
+De optie **breedte van de voorste schouder** bepaalt de breedte van de schouders vooraan ten opzichte van de achterkant.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/frontshoulderwidth/uk.md b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/uk.md
new file mode 100644
index 00000000000..7cb33200e45
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/frontshoulderwidth/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Ширина плечей спереду"
+---
+
+***
+
+Параметр **ширина плечей спереду** регулює ширину плечей спереду відносно спинки.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/de.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/de.md
new file mode 100644
index 00000000000..8ffce74d660
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/de.md
@@ -0,0 +1,7 @@
+---
+title: "Verringerung der Brustumfangszugabe"
+---
+
+***
+
+Ermöglicht es dir den Spielraum an der Brust zu verringern, um dort einen engeren Sitz zu ermöglichen.
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/en.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/en.md
new file mode 100644
index 00000000000..70696fe82de
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/en.md
@@ -0,0 +1,7 @@
+---
+title: "Full chest ease reduction"
+---
+
+***
+
+Allows you to independently reduce the ease around the chest to make it fit tight(er) in that area.
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/es.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/es.md
new file mode 100644
index 00000000000..070a8baba3b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/es.md
@@ -0,0 +1,7 @@
+---
+title: "Reducción total de la holgura torácica"
+---
+
+***
+
+Te permite reducir de forma independiente la holgura alrededor del pecho para que quede ajustado(a) en esa zona.
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/fr.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/fr.md
new file mode 100644
index 00000000000..dbfbe6a4359
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/fr.md
@@ -0,0 +1,7 @@
+---
+title: "Réduction de l'aisance de la poitrine"
+---
+
+***
+
+Vous permet de réduire indépendamment du reste l'aisance de la poitrine pour le rendre (plus) ajusté à ce niveau.
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/nl.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/nl.md
new file mode 100644
index 00000000000..ba0d0d98667
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/nl.md
@@ -0,0 +1,7 @@
+---
+title: "Vermindering van de volle buste overwijdte"
+---
+
+***
+
+Hiermee kun je de overwijdte rond de borst onafhankelijk verminderen om het daar strak(er) te laten aansluiten.
diff --git a/markdown/org/docs/designs/tristan/options/fullchesteasereduction/uk.md b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/uk.md
new file mode 100644
index 00000000000..af69c52b24f
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/fullchesteasereduction/uk.md
@@ -0,0 +1,7 @@
+---
+title: "Повне зменшення об'єму грудної клітки"
+---
+
+***
+
+Дозволяє самостійно зменшити легкість навколо грудей, щоб вона щільно прилягала в цій ділянці.
diff --git a/markdown/org/docs/designs/tristan/options/hem/de.md b/markdown/org/docs/designs/tristan/options/hem/de.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/de.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hem/en.md b/markdown/org/docs/designs/tristan/options/hem/en.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/en.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hem/es.md b/markdown/org/docs/designs/tristan/options/hem/es.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/es.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hem/fr.md b/markdown/org/docs/designs/tristan/options/hem/fr.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/fr.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hem/nl.md b/markdown/org/docs/designs/tristan/options/hem/nl.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/nl.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hem/uk.md b/markdown/org/docs/designs/tristan/options/hem/uk.md
new file mode 100644
index 00000000000..5d2c56609e2
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hem/uk.md
@@ -0,0 +1,12 @@
+---
+title: "Hem option"
+---
+
+***
+
+The **hem** option creates the extra fabric to make a hem. This is for the waist only. Will be ignored
+if the **peplum** option is enabled.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/de.md b/markdown/org/docs/designs/tristan/options/hemsize/de.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/de.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/en.md b/markdown/org/docs/designs/tristan/options/hemsize/en.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/en.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/es.md b/markdown/org/docs/designs/tristan/options/hemsize/es.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/es.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/fr.md b/markdown/org/docs/designs/tristan/options/hemsize/fr.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/nl.md b/markdown/org/docs/designs/tristan/options/hemsize/nl.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/hemsize/uk.md b/markdown/org/docs/designs/tristan/options/hemsize/uk.md
new file mode 100644
index 00000000000..24023a08aa8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/hemsize/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Hem Size"
+---
+
+***
+
+The **hem size** controls the size of the **hem**.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/de.md b/markdown/org/docs/designs/tristan/options/highbustwidth/de.md
new file mode 100644
index 00000000000..8397dee397d
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/de.md
@@ -0,0 +1,11 @@
+---
+title: "Hohe Büstenbreite"
+---
+
+***
+
+Die **hohe Büstenbreite** erlaubt es Ihnen, die hohe Büstenbreite an der Vorderseite zu optimieren.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/en.md b/markdown/org/docs/designs/tristan/options/highbustwidth/en.md
new file mode 100644
index 00000000000..9829cab1b18
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/en.md
@@ -0,0 +1,11 @@
+---
+title: "High bust width"
+---
+
+***
+
+The **high bust width** option allows you to tweak the high bust width at the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/es.md b/markdown/org/docs/designs/tristan/options/highbustwidth/es.md
new file mode 100644
index 00000000000..2e76fc46cd5
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/es.md
@@ -0,0 +1,11 @@
+---
+title: "Ancho de bust alto"
+---
+
+***
+
+La opción **de ancho de bust alto** le permite ajustar el ancho de bust alto en el frente.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/fr.md b/markdown/org/docs/designs/tristan/options/highbustwidth/fr.md
new file mode 100644
index 00000000000..73fe7de0937
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Largeur de buste supérieur"
+---
+
+***
+
+L'option **grande largeur de poitrine** vous permet de modifier la largeur de la poitrine à l'avant.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/nl.md b/markdown/org/docs/designs/tristan/options/highbustwidth/nl.md
new file mode 100644
index 00000000000..e6a47535b58
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Hoge buste-breedte"
+---
+
+***
+
+De **hoge bustebreedte** optie maakt het mogelijk om de bustebreedte aan het voorpand aan te passen.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/highbustwidth/uk.md b/markdown/org/docs/designs/tristan/options/highbustwidth/uk.md
new file mode 100644
index 00000000000..03217ce42e6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/highbustwidth/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Висока ширина бюста"
+---
+
+***
+
+Опція **високої ширини бюста** дозволяє налаштувати високу ширину бюста спереду.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/de.md b/markdown/org/docs/designs/tristan/options/lacing/de.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/de.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/en.md b/markdown/org/docs/designs/tristan/options/lacing/en.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/en.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/es.md b/markdown/org/docs/designs/tristan/options/lacing/es.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/es.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/fr.md b/markdown/org/docs/designs/tristan/options/lacing/fr.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/fr.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/nl.md b/markdown/org/docs/designs/tristan/options/lacing/nl.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/nl.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacing/uk.md b/markdown/org/docs/designs/tristan/options/lacing/uk.md
new file mode 100644
index 00000000000..e940a3b80f6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacing/uk.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing option"
+---
+
+***
+
+The **lacing** option removes the fabric that is being replaced by the lacing. This is
+what one would see with historical corsets and some dirndl.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/de.md b/markdown/org/docs/designs/tristan/options/lacinglocation/de.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/de.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/en.md b/markdown/org/docs/designs/tristan/options/lacinglocation/en.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/en.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/es.md b/markdown/org/docs/designs/tristan/options/lacinglocation/es.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/es.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/fr.md b/markdown/org/docs/designs/tristan/options/lacinglocation/fr.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/fr.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/nl.md b/markdown/org/docs/designs/tristan/options/lacinglocation/nl.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/nl.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacinglocation/uk.md b/markdown/org/docs/designs/tristan/options/lacinglocation/uk.md
new file mode 100644
index 00000000000..b536cf52a9b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacinglocation/uk.md
@@ -0,0 +1,12 @@
+---
+title: "Lacing location"
+---
+
+***
+
+The **lacing location** controls where the **lacing** option will be implemented.
+Options are in the front, or in the back.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/de.md b/markdown/org/docs/designs/tristan/options/lacingwidth/de.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/de.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/en.md b/markdown/org/docs/designs/tristan/options/lacingwidth/en.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/en.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/es.md b/markdown/org/docs/designs/tristan/options/lacingwidth/es.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/es.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/fr.md b/markdown/org/docs/designs/tristan/options/lacingwidth/fr.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/nl.md b/markdown/org/docs/designs/tristan/options/lacingwidth/nl.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/lacingwidth/uk.md b/markdown/org/docs/designs/tristan/options/lacingwidth/uk.md
new file mode 100644
index 00000000000..761b2be3be3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/lacingwidth/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Lacing width"
+---
+
+***
+
+The **lacing width** controls the size of the **lacing** opening.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/nl.md b/markdown/org/docs/designs/tristan/options/nl.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/nl.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/de.md b/markdown/org/docs/designs/tristan/options/peplum/de.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/de.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/en.md b/markdown/org/docs/designs/tristan/options/peplum/en.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/en.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/es.md b/markdown/org/docs/designs/tristan/options/peplum/es.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/es.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/fr.md b/markdown/org/docs/designs/tristan/options/peplum/fr.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/fr.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/nl.md b/markdown/org/docs/designs/tristan/options/peplum/nl.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/nl.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplum/uk.md b/markdown/org/docs/designs/tristan/options/peplum/uk.md
new file mode 100644
index 00000000000..85ea4cbb999
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplum/uk.md
@@ -0,0 +1,15 @@
+---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/de.md b/markdown/org/docs/designs/tristan/options/peplumfullness/de.md
new file mode 100644
index 00000000000..564530ded9e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/de.md
@@ -0,0 +1,16 @@
+[---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
+](../peplum)
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/en.md b/markdown/org/docs/designs/tristan/options/peplumfullness/en.md
new file mode 100644
index 00000000000..6513201ea49
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/en.md
@@ -0,0 +1,12 @@
+---
+title: "Peplum fullness"
+---
+
+***
+
+The **peplum fullness** determines the amount of wrinkles in the peplum. This can
+vary between 180 to 360 degree. Think of it as a half-circle to a full-circle skirt.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/es.md b/markdown/org/docs/designs/tristan/options/peplumfullness/es.md
new file mode 100644
index 00000000000..564530ded9e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/es.md
@@ -0,0 +1,16 @@
+[---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
+](../peplum)
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/fr.md b/markdown/org/docs/designs/tristan/options/peplumfullness/fr.md
new file mode 100644
index 00000000000..564530ded9e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/fr.md
@@ -0,0 +1,16 @@
+[---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
+](../peplum)
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/nl.md b/markdown/org/docs/designs/tristan/options/peplumfullness/nl.md
new file mode 100644
index 00000000000..564530ded9e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/nl.md
@@ -0,0 +1,16 @@
+[---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
+](../peplum)
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/options/peplumfullness/uk.md b/markdown/org/docs/designs/tristan/options/peplumfullness/uk.md
new file mode 100644
index 00000000000..564530ded9e
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumfullness/uk.md
@@ -0,0 +1,16 @@
+[---
+title: "Peplum option"
+---
+
+***
+
+The **peplum** option creates a peplum along the waist.
+
+
+If the size and fullness are large enough, this can become a dress.
+
+
+
+
+
+](../peplum)
\ No newline at end of file
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/de.md b/markdown/org/docs/designs/tristan/options/peplumsize/de.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/de.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/en.md b/markdown/org/docs/designs/tristan/options/peplumsize/en.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/en.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/es.md b/markdown/org/docs/designs/tristan/options/peplumsize/es.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/es.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/fr.md b/markdown/org/docs/designs/tristan/options/peplumsize/fr.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/nl.md b/markdown/org/docs/designs/tristan/options/peplumsize/nl.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/peplumsize/uk.md b/markdown/org/docs/designs/tristan/options/peplumsize/uk.md
new file mode 100644
index 00000000000..9b7371fcdab
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/peplumsize/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Peplum Size"
+---
+
+***
+
+The **peplum size** controls the size of the **peplum**. This is a percentage of the length of the front.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/de.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/de.md
new file mode 100644
index 00000000000..59f83d7e187
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/de.md
@@ -0,0 +1,11 @@
+---
+title: "Schulter Abnäher Position"
+---
+
+***
+
+Mit der Option **Schulterabnäherposition** kannst du die Position des Abnähers/der Prinzessinnennaht verschieben.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/en.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/en.md
new file mode 100644
index 00000000000..30caccd12d8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/en.md
@@ -0,0 +1,11 @@
+---
+title: "Shoulder Dart Position"
+---
+
+***
+
+The **Shoulder Dart Position** option allows you to move the position of the dart/princess seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/es.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/es.md
new file mode 100644
index 00000000000..61916134f28
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/es.md
@@ -0,0 +1,11 @@
+---
+title: "Posición del dardo en el hombro"
+---
+
+***
+
+La opción **Posición de la pinza en el hombro** te permite mover la posición de la pinza/costura princesa.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/fr.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/fr.md
new file mode 100644
index 00000000000..446d901a904
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Position de la fléchette d'épaule"
+---
+
+***
+
+L'option **Shoulder Dart Position** te permet de déplacer la position de la couture d'échancrure/princesse.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/nl.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/nl.md
new file mode 100644
index 00000000000..770eefc1104
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Schouderpijl Positie"
+---
+
+***
+
+Met de optie **Shoulder Dart Position** kun je de positie van de figuurnaad verplaatsen.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shoulderdartposition/uk.md b/markdown/org/docs/designs/tristan/options/shoulderdartposition/uk.md
new file mode 100644
index 00000000000..7fe12a65aaf
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shoulderdartposition/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Положення плечової виточки"
+---
+
+***
+
+Опція **Положення плечової виточки** дозволяє змінювати положення виточки/притачного шва.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/de.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/de.md
new file mode 100644
index 00000000000..737383cac39
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/de.md
@@ -0,0 +1,11 @@
+---
+title: "Schulter-zu-Schulter-Erleichterung"
+---
+
+***
+
+Mit der Option **Schulter-zu-Schulter-Erleichterung** kannst du eine Erleichterung zwischen den Schultern hinzufügen.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/en.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/en.md
new file mode 100644
index 00000000000..6cd003449bb
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/en.md
@@ -0,0 +1,11 @@
+---
+title: "Shoulder to Shoulder Ease"
+---
+
+***
+
+The **Shoulder to Shoulder Ease** option allows you to add ease between the shoulders.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/es.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/es.md
new file mode 100644
index 00000000000..ff65b5bf456
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/es.md
@@ -0,0 +1,11 @@
+---
+title: "Facilidad de Hombro a Hombro"
+---
+
+***
+
+La opción **Facilidad entre hombros** te permite añadir facilidad entre los hombros.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/fr.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/fr.md
new file mode 100644
index 00000000000..a197b3eb507
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Facilité d'épaule à épaule"
+---
+
+***
+
+L'option **Shoulder to Shoulder Ease** te permet d'ajouter de l'aisance entre les épaules.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/nl.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/nl.md
new file mode 100644
index 00000000000..28fed2194eb
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Schouder aan schouder gemak"
+---
+
+***
+
+Met de optie **Shoulder to Shoulder Ease** kun je gemak tussen de schouders toevoegen.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/uk.md b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/uk.md
new file mode 100644
index 00000000000..97b006f60de
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/shouldertoshoulderease/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Легкість від плеча до плеча"
+---
+
+***
+
+Опція **Shoulder to Shoulder Ease** дозволяє додати легкості між плечима.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/de.md b/markdown/org/docs/designs/tristan/options/strapwidth/de.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/de.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/en.md b/markdown/org/docs/designs/tristan/options/strapwidth/en.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/en.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/es.md b/markdown/org/docs/designs/tristan/options/strapwidth/es.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/es.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/fr.md b/markdown/org/docs/designs/tristan/options/strapwidth/fr.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/nl.md b/markdown/org/docs/designs/tristan/options/strapwidth/nl.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/strapwidth/uk.md b/markdown/org/docs/designs/tristan/options/strapwidth/uk.md
new file mode 100644
index 00000000000..002df59ab43
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/strapwidth/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Strap width"
+---
+
+***
+
+The **strap width** option controls the width of the shoulder straps.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/uk.md b/markdown/org/docs/designs/tristan/options/uk.md
new file mode 100644
index 00000000000..8eb6e8481db
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/uk.md
@@ -0,0 +1,5 @@
+---
+title: "Tristan top: Design Options"
+---
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/de.md b/markdown/org/docs/designs/tristan/options/upperdartlength/de.md
new file mode 100644
index 00000000000..1805e8ba1bc
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/de.md
@@ -0,0 +1,11 @@
+---
+title: "Obere Abnäherlänge"
+---
+
+***
+
+Die **Upper Dart Length** steuert die Länge des oberen Abnähers, der zu 100 % bis zum Brustansatz reicht.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/en.md b/markdown/org/docs/designs/tristan/options/upperdartlength/en.md
new file mode 100644
index 00000000000..2a790f863e8
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/en.md
@@ -0,0 +1,11 @@
+---
+title: "Upper Dart Length"
+---
+
+***
+
+The **Upper Dart Length** controls the length of the upper dart, 100% is all the way to the bust point.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/es.md b/markdown/org/docs/designs/tristan/options/upperdartlength/es.md
new file mode 100644
index 00000000000..1429e4df5d6
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/es.md
@@ -0,0 +1,11 @@
+---
+title: "Longitud del dardo superior"
+---
+
+***
+
+La página **Longitud del dardo superior** controla la longitud del dardo superior, 100% hasta el punto del pecho.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/fr.md b/markdown/org/docs/designs/tristan/options/upperdartlength/fr.md
new file mode 100644
index 00000000000..86ff4e7b3a9
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Longueur de la fléchette supérieure"
+---
+
+***
+
+Le site **Upper Dart Length** contrôle la longueur du dard supérieur, 100 % jusqu'à la pointe du buste.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/nl.md b/markdown/org/docs/designs/tristan/options/upperdartlength/nl.md
new file mode 100644
index 00000000000..d0da8cbdf1d
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Lengte bovenste pijl"
+---
+
+***
+
+De **Bovenpijllengte** regelt de lengte van de bovenpijl, 100% is helemaal tot aan de buste.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/upperdartlength/uk.md b/markdown/org/docs/designs/tristan/options/upperdartlength/uk.md
new file mode 100644
index 00000000000..d136ded89e5
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/upperdartlength/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Довжина верхньої виточки"
+---
+
+***
+
+Довжина верхньої виточки **** регулює довжину верхньої виточки, 100% - це довжина до точки обхвату грудей.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/de.md b/markdown/org/docs/designs/tristan/options/waistdartlength/de.md
new file mode 100644
index 00000000000..6dbc3b8b7eb
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/de.md
@@ -0,0 +1,11 @@
+---
+title: "Länge des Taillenabnähers"
+---
+
+***
+
+Die Option **Taillenlänge Dart** steuert die Länge des Taillendarts in Richtung Büste.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/en.md b/markdown/org/docs/designs/tristan/options/waistdartlength/en.md
new file mode 100644
index 00000000000..b0c75990481
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/en.md
@@ -0,0 +1,11 @@
+---
+title: "Waist dart length"
+---
+
+***
+
+The **waist dart length** option controls the length of the waist dart towards the bust.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/es.md b/markdown/org/docs/designs/tristan/options/waistdartlength/es.md
new file mode 100644
index 00000000000..1cac55d1012
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/es.md
@@ -0,0 +1,11 @@
+---
+title: "Longitud del dart de Waist"
+---
+
+***
+
+La opción de dardos de cintura **** controla la longitud del dardo de cintura hacia el busto.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/fr.md b/markdown/org/docs/designs/tristan/options/waistdartlength/fr.md
new file mode 100644
index 00000000000..886ecdad5c1
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Longueur de la pince de taille"
+---
+
+***
+
+L'option **longueur de la tige de taille** contrôle la longueur du dart de taille vers le bust.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/nl.md b/markdown/org/docs/designs/tristan/options/waistdartlength/nl.md
new file mode 100644
index 00000000000..7e97cb5d4a3
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Lengte neep taille"
+---
+
+***
+
+De lengte van de **neep** optie bepaalt de lengte van de neep van de taille naar de bust.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartlength/uk.md b/markdown/org/docs/designs/tristan/options/waistdartlength/uk.md
new file mode 100644
index 00000000000..48af2ad243d
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartlength/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Довжина талієвої виточки"
+---
+
+***
+
+Параметр **довжина талієвої виточки** регулює довжину талієвої виточки по відношенню до грудей.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/de.md b/markdown/org/docs/designs/tristan/options/waistdartposition/de.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/de.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/en.md b/markdown/org/docs/designs/tristan/options/waistdartposition/en.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/en.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/es.md b/markdown/org/docs/designs/tristan/options/waistdartposition/es.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/es.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/fr.md b/markdown/org/docs/designs/tristan/options/waistdartposition/fr.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/fr.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/nl.md b/markdown/org/docs/designs/tristan/options/waistdartposition/nl.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/nl.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistdartposition/uk.md b/markdown/org/docs/designs/tristan/options/waistdartposition/uk.md
new file mode 100644
index 00000000000..c602635298b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistdartposition/uk.md
@@ -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).
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/de.md b/markdown/org/docs/designs/tristan/options/waistease/de.md
new file mode 100644
index 00000000000..e22ed3ab4ed
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/de.md
@@ -0,0 +1,11 @@
+---
+title: "Taillenzugabe"
+---
+
+***
+
+Die Option **Taille Leichtigkeit** steuert die Menge der Leichtigkeit in deiner Taille.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/en.md b/markdown/org/docs/designs/tristan/options/waistease/en.md
new file mode 100644
index 00000000000..0ca649ecfa9
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/en.md
@@ -0,0 +1,11 @@
+---
+title: "Waist ease"
+---
+
+***
+
+The **waist ease** option controls the amount of ease at your waist.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/es.md b/markdown/org/docs/designs/tristan/options/waistease/es.md
new file mode 100644
index 00000000000..8e3d24b0675
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/es.md
@@ -0,0 +1,11 @@
+---
+title: "Holgura de cintura"
+---
+
+***
+
+La opción de facilidad de cintura **** controla la cantidad de facilidad en la cintura.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/fr.md b/markdown/org/docs/designs/tristan/options/waistease/fr.md
new file mode 100644
index 00000000000..795048ec78c
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/fr.md
@@ -0,0 +1,11 @@
+---
+title: "Aisance à la taille"
+---
+
+***
+
+L'option **facilitant la taille** contrôle la quantité d'aisance à votre taille.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/nl.md b/markdown/org/docs/designs/tristan/options/waistease/nl.md
new file mode 100644
index 00000000000..535bb827372
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/nl.md
@@ -0,0 +1,11 @@
+---
+title: "Overwijdte taille"
+---
+
+***
+
+De optie **taille overwijdte** bepaalt de hoeveelheid overwijdte aan je taille.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/waistease/uk.md b/markdown/org/docs/designs/tristan/options/waistease/uk.md
new file mode 100644
index 00000000000..9d00d9774ad
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/waistease/uk.md
@@ -0,0 +1,11 @@
+---
+title: "Легкість талії"
+---
+
+***
+
+Опція **полегшення талії** контролює ступінь полегшення талії.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/de.md b/markdown/org/docs/designs/tristan/options/zipperlocation/de.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/de.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/en.md b/markdown/org/docs/designs/tristan/options/zipperlocation/en.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/en.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/es.md b/markdown/org/docs/designs/tristan/options/zipperlocation/es.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/es.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/fr.md b/markdown/org/docs/designs/tristan/options/zipperlocation/fr.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/fr.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/nl.md b/markdown/org/docs/designs/tristan/options/zipperlocation/nl.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/nl.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/markdown/org/docs/designs/tristan/options/zipperlocation/uk.md b/markdown/org/docs/designs/tristan/options/zipperlocation/uk.md
new file mode 100644
index 00000000000..7868421791b
--- /dev/null
+++ b/markdown/org/docs/designs/tristan/options/zipperlocation/uk.md
@@ -0,0 +1,12 @@
+---
+title: "Zipper location"
+---
+
+***
+
+The **zipper location** controls where the zipper should be inserted.
+Options are in the front, in the back, or in the side seam.
+
+
+
+
diff --git a/sites/lab/pages/new/tristan.mjs b/sites/lab/pages/new/tristan.mjs
new file mode 100644
index 00000000000..cc78e03c87c
--- /dev/null
+++ b/sites/lab/pages/new/tristan.mjs
@@ -0,0 +1,41 @@
+/*
+ * This page is auto-generated. Do not edit it by hand.
+ */
+import { Tristan } from 'designs/tristan/src/index.mjs'
+// Dependencies
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
+import { nsMerge } from 'shared/utils.mjs'
+// Components
+import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
+import { Workbench, ns as wbNs } from 'shared/components/workbench/new.mjs'
+import { WorkbenchLayout } from 'site/components/layouts/workbench.mjs'
+
+// Translation namespaces used on this page
+const ns = nsMerge('tristan', wbNs, pageNs)
+
+const NewTristanPage = ({ page, docs }) => (
+
+
+
+)
+
+export default NewTristanPage
+
+export async function getStaticProps({ locale }) {
+ return {
+ props: {
+ ...(await serverSideTranslations(locale, ns)),
+ page: {
+ locale,
+ path: ['new', 'tristan'],
+ title: 'Tristan',
+ },
+ },
+ }
+}
diff --git a/sites/org/pages/account/patterns/tristan/edit.mjs b/sites/org/pages/account/patterns/tristan/edit.mjs
new file mode 100644
index 00000000000..a9566759f85
--- /dev/null
+++ b/sites/org/pages/account/patterns/tristan/edit.mjs
@@ -0,0 +1,86 @@
+/*
+ * This page is auto-generated. Do not edit it by hand.
+ */
+import { Tristan } from 'designs/tristan/src/index.mjs'
+// Dependencies
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
+import { nsMerge, getSearchParam } from 'shared/utils.mjs'
+// Hooks
+import { useState, useEffect, useContext } from 'react'
+import { useTranslation } from 'next-i18next'
+import { useBackend } from 'shared/hooks/use-backend.mjs'
+// Context
+import { LoadingStatusContext } from 'shared/context/loading-status-context.mjs'
+// Components
+import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
+import { Workbench, ns as wbNs } from 'shared/components/workbench/new.mjs'
+import { WorkbenchLayout } from 'site/components/layouts/workbench.mjs'
+import { Loading } from 'shared/components/spinner.mjs'
+
+// Translation namespaces used on this page
+const ns = nsMerge('tristan', wbNs, pageNs)
+
+const EditDesignComponent = ({ id, design, Design, settings }) => (
+
+)
+
+const EditTristanPage = ({ page }) => {
+ const { setLoadingStatus } = useContext(LoadingStatusContext)
+ const backend = useBackend()
+ const { t } = useTranslation(ns)
+
+ const [pattern, setPattern] = useState(false)
+
+ useEffect(() => {
+ const getPattern = async () => {
+ setLoadingStatus([true, t('backendLoadingStarted')])
+ let result
+ try {
+ result = await backend.getPattern(id)
+ if (result.success) {
+ setPattern(result.data.pattern)
+ setLoadingStatus([true, 'backendLoadingCompleted', true, true])
+ } else setLoadingStatus([true, 'backendError', true, false])
+ } catch (err) {
+ console.log(err)
+ setLoadingStatus([true, 'backendError', true, false])
+ }
+ }
+ const id = getSearchParam('id')
+ if (id) getPattern()
+ }, [backend, setLoadingStatus, t])
+
+ return (
+ // prettier-ignore
+
+ {pattern ? (
+
+ ) : (
+
+
{t('account:oneMomentPLease')}
+
+
+ )}
+
+ )
+}
+
+export default EditTristanPage
+
+export async function getStaticProps({ locale }) {
+ return {
+ props: {
+ ...(await serverSideTranslations(locale, ns)),
+ page: {
+ locale,
+ path: ['account', 'patterns', 'tristan'],
+ title: 'Tristan',
+ },
+ },
+ }
+}
diff --git a/sites/org/pages/new/tristan.mjs b/sites/org/pages/new/tristan.mjs
new file mode 100644
index 00000000000..cc78e03c87c
--- /dev/null
+++ b/sites/org/pages/new/tristan.mjs
@@ -0,0 +1,41 @@
+/*
+ * This page is auto-generated. Do not edit it by hand.
+ */
+import { Tristan } from 'designs/tristan/src/index.mjs'
+// Dependencies
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
+import { nsMerge } from 'shared/utils.mjs'
+// Components
+import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
+import { Workbench, ns as wbNs } from 'shared/components/workbench/new.mjs'
+import { WorkbenchLayout } from 'site/components/layouts/workbench.mjs'
+
+// Translation namespaces used on this page
+const ns = nsMerge('tristan', wbNs, pageNs)
+
+const NewTristanPage = ({ page, docs }) => (
+
+
+
+)
+
+export default NewTristanPage
+
+export async function getStaticProps({ locale }) {
+ return {
+ props: {
+ ...(await serverSideTranslations(locale, ns)),
+ page: {
+ locale,
+ path: ['new', 'tristan'],
+ title: 'Tristan',
+ },
+ },
+ }
+}
diff --git a/sites/shared/components/designs/linedrawings/index.mjs b/sites/shared/components/designs/linedrawings/index.mjs
index 56cbd2dfc8a..1973ecfb850 100644
--- a/sites/shared/components/designs/linedrawings/index.mjs
+++ b/sites/shared/components/designs/linedrawings/index.mjs
@@ -19,6 +19,11 @@ import { Hortensia, HortensiaFront } from 'shared/components/designs/linedrawing
import { Simon, SimonFront, SimonBack } from 'shared/components/designs/linedrawings/simon.mjs'
import { Uma, UmaFront, UmaBack } from 'shared/components/designs/linedrawings/uma.mjs'
import { Wahid, WahidFront, WahidBack } from 'shared/components/designs/linedrawings/wahid.mjs'
+import {
+ Tristan,
+ TristanFront,
+ TristanBack,
+} from 'shared/components/designs/linedrawings/tristan.mjs'
export const lineDrawingsFront = {
aaron: AaronFront,
@@ -38,6 +43,7 @@ export const lineDrawingsFront = {
simon: SimonFront,
uma: UmaFront,
wahid: WahidFront,
+ tristan: TristanFront,
}
export const lineDrawingsBack = {
@@ -53,6 +59,7 @@ export const lineDrawingsBack = {
simon: SimonBack,
uma: UmaBack,
wahid: WahidBack,
+ tristan: TristanBack,
}
export const lineDrawings = {
@@ -73,4 +80,5 @@ export const lineDrawings = {
simon: Simon,
uma: Uma,
wahid: Wahid,
+ tristan: Tristan,
}
diff --git a/sites/shared/components/designs/linedrawings/tristan.mjs b/sites/shared/components/designs/linedrawings/tristan.mjs
new file mode 100644
index 00000000000..ac196d25a06
--- /dev/null
+++ b/sites/shared/components/designs/linedrawings/tristan.mjs
@@ -0,0 +1,86 @@
+import { LineDrawingWrapper, thin } from './shared.mjs'
+
+const strokeScale = 0.5
+
+export const Tristan = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+
+ )
+}
+
+/*
+ * React component for the front
+ */
+export const TristanFront = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * React component for the back
+ */
+export const TristanBack = ({
+ className = 'w-64', // CSS classes to apply
+ stroke = 1, // Stroke width to use
+}) => {
+ // Normalize stroke across designs
+ stroke = stroke * strokeScale
+
+ return (
+
+
+
+ )
+}
+
+/*
+ * SVG elements for the front
+ */
+export const Front = ({ stroke }) => (
+ <>
+
+
+ >
+)
+
+/*
+ * SVG elements for the back
+ */
+const Back = ({ stroke }) => (
+ <>
+
+
+ >
+)