From 526eb77396bf77ee8147755607889c6842cc3090 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 12 Oct 2023 02:29:48 +0000 Subject: [PATCH 01/26] Remove mini, add expand --- designs/waralee/i18n/en.json | 15 +- designs/waralee/src/backpocket.mjs | 100 +++-- designs/waralee/src/cutout.mjs | 59 +-- designs/waralee/src/facings.mjs | 107 +++-- designs/waralee/src/mini.mjs | 97 ++--- designs/waralee/src/options.mjs | 2 +- designs/waralee/src/pants.mjs | 213 +++++----- designs/waralee/src/pantsproto.mjs | 616 ++++++++++++++--------------- designs/waralee/src/pocket.mjs | 175 ++++---- designs/waralee/src/waistband.mjs | 197 ++++----- 10 files changed, 750 insertions(+), 831 deletions(-) diff --git a/designs/waralee/i18n/en.json b/designs/waralee/i18n/en.json index 46c7e2cc1f0..ede664f813c 100644 --- a/designs/waralee/i18n/en.json +++ b/designs/waralee/i18n/en.json @@ -14,7 +14,20 @@ "waistbandBack": "Waistband back", "waistbandFront": "Waistband front" }, - "s": {}, + "s": { + "cutwaistbandBack.t": "The back waist band is not shown", + "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.", + "cutwaistbandFront.t": "The front waist band is not shown", + "cutwaistbandFront.d": "The **front waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.", + "cutstrapBack.t": "The back strap is not shown", + "cutstrapBack.d": "The **back strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.", + "cutstrapFront.t": "The front strap is not shown", + "cutstrapFront.d": "The **front strap** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.", + "showPants.t": "The full pants are shown", + "showPants.d": "The **full pants** are shown. This takes up a lot of paper to print. Consider hiding this part, and a minimized version will show with the dimensions.", + "hidePants.t": "The full pants are not shown", + "hidePants.d": "The **full pants** are not shown. Instead a minimized version is show with the dimensions, allowing you cut this directly from the fabric. This saves considerably on the required paper to print this pattern." + }, "o": { "backPocket": { "t": "Back pocket", diff --git a/designs/waralee/src/backpocket.mjs b/designs/waralee/src/backpocket.mjs index bc34ed6615c..295b7d40448 100644 --- a/designs/waralee/src/backpocket.mjs +++ b/designs/waralee/src/backpocket.mjs @@ -1,54 +1,53 @@ import { pantsProto } from './pantsproto.mjs' -function waraleeBackPocket({ - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - complete, - paperless, - macro, - sa, - part, -}) { - if (false == options.backPocket) { - return part - } +export const backPocket = { + name: 'waralee.backPocket', + after: pantsProto, + draft: ({ + options, + measurements, + Point, + Path, + points, + paths, + Snippet, + snippets, + macro, + sa, + part, + }) => { + if (false == options.backPocket) { + return part + } - let pocketDepth = options.backPocketDepth + const pocketDepth = options.backPocketDepth - points.topLeft = new Point(0, 0) - points.bottomLeft = points.topLeft.shift( - 270, - pocketDepth /*+ 30*/ * 2 + - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ - ) + points.topLeft = new Point(0, 0) + points.bottomLeft = points.topLeft.shift( + 270, + pocketDepth /*+ 30*/ * 2 + + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + ) - points.topRight = points.topLeft.shift( - 0, - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ /*+ 24*/ - ) - points.bottomRight = points.topRight.shift( - 270, - pocketDepth /*+ 30*/ * 2 + - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ - ) + points.topRight = points.topLeft.shift( + 0, + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ /*+ 24*/ + ) + points.bottomRight = points.topRight.shift( + 270, + pocketDepth /*+ 30*/ * 2 + + options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + ) - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeft) - .line(points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .close() - .attr('class', 'fabric') + paths.seam = new Path() + .move(points.topLeft) + .line(points.bottomLeft) + .line(points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .close() + .attr('class', 'fabric') - // Complete? - if (complete) { points.title = points.topLeft.shift(270, 75).shift(0, 50) macro('title', { nr: 4, @@ -64,10 +63,7 @@ function waraleeBackPocket({ .attr('data-text-class', 'center') if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - // Paperless? - if (paperless) { macro('hd', { id: 1, from: points.topLeft, @@ -80,13 +76,7 @@ function waraleeBackPocket({ to: points.bottomLeft, x: points.topLeft.x + 15, }) - } - return part -} - -export const backPocket = { - name: 'waralee.backPocket', - after: pantsProto, - draft: waraleeBackPocket, + return part + }, } diff --git a/designs/waralee/src/cutout.mjs b/designs/waralee/src/cutout.mjs index b89c866e5e5..78b70ac9713 100644 --- a/designs/waralee/src/cutout.mjs +++ b/designs/waralee/src/cutout.mjs @@ -1,38 +1,24 @@ import { pantsProto } from './pantsproto.mjs' -function waraleeCutout({ - options, - Path, - points, - paths, - Snippet, - snippets, - complete, - sa, - paperless, - macro, - part, -}) { - let separateWaistband = options.separateWaistband - if ('waistband' == options.frontPocketStyle) { - separateWaistband = true - } +export const cutout = { + name: 'waralee.cutout', + from: pantsProto, + draft: ({ options, Path, points, paths, Snippet, snippets, sa, macro, expand, part }) => { + const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle - paths.seam = new Path() - .move(points.mWaist1) - .line(points.mWaist2) - .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) - .join(paths.backTopCutOut) - .join(paths.backBottomCutOut) - .join(paths.frontBottomCutOut) - .join(paths.frontTopCutOut) - .close() - .attr('class', 'fabric') + paths.seam = new Path() + .move(points.mWaist1) + .line(points.mWaist2) + .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .join(paths.backTopCutOut) + .join(paths.backBottomCutOut) + .join(paths.frontBottomCutOut) + .join(paths.frontTopCutOut) + .close() + .attr('class', 'fabric') - paths.cutout.hide() + paths.cutout.hide() - // Complete? - if (complete) { points.title = points.mWaist.shift(270, 75) macro('title', { nr: 2, @@ -54,10 +40,7 @@ function waraleeCutout({ paths.sa = paths.seamAlternate.offset(sa).attr('class', 'fabric sa') } - } - // Paperless? - if (paperless) { macro('hd', { id: 1, from: points.fWaistSide, @@ -82,13 +65,7 @@ function waraleeCutout({ to: points.mWaist1, x: points.mWaist.x + 15, }) - } - return part.setHidden(!options.showMini) -} - -export const cutout = { - name: 'waralee.cutout', - from: pantsProto, - draft: waraleeCutout, + return part.hide(expand) + }, } diff --git a/designs/waralee/src/facings.mjs b/designs/waralee/src/facings.mjs index 8ccf86c7caa..40240b61876 100644 --- a/designs/waralee/src/facings.mjs +++ b/designs/waralee/src/facings.mjs @@ -1,57 +1,56 @@ import { pantsProto } from './pantsproto.mjs' -function waraleeFacings({ - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - complete, - paperless, - macro, - sa, - part, -}) { - let frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - let backPocketSize = - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ +export const facings = { + name: 'waralee.facings', + after: pantsProto, + draft: ({ + options, + measurements, + Point, + Path, + points, + paths, + Snippet, + snippets, + macro, + sa, + part, + }) => { + const frontPocketSize = + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + const backPocketSize = + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - points.frontTL = new Point(0, 0) - points.frontTR = points.frontTL.shift(0, frontPocketSize + sa + sa) - points.frontBL = points.frontTL.shift(270, frontPocketSize / 2) - points.frontBR = points.frontTR.shift(270, frontPocketSize / 2) + points.frontTL = new Point(0, 0) + points.frontTR = points.frontTL.shift(0, frontPocketSize + sa + sa) + points.frontBL = points.frontTL.shift(270, frontPocketSize / 2) + points.frontBR = points.frontTR.shift(270, frontPocketSize / 2) - points.backTL = points.frontBL.shift(270, 50) - points.backTR = points.backTL.shift(0, backPocketSize + sa + sa) - points.backBL = points.backTL.shift(270, backPocketSize / 2) - points.backBR = points.backTR.shift(270, backPocketSize / 2) + points.backTL = points.frontBL.shift(270, 50) + points.backTR = points.backTL.shift(0, backPocketSize + sa + sa) + points.backBL = points.backTL.shift(270, backPocketSize / 2) + points.backBR = points.backTR.shift(270, backPocketSize / 2) - paths.frontSeam = new Path() - .move(points.frontTL) - .line(points.frontBL) - .line(points.frontBR) - .line(points.frontTR) - .line(points.frontTL) - .close() - .attr('class', 'fabric') - .setHidden(!(options.frontPocket && 'welt' == options.frontPocketStyle)) + paths.frontSeam = new Path() + .move(points.frontTL) + .line(points.frontBL) + .line(points.frontBR) + .line(points.frontTR) + .line(points.frontTL) + .close() + .attr('class', 'fabric') + .setHidden(!(options.frontPocket && 'welt' == options.frontPocketStyle)) - paths.backSeam = new Path() - .move(points.backTL) - .line(points.backBL) - .line(points.backBR) - .line(points.backTR) - .line(points.backTL) - .close() - .attr('class', 'fabric') - .setHidden(!options.backPocket) + paths.backSeam = new Path() + .move(points.backTL) + .line(points.backBL) + .line(points.backBR) + .line(points.backTR) + .line(points.backTL) + .close() + .attr('class', 'fabric') + .setHidden(!options.backPocket) - // Complete? - if (complete) { if (options.frontPocket && 'welt' == options.frontPocketStyle) { points.frontTitle = points.frontTL.shift(270, 30).shift(0, 40) macro('title', { @@ -85,9 +84,7 @@ function waraleeFacings({ .attr('data-text', 'Waralee') .attr('data-text-class', 'center') } - } - // Paperless? - if (paperless) { + if (options.frontPocket && 'welt' == options.frontPocketStyle) { macro('hd', { id: 1, @@ -116,13 +113,7 @@ function waraleeFacings({ x: points.backTL.x + 15, }) } - } - return part -} - -export const facings = { - name: 'waralee.facings', - after: pantsProto, - draft: waraleeFacings, + return part + }, } diff --git a/designs/waralee/src/mini.mjs b/designs/waralee/src/mini.mjs index e1524d8bfc6..50c9953e3be 100644 --- a/designs/waralee/src/mini.mjs +++ b/designs/waralee/src/mini.mjs @@ -4,44 +4,48 @@ import { pantsProto } from './pantsproto.mjs' // To keep you from printing it completely, you could print this part in paperless mode // and only have a single sheet with all the dimensions on it. -function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, part }) { - let mini = options.minimizer - let separateWaistband = options.separateWaistband - if ('waistband' == options.frontPocketStyle) { - separateWaistband = true - } +export const mini = { + name: 'waralee.mini', + from: pantsProto, + draft: ({ options, Path, points, paths, sa, macro, store, expand, part }) => { + if (expand) { + return part.hide() + } - for (var p in points) { - points[p].x = points[p].x / mini - points[p].y = points[p].y / mini - } + const mini = options.minimizer + const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle - paths.waistFoldBack = paths.waistBack - .offset((-1 * store.get('waistBand')) / mini) - .attr('class', 'fabric stroke-sm') - paths.waistFoldFront = paths.waistFront - .offset((-1 * store.get('waistBand')) / mini) - .attr('class', 'fabric stroke-sm') + for (const p in points) { + points[p].x = points[p].x / mini + points[p].y = points[p].y / mini + } - paths.frontFold = paths.front - .offset((-1 * store.get('hem')) / mini) - .attr('class', 'fabric stroke-sm') - paths.legFold = paths.leg.offset((-1 * store.get('hem')) / mini).attr('class', 'fabric stroke-sm') - paths.backFold = paths.back - .offset((-1 * store.get('hem')) / mini) - .attr('class', 'fabric stroke-sm') + paths.waistFoldBack = paths.waistBack + .offset((-1 * store.get('waistBand')) / mini) + .attr('class', 'fabric stroke-sm') + paths.waistFoldFront = paths.waistFront + .offset((-1 * store.get('waistBand')) / mini) + .attr('class', 'fabric stroke-sm') - paths.cutOut = new Path() - .move(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) - .line(points.mWaist2) - .line(points.mWaist1) - .line(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) - .attr('class', 'help') + paths.frontFold = paths.front + .offset((-1 * store.get('hem')) / mini) + .attr('class', 'fabric stroke-sm') + paths.legFold = paths.leg + .offset((-1 * store.get('hem')) / mini) + .attr('class', 'fabric stroke-sm') + paths.backFold = paths.back + .offset((-1 * store.get('hem')) / mini) + .attr('class', 'fabric stroke-sm') - paths.seam.unhide() + paths.cutOut = new Path() + .move(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .line(points.mWaist2) + .line(points.mWaist1) + .line(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) + .attr('class', 'help') + + paths.seam.unhide() - // Complete? - if (complete) { macro('scalebox', { at: points.mLeg.shift(-90, 35) }) if (options.frontPocket && 'welt' == options.frontPocketStyle) { @@ -68,12 +72,12 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, .attr('data-text', 'useMeasurementsToCutFromFabric') .attr('data-text-class', 'center') - let fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide - let fWaistFrontOverlap = separateWaistband + const fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide + const fWaistFrontOverlap = separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap - let bWaistSide = separateWaistband ? points.bWaistSideSeam : points.bWaistSide - let bWaistBackOverlap = separateWaistband + const bWaistSide = separateWaistband ? points.bWaistSideSeam : points.bWaistSide + const bWaistBackOverlap = separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap @@ -83,6 +87,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: fWaistSide, y: fWaistSide.y + 10, text: part.units(fWaistSide.dist(points.fWaistFrontOverlap) * mini), + force: true, }) macro('hd', { id: 2, @@ -90,6 +95,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.bLegBackOverlap, y: points.bLegBackOverlap.y - 10, text: part.units(points.fLegFrontOverlap.dist(points.bLegBackOverlap) * mini), + force: true, }) macro('hd', { id: 3, @@ -97,6 +103,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.bWaistBackOverlap, y: points.bWaistBackOverlap.y + 20, text: part.units(points.bWaistBackOverlap.dist(points.bWaistBack) * mini), + force: true, }) macro('hd', { id: 4, @@ -104,6 +111,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.mHip, y: points.mHip.y + 10, text: part.units((points.mHip.x - points.fWaistFrontOverlap.x) * mini), + force: true, }) macro('vd', { id: 5, @@ -111,6 +119,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.fLegFrontOverlap, x: points.fLegFrontOverlap.x + 10, text: part.units(fWaistFrontOverlap.dist(points.fLegFrontOverlap) * mini), + force: true, }) macro('vd', { id: 6, @@ -118,6 +127,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: bWaistBackOverlap, x: points.bLegBackOverlap.x - 10, text: part.units(bWaistBackOverlap.dist(points.bLegBackOverlap) * mini), + force: true, }) macro('vd', { id: 7, @@ -125,6 +135,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: bWaistSide, x: bWaistSide.x + 10, text: part.units((points.bLegBackOverlap.y - bWaistSide.y) * mini), + force: true, }) if (options.frontPocket && 'welt' == options.frontPocketStyle) { @@ -134,6 +145,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.frontPocketBottom2, y: points.frontPocketBottom2.y + 20, text: part.units((points.frontPocketBottom2.x - fWaistFrontOverlap.x) * mini), + force: true, }) macro('vd', { id: 9, @@ -141,6 +153,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.frontPocketBottom2, x: points.frontPocketBottom2.x + 20, text: part.units((points.frontPocketBottom2.y - fWaistFrontOverlap.y) * mini), + force: true, }) } @@ -151,6 +164,7 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: bWaistBackOverlap, y: bWaistBackOverlap.y + 40, text: part.units((bWaistBackOverlap.x - points.backPocketRight.x) * mini), + force: true, }) macro('vd', { id: 11, @@ -158,15 +172,10 @@ function waraleeMini({ options, Path, points, paths, complete, sa, macro, store, to: points.backPocketRight, x: points.backPocketRight.x, text: part.units((points.backPocketRight.y - bWaistBackOverlap.y) * mini), + force: true, }) } - } - return part.setHidden(!options.showMini) -} - -export const mini = { - name: 'waralee.mini', - from: pantsProto, - draft: waraleeMini, + return part.setHidden(!options.showMini && !expand) + }, } diff --git a/designs/waralee/src/options.mjs b/designs/waralee/src/options.mjs index 437459ffe31..8d40c7174dc 100644 --- a/designs/waralee/src/options.mjs +++ b/designs/waralee/src/options.mjs @@ -30,7 +30,7 @@ export const frontWaistAdjustment = 0.163 export const backWaistAdjustment = 0.3 export const crotchEase = 1.08 export const frontPocketStyle = { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' } -export const showMini = { bool: true, menu: 'options' } +// export const showMini = { bool: true, menu: 'options' } export const fitWaist = { bool: true, menu: 'fit' } export const separateWaistband = { bool: false, menu: 'style' } export const knotInFront = { bool: true, menu: 'style' } diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index 4f7f0b5dcc4..c965ede955c 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -1,44 +1,52 @@ import { pantsProto } from './pantsproto.mjs' -function waraleePants({ - options, - points, - Path, - paths, - Snippet, - snippets, - complete, - sa, - paperless, - macro, - store, - part, -}) { - let separateWaistband = options.separateWaistband - if ('waistband' == options.frontPocketStyle) { - separateWaistband = true - } +export const pants = { + name: 'waralee.pants', + from: pantsProto, + draft: ({ options, points, Path, paths, Snippet, snippets, sa, macro, store, expand, part }) => { + const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle - if (false == separateWaistband) { - paths.waistFoldBack = new Path() - .move(points.bWaistSideHem) - .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackHem) - .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlapHem) - .attr('class', 'fabric stroke-sm') - paths.waistFoldFront = new Path() - .move(points.fWaistSideHem) - .line(points.fWaistFrontOverlapHem) - .attr('class', 'fabric stroke-sm') - } + if (expand) { + // Expand is on, do not draw the part but flag this to the user + store.flag.note({ + msg: `waralee:showPants`, + suggest: { + text: 'flag:hide', + icon: 'expand', + update: { + settings: ['expand', 0], + }, + }, + }) + } else { + // Expand is on, do not draw the part but flag this to the user + store.flag.note({ + msg: `waralee:hidePants`, + }) + // Also hint about expand + store.flag.preset('expand') - paths.frontFold = paths.front.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') - paths.legFold = paths.leg.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') - paths.backFold = paths.back.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + return part.hide() + } - paths.seam.unhide() + if (false == separateWaistband) { + paths.waistFoldBack = new Path() + .move(points.bWaistSideHem) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackHem) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlapHem) + .attr('class', 'fabric stroke-sm') + paths.waistFoldFront = new Path() + .move(points.fWaistSideHem) + .line(points.fWaistFrontOverlapHem) + .attr('class', 'fabric stroke-sm') + } + + paths.frontFold = paths.front.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + paths.legFold = paths.leg.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + paths.backFold = paths.back.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + + paths.seam.unhide() - // Complete? - if (complete) { points.title = points.fWaistFront.shift(270, 400) macro('title', { nr: 1, @@ -47,23 +55,19 @@ function waraleePants({ }) points.logo = points.title.shift(270, 75) - snippets.logo = new Snippet('logo', points.logo) macro('scalebox', { at: points.mHip.shift(-90, 70) }) if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - if (options.frontPocket && 'welt' == options.frontPocketStyle) { - paths.frontPocket.unhide() - } - if (options.backPocket) { - paths.backPocket.unhide() - } + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + paths.frontPocket.unhide() + } + if (options.backPocket) { + paths.backPocket.unhide() + } - // Paperless? - if (paperless) { let fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide let bWaistSide = separateWaistband ? points.bWaistSideSeam : points.bWaistSide macro('hd', { @@ -114,6 +118,7 @@ function waraleePants({ to: points.bLegBackOverlap, x: points.bLegBackOverlap.x - 30, }) + if (false == separateWaistband) { macro('vd', { id: 8, @@ -121,68 +126,62 @@ function waraleePants({ to: points.fWaistSideHem, x: points.fWaistSide.x + 10, }) + + if (options.frontPocket && 'welt' == options.frontPocketStyle) { + macro('vd', { + id: 9, + from: fWaistSide, + to: points.frontPocketTop, + x: points.frontPocketTop.x, + }) + macro('vd', { + id: 10, + from: fWaistSide, + to: points.frontPocketBottom, + x: points.frontPocketBottom.x, + }) + macro('hd', { + id: 11, + from: points.frontPocketTop, + to: fWaistSide, + y: points.frontPocketTop.y, + }) + macro('hd', { + id: 12, + from: points.frontPocketBottom, + to: fWaistSide, + y: points.frontPocketBottom.y, + }) + } + + if (options.backPocket) { + macro('vd', { + id: 13, + from: bWaistSide, + to: points.backPocketLeft, + x: points.backPocketLeft.x, + }) + macro('vd', { + id: 14, + from: bWaistSide, + to: points.backPocketRight, + x: points.backPocketRight.x, + }) + macro('hd', { + id: 15, + from: bWaistSide, + to: points.backPocketLeft, + y: points.backPocketLeft.y, + }) + macro('hd', { + id: 16, + from: bWaistSide, + to: points.backPocketRight, + y: points.backPocketRight.y, + }) + } } - if (options.frontPocket && 'welt' == options.frontPocketStyle) { - macro('vd', { - id: 9, - from: fWaistSide, - to: points.frontPocketTop, - x: points.frontPocketTop.x, - }) - macro('vd', { - id: 10, - from: fWaistSide, - to: points.frontPocketBottom, - x: points.frontPocketBottom.x, - }) - macro('hd', { - id: 11, - from: points.frontPocketTop, - to: fWaistSide, - y: points.frontPocketTop.y, - }) - macro('hd', { - id: 12, - from: points.frontPocketBottom, - to: fWaistSide, - y: points.frontPocketBottom.y, - }) - } - - if (options.backPocket) { - macro('vd', { - id: 13, - from: bWaistSide, - to: points.backPocketLeft, - x: points.backPocketLeft.x, - }) - macro('vd', { - id: 14, - from: bWaistSide, - to: points.backPocketRight, - x: points.backPocketRight.x, - }) - macro('hd', { - id: 15, - from: bWaistSide, - to: points.backPocketLeft, - y: points.backPocketLeft.y, - }) - macro('hd', { - id: 16, - from: bWaistSide, - to: points.backPocketRight, - y: points.backPocketRight.y, - }) - } - } - - return part.setHidden(options.showMini != false) -} - -export const pants = { - name: 'waralee.pants', - from: pantsProto, - draft: waraleePants, + return part.setHidden(options.showMini && !expand) + }, } diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index d99283795ab..c7274e537d4 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -1,317 +1,317 @@ import * as options from './options.mjs' -function waraleePantsProto({ options, measurements, Point, Path, points, paths, store, part }) { - let seatDepth = - measurements.crotchDepth /* - measurements.waistToHips */ * - (1 + options.waistRaise) * - options.crotchEase - let circumference = measurements.seat - let waist = - typeof measurements.waist == 'undefined' || false == options.fitWaist - ? measurements.seat - : measurements.waist - let waistBack = - typeof measurements.waistBack == 'undefined' || false == options.fitWaist - ? waist / 2 - : measurements.waistBack - - let separateWaistband = options.separateWaistband - if ('waistband' == options.frontPocketStyle) { - separateWaistband = true - } - - if (circumference < waist) { - circumference = waist - } - - let circumference4 = circumference / 4 - let hem = measurements.inseam * options.hemWidth - let waistBand = measurements.inseam * options.waistbandWidth - store.set('waistBand', waistBand) - store.set('hem', hem) - - points.mWaist = new Point(0, 0) - - points.mHip = points.mWaist.shift(270, seatDepth) - - points.fWaistSide = points.mWaist - .shift(180, options.crotchFront * circumference4) - .shift(90, waistBand) - points.fWaistCrotchCP = points.fWaistSide.shift( - 270, - seatDepth * options.crotchFactorFrontVer + waistBand - ) - points.fHipCrotchCP = points.mHip.shift( - 180, - options.crotchFront * circumference4 * options.crotchFactorFrontHor - ) - - points.fHipSide = points.mHip.shift(180, options.crotchFront * circumference4) - - points.bWaistSide = points.mWaist - .shift(0, options.crotchBack * circumference4) - .shift(90, waistBand) - .shift(90, options.backRaise * seatDepth) - points.bWaistCrotchCP = points.bWaistSide.shift(270, seatDepth * options.crotchFactorBackVer) - points.bHipCrotchCP = points.mHip.shift( - 0, - options.crotchBack * circumference4 * options.crotchFactorBackHor - ) - - points.bHipSide = points.mHip.shift(0, options.crotchBack * circumference4) - - points.fCutOutHip = new Path() - .move(points.fWaistSide) - .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) - .shiftAlong(measurements.waistToHips + waistBand) - points.bCutOutHip = new Path() - .move(points.bWaistSide) - .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) - .shiftAlong(measurements.waistToHips + waistBand + options.backRaise * seatDepth) - - let waistSeatDifferenceBack = measurements.seat / 2 - waistBack - let waistSeatDifferenceFront = measurements.seat / 2 - (waist - waistBack) - - points.bWaistAdjusted = points.bWaistSide.shift( - 0, - waistSeatDifferenceBack * options.backWaistAdjustment - ) - points.fWaistAdjusted = points.fWaistSide.shift( - 180, - waistSeatDifferenceFront * options.frontWaistAdjustment - ) - - points.mLeg = points.mHip.shift(270, measurements.inseam * (1 - options.legShortening)) - points.fLegSide = points.mLeg.shift(180, options.crotchFront * circumference4) - points.bLegSide = points.mLeg.shift(0, options.crotchBack * circumference4) - - points.fWaistFront = points.fWaistSide.shift(180, circumference4) - points.fWaistFrontOverlap = points.fWaistFront.shift(180, options.waistOverlap * circumference4) - points.fHipFront = points.fHipSide.shift(180, circumference4) - points.fHipFrontOverlap = points.fHipFront.shift(180, options.waistOverlap * circumference4) - points.fLegFront = points.fLegSide.shift(180, circumference4) - points.fLegFrontOverlap = points.fLegFront.shift(180, options.waistOverlap * circumference4) - - // Calculate the distance we need to move horizontally to get to the point that will - // diagonally be the distance we're looking for (circumference/4) - let bHorDistance = Math.sqrt( - circumference4 * circumference4 - options.backRaise * seatDepth * options.backRaise * seatDepth - ) - // Create a point that is this distance from the side. - points.bWaistBack = points.mWaist - .shift(90, waistBand) - .shift(0, options.crotchBack * circumference4 + bHorDistance) - - points.bWaistBackOverlap = points.bWaistBack.shift(0, options.waistOverlap * circumference4) - - points.bHipBack = points.bHipSide.shift(0, circumference4) - points.bHipBackOverlap = points.bHipBack.shift(0, options.waistOverlap * circumference4) - points.bLegBack = points.bLegSide.shift(0, circumference4) - points.bLegBackOverlap = points.bLegBack.shift(0, options.waistOverlap * circumference4) - - points.bWaistSideTemp = points.bWaistSide.shift(0, 2) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. - - let fPaths = new Path() - .move(points.fWaistSide) - .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) - .split(points.fCutOutHip) - - let bPaths = new Path() - .move(points.bWaistSide) - .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) - .split(points.bCutOutHip) - - fPaths[0].hide() - fPaths[1].hide() - bPaths[0].hide() - bPaths[1].hide() - - points.fCutOutHipCp1 = fPaths[1].ops[1].cp1.shiftFractionTowards(points.fCutOutHip, 1.25) - points.fCutOutHipCp2 = fPaths[1].ops[1].cp1.clone() - points.mHipCp1 = fPaths[1].ops[1].cp2.clone() - points.mHipCp2 = bPaths[1].ops[1].cp2.clone() - points.bCutOutHipCp1 = bPaths[1].ops[1].cp1.clone() - points.bCutOutHipCp2 = bPaths[1].ops[1].cp1.shiftFractionTowards(points.bCutOutHip, 1.25) - - paths.frontBottomCutOut = new Path() - .move(points.mHip) - .curve(points.mHipCp1, points.fCutOutHipCp2, points.fCutOutHip) - .hide() - paths.backBottomCutOut = new Path() - .move(points.bCutOutHip) - .curve(points.bCutOutHipCp1, points.mHipCp2, points.mHip) - .hide() - - paths.frontTopCutOut = new Path() - .move(points.fCutOutHip) - .curve(points.fCutOutHipCp1, points.fWaistAdjusted, points.fWaistAdjusted) - .hide() - paths.backTopCutOut = new Path() - .move(points.bWaistAdjusted) - .curve(points.bWaistAdjusted, points.bCutOutHipCp2, points.bCutOutHip) - .hide() - - points.fWaistSideHem = paths.frontTopCutOut.reverse().shiftAlong(waistBand) - points.fWaistSideSeam = paths.frontTopCutOut.reverse().shiftAlong(waistBand * 2) - points.fWaistSide = points.fWaistSideSeam.flipY(points.fWaistSideHem) - points.bWaistSideHem = paths.backTopCutOut.shiftAlong(waistBand) - points.bWaistSideSeam = paths.backTopCutOut.shiftAlong(waistBand * 2) - points.bWaistSide = points.bWaistSideSeam.flipY(points.bWaistSideHem) - - points.fWaistFrontOverlapHem = points.fWaistFrontOverlap.shift(270, waistBand) - points.bWaistBackHem = points.bWaistBack.shift(270, waistBand) - points.bWaistBackOverlapHem = points.bWaistBackOverlap.shift(270, waistBand) - points.fWaistFrontOverlapSeam = points.fWaistFrontOverlap.shift(270, waistBand * 2) - points.bWaistBackSeam = points.bWaistBack.shift(270, waistBand * 2) - points.bWaistBackOverlapSeam = points.bWaistBackOverlap.shift(270, waistBand * 2) - points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() - - points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() - points.fWaistHipCp1 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp1.clone() - points.bWaistSideCp1 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp1.clone() - points.bWaistHipCp2 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp2.clone() - - if (separateWaistband) { - points.mWaist1 = new Point(points.mWaist.x, points.fWaistSideSeam.y) - // points.mWaist = new Point(points.mWaist.x, points.fWaistSideSeam.y) - } else { - points.mWaist1 = new Point(points.mWaist.x, points.fWaistSide.y) - } - if (separateWaistband) { - points.mWaist2 = new Point(points.mWaist.x, points.bWaistSideSeam.y) - } else { - points.mWaist2 = new Point(points.mWaist.x, points.bWaistSide.y) - } - - paths.frontTopCutOut = new Path() - .move(points.fCutOutHip) - .curve(points.fCutOutHipCp1, points.fWaistSideCp2, points.fWaistSideSeam) - .hide() - if (false == separateWaistband) { - paths.frontTopCutOut.line(points.fWaistSideHem) - paths.frontTopCutOut.line(points.fWaistSide) - } - if (false == separateWaistband) { - paths.backTopCutOut = new Path() - .move(points.bWaistSide) - .line(points.bWaistSideHem) - .line(points.bWaistSideSeam) - } else { - paths.backTopCutOut = new Path().move(points.bWaistSideSeam) - } - paths.backTopCutOut.curve(points.bWaistSideCp1, points.bCutOutHipCp2, points.bCutOutHip).hide() - - paths.cutout = paths.backTopCutOut - .join(paths.backBottomCutOut) - .join(paths.frontBottomCutOut) - .join(paths.frontTopCutOut) - .hide() - - paths.waistBack = new Path() - .move(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) - .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBack) - // .line(points.bWaistSideTemp) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. - .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) - .hide() - paths.waistFront = new Path() - .move(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) - .line(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) - .hide() - paths.front = new Path() - .move(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) - .line(points.fHipFrontOverlap) - .line(points.fLegFrontOverlap) - .hide() - paths.back = new Path() - .move(points.bLegBackOverlap) - .line(points.bHipBackOverlap) - .line(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) - .hide() - paths.leg = new Path().move(points.fLegFrontOverlap).line(points.bLegBackOverlap).hide() - - paths.seam = paths.waistFront - .join(paths.front) - .join(paths.leg) - .join(paths.back) - .join(paths.waistBack) - .join(paths.cutout) - .close() - .attr('class', 'fabric') - .hide() - - if (options.frontPocket) { - points.frontPocketTop = points.fWaistSideSeam - .shift( - 270, - options.frontPocketVerticalOffset * - measurements.crotchDepth /*- measurements.waistToHips*/ + - waistBand * (separateWaistband ? 1 : 2) - ) - .shift(180, options.frontPocketHorizontalOffset * measurements.seat) - - points.frontPocketTop2 = points.frontPocketTop.shift(340, 12) - points.frontPocketBottom = points.frontPocketTop.shift( - 250, - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - ) - points.frontPocketBottom2 = points.frontPocketBottom.shift(340, 12) - - paths.frontPocket = new Path() - .move(points.frontPocketTop) - .line(points.frontPocketBottom) - .line(points.frontPocketBottom2) - .line(points.frontPocketTop2) - .close() - .attr('class', 'fabric') - .hide() - } - - if (options.backPocket) { - points.backPocketRight = points.bWaistBack - .shiftTowards(points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat) - .shift( - 270, - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + - waistBand * (separateWaistband ? 1 : 2) - ) - points.backPocketLeft = points.bWaistBack - .shiftTowards( - points.bWaistSide, - options.backPocketHorizontalOffset * measurements.seat + - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - ) - .shift( - 270, - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + - waistBand * (separateWaistband ? 1 : 2) - ) - points.backPocketRight2 = points.backPocketRight.shift( - points.backPocketRight.angle(points.backPocketLeft) + 90, - 12 - ) - points.backPocketLeft2 = points.backPocketLeft.shift( - points.backPocketLeft.angle(points.backPocketRight) - 90, - 12 - ) - - paths.backPocket = new Path() - .move(points.backPocketLeft) - .line(points.backPocketLeft2) - .line(points.backPocketRight2) - .line(points.backPocketRight) - .close() - .attr('class', 'fabric') - .hide() - } - - return part.hide() -} - export const pantsProto = { name: 'waralee.pantsProto', hide: { self: true }, measurements: ['seat', 'inseam', 'crotchDepth', 'waistToHips'], optionalMeasurements: ['waist', 'waistBack'], options, - draft: waraleePantsProto, + draft: ({ options, measurements, Point, Path, points, paths, store, part }) => { + console.log({ measurements: JSON.parse(JSON.stringify(measurements)) }) + console.log({ options: JSON.parse(JSON.stringify(options)) }) + + const seatDepth = + measurements.crotchDepth /* - measurements.waistToHips */ * + (1 + options.waistRaise) * + options.crotchEase + const waist = + typeof measurements.waist == 'undefined' || false == options.fitWaist + ? measurements.seat + : measurements.waist + const circumference = measurements.seat > waist ? measurements.seat : waist + const waistBack = + typeof measurements.waistBack == 'undefined' || false == options.fitWaist + ? waist / 2 + : measurements.waistBack + + const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle + + const circumference4 = circumference / 4 + const hem = measurements.inseam * options.hemWidth + const waistBand = measurements.inseam * options.waistbandWidth + + store.set('waistBand', waistBand) + store.set('hem', hem) + + points.mWaist = new Point(0, 0) + + points.mHip = points.mWaist.shift(270, seatDepth) + + points.fWaistSide = points.mWaist + .shift(180, options.crotchFront * circumference4) + .shift(90, waistBand) + points.fWaistCrotchCP = points.fWaistSide.shift( + 270, + seatDepth * options.crotchFactorFrontVer + waistBand + ) + points.fHipCrotchCP = points.mHip.shift( + 180, + options.crotchFront * circumference4 * options.crotchFactorFrontHor + ) + + points.fHipSide = points.mHip.shift(180, options.crotchFront * circumference4) + + points.bWaistSide = points.mWaist + .shift(0, options.crotchBack * circumference4) + .shift(90, waistBand) + .shift(90, options.backRaise * seatDepth) + points.bWaistCrotchCP = points.bWaistSide.shift(270, seatDepth * options.crotchFactorBackVer) + points.bHipCrotchCP = points.mHip.shift( + 0, + options.crotchBack * circumference4 * options.crotchFactorBackHor + ) + + points.bHipSide = points.mHip.shift(0, options.crotchBack * circumference4) + + console.log({ points: JSON.parse(JSON.stringify(points)) }) + + points.fCutOutHip = new Path() + .move(points.fWaistSide) + .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) + .shiftAlong(measurements.waistToHips + waistBand) + points.bCutOutHip = new Path() + .move(points.bWaistSide) + .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) + .shiftAlong(measurements.waistToHips + waistBand + options.backRaise * seatDepth) + + const waistSeatDifferenceBack = measurements.seat / 2 - waistBack + const waistSeatDifferenceFront = measurements.seat / 2 - (waist - waistBack) + + points.bWaistAdjusted = points.bWaistSide.shift( + 0, + waistSeatDifferenceBack * options.backWaistAdjustment + ) + points.fWaistAdjusted = points.fWaistSide.shift( + 180, + waistSeatDifferenceFront * options.frontWaistAdjustment + ) + + points.mLeg = points.mHip.shift(270, measurements.inseam * (1 - options.legShortening)) + points.fLegSide = points.mLeg.shift(180, options.crotchFront * circumference4) + points.bLegSide = points.mLeg.shift(0, options.crotchBack * circumference4) + + points.fWaistFront = points.fWaistSide.shift(180, circumference4) + points.fWaistFrontOverlap = points.fWaistFront.shift(180, options.waistOverlap * circumference4) + points.fHipFront = points.fHipSide.shift(180, circumference4) + points.fHipFrontOverlap = points.fHipFront.shift(180, options.waistOverlap * circumference4) + points.fLegFront = points.fLegSide.shift(180, circumference4) + points.fLegFrontOverlap = points.fLegFront.shift(180, options.waistOverlap * circumference4) + + // Calculate the distance we need to move horizontally to get to the point that will + // diagonally be the distance we're looking for (circumference/4) + const bHorDistance = Math.sqrt( + circumference4 * circumference4 - + options.backRaise * seatDepth * options.backRaise * seatDepth + ) + // Create a point that is this distance from the side. + points.bWaistBack = points.mWaist + .shift(90, waistBand) + .shift(0, options.crotchBack * circumference4 + bHorDistance) + + points.bWaistBackOverlap = points.bWaistBack.shift(0, options.waistOverlap * circumference4) + + points.bHipBack = points.bHipSide.shift(0, circumference4) + points.bHipBackOverlap = points.bHipBack.shift(0, options.waistOverlap * circumference4) + points.bLegBack = points.bLegSide.shift(0, circumference4) + points.bLegBackOverlap = points.bLegBack.shift(0, options.waistOverlap * circumference4) + + points.bWaistSideTemp = points.bWaistSide.shift(0, 2) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. + + const fPaths = new Path() + .move(points.fWaistSide) + .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) + .split(points.fCutOutHip) + + const bPaths = new Path() + .move(points.bWaistSide) + .curve(points.bWaistCrotchCP, points.bHipCrotchCP, points.mHip) + .split(points.bCutOutHip) + + fPaths[0].hide() + fPaths[1].hide() + bPaths[0].hide() + bPaths[1].hide() + + points.fCutOutHipCp1 = fPaths[1].ops[1].cp1.shiftFractionTowards(points.fCutOutHip, 1.25) + points.fCutOutHipCp2 = fPaths[1].ops[1].cp1.clone() + points.mHipCp1 = fPaths[1].ops[1].cp2.clone() + points.mHipCp2 = bPaths[1].ops[1].cp2.clone() + points.bCutOutHipCp1 = bPaths[1].ops[1].cp1.clone() + points.bCutOutHipCp2 = bPaths[1].ops[1].cp1.shiftFractionTowards(points.bCutOutHip, 1.25) + + paths.frontBottomCutOut = new Path() + .move(points.mHip) + .curve(points.mHipCp1, points.fCutOutHipCp2, points.fCutOutHip) + .hide() + paths.backBottomCutOut = new Path() + .move(points.bCutOutHip) + .curve(points.bCutOutHipCp1, points.mHipCp2, points.mHip) + .hide() + + paths.frontTopCutOut = new Path() + .move(points.fCutOutHip) + .curve(points.fCutOutHipCp1, points.fWaistAdjusted, points.fWaistAdjusted) + .hide() + paths.backTopCutOut = new Path() + .move(points.bWaistAdjusted) + .curve(points.bWaistAdjusted, points.bCutOutHipCp2, points.bCutOutHip) + .hide() + + points.fWaistSideHem = paths.frontTopCutOut.reverse().shiftAlong(waistBand) + points.fWaistSideSeam = paths.frontTopCutOut.reverse().shiftAlong(waistBand * 2) + points.fWaistSide = points.fWaistSideSeam.flipY(points.fWaistSideHem) + points.bWaistSideHem = paths.backTopCutOut.shiftAlong(waistBand) + points.bWaistSideSeam = paths.backTopCutOut.shiftAlong(waistBand * 2) + points.bWaistSide = points.bWaistSideSeam.flipY(points.bWaistSideHem) + + points.fWaistFrontOverlapHem = points.fWaistFrontOverlap.shift(270, waistBand) + points.bWaistBackHem = points.bWaistBack.shift(270, waistBand) + points.bWaistBackOverlapHem = points.bWaistBackOverlap.shift(270, waistBand) + points.fWaistFrontOverlapSeam = points.fWaistFrontOverlap.shift(270, waistBand * 2) + points.bWaistBackSeam = points.bWaistBack.shift(270, waistBand * 2) + points.bWaistBackOverlapSeam = points.bWaistBackOverlap.shift(270, waistBand * 2) + points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() + + points.fWaistSideCp2 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp2.clone() + points.fWaistHipCp1 = paths.frontTopCutOut.split(points.fWaistSideSeam)[0].ops[1].cp1.clone() + points.bWaistSideCp1 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp1.clone() + points.bWaistHipCp2 = paths.backTopCutOut.split(points.bWaistSideSeam)[1].ops[1].cp2.clone() + + if (separateWaistband) { + points.mWaist1 = new Point(points.mWaist.x, points.fWaistSideSeam.y) + // points.mWaist = new Point(points.mWaist.x, points.fWaistSideSeam.y) + } else { + points.mWaist1 = new Point(points.mWaist.x, points.fWaistSide.y) + } + if (separateWaistband) { + points.mWaist2 = new Point(points.mWaist.x, points.bWaistSideSeam.y) + } else { + points.mWaist2 = new Point(points.mWaist.x, points.bWaistSide.y) + } + + paths.frontTopCutOut = new Path() + .move(points.fCutOutHip) + .curve(points.fCutOutHipCp1, points.fWaistSideCp2, points.fWaistSideSeam) + .hide() + if (false == separateWaistband) { + paths.frontTopCutOut.line(points.fWaistSideHem) + paths.frontTopCutOut.line(points.fWaistSide) + } + if (false == separateWaistband) { + paths.backTopCutOut = new Path() + .move(points.bWaistSide) + .line(points.bWaistSideHem) + .line(points.bWaistSideSeam) + } else { + paths.backTopCutOut = new Path().move(points.bWaistSideSeam) + } + paths.backTopCutOut.curve(points.bWaistSideCp1, points.bCutOutHipCp2, points.bCutOutHip).hide() + + paths.cutout = paths.backTopCutOut + .join(paths.backBottomCutOut) + .join(paths.frontBottomCutOut) + .join(paths.frontTopCutOut) + .hide() + + paths.waistBack = new Path() + .move(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) + .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBack) + // .line(points.bWaistSideTemp) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. + .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) + .hide() + paths.waistFront = new Path() + .move(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) + .line(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) + .hide() + paths.front = new Path() + .move(separateWaistband ? points.fWaistFrontOverlapSeam : points.fWaistFrontOverlap) + .line(points.fHipFrontOverlap) + .line(points.fLegFrontOverlap) + .hide() + paths.back = new Path() + .move(points.bLegBackOverlap) + .line(points.bHipBackOverlap) + .line(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) + .hide() + paths.leg = new Path().move(points.fLegFrontOverlap).line(points.bLegBackOverlap).hide() + + paths.seam = paths.waistFront + .join(paths.front) + .join(paths.leg) + .join(paths.back) + .join(paths.waistBack) + .join(paths.cutout) + .close() + .attr('class', 'fabric') + .hide() + + if (options.frontPocket) { + points.frontPocketTop = points.fWaistSideSeam + .shift( + 270, + options.frontPocketVerticalOffset * + measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) + ) + .shift(180, options.frontPocketHorizontalOffset * measurements.seat) + + points.frontPocketTop2 = points.frontPocketTop.shift(340, 12) + points.frontPocketBottom = points.frontPocketTop.shift( + 250, + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + ) + points.frontPocketBottom2 = points.frontPocketBottom.shift(340, 12) + + paths.frontPocket = new Path() + .move(points.frontPocketTop) + .line(points.frontPocketBottom) + .line(points.frontPocketBottom2) + .line(points.frontPocketTop2) + .close() + .attr('class', 'fabric') + .hide() + } + + if (options.backPocket) { + points.backPocketRight = points.bWaistBack + .shiftTowards(points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat) + .shift( + 270, + options.backPocketVerticalOffset * + measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) + ) + points.backPocketLeft = points.bWaistBack + .shiftTowards( + points.bWaistSide, + options.backPocketHorizontalOffset * measurements.seat + + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + ) + .shift( + 270, + options.backPocketVerticalOffset * + measurements.crotchDepth /*- measurements.waistToHips*/ + + waistBand * (separateWaistband ? 1 : 2) + ) + points.backPocketRight2 = points.backPocketRight.shift( + points.backPocketRight.angle(points.backPocketLeft) + 90, + 12 + ) + points.backPocketLeft2 = points.backPocketLeft.shift( + points.backPocketLeft.angle(points.backPocketRight) - 90, + 12 + ) + + paths.backPocket = new Path() + .move(points.backPocketLeft) + .line(points.backPocketLeft2) + .line(points.backPocketRight2) + .line(points.backPocketRight) + .close() + .attr('class', 'fabric') + .hide() + } + + return part.hide() + }, } diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index d797eaf5eea..8443fae2cdb 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -1,91 +1,98 @@ import { pantsProto } from './pantsproto.mjs' -function waraleePocket({ - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - complete, - sa, - paperless, - macro, - part, -}) { - if (false == options.frontPocket) { - return part - } +export const pocket = { + name: 'waralee.pocket', + after: pantsProto, + draft: ({ + options, + measurements, + Point, + Path, + points, + paths, + Snippet, + snippets, + sa, + macro, + part, + }) => { + if (false == options.frontPocket) { + return part + } - const c = 0.55191502449351 + const c = 0.55191502449351 - let pocketDepth = - (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor - let frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + const pocketDepth = + (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor + const frontPocketSize = + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - if ('welt' == options.frontPocketStyle) { - points.topLeft = new Point(0, 0) - points.bottomLeft = points.topLeft.shift(270, pocketDepth) + console.log({ pocketDepth: pocketDepth, frontPocketSize: frontPocketSize }) - points.topRight = points.topLeft.shift(0, pocketDepth * (1 / 3)) - points.bottomRight = points.topRight.shift(290, pocketDepth * (5 / 6)) + if ('welt' != options.frontPocketStyle) { + points.topLeft = new Point(0, 0) + points.bottomLeft = points.topLeft.shift(270, pocketDepth) + console.log({ nwpoints: JSON.parse(JSON.stringify(points)) }) - points.bottomLeftCP = points.bottomLeft.shift(0, pocketDepth * (1 / 6)) - points.bottomRightCP = points.bottomRight.shift(225, pocketDepth * (1 / 4)) + points.topRight = points.topLeft.shift(0, pocketDepth * (1 / 3)) + points.bottomRight = points.topRight.shift(290, pocketDepth * (5 / 6)) - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeft) - .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .close() - .attr('class', 'fabric') - } else { - points.topLeft = new Point(0, 0) - points.topRight = points.topLeft.shift(0, frontPocketSize) - points.bottomLeft = points.topLeft.shift(270, frontPocketSize * 1.5) - points.bottomRight = points.topRight.shift(270, frontPocketSize * 1.5) - points.bottomLeftCornerUp = points.bottomLeft.shift(90, frontPocketSize / 4) - points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift(270, (frontPocketSize / 4) * c) - points.bottomLeftCornerOver = points.bottomLeft.shift(0, frontPocketSize / 4) - points.bottomLeftCornerOverCp2 = points.bottomLeftCornerOver.shift( - 180, - (frontPocketSize / 4) * c - ) - points.bottomRightCornerUp = points.bottomRight.shift(90, frontPocketSize / 4) - points.bottomRightCornerUpCp2 = points.bottomRightCornerUp.shift(270, (frontPocketSize / 4) * c) - points.bottomRightCornerOver = points.bottomRight.shift(180, frontPocketSize / 4) - points.bottomRightCornerOverCp1 = points.bottomRightCornerOver.shift( - 0, - (frontPocketSize / 4) * c - ) + points.bottomLeftCP = points.bottomLeft.shift(0, pocketDepth * (1 / 6)) + points.bottomRightCP = points.bottomRight.shift(225, pocketDepth * (1 / 4)) - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeftCornerUp) - .curve( - points.bottomLeftCornerUpCp1, - points.bottomLeftCornerOverCp2, - points.bottomLeftCornerOver + paths.seam = new Path() + .move(points.topLeft) + .line(points.bottomLeft) + .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .close() + .attr('class', 'fabric') + } else { + points.topLeft = new Point(0, 0) + points.topRight = points.topLeft.shift(0, frontPocketSize) + points.bottomLeft = points.topLeft.shift(270, frontPocketSize * 1.5) + points.bottomRight = points.topRight.shift(270, frontPocketSize * 1.5) + console.log({ wpoints: JSON.parse(JSON.stringify(points)) }) + + points.bottomLeftCornerUp = points.bottomLeft.shift(90, frontPocketSize / 4) + points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift(270, (frontPocketSize / 4) * c) + points.bottomLeftCornerOver = points.bottomLeft.shift(0, frontPocketSize / 4) + points.bottomLeftCornerOverCp2 = points.bottomLeftCornerOver.shift( + 180, + (frontPocketSize / 4) * c ) - .line(points.bottomRightCornerOver) - .curve( - points.bottomRightCornerOverCp1, - points.bottomRightCornerUpCp2, - points.bottomRightCornerUp + points.bottomRightCornerUp = points.bottomRight.shift(90, frontPocketSize / 4) + points.bottomRightCornerUpCp2 = points.bottomRightCornerUp.shift( + 270, + (frontPocketSize / 4) * c + ) + points.bottomRightCornerOver = points.bottomRight.shift(180, frontPocketSize / 4) + points.bottomRightCornerOverCp1 = points.bottomRightCornerOver.shift( + 0, + (frontPocketSize / 4) * c ) - .line(points.topRight) - .line(points.topLeft) - .close() - .attr('class', 'fabric') - } - // Complete? - if (complete) { + paths.seam = new Path() + .move(points.topLeft) + .line(points.bottomLeftCornerUp) + .curve( + points.bottomLeftCornerUpCp1, + points.bottomLeftCornerOverCp2, + points.bottomLeftCornerOver + ) + .line(points.bottomRightCornerOver) + .curve( + points.bottomRightCornerOverCp1, + points.bottomRightCornerUpCp2, + points.bottomRightCornerUp + ) + .line(points.topRight) + .line(points.topLeft) + .close() + .attr('class', 'fabric') + } + points.title = points.topLeft.shift(270, 75).shift(0, 50) macro('title', { nr: 3, @@ -100,12 +107,15 @@ function waraleePocket({ .attr('data-text', 'Waralee') .attr('data-text-class', 'center') + console.log({ points: JSON.parse(JSON.stringify(points)), frontPocketSize: frontPocketSize }) + if ('welt' == options.frontPocketStyle) { macro('cutonfold', { from: points.topLeft, to: points.bottomLeft, margin: 5, offset: 10, + id: 'cof', }) } if (sa) { @@ -126,10 +136,7 @@ function waraleePocket({ paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } } - } - // Paperless? - if (paperless) { if ('welt' == options.frontPocketStyle) { macro('hd', { id: 1, @@ -175,13 +182,7 @@ function waraleePocket({ x: points.bottomLeftCornerOver.x, }) } - } - return part -} - -export const pocket = { - name: 'waralee.pocket', - after: pantsProto, - draft: waraleePocket, + return part + }, } diff --git a/designs/waralee/src/waistband.mjs b/designs/waralee/src/waistband.mjs index 21ed4753781..18766fea108 100644 --- a/designs/waralee/src/waistband.mjs +++ b/designs/waralee/src/waistband.mjs @@ -11,22 +11,21 @@ function waraleeWaistband( paths, Snippet, snippets, - complete, - paperless, macro, sa, store, + expand, + units, part, } ) { - const WidthReduction = 6 - let waistBand = store.get('waistBand') - let waistBandLengthFront = points.fWaistSideHem.dist(points.fWaistFrontOverlapHem) - let waistBandLengthBack = + const waistBand = store.get('waistBand') + const waistBandLengthFront = points.fWaistSideHem.dist(points.fWaistFrontOverlapHem) + const waistBandLengthBack = points.bWaistSideHem.dist(points.bWaistBackHem) + points.bWaistBackHem.dist(points.bWaistBackOverlapHem) - let strapLength = measurements.waist + measurements.crotchDepth * 1.75 + let waistBandLength = measurements.waist + measurements.crotchDepth * 1.75 let partNr = 0 switch (type) { @@ -35,20 +34,7 @@ function waraleeWaistband( return part } partNr = 9 - points.tr = points.fWaistSide - points.mr = points.fWaistSideHem - points.br = points.fWaistSideSeam - points.ml = points.fWaistSideHem.shift(180, (waistBandLengthFront / WidthReduction) * 2) - points.tl = points.ml.shift(90, waistBand) - points.bl = points.ml.shift(270, waistBand) - - macro('hd', { - from: points.ml, - to: points.mr, - y: points.mr.y, - text: part.units(waistBandLengthFront), - }) - + waistBandLength = waistBandLengthFront * 2 break case 'waistBandBack': @@ -56,137 +42,90 @@ function waraleeWaistband( return part } partNr = 10 - points.tl = points.bWaistSide - points.ml = points.bWaistSideHem - points.bl = points.bWaistSideSeam - points.mr = points.bWaistSideHem.shift(0, (waistBandLengthBack / WidthReduction) * 2) - points.tr = points.mr.shift(90, waistBand) - points.br = points.mr.shift(270, waistBand) - - macro('hd', { - from: points.ml, - to: points.mr, - y: points.mr.y, - text: part.units(waistBandLengthBack), - }) - + waistBandLength = waistBandLengthBack * 2 break case 'strapFront': partNr = 7 - strapLength -= waistBandLengthFront * 2 - strapLength += options.knotInFront ? measurements.waist / 2 : 0 - - points.mr = new Point(0, 0) - points.tr = points.mr.shift(90, waistBand) - points.br = points.mr.shift(270, waistBand) - points.ml = points.mr.shift(180, (waistBandLengthFront / WidthReduction) * 2) - points.tl = points.ml.shift(90, waistBand) - points.bl = points.ml.shift(270, waistBand) - - macro('hd', { - from: points.ml, - to: points.mr, - y: points.mr.y, - text: part.units(strapLength), - }) - + waistBandLength -= waistBandLengthFront * 2 + waistBandLength += options.knotInFront ? measurements.waist / 2 : 0 break case 'strapBack': partNr = 8 - strapLength -= waistBandLengthBack * 2 - strapLength += options.knotInFront ? 0 : measurements.waist / 2 - - points.mr = new Point(0, 0) - points.tr = points.mr.shift(90, waistBand) - points.br = points.mr.shift(270, waistBand) - points.ml = points.mr.shift(180, (waistBandLengthFront / WidthReduction) * 2) - points.tl = points.ml.shift(90, waistBand) - points.bl = points.ml.shift(270, waistBand) - - macro('hd', { - from: points.ml, - to: points.mr, - y: points.mr.y, - text: part.units(strapLength), - }) - + waistBandLength -= waistBandLengthBack * 2 + waistBandLength += options.knotInFront ? 0 : measurements.waist / 2 break } - points.zigzagTop = points.tr.shift(180, waistBandLengthFront / WidthReduction) - points.zigzagTopR = points.zigzagTop.shift(0, waistBand / 8) - points.zigzagTopT = points.zigzagTop.shift(90, waistBand / 4) - points.zigzagTopL = points.zigzagTop.shift(180, waistBand / 8) - points.zigzagTopB = points.zigzagTop.shift(270, waistBand / 4) - points.zigzagBottom = points.br.shift(180, waistBandLengthFront / WidthReduction) - points.zigzagBottomR = points.zigzagBottom.shift(0, waistBand / 8) - points.zigzagBottomT = points.zigzagBottom.shift(90, waistBand / 4) - points.zigzagBottomL = points.zigzagBottom.shift(180, waistBand / 8) - points.zigzagBottomB = points.zigzagBottom.shift(270, waistBand / 4) + if (!expand) { + // Expand is on, do not draw the part but flag this to the user + store.flag.note({ + msg: `waralee:cut` + type, + replace: { + width: units(waistBand * 2), + length: units(waistBandLength), + }, + suggest: { + text: 'flag:show', + icon: 'expand', + update: { + settings: ['expand', 1], + }, + }, + }) + // Also hint about expand + store.flag.preset('expand') - paths.ZZtop = new Path() - .move(points.zigzagTopR) - .line(points.zigzagTopT) - .line(points.zigzagTopB) - .line(points.zigzagTopL) - .attr('class', 'dotted') - paths.ZZbottom = new Path() - .move(points.zigzagBottomR) - .line(points.zigzagBottomT) - .line(points.zigzagBottomB) - .line(points.zigzagBottomL) - .attr('class', 'dotted') - paths.right = new Path() - .move(points.zigzagBottomR) - .line(points.br) - .line(points.mr) - .line(points.tr) - .line(points.zigzagTopR) - paths.left = new Path() - .move(points.zigzagBottomL) - .line(points.bl) - .line(points.ml) - .line(points.tl) - .line(points.zigzagTopL) + return part.hide() + } + + points.tl = new Point(0, 0) + points.bl = new Point(0, waistBandLength) + points.tr = new Point(waistBand * 2, 0) + points.br = new Point(waistBand * 2, waistBandLength) paths.seam = new Path() .move(points.br) - .line(points.mr) .line(points.tr) .line(points.tl) - .line(points.ml) .line(points.bl) .line(points.br) .close() - .hide() - // Complete? - if (complete) { - if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - points.title = points.tl.shiftFractionTowards(points.br, 0.2).shift(270, 20) - macro('title', { - nr: partNr, - at: points.title, - title: type, - prefix: 'front', - scale: 0.4, - }) + console.log({ + part: type, + points: JSON.parse(JSON.stringify(points)), + paths: JSON.parse(JSON.stringify(paths)), + }) - points.logo = points.tl.shiftFractionTowards(points.br, 0.8) - snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.3) - } - // Paperless? - if (paperless) { - macro('vd', { - id: 1, - from: points.tr, - to: points.br, - x: points.br.x + sa + 10, - }) - } + points.title = new Point(waistBand, waistBandLength * 0.2) + macro('title', { + nr: partNr, + at: points.title, + title: type, + prefix: 'front', + scale: 0.4, + align: 'center', + }) + + points.logo = new Point(waistBand, waistBandLength * 0.4) + snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.3) + + macro('hd', { + id: 'w', + from: points.tr, + to: points.tl, + y: points.tl.y + sa + 10, + }) + macro('vd', { + id: 'h', + from: points.tr, + to: points.br, + x: points.br.x + sa + 10, + }) return part } From 9eaf2515b084e04b33ed0ba936d0494b04acc3b2 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Thu, 12 Oct 2023 21:01:09 +0000 Subject: [PATCH 02/26] Removal of Mini option and some i18n --- designs/waralee/i18n/en.json | 50 ++++++++++++++++++++++++++-------- designs/waralee/src/cutout.mjs | 8 ++++-- designs/waralee/src/mini.mjs | 5 ++-- designs/waralee/src/pants.mjs | 2 +- designs/waralee/src/pocket.mjs | 2 +- 5 files changed, 49 insertions(+), 18 deletions(-) diff --git a/designs/waralee/i18n/en.json b/designs/waralee/i18n/en.json index ede664f813c..cb9a085c419 100644 --- a/designs/waralee/i18n/en.json +++ b/designs/waralee/i18n/en.json @@ -86,24 +86,52 @@ "d": "This setting raises the waist in the back. Our waist does not sit horizontally, but is angled up at the back. This seting allows you to raise this in the back if you need it for a good fit." }, "fitWaist": { - "t": "FIXME: Give this option a name", - "d": "FIXME: Give this option a description" + "t": "Fit the garment to the waist", + "d": "Traditionally, wrap pants are not fitted to the waist, and just use the flexibility of the fabric to adjust." + }, + "fitWaistNo": { + "t": "Do not fit the garment to the waist", + "d": "The traditional wrap pants." + }, + "fitWaistYes": { + "t": "Fit the garment to the waist", + "d": "Adjust the crotch cutout to make the waist fit better." }, "frontPocketStyle": { - "t": "FIXME: Give this option a name", - "d": "FIXME: Give this option a description" + "t": "Front pocket style", + "d": "A welt pocket, or a pocket hidden in the waistband." + }, + "frontPocketStyle.welt": { + "t": "Welt style Front pocket", + "d": "The front pocket will be a welt pocket, slanted, and hidden by the overlap." + }, + "frontPocketStyle.waistband": { + "t": "Waistband Front pocket", + "d": "The front pocket will be hidden in the seam of the waistband." }, "knotInFront": { - "t": "FIXME: Give this option a name", - "d": "FIXME: Give this option a description" + "t": "Placement of the knot", + "d": "The knot of the wrap straps can be place in the front or back." + }, + "knotInFrontNo": { + "t": "Knot in the back", + "d": "The knot of the wrap straps will be in the back." + }, + "knotInFrontYes": { + "t": "Knot in the front", + "d": "The knot of the wrap straps will be in the front." }, "separateWaistband": { - "t": "FIXME: Give this option a name", - "d": "FIXME: Give this option a description" + "t": "Create a separate waistband", + "d": "Create a separate waistband, or have a hem the size of the waistband." }, - "showMini": { - "t": "FIXME: Give this option a name", - "d": "FIXME: Give this option a description" + "separateWaistbandNo": { + "t": "No separate waistband", + "d": "The waistband is created by a folded hem." + }, + "separateWaistbandYes": { + "t": "Separate waistband", + "d": "The waistband is a separate piece, and sewn onto the pants." } } } diff --git a/designs/waralee/src/cutout.mjs b/designs/waralee/src/cutout.mjs index 78b70ac9713..d7efc65dac2 100644 --- a/designs/waralee/src/cutout.mjs +++ b/designs/waralee/src/cutout.mjs @@ -4,6 +4,10 @@ export const cutout = { name: 'waralee.cutout', from: pantsProto, draft: ({ options, Path, points, paths, Snippet, snippets, sa, macro, expand, part }) => { + if (expand) { + return part.hide() + } + const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle paths.seam = new Path() @@ -17,7 +21,7 @@ export const cutout = { .close() .attr('class', 'fabric') - paths.cutout.hide() + // paths.cutout.hide() points.title = points.mWaist.shift(270, 75) macro('title', { @@ -66,6 +70,6 @@ export const cutout = { x: points.mWaist.x + 15, }) - return part.hide(expand) + return part }, } diff --git a/designs/waralee/src/mini.mjs b/designs/waralee/src/mini.mjs index 50c9953e3be..5ba37654f0f 100644 --- a/designs/waralee/src/mini.mjs +++ b/designs/waralee/src/mini.mjs @@ -12,7 +12,7 @@ export const mini = { return part.hide() } - const mini = options.minimizer + const mini = points.bWaistBackOverlapSeam.dist(points.fWaistFrontOverlapSeam) / 150 const separateWaistband = options.separateWaistband || 'waistband' == options.frontPocketStyle for (const p in points) { @@ -175,7 +175,6 @@ export const mini = { force: true, }) } - - return part.setHidden(!options.showMini && !expand) + return part }, } diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index c965ede955c..9a208a4da87 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -182,6 +182,6 @@ export const pants = { } } - return part.setHidden(options.showMini && !expand) + return part }, } diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index 8443fae2cdb..0fc7c7c3d11 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -137,7 +137,7 @@ export const pocket = { } } - if ('welt' == options.frontPocketStyle) { + if ('welt' != options.frontPocketStyle) { macro('hd', { id: 1, from: points.topLeft, From 63039e08829096a82d6f361ce57fe260df7a5509 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Sun, 15 Oct 2023 17:29:26 +0000 Subject: [PATCH 03/26] almost done --- designs/waralee/i18n/en.json | 33 ++++- designs/waralee/src/backpocket.mjs | 60 ++++++--- designs/waralee/src/facings.mjs | 195 ++++++++++++++--------------- designs/waralee/src/ghost.mjs | 107 ++++++++++++++++ designs/waralee/src/index.mjs | 8 +- designs/waralee/src/options.mjs | 18 ++- designs/waralee/src/pants.mjs | 2 + designs/waralee/src/pantsproto.mjs | 79 ++++++++++-- designs/waralee/src/pocket.mjs | 126 ++++++------------- designs/waralee/src/waistband.mjs | 26 ++-- 10 files changed, 414 insertions(+), 240 deletions(-) create mode 100644 designs/waralee/src/ghost.mjs diff --git a/designs/waralee/i18n/en.json b/designs/waralee/i18n/en.json index cb9a085c419..6009c69985d 100644 --- a/designs/waralee/i18n/en.json +++ b/designs/waralee/i18n/en.json @@ -4,10 +4,11 @@ "p": { "backPocket": "Back pocket", "cutout": "Cutout", - "facings": "Facings", - "mini": "Mini", + "facingBack": "Back Pocket Facing", + "facingFront": "Front Pocket Facing", + "mini": "Mini version", "pants": "Pants", - "pantsProto": "FIXME: Give this part a name", + "pantsProto": "Pants prototype", "pocket": "Pocket", "strapBack": "Strap back", "strapFront": "Strap front", @@ -15,6 +16,12 @@ "waistbandFront": "Waistband front" }, "s": { + "cutBackPocket.t": "The back pocket is not shown", + "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.", + "cutFacingback.t": "The back pocket facing is not shown", + "cutFacingback.d": "The **back pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.", + "cutFacingfront.t": "The front pocket facing is not shown", + "cutFacingfront.d": "The **front pocket facing** is made of a rectangle of fabric {{{ width }}} wide and {{{ length }}} long.", "cutwaistbandBack.t": "The back waist band is not shown", "cutwaistbandBack.d": "The **back waist band** is made of two strips of fabric {{{ width }}} wide and {{{ length }}} long.", "cutwaistbandFront.t": "The front waist band is not shown", @@ -33,10 +40,26 @@ "t": "Back pocket", "d": "Whether to include a back pocket or not" }, + "backPocketYes": { + "t": "Back pocket", + "d": "The back pocket is included" + }, + "backPocketNo": { + "t": "No Back pocket", + "d": "The pattern is drawn without a back pocket" + }, "frontPocket": { "t": "Front pocket", "d": "Whether to include a front pocket or not" }, + "frontPocketYes": { + "t": "Front pocket", + "d": "The front pocket is included" + }, + "frontPocketNo": { + "t": "No Front pocket", + "d": "The pattern is drawn without a front pocket" + }, "hemWidth": { "t": "Hem size", "d": "Size of the hem at the bottom of the pants" @@ -110,8 +133,8 @@ "d": "The front pocket will be hidden in the seam of the waistband." }, "knotInFront": { - "t": "Placement of the knot", - "d": "The knot of the wrap straps can be place in the front or back." + "t": "Place the knot in the front", + "d": "The knot of the wrap straps can be placed in the front or back." }, "knotInFrontNo": { "t": "Knot in the back", diff --git a/designs/waralee/src/backpocket.mjs b/designs/waralee/src/backpocket.mjs index 295b7d40448..d4f81d7ced4 100644 --- a/designs/waralee/src/backpocket.mjs +++ b/designs/waralee/src/backpocket.mjs @@ -14,40 +14,70 @@ export const backPocket = { snippets, macro, sa, + store, + expand, + units, part, }) => { if (false == options.backPocket) { - return part + return part.hide() } + const pocketDepth = options.backPocketDepth * measurements.crotchDepth - const pocketDepth = options.backPocketDepth + if (!expand) { + // Expand is on, do not draw the part but flag this to the user + store.flag.note({ + msg: `waralee:cutBackPocket`, + replace: { + width: units(options.backPocketSize * measurements.crotchDepth), + length: units(pocketDepth + options.backPocketVerticalOffset * measurements.crotchDepth), + }, + suggest: { + text: 'flag:show', + icon: 'expand', + update: { + settings: ['expand', 1], + }, + }, + }) + // Also hint about expand + store.flag.preset('expand') + + return part.hide() + } points.topLeft = new Point(0, 0) points.bottomLeft = points.topLeft.shift( 270, - pocketDepth /*+ 30*/ * 2 + - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + pocketDepth + options.backPocketVerticalOffset * measurements.crotchDepth ) - points.topRight = points.topLeft.shift( - 0, - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ /*+ 24*/ - ) + points.topRight = points.topLeft.shift(0, options.backPocketSize * measurements.crotchDepth) points.bottomRight = points.topRight.shift( 270, - pocketDepth /*+ 30*/ * 2 + - options.backPocketVerticalOffset * measurements.crotchDepth /*- measurements.waistToHips*/ + pocketDepth + options.backPocketVerticalOffset * measurements.crotchDepth ) - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeft) - .line(points.bottomRight) + paths.seamSA = new Path() + .move(points.bottomRight) .line(points.topRight) .line(points.topLeft) + .line(points.bottomLeft) + .hide() + paths.seam = new Path() + .move(points.bottomLeft) + .line(points.bottomRight) + .join(paths.seamSA) .close() .attr('class', 'fabric') + macro('cutonfold', { + from: points.bottomLeft, + to: points.bottomRight, + }) + + store.cutlist.addCut({ cut: 2, from: 'lining' }) + points.title = points.topLeft.shift(270, 75).shift(0, 50) macro('title', { nr: 4, @@ -62,7 +92,7 @@ export const backPocket = { .attr('data-text', 'Waralee') .attr('data-text-class', 'center') - if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (sa) paths.sa = paths.seamSA.close().offset(sa).attr('class', 'fabric sa') macro('hd', { id: 1, diff --git a/designs/waralee/src/facings.mjs b/designs/waralee/src/facings.mjs index 40240b61876..935429038a0 100644 --- a/designs/waralee/src/facings.mjs +++ b/designs/waralee/src/facings.mjs @@ -1,9 +1,8 @@ import { pantsProto } from './pantsproto.mjs' -export const facings = { - name: 'waralee.facings', - after: pantsProto, - draft: ({ +function waraleeFacing( + type, + { options, measurements, Point, @@ -14,106 +13,102 @@ export const facings = { snippets, macro, sa, + store, + expand, + units, part, - }) => { - const frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - const backPocketSize = - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + } +) { + const frontPocketSize = + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + const backPocketSize = + options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - points.frontTL = new Point(0, 0) - points.frontTR = points.frontTL.shift(0, frontPocketSize + sa + sa) - points.frontBL = points.frontTL.shift(270, frontPocketSize / 2) - points.frontBR = points.frontTR.shift(270, frontPocketSize / 2) - - points.backTL = points.frontBL.shift(270, 50) - points.backTR = points.backTL.shift(0, backPocketSize + sa + sa) - points.backBL = points.backTL.shift(270, backPocketSize / 2) - points.backBR = points.backTR.shift(270, backPocketSize / 2) - - paths.frontSeam = new Path() - .move(points.frontTL) - .line(points.frontBL) - .line(points.frontBR) - .line(points.frontTR) - .line(points.frontTL) - .close() - .attr('class', 'fabric') - .setHidden(!(options.frontPocket && 'welt' == options.frontPocketStyle)) - - paths.backSeam = new Path() - .move(points.backTL) - .line(points.backBL) - .line(points.backBR) - .line(points.backTR) - .line(points.backTL) - .close() - .attr('class', 'fabric') - .setHidden(!options.backPocket) - - if (options.frontPocket && 'welt' == options.frontPocketStyle) { - points.frontTitle = points.frontTL.shift(270, 30).shift(0, 40) - macro('title', { - nr: 5, - at: points.frontTitle.shift(0, 30), - title: 'frontFacing', - prefix: 'front', - scale: 0.6, - }) - - points.frontLogo = points.frontTitle.shift(270, 0) - snippets.frontLogo = new Snippet('logo', points.frontLogo).attr('data-scale', 0.3) - points.frontText = points.frontLogo - .shift(-90, 15) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + if (type == 'front') { + if (!options.frontPocket || 'welt' != options.frontPocketStyle) { + return part.hide() } - if (options.backPocket) { - points.backTitle = points.backTL.shift(270, 30).shift(0, 40) - macro('title', { - nr: 6, - at: points.backTitle.shift(0, 30), - title: 'backFacing', - prefix: 'back', - scale: 0.6, - }) - points.backLogo = points.backTitle.shift(270, 0) - snippets.backLogo = new Snippet('logo', points.backLogo).attr('data-scale', 0.3) - points.backText = points.backLogo - .shift(-90, 15) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + } else { + if (!options.backPocket) { + return part.hide() } + } - if (options.frontPocket && 'welt' == options.frontPocketStyle) { - macro('hd', { - id: 1, - from: points.frontTL, - to: points.frontTR, - y: points.frontTL.y + 15, - }) - macro('vd', { - id: 2, - from: points.frontTL, - to: points.frontBL, - x: points.frontTL.x + 15, - }) - } - if (options.backPocket) { - macro('hd', { - id: 3, - from: points.backTL, - to: points.backTR, - y: points.backTL.y + 15, - }) - macro('vd', { - id: 4, - from: points.backTL, - to: points.backBL, - x: points.backTL.x + 15, - }) - } + const width = (type == 'front' ? frontPocketSize : backPocketSize) + sa + sa + const height = (type == 'front' ? frontPocketSize : backPocketSize) / 2 - return part - }, + if (!expand) { + // Expand is on, do not draw the part but flag this to the user + store.flag.note({ + msg: `waralee:cutFacing` + type, + replace: { + width: units(width), + length: units(height), + }, + suggest: { + text: 'flag:show', + icon: 'expand', + update: { + settings: ['expand', 1], + }, + }, + }) + // Also hint about expand + store.flag.preset('expand') + + return part.hide() + } + + points.tl = new Point(0, 0) + points.tr = points.tl.shift(0, width) + points.bl = points.tl.shift(270, height) + points.br = points.tr.shift(270, height) + + paths.seamSeam = new Path() + .move(points.tl) + .line(points.bl) + .line(points.br) + .line(points.tr) + .line(points.tl) + .close() + .attr('class', 'fabric') + + store.cutlist.addCut({ cut: type == 'front' ? 4 : 2, from: 'fabric' }) + + points.title = points.tl.shift(270, 30).shift(0, 40) + macro('title', { + nr: type == 'front' ? 5 : 6, + at: points.title.shift(0, 30), + title: type + 'Facing', + scale: 0.6, + }) + + points.logo = points.title.shift(270, 0) + snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.3) + + macro('hd', { + id: 1, + from: points.tl, + to: points.tr, + y: points.tl.y + 15, + }) + macro('vd', { + id: 2, + from: points.tl, + to: points.bl, + x: points.tl.x + 15, + }) + + return part +} + +export const facingFront = { + name: 'waralee.facingFront', + after: pantsProto, + draft: (part) => waraleeFacing('front', part), +} +export const facingBack = { + name: 'waralee.facingBack', + after: pantsProto, + draft: (part) => waraleeFacing('back', part), } diff --git a/designs/waralee/src/ghost.mjs b/designs/waralee/src/ghost.mjs new file mode 100644 index 00000000000..17f50036788 --- /dev/null +++ b/designs/waralee/src/ghost.mjs @@ -0,0 +1,107 @@ +import { pantsProto } from './pantsproto.mjs' + +export const ghost = { + name: 'waralee.ghost', + after: pantsProto, + draft: ({ + options, + measurements, + Point, + Path, + points, + paths, + Snippet, + snippets, + sa, + macro, + part, + }) => { + const c = 0.55191502449351 + const eyeSize = 0.02 + const size = 500 + + points.middle = new Point(0, 0) + points.eyeLine = points.middle.shift(270, size / 10) + points.eyeLeft = points.eyeLine.shift(180, size / 20) + points.eyeRight = points.eyeLine.shift(0, size / 20) + points.top = new Point(0, -1 * size) + points.left = new Point(-1 * size, 0) + points.right = new Point(size, 0) + points.bottom = new Point(0, size) + points.topCp1 = points.top.shift(180, size * c) + points.topCp2 = points.top.shift(0, size * c) + points.leftCp1 = points.left.shift(270, size * c) + points.leftCp2 = points.left.shift(90, size * c) + points.bottomCp1 = points.bottom.shift(0, size * c) + points.bottomCp2 = points.bottom.shift(180, size * c) + points.rightCp1 = points.right.shift(90, size * c) + points.rightCp2 = points.right.shift(270, size * c) + + points.eyeLefttop = points.eyeLeft.shift(90, size * eyeSize) + points.eyeLeftleft = points.eyeLeft.shift(180, size * eyeSize) + points.eyeLeftbottom = points.eyeLeft.shift(270, size * eyeSize) + points.eyeLeftright = points.eyeLeft.shift(0, size * eyeSize) + points.eyeLefttopCp1 = points.eyeLefttop.shift(180, size * c * eyeSize) + points.eyeLefttopCp2 = points.eyeLefttop.shift(0, size * c * eyeSize) + points.eyeLeftleftCp1 = points.eyeLeftleft.shift(270, size * c * eyeSize) + points.eyeLeftleftCp2 = points.eyeLeftleft.shift(90, size * c * eyeSize) + points.eyeLeftbottomCp1 = points.eyeLeftbottom.shift(0, size * c * eyeSize) + points.eyeLeftbottomCp2 = points.eyeLeftbottom.shift(180, size * c * eyeSize) + points.eyeLeftrightCp1 = points.eyeLeftright.shift(90, size * c * eyeSize) + points.eyeLeftrightCp2 = points.eyeLeftright.shift(270, size * c * eyeSize) + + points.eyeRighttop = points.eyeRight.shift(90, size * eyeSize) + points.eyeRightleft = points.eyeRight.shift(180, size * eyeSize) + points.eyeRightbottom = points.eyeRight.shift(270, size * eyeSize) + points.eyeRightright = points.eyeRight.shift(0, size * eyeSize) + points.eyeRighttopCp1 = points.eyeRighttop.shift(180, size * c * eyeSize) + points.eyeRighttopCp2 = points.eyeRighttop.shift(0, size * c * eyeSize) + points.eyeRightleftCp1 = points.eyeRightleft.shift(270, size * c * eyeSize) + points.eyeRightleftCp2 = points.eyeRightleft.shift(90, size * c * eyeSize) + points.eyeRightbottomCp1 = points.eyeRightbottom.shift(0, size * c * eyeSize) + points.eyeRightbottomCp2 = points.eyeRightbottom.shift(180, size * c * eyeSize) + points.eyeRightrightCp1 = points.eyeRightright.shift(90, size * c * eyeSize) + points.eyeRightrightCp2 = points.eyeRightright.shift(270, size * c * eyeSize) + + console.log({ points: JSON.parse(JSON.stringify(points)) }) + + paths.seam = new Path() + .move(points.top) + .curve(points.topCp1, points.leftCp2, points.left) + .curve(points.leftCp1, points.bottomCp2, points.bottom) + .curve(points.bottomCp1, points.rightCp2, points.right) + .curve(points.rightCp1, points.topCp2, points.top) + .close() + .attr('class', 'fabric') + + paths.eyeLeft = new Path() + .move(points.eyeLefttop) + .curve(points.eyeLefttopCp1, points.eyeLeftleftCp2, points.eyeLeftleft) + .curve(points.eyeLeftleftCp1, points.eyeLeftbottomCp2, points.eyeLeftbottom) + .curve(points.eyeLeftbottomCp1, points.eyeLeftrightCp2, points.eyeLeftright) + .curve(points.eyeLeftrightCp1, points.eyeLefttopCp2, points.eyeLefttop) + .close() + .attr('class', 'fabric') + + paths.eyeRight = new Path() + .move(points.eyeRighttop) + .curve(points.eyeRighttopCp1, points.eyeRightleftCp2, points.eyeRightleft) + .curve(points.eyeRightleftCp1, points.eyeRightbottomCp2, points.eyeRightbottom) + .curve(points.eyeRightbottomCp1, points.eyeRightrightCp2, points.eyeRightright) + .curve(points.eyeRightrightCp1, points.eyeRighttopCp2, points.eyeRighttop) + .close() + .attr('class', 'fabric') + + points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) + macro('title', { + nr: 1, + at: points.title, + title: 'Gozer', + align: 'center', + }) + points.logo = points.middle.shiftFractionTowards(points.bottom, 0.5) + snippets.logo = new Snippet('logo', points.logo) + + return part + }, +} diff --git a/designs/waralee/src/index.mjs b/designs/waralee/src/index.mjs index 34b4867de59..f0254229a8c 100644 --- a/designs/waralee/src/index.mjs +++ b/designs/waralee/src/index.mjs @@ -5,7 +5,7 @@ import { pants } from './pants.mjs' import { cutout } from './cutout.mjs' import { pocket } from './pocket.mjs' import { backPocket } from './backpocket.mjs' -import { facings } from './facings.mjs' +import { facingFront, facingBack } from './facings.mjs' import { mini } from './mini.mjs' import { waistbandFront, waistbandBack, strapFront, strapBack } from './waistband.mjs' // Re-export skeleton parts so peope can re-use them @@ -19,7 +19,8 @@ const Waralee = new Design({ cutout, pocket, backPocket, - facings, + facingFront, + facingBack, mini, waistbandFront, waistbandBack, @@ -34,7 +35,8 @@ export { cutout, pocket, backPocket, - facings, + facingFront, + facingBack, mini, waistbandFront, waistbandBack, diff --git a/designs/waralee/src/options.mjs b/designs/waralee/src/options.mjs index 8d40c7174dc..f3e52efcff8 100644 --- a/designs/waralee/src/options.mjs +++ b/designs/waralee/src/options.mjs @@ -1,6 +1,7 @@ // Fit export const backRaise = { pct: 10, min: 0, max: 25, menu: 'fit' } export const waistRaise = { pct: 0, min: -20, max: 40, menu: 'fit' } +export const fitWaist = { bool: true, menu: 'fit' } // Style export const hemWidth = { pct: 1.75, min: 1, max: 2.5, menu: 'style' } export const legShortening = { pct: 25, min: -10, max: 50, menu: 'style' } @@ -8,6 +9,9 @@ export const waistOverlap = { pct: 50, min: 10, max: 100, menu: 'style' } export const frontPocket = { bool: true, menu: 'style' } export const backPocket = { bool: true, menu: 'style' } export const waistbandWidth = { pct: 3.5, min: 2, max: 5, menu: 'style' } +export const frontPocketStyle = { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' } +export const separateWaistband = { bool: false, menu: 'style' } +export const knotInFront = { bool: true, menu: 'style' } // Advanced export const crotchFront = { pct: 30, min: 10, max: 70, menu: 'advanced' } export const crotchBack = { pct: 45, min: 10, max: 70, menu: 'advanced' } @@ -16,21 +20,15 @@ export const crotchFactorFrontVer = { pct: 30, min: 10, max: 70, menu: 'advanced export const crotchFactorBackHor = { pct: 90, min: 10, max: 100, menu: 'advanced' } export const crotchFactorBackVer = { pct: 60, min: 20, max: 90, menu: 'advanced' } // Static values -export const minimizer = 4 +export const backWaistAdjustment = 0.3 export const frontPocketVerticalOffset = 0.07 export const frontPocketHorizontalOffset = 0.18 export const frontPocketSize = 0.45 +export const frontPocketWidthHeightRatio = 0.076 export const frontPocketDepthFactor = 1.6 -export const backPocketDepth = 140 +export const frontWaistAdjustment = 0.163 +export const backPocketDepth = 0.5 export const backPocketVerticalOffset = 0.2 export const backPocketHorizontalOffset = 0.045 export const backPocketSize = 0.45 -// Added later -export const frontWaistAdjustment = 0.163 -export const backWaistAdjustment = 0.3 export const crotchEase = 1.08 -export const frontPocketStyle = { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' } -// export const showMini = { bool: true, menu: 'options' } -export const fitWaist = { bool: true, menu: 'fit' } -export const separateWaistband = { bool: false, menu: 'style' } -export const knotInFront = { bool: true, menu: 'style' } diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index 9a208a4da87..f6d2765fe87 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -47,6 +47,8 @@ export const pants = { paths.seam.unhide() + store.cutlist.addCut({ cut: 2, from: 'fabric' }) + points.title = points.fWaistFront.shift(270, 400) macro('title', { nr: 1, diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index c7274e537d4..3880d69ee37 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -1,3 +1,4 @@ +import path from 'path' import * as options from './options.mjs' export const pantsProto = { @@ -6,10 +7,7 @@ export const pantsProto = { measurements: ['seat', 'inseam', 'crotchDepth', 'waistToHips'], optionalMeasurements: ['waist', 'waistBack'], options, - draft: ({ options, measurements, Point, Path, points, paths, store, part }) => { - console.log({ measurements: JSON.parse(JSON.stringify(measurements)) }) - console.log({ options: JSON.parse(JSON.stringify(options)) }) - + draft: ({ options, measurements, Point, Path, points, paths, store, part, utils }) => { const seatDepth = measurements.crotchDepth /* - measurements.waistToHips */ * (1 + options.waistRaise) * @@ -30,8 +28,15 @@ export const pantsProto = { const hem = measurements.inseam * options.hemWidth const waistBand = measurements.inseam * options.waistbandWidth + const pocketDepth = + (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor + const frontPocketSize = + options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + store.set('waistBand', waistBand) store.set('hem', hem) + store.set('pocketDepth', pocketDepth) + store.set('frontPocketSize', frontPocketSize) points.mWaist = new Point(0, 0) @@ -63,8 +68,6 @@ export const pantsProto = { points.bHipSide = points.mHip.shift(0, options.crotchBack * circumference4) - console.log({ points: JSON.parse(JSON.stringify(points)) }) - points.fCutOutHip = new Path() .move(points.fWaistSide) .curve(points.fWaistCrotchCP, points.fHipCrotchCP, points.mHip) @@ -216,7 +219,6 @@ export const pantsProto = { paths.waistBack = new Path() .move(separateWaistband ? points.bWaistBackOverlapSeam : points.bWaistBackOverlap) .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBack) - // .line(points.bWaistSideTemp) // This is a trick to make the offset() call work. Without it, the offset is crossing the cutout line. .line(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) .hide() paths.waistFront = new Path() @@ -255,12 +257,14 @@ export const pantsProto = { ) .shift(180, options.frontPocketHorizontalOffset * measurements.seat) - points.frontPocketTop2 = points.frontPocketTop.shift(340, 12) + const frontPocketHeight = frontPocketSize * options.frontPocketWidthHeightRatio + + points.frontPocketTop2 = points.frontPocketTop.shift(340, frontPocketHeight) points.frontPocketBottom = points.frontPocketTop.shift( 250, options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ ) - points.frontPocketBottom2 = points.frontPocketBottom.shift(340, 12) + points.frontPocketBottom2 = points.frontPocketBottom.shift(340, frontPocketHeight) paths.frontPocket = new Path() .move(points.frontPocketTop) @@ -270,6 +274,56 @@ export const pantsProto = { .close() .attr('class', 'fabric') .hide() + + points.frontPocketSeam = utils.beamsIntersect( + points.frontPocketBottom, + points.frontPocketTop, + points.fWaistSideSeam, + points.fWaistFrontOverlapSeam + ) + + const frontPocketExtraDepth = points.frontPocketTop.dist(points.frontPocketSeam) + + points.frontPocketTopLeft = points.frontPocketSeam.shiftTowards( + points.fWaistFrontOverlapSeam, + frontPocketHeight + ) + points.frontPocketTopRight = points.frontPocketTopLeft.shift(0, pocketDepth * (1 / 3)) + + points.frontPocketBottomRight = points.frontPocketTopRight.shift( + 270, + pocketDepth + frontPocketExtraDepth + ) + points.frontPocketBottomLeft = points.frontPocketTopLeft.shift( + 250, + pocketDepth * (5 / 6) + frontPocketExtraDepth + ) + + points.frontPocketBottomRightCP = points.frontPocketBottomRight.shift( + 180, + pocketDepth * (1 / 6) + ) + points.frontPocketBottomLeftCP = points.frontPocketBottomLeft.shift( + 315, + pocketDepth * (1 / 4) + ) + + paths.frontPocketSeamSA = new Path() + .move(points.frontPocketTopRight) + .line(points.frontPocketTopLeft) + .line(points.frontPocketBottomLeft) + .curve( + points.frontPocketBottomLeftCP, + points.frontPocketBottomRightCP, + points.frontPocketBottomRight + ) + .hide() + paths.frontPocketSeam = new Path() + .move(points.frontPocketBottomRight) + .line(points.frontPocketTopRight) + .join(paths.frontPocketSeamSA) + .close() + .attr('class', 'dotted mark') } if (options.backPocket) { @@ -312,6 +366,13 @@ export const pantsProto = { .hide() } + path.temp = new Path() + .move(points.bWaistSide) + .line(points.fWaistSide) + .line(points.fLegFront) + .line(points.bLegBack) + .close() + return part.hide() }, } diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index 0fc7c7c3d11..e9844985816 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -2,58 +2,23 @@ import { pantsProto } from './pantsproto.mjs' export const pocket = { name: 'waralee.pocket', - after: pantsProto, - draft: ({ - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - sa, - macro, - part, - }) => { + from: pantsProto, + draft: ({ options, Point, Path, points, paths, Snippet, snippets, sa, macro, store, part }) => { if (false == options.frontPocket) { - return part + return part.hide() } const c = 0.55191502449351 - const pocketDepth = - (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor - const frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + const frontPocketSize = store.get('frontPocketSize') - console.log({ pocketDepth: pocketDepth, frontPocketSize: frontPocketSize }) + console.log({ paths: JSON.parse(JSON.stringify(paths)) }) if ('welt' != options.frontPocketStyle) { - points.topLeft = new Point(0, 0) - points.bottomLeft = points.topLeft.shift(270, pocketDepth) - console.log({ nwpoints: JSON.parse(JSON.stringify(points)) }) - - points.topRight = points.topLeft.shift(0, pocketDepth * (1 / 3)) - points.bottomRight = points.topRight.shift(290, pocketDepth * (5 / 6)) - - points.bottomLeftCP = points.bottomLeft.shift(0, pocketDepth * (1 / 6)) - points.bottomRightCP = points.bottomRight.shift(225, pocketDepth * (1 / 4)) - - paths.seam = new Path() - .move(points.topLeft) - .line(points.bottomLeft) - .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .close() - .attr('class', 'fabric') - } else { points.topLeft = new Point(0, 0) points.topRight = points.topLeft.shift(0, frontPocketSize) points.bottomLeft = points.topLeft.shift(270, frontPocketSize * 1.5) points.bottomRight = points.topRight.shift(270, frontPocketSize * 1.5) - console.log({ wpoints: JSON.parse(JSON.stringify(points)) }) points.bottomLeftCornerUp = points.bottomLeft.shift(90, frontPocketSize / 4) points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift(270, (frontPocketSize / 4) * c) @@ -91,9 +56,24 @@ export const pocket = { .line(points.topLeft) .close() .attr('class', 'fabric') + + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } else { + paths.frontPocketSeam.setClass('fabric') + + paths.sa = paths.frontPocketSeamSA.offset(sa).close().attr('class', 'fabric sa') + + paths.frontPocket.unhide().setClass('mark') + + macro('cutonfold', { + from: points.frontPocketBottomRight, + to: points.frontPocketTopRight, + }) } - points.title = points.topLeft.shift(270, 75).shift(0, 50) + store.cutlist.addCut({ cut: 2, from: 'lining' }) + + points.title = points.frontPocketTopLeft.shift(270, 75).shift(0, 50) macro('title', { nr: 3, at: points.title, @@ -107,66 +87,36 @@ export const pocket = { .attr('data-text', 'Waralee') .attr('data-text-class', 'center') - console.log({ points: JSON.parse(JSON.stringify(points)), frontPocketSize: frontPocketSize }) - if ('welt' == options.frontPocketStyle) { - macro('cutonfold', { - from: points.topLeft, - to: points.bottomLeft, - margin: 5, - offset: 10, - id: 'cof', - }) - } - if (sa) { - if ('welt' == options.frontPocketStyle) { - paths.sa = new Path() - .move(points.bottomLeft) - .join( - new Path() - .move(points.bottomLeft) - .curve(points.bottomLeftCP, points.bottomRightCP, points.bottomRight) - .line(points.topRight) - .line(points.topLeft) - .offset(sa) - ) - .line(points.topLeft) - .attr('class', 'fabric sa') - } else { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - } - } - - if ('welt' != options.frontPocketStyle) { macro('hd', { id: 1, - from: points.topLeft, - to: points.topRight, - y: points.topLeft.y + 15, + from: points.frontPocketTopLeft, + to: points.frontPocketTopRight, + y: points.frontPocketTopLeft.y - sa - 15, }) macro('hd', { id: 2, - from: points.bottomLeft, - to: points.bottomRight, - y: points.bottomRight.y, + from: points.frontPocketBottomLeft, + to: points.frontPocketBottomRight, + y: points.frontPocketBottomRight.y + sa + 15, }) macro('vd', { id: 3, - from: points.topLeft, - to: points.bottomLeft, - x: points.topLeft.x + 15, + from: points.frontPocketBottomLeft, + to: points.frontPocketTopLeft, + x: points.frontPocketBottomLeft.x - sa - 15, }) macro('vd', { id: 4, - from: points.topRight, - to: points.bottomRight, - x: points.bottomRight.x, + from: points.frontPocketTopRight, + to: points.frontPocketBottomRight, + x: points.frontPocketBottomRight.x + 15, }) macro('vd', { id: 5, - from: points.bottomRight, - to: points.bottomLeft, - x: points.bottomRight.x, + from: points.frontPocketBottomRight, + to: points.frontPocketBottomLeft, + x: points.frontPocketBottomLeft.x - sa - 15, }) } else { macro('hd', { @@ -177,8 +127,8 @@ export const pocket = { }) macro('vd', { id: 7, - from: points.topLeft, - to: points.bottomLeftCornerOver, + from: points.bottomLeftCornerOver, + to: points.topLeft, x: points.bottomLeftCornerOver.x, }) } diff --git a/designs/waralee/src/waistband.mjs b/designs/waralee/src/waistband.mjs index 18766fea108..0e3c5d294d9 100644 --- a/designs/waralee/src/waistband.mjs +++ b/designs/waralee/src/waistband.mjs @@ -31,7 +31,7 @@ function waraleeWaistband( switch (type) { case 'waistBandFront': if (false == options.separateWaistband && 'welt' == options.frontPocketStyle) { - return part + return part.hide() } partNr = 9 waistBandLength = waistBandLengthFront * 2 @@ -39,7 +39,7 @@ function waraleeWaistband( case 'waistBandBack': if (false == options.separateWaistband && 'welt' == options.frontPocketStyle) { - return part + return part.hide() } partNr = 10 waistBandLength = waistBandLengthBack * 2 @@ -80,8 +80,12 @@ function waraleeWaistband( return part.hide() } + store.cutlist.addCut({ cut: 1, from: 'fabric' }) + points.tl = new Point(0, 0) points.bl = new Point(0, waistBandLength) + points.tm = new Point(waistBand, 0) + points.bm = new Point(waistBand, waistBandLength) points.tr = new Point(waistBand * 2, 0) points.br = new Point(waistBand * 2, waistBandLength) @@ -93,13 +97,15 @@ function waraleeWaistband( .line(points.br) .close() + paths.fold = new Path() + .move(points.tm) + .line(points.bm) + .attr('class', 'fabric dotted') + .setText('fold') + if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') - console.log({ - part: type, - points: JSON.parse(JSON.stringify(points)), - paths: JSON.parse(JSON.stringify(paths)), - }) + store.cutlist.addCut({ cut: 1, from: 'fabric' }) points.title = new Point(waistBand, waistBandLength * 0.2) macro('title', { @@ -116,9 +122,9 @@ function waraleeWaistband( macro('hd', { id: 'w', - from: points.tr, - to: points.tl, - y: points.tl.y + sa + 10, + from: points.tl, + to: points.tr, + y: points.tl.y - sa - 10, }) macro('vd', { id: 'h', From 1538d1f68b9820ea7d13f9d3cebc254d6eee87f3 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Sun, 15 Oct 2023 23:37:21 +0000 Subject: [PATCH 04/26] Pretty much done --- config/software/designs.json | 2 +- designs/waralee/i18n/en.json | 9 ++- designs/waralee/src/mini.mjs | 6 +- designs/waralee/src/options.mjs | 34 --------- designs/waralee/src/pants.mjs | 1 + designs/waralee/src/pantsproto.mjs | 72 ++++++++++++++++++- designs/waralee/src/pocket.mjs | 2 - .../waralee/options/legshortening/de.md | 9 --- .../waralee/options/legshortening/en.md | 9 --- .../waralee/options/legshortening/es.md | 9 --- .../waralee/options/legshortening/fr.md | 9 --- .../waralee/options/legshortening/nl.md | 9 --- .../waralee/options/legshortening/uk.md | 9 --- .../designs/waralee/options/legsize/en.md | 9 +++ 14 files changed, 90 insertions(+), 99 deletions(-) delete mode 100644 designs/waralee/src/options.mjs delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/de.md delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/en.md delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/es.md delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/fr.md delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/nl.md delete mode 100644 markdown/org/docs/designs/waralee/options/legshortening/uk.md create mode 100644 markdown/org/docs/designs/waralee/options/legsize/en.md diff --git a/config/software/designs.json b/config/software/designs.json index e46320e9ea6..4bfa35e0ef2 100644 --- a/config/software/designs.json +++ b/config/software/designs.json @@ -512,7 +512,7 @@ "design": "Wouter Van Wageningen", "difficulty": 2, "tags": ["bottoms", "trousers"], - "techniques": [] + "techniques": ["curvedSeam", "hem", "weltPocket"] }, "yuri": { "lab": true, diff --git a/designs/waralee/i18n/en.json b/designs/waralee/i18n/en.json index 6009c69985d..1d6b9cde8b5 100644 --- a/designs/waralee/i18n/en.json +++ b/designs/waralee/i18n/en.json @@ -16,6 +16,9 @@ "waistbandFront": "Waistband front" }, "s": { + "thisIsNotAPart": "This is not a real part", + "doNotCutFromFabric": "Do not cut this from the fabric", + "useMeasurementsToCutFromFabric": "Use these measurements to cut the shape from the fabric", "cutBackPocket.t": "The back pocket is not shown", "cutBackPocket.d": "The **back pocket** is made of two rectangles of fabric {{{ width }}} wide and {{{ length }}} long.", "cutFacingback.t": "The back pocket facing is not shown", @@ -100,9 +103,9 @@ "t": "Waist Overlap", "d": "This dicates how much you want the leg flaps to overlap at the waist. A setting of 0 would have them meet at the side seam, and a setting of 100 makes them meet at the front/back." }, - "legShortening": { - "t": "Leg Shortening", - "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the more that will be taken off the length." + "legSize": { + "t": "Leg Size", + "d": "This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants." }, "backRaise": { "t": "Back Raise", diff --git a/designs/waralee/src/mini.mjs b/designs/waralee/src/mini.mjs index 5ba37654f0f..c0478ead897 100644 --- a/designs/waralee/src/mini.mjs +++ b/designs/waralee/src/mini.mjs @@ -61,15 +61,15 @@ export const mini = { points.pText1 = points.mHip .shiftFractionTowards(points.mLeg, 0.5) - .attr('data-text', 'thisIsNotAPart') + .attr('data-text', 'waralee:thisIsNotAPart') .attr('data-text-class', 'center') points.pText2 = points.mHip .shiftFractionTowards(points.mLeg, 0.6) - .attr('data-text', 'doNotCutFromFabric') + .attr('data-text', 'waralee:doNotCutFromFabric') .attr('data-text-class', 'center') points.pText3 = points.mHip .shiftFractionTowards(points.mLeg, 0.7) - .attr('data-text', 'useMeasurementsToCutFromFabric') + .attr('data-text', 'waralee:useMeasurementsToCutFromFabric') .attr('data-text-class', 'center') const fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide diff --git a/designs/waralee/src/options.mjs b/designs/waralee/src/options.mjs deleted file mode 100644 index f3e52efcff8..00000000000 --- a/designs/waralee/src/options.mjs +++ /dev/null @@ -1,34 +0,0 @@ -// Fit -export const backRaise = { pct: 10, min: 0, max: 25, menu: 'fit' } -export const waistRaise = { pct: 0, min: -20, max: 40, menu: 'fit' } -export const fitWaist = { bool: true, menu: 'fit' } -// Style -export const hemWidth = { pct: 1.75, min: 1, max: 2.5, menu: 'style' } -export const legShortening = { pct: 25, min: -10, max: 50, menu: 'style' } -export const waistOverlap = { pct: 50, min: 10, max: 100, menu: 'style' } -export const frontPocket = { bool: true, menu: 'style' } -export const backPocket = { bool: true, menu: 'style' } -export const waistbandWidth = { pct: 3.5, min: 2, max: 5, menu: 'style' } -export const frontPocketStyle = { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' } -export const separateWaistband = { bool: false, menu: 'style' } -export const knotInFront = { bool: true, menu: 'style' } -// Advanced -export const crotchFront = { pct: 30, min: 10, max: 70, menu: 'advanced' } -export const crotchBack = { pct: 45, min: 10, max: 70, menu: 'advanced' } -export const crotchFactorFrontHor = { pct: 90, min: 10, max: 100, menu: 'advanced' } -export const crotchFactorFrontVer = { pct: 30, min: 10, max: 70, menu: 'advanced' } -export const crotchFactorBackHor = { pct: 90, min: 10, max: 100, menu: 'advanced' } -export const crotchFactorBackVer = { pct: 60, min: 20, max: 90, menu: 'advanced' } -// Static values -export const backWaistAdjustment = 0.3 -export const frontPocketVerticalOffset = 0.07 -export const frontPocketHorizontalOffset = 0.18 -export const frontPocketSize = 0.45 -export const frontPocketWidthHeightRatio = 0.076 -export const frontPocketDepthFactor = 1.6 -export const frontWaistAdjustment = 0.163 -export const backPocketDepth = 0.5 -export const backPocketVerticalOffset = 0.2 -export const backPocketHorizontalOffset = 0.045 -export const backPocketSize = 0.45 -export const crotchEase = 1.08 diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index f6d2765fe87..ff944ce81ec 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -65,6 +65,7 @@ export const pants = { if (options.frontPocket && 'welt' == options.frontPocketStyle) { paths.frontPocket.unhide() + paths.frontPocketSeam.unhide() } if (options.backPocket) { paths.backPocket.unhide() diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index 3880d69ee37..7ee53135b74 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -1,5 +1,72 @@ +import { pctBasedOn } from '@freesewing/core' import path from 'path' -import * as options from './options.mjs' + +export const options = { + // Fit + backRaise: { + pct: 10, + min: 0, + max: 25, + // eslint-disable-next-line no-unused-vars + toAbs: (value, { measurements, options }, mergedOptions) => + value * + (measurements.crotchDepth * (1 + mergedOptions.waistRaise) * mergedOptions.crotchEase), + menu: 'fit', + }, + waistRaise: { + pct: 0, + min: -20, + max: 40, + // eslint-disable-next-line no-unused-vars + toAbs: (value, { measurements, options }, mergedOptions) => + measurements.crotchDepth * (1 + value), + menu: 'fit', + }, + fitWaist: { bool: true, menu: 'fit' }, + // Style + hemWidth: { pct: 1.75, min: 1, max: 2.5, ...pctBasedOn('inseam'), menu: 'style' }, + legSize: { pct: 75, max: 90, min: 50, ...pctBasedOn('inseam'), menu: 'style' }, + waistOverlap: { + pct: 50, + min: 10, + max: 100, + // eslint-disable-next-line no-unused-vars + toAbs: (value, { measurements, options }, mergedOptions) => { + const waist = + typeof measurements.waist == 'undefined' || false == mergedOptions.fitWaist + ? measurements.seat + : measurements.waist + return (measurements.seat > waist ? measurements.seat : waist) * value + }, + menu: 'style', + }, + frontPocket: { bool: true, menu: 'style' }, + backPocket: { bool: true, menu: 'style' }, + waistbandWidth: { pct: 3.5, min: 2, max: 5, ...pctBasedOn('inseam'), menu: 'style' }, + frontPocketStyle: { dflt: 'welt', list: ['welt', 'waistband'], menu: 'style' }, + separateWaistband: { bool: false, menu: 'style' }, + knotInFront: { bool: true, menu: 'style' }, + // Advanced + crotchFront: { pct: 30, min: 10, max: 70, menu: 'advanced' }, + crotchBack: { pct: 45, min: 10, max: 70, menu: 'advanced' }, + crotchFactorFrontHor: { pct: 90, min: 10, max: 100, menu: 'advanced' }, + crotchFactorFrontVer: { pct: 30, min: 10, max: 70, menu: 'advanced' }, + crotchFactorBackHor: { pct: 90, min: 10, max: 100, menu: 'advanced' }, + crotchFactorBackVer: { pct: 60, min: 20, max: 90, menu: 'advanced' }, + // Static values + backWaistAdjustment: 0.3, + frontPocketVerticalOffset: 0.07, + frontPocketHorizontalOffset: 0.18, + frontPocketSize: 0.45, + frontPocketWidthHeightRatio: 0.076, + frontPocketDepthFactor: 1.6, + frontWaistAdjustment: 0.163, + backPocketDepth: 0.5, + backPocketVerticalOffset: 0.2, + backPocketHorizontalOffset: 0.045, + backPocketSize: 0.45, + crotchEase: 1.08, +} export const pantsProto = { name: 'waralee.pantsProto', @@ -89,7 +156,7 @@ export const pantsProto = { waistSeatDifferenceFront * options.frontWaistAdjustment ) - points.mLeg = points.mHip.shift(270, measurements.inseam * (1 - options.legShortening)) + points.mLeg = points.mHip.shift(270, measurements.inseam * options.legSize) points.fLegSide = points.mLeg.shift(180, options.crotchFront * circumference4) points.bLegSide = points.mLeg.shift(0, options.crotchBack * circumference4) @@ -324,6 +391,7 @@ export const pantsProto = { .join(paths.frontPocketSeamSA) .close() .attr('class', 'dotted mark') + .hide() } if (options.backPocket) { diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index e9844985816..f34dd0336c2 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -12,8 +12,6 @@ export const pocket = { const frontPocketSize = store.get('frontPocketSize') - console.log({ paths: JSON.parse(JSON.stringify(paths)) }) - if ('welt' != options.frontPocketStyle) { points.topLeft = new Point(0, 0) points.topRight = points.topLeft.shift(0, frontPocketSize) diff --git a/markdown/org/docs/designs/waralee/options/legshortening/de.md b/markdown/org/docs/designs/waralee/options/legshortening/de.md deleted file mode 100644 index a58aa383273..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/de.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Verkürzung des Hosenbeins" ---- - -Das bestimmt, wie lange die Hosen sein werden. Es ist ein Faktor der Inseam-Messung. Je größer der Wert, desto mehr wird von der Länge entfernt. - -## Effekt dieser Option auf das Schnittmuster - -![Dieses Bild zeigt den Effekt dieser Option, indem es mehrere Varianten überlagert, die einen anderen Wert für diese Option haben](waralee_legshortening_sample.svg "Effekt dieser Option auf das Schnittmuster") diff --git a/markdown/org/docs/designs/waralee/options/legshortening/en.md b/markdown/org/docs/designs/waralee/options/legshortening/en.md deleted file mode 100644 index 9637ceb99ec..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/en.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Leg Shortening" ---- - -This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the more that will be taken off the length. - - - - diff --git a/markdown/org/docs/designs/waralee/options/legshortening/es.md b/markdown/org/docs/designs/waralee/options/legshortening/es.md deleted file mode 100644 index cb3e67c3769..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/es.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Acortamiento de la pierna" ---- - -Esto dicta cuánto tiempo durarán los pantalones. Se trata de un factor de medición de buques. Cuanto más grande sea el valor, más se quitará de la longitud. - -## Efecto de esta opción en el patrón - -![Esta imagen muestra el efecto de esta opción superponiendo varias variantes que tienen un valor diferente para esta opción](waralee_legshortening_sample.svg "Efecto de esta opción en el patrón") diff --git a/markdown/org/docs/designs/waralee/options/legshortening/fr.md b/markdown/org/docs/designs/waralee/options/legshortening/fr.md deleted file mode 100644 index bc201aee7b4..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/fr.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Réduction des jambes" ---- - -Cela dicte combien de temps le pantalon sera. C'est un facteur de la mesure de la couture. Plus la valeur est grande, plus elle sera retirée de la longueur. - -## Effet de cette option sur le motif - -![Cette image montre l'effet de cette option en superposant plusieurs variantes qui ont une valeur différente pour cette option](waralee_legshortening_sample.svg "Effet de cette option sur le motif") diff --git a/markdown/org/docs/designs/waralee/options/legshortening/nl.md b/markdown/org/docs/designs/waralee/options/legshortening/nl.md deleted file mode 100644 index 86dfd4626db..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/nl.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Been Inkorten" ---- - -Dit bepaalt hoe lang de broek zal zijn. Het is een factor van de binnenste meting. Hoe groter de waarde, des te meer zal de lengte worden afgenomen. - -## Effect van deze optie op het patroon - -![Deze afbeelding toont het effect van deze optie door meerdere varianten die een andere waarde hebben voor deze optie te vervangen](waralee_legshortening_sample.svg "Effect van deze optie op het patroon") diff --git a/markdown/org/docs/designs/waralee/options/legshortening/uk.md b/markdown/org/docs/designs/waralee/options/legshortening/uk.md deleted file mode 100644 index 1f20fcf7959..00000000000 --- a/markdown/org/docs/designs/waralee/options/legshortening/uk.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Довжина штанин" ---- - -Від цього залежить, якої довжини будуть штани. Це фактор вимірювання швів. Чим більше значення, тим більше буде віднято від довжини. - -## Вплив цієї опції на шаблон - -![На цьому зображенні показано вплив цієї опції шляхом накладання декількох варіантів, які мають різне значення для цієї опції](waralee_legshortening_sample.svg "Вплив цієї опції на шаблон") diff --git a/markdown/org/docs/designs/waralee/options/legsize/en.md b/markdown/org/docs/designs/waralee/options/legsize/en.md new file mode 100644 index 00000000000..849a8993a4c --- /dev/null +++ b/markdown/org/docs/designs/waralee/options/legsize/en.md @@ -0,0 +1,9 @@ +--- +title: "Leg Size" +--- + +This dictates how long the pants will be. It is a factor of the inseam measurement. The larger the value, the longer the pants. + + + + From bb4da2fe6aa5c3e32ca670a0ff93096bcc714f7d Mon Sep 17 00:00:00 2001 From: woutervdub Date: Sun, 15 Oct 2023 23:42:29 +0000 Subject: [PATCH 05/26] design --- config/software/designs.json | 876 ++++++++++++++++++++++++----------- 1 file changed, 607 insertions(+), 269 deletions(-) diff --git a/config/software/designs.json b/config/software/designs.json index 4bfa35e0ef2..032c8509d7a 100644 --- a/config/software/designs.json +++ b/config/software/designs.json @@ -1,112 +1,189 @@ { "aaron": { - "description": "A FreeSewing pattern for a A-shirt or tank top", - "lab": true, - "org": true, "code": "Joost De Cock", + "description": "A FreeSewing pattern for a A-shirt or tank top", "design": "Joost De Cock", "difficulty": 2, - "tags": ["tops", "underwear"], - "techniques": ["hem", "stretch", "knitBinding", "curvedSeam"] + "lab": true, + "org": true, + "tags": [ + "tops", + "underwear" + ], + "techniques": [ + "hem", + "stretch", + "knitBinding", + "curvedSeam" + ] }, "albert": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for an apron", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for an apron", "design": "Wouter Van Wageningen", "difficulty": 2, - "tags": ["accessories"], - "techniques": ["hem", "knitBinding", "curvedSeam", "pocket"] + "lab": true, + "org": true, + "tags": [ + "accessories" + ], + "techniques": [ + "hem", + "knitBinding", + "curvedSeam", + "pocket" + ] }, "bee": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a bikini top", "code": "bobgeorgethe3rd", + "description": "A FreeSewing pattern for a bikini top", "design": "PrudenceRabbit", "difficulty": 3, - "tags": ["tops", "swimwear"], - "techniques": ["hem", "stretch", "curvedSeam", "precision"] + "lab": true, + "org": true, + "tags": [ + "tops", + "swimwear" + ], + "techniques": [ + "hem", + "stretch", + "curvedSeam", + "precision" + ] }, "bella": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for a womenswear bodice block", + "design": [ + "Bella Incognito", + "Joost De Cock" + ], + "difficulty": 3, "lab": true, "org": true, - "description": "A FreeSewing pattern for a womenswear bodice block", - "code": "Joost De Cock", - "design": ["Bella Incognito", "Joost De Cock"], - "difficulty": 3, - "tags": ["blocks", "tops"], - "techniques": ["dart", "block"] + "tags": [ + "blocks", + "tops" + ], + "techniques": [ + "dart", + "block" + ] }, "benjamin": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a bow tie", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a bow tie", "design": "Wouter Van Wageningen", "difficulty": 3, - "tags": ["accessories"], - "techniques": ["precision", "interfacing"] + "lab": true, + "org": true, + "tags": [ + "accessories" + ], + "techniques": [ + "precision", + "interfacing" + ] }, "bent": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a menswear body block with a two-part sleeve", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a menswear body block with a two-part sleeve", "design": "Joost De Cock", "difficulty": 3, - "tags": ["blocks", "tops"], - "techniques": ["hem", "curvedSeam", "setSleeve"] + "lab": true, + "org": true, + "tags": [ + "blocks", + "tops" + ], + "techniques": [ + "hem", + "curvedSeam", + "setSleeve" + ] }, "bob": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a bib", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a bib", "design": "Joost De Cock", "difficulty": 3, - "tags": ["accessories", "infants"], - "techniques": ["biasTape", "curvedSeam", "snap"] + "lab": true, + "org": true, + "tags": [ + "accessories", + "infants" + ], + "techniques": [ + "biasTape", + "curvedSeam", + "snap" + ] }, "breanna": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a basic body block for womenswear", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a basic body block for womenswear", "design": "Joost De Cock", "difficulty": 3, - "tags": ["blocks", "tops"], - "techniques": ["block", "dart"] + "lab": true, + "org": true, + "tags": [ + "blocks", + "tops" + ], + "techniques": [ + "block", + "dart" + ] }, "brian": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a basic body block for menswear", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a basic body block for menswear", "design": "Joost De Cock", "difficulty": 3, - "tags": ["blocks", "tops"], - "techniques": ["block", "flatSleeve"] + "lab": true, + "org": true, + "tags": [ + "blocks", + "tops" + ], + "techniques": [ + "block", + "flatSleeve" + ] }, "bruce": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for boxer briefs", "code": "Joost De Cock", + "description": "A FreeSewing pattern for boxer briefs", "design": "Joost De Cock", "difficulty": 3, - "tags": ["tops", "underwear"], - "techniques": ["stretch", "hem", "curvedSeam", "elastic"] - }, - "carlita": { "lab": true, "org": true, - "description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat", + "tags": [ + "tops", + "underwear" + ], + "techniques": [ + "stretch", + "hem", + "curvedSeam", + "elastic" + ] + }, + "carlita": { "code": "Joost De Cock", - "design": ["Anneke Caramin", "Joost De Cock"], + "description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat", + "design": [ + "Anneke Caramin", + "Joost De Cock" + ], "difficulty": 5, - "tags": ["tops", "coats"], + "lab": true, + "org": true, + "tags": [ + "tops", + "coats" + ], "techniques": [ "hem", "pocket", @@ -121,13 +198,19 @@ ] }, "carlton": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat", + "design": [ + "Anneke Caramin", + "Joost De Cock" + ], + "difficulty": 5, "lab": true, "org": true, - "description": "A FreeSewing pattern for Sherlock Holmes cosplay; Or just a nice long coat", - "code": "Joost De Cock", - "design": ["Anneke Caramin", "Joost De Cock"], - "difficulty": 5, - "tags": ["tops", "coats"], + "tags": [ + "tops", + "coats" + ], "techniques": [ "hem", "pocket", @@ -141,23 +224,37 @@ ] }, "cathrin": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for a underbust corset / waist trainer", + "design": [ + "Cathrin Åhlén", + "Joost De Cock" + ], + "difficulty": 4, "lab": true, "org": true, - "description": "A FreeSewing pattern for a underbust corset / waist trainer", - "code": "Joost De Cock", - "design": ["Cathrin Åhlén", "Joost De Cock"], - "difficulty": 4, - "tags": ["tops", "underwear"], - "techniques": ["boning", "precision", "curvedSeam", "interfacing"] + "tags": [ + "tops", + "underwear" + ], + "techniques": [ + "boning", + "precision", + "curvedSeam", + "interfacing" + ] }, "charlie": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for chino trousers", "code": "Joost De Cock", + "description": "A FreeSewing pattern for chino trousers", "design": "Joost De Cock", "difficulty": 3, - "tags": ["bottoms", "trousers"], + "lab": true, + "org": true, + "tags": [ + "bottoms", + "trousers" + ], "techniques": [ "weltPocket", "curvedSeams", @@ -171,109 +268,180 @@ ] }, "cornelius": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for cycling breeches, based on the Keystone drafting system", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for cycling breeches, based on the Keystone drafting system", "design": "Wouter Van Wageningen", "difficulty": 3, - "tags": ["bottoms", "trousers"], - "techniques": [] + "lab": true, + "org": true, + "tags": [ + "bottoms", + "trousers" + ], + "techniques": [ + "curvedSeams", + "fly", + "zipper", + "button", + "pocket" + ] }, "diana": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a top with a draped neck", "code": "Erica Alcusa Sáez", + "description": "A FreeSewing pattern for a top with a draped neck", "design": "Erica Alcusa Sáez", "difficulty": 2, - "tags": ["tops"], - "techniques": ["curvedSeam", "flatSleeve", "hem"] + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "flatSleeve", + "hem" + ] }, "examples": { - "lab": false, - "org": false, + "code": "Joost De Cock", "description": "A FreeSewing pattern holding examples for our documentation", - "code": "Joost De Cock" + "lab": false, + "org": false }, "florence": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a face mask", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a face mask", "design": "Joost De Cock", "difficulty": 1, - "tags": ["accessories"], - "techniques": ["curvedSeam"] + "lab": true, + "org": true, + "tags": [ + "accessories" + ], + "techniques": [ + "curvedSeam" + ] }, "florent": { - "lab": true, - "org": true, + "code": [ + "Quentin Felix", + "Joost De Cock" + ], "description": "A FreeSewing pattern for a flat cap", - "code": ["Quentin Felix", "Joost De Cock"], "design": "Quentin Felix", "difficulty": 3, - "tags": ["accessories", "hats"], - "techniques": ["curvedSeam"] + "lab": true, + "org": true, + "tags": [ + "accessories", + "hats" + ], + "techniques": [ + "curvedSeam" + ] }, "hi": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a shark plush toy", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a shark plush toy", "design": "Wouter Van Wageningen", "difficulty": 4, - "tags": ["accessories", "toys"], - "techniques": ["curvedSeam", "dart"] + "lab": true, + "org": true, + "tags": [ + "accessories", + "toys" + ], + "techniques": [ + "curvedSeam", + "dart" + ] }, "holmes": { - "lab": true, - "org": true, + "code": [ + "Erica Alcusa Sáez", + "bobgeorgethe3rd" + ], "description": "A FreeSewing pattern for a Sherlock Holmes hat", - "code": ["Erica Alcusa Sáez", "bobgeorgethe3rd"], "design": "Erica Alcusa Sáez", "difficulty": 3, - "tags": ["accessories", "hats"], - "techniques": ["curvedSeam", "lining"] + "lab": true, + "org": true, + "tags": [ + "accessories", + "hats" + ], + "techniques": [ + "curvedSeam", + "lining" + ] }, "hortensia": { + "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a handbag", + "design": [ + "Stoffsuchti", + "Wouter Van Wageningen" + ], + "difficulty": 3, "lab": true, "org": true, - "description": "A FreeSewing pattern for a handbag", - "code": "Wouter Van Wageningen", - "design": ["Stoffsuchti", "Wouter Van Wageningen"], - "difficulty": 3, - "tags": ["accessories", "bags"], - "techniques": ["curvedSeam", "precision", "lining", "zipper"] + "tags": [ + "accessories", + "bags" + ], + "techniques": [ + "curvedSeam", + "precision", + "lining", + "zipper" + ] }, "huey": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a zip-up hoodie", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a zip-up hoodie", "design": "Joost De Cock", "difficulty": 3, - "tags": ["tops"], - "techniques": ["curvedSeam", "pocket", "zipper", "ribbing", "flatSleeve"] + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "pocket", + "zipper", + "ribbing", + "flatSleeve" + ] }, "hugo": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a hooded jumper with raglan sleeves", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a hooded jumper with raglan sleeves", "design": "Joost De Cock", "difficulty": 3, - "tags": ["tops"], - "techniques": ["curvedSeam", "pocket", "ribbing", "raglanSleeve"] - }, - "jaeger": { "lab": true, "org": true, - "description": "A FreeSewing pattern for a sport coat style jacket", + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "pocket", + "ribbing", + "raglanSleeve" + ] + }, + "jaeger": { "code": "Joost De Cock", + "description": "A FreeSewing pattern for a sport coat style jacket", "design": "Joost De Cock", "difficulty": 5, - "tags": ["tops", "coats"], + "lab": true, + "org": true, + "tags": [ + "tops", + "coats" + ], "techniques": [ "hem", "pocket", @@ -287,222 +455,375 @@ ] }, "legend": { - "lab": false, - "org": false, + "code": "Joost De Cock", "description": "A FreeSewing pattern to document pattern notation", - "code": "Joost De Cock" + "lab": false, + "org": false }, "lucy": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a historical tie-on pocket", "code": "SeaZeeZee", + "description": "A FreeSewing pattern for a historical tie-on pocket", "design": "SeaZeeZee", "difficulty": 2, - "tags": ["accessories", "historical", "bags"], - "techniques": ["curvedSeam"] - }, - "lunetius": { "lab": true, "org": true, - "description": "A FreeSewing pattern for a lacerna, a historical Roman cloak", + "tags": [ + "accessories", + "historical", + "bags" + ], + "techniques": [ + "curvedSeam" + ] + }, + "lunetius": { "code": "Rika Tamaike", + "description": "A FreeSewing pattern for a lacerna, a historical Roman cloak", "design": "Rika Tamaike", "difficulty": 1, - "tags": ["tops", "coats", "historical"], - "techniques": ["hem"] + "lab": true, + "org": true, + "tags": [ + "tops", + "coats", + "historical" + ], + "techniques": [ + "hem" + ] }, "magde": { - "lab": true, - "org": false, - "description": "A FreeSewing pattern for a bike messenger bag", "code": "clegganator259", + "description": "A FreeSewing pattern for a bike messenger bag", "design": "clegganator259", "difficulty": 3, - "tags": ["accessories", "bags"], + "lab": true, + "org": false, + "tags": [ + "accessories", + "bags" + ], "techniques": [] }, "noble": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a princess seam bodice block", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a princess seam bodice block", "design": "Wouter Van Wageningen", "difficulty": 3, - "tags": ["blocks", "tops"], - "techniques": ["curvedSeam", "precision", "princessSeam"] - }, - "octoplushy": { "lab": true, "org": true, + "tags": [ + "blocks", + "tops" + ], + "techniques": [ + "block", + "curvedSeam", + "precision", + "princessSeam" + ] + }, + "octoplushy": { + "code": "Wouter Van Wageningen", "description": "A FreeSewing pattern for an octopus plushy toy", + "design": "Wouter Van Wageningen", + "difficulty": 4, + "lab": true, + "org": true, + "tags": [ + "accessories", + "toys" + ], + "techniques": [ + "curvedSeam", + "precision" + ] + }, + "paco": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for summer pants", + "design": "Joost De Cock", + "difficulty": 3, + "lab": true, + "org": true, + "tags": [ + "bottoms", + "trousers" + ], + "techniques": [ + "elastic", + "curvedSeam", + "pocket", + "weltPocket", + "hem" + ] + }, + "penelope": { + "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a pencil skirt", + "design": "Wouter Van Wageningen", + "difficulty": 3, + "lab": true, + "org": true, + "tags": [ + "bottoms", + "skirts" + ], + "techniques": [ + "hem", + "curvedSeam", + "precision", + "zipper" + ] + }, + "plugintest": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern to test (y)our plugins", + "lab": true, + "org": false + }, + "rendertest": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern to test (y)our render engine our CSS", + "lab": true, + "org": false + }, + "sandy": { + "code": [ + "Erica Alcusa Sáez", + "Joost De Cock" + ], + "description": "A FreeSewing pattern for a circle skirt", + "design": "Erica Alcusa Sáez", + "difficulty": 3, + "lab": true, + "org": true, + "tags": [ + "bottoms", + "skirts" + ], + "techniques": [ + "curvedSeam", + "button", + "hem" + ] + }, + "shelly": { + "lab": true, + "org": true, + "description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts", + "code": "Thrunic", + "design": "Thrunic", + "difficulty": 2, + "tags": ["tops", "swimwear"], + "techniques": ["hem", "stretch", "curvedSeam", "raglanSleeve"] + }, + "shin": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for swim trunks", + "design": "Joost De Cock", + "difficulty": 2, + "lab": true, + "org": true, + "tags": [ + "bottoms", + "swimwear" + ], + "techniques": [ + "hem", + "stretch", + "curvedSeam", + "elastic" + ] + }, + "simon": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for a button down shirt", + "design": "Joost De Cock", + "difficulty": 4, + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "hem", + "button", + "interfacing", + "curvedSeam", + "flatFelledSeam", + "flatSleeve" + ] + }, + "simone": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)", + "design": "Joost De Cock", + "difficulty": 4, + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "hem", + "button", + "interfacing", + "curvedSeam", + "flatFelledSeam", + "flatSleeve" + ] + }, + "skully": { + "description": "A FreeSewing pattern for skully, our logo, a plushy toy", "code": "Wouter Van Wageningen", "design": "Wouter Van Wageningen", "difficulty": 4, + "lab": true, + "org": true, "tags": ["accessories", "toys"], "techniques": ["curvedSeam", "precision"] }, - "paco": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for summer pants", - "code": "Joost De Cock", - "design": "Joost De Cock", - "difficulty": 3, - "tags": ["bottoms", "trousers"], - "techniques": ["elastic", "curvedSeam", "pocket", "weltPocket", "hem"] - }, - "penelope": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a pencil skirt", - "code": "Wouter Van Wageningen", - "design": "Wouter Van Wageningen", - "difficulty": 3, - "tags": ["bottoms", "skirts"], - "techniques": ["hem", "curvedSeam", "precision", "zipper"] - }, - "plugintest": { - "lab": false, - "org": false, - "description": "A FreeSewing pattern to test (y)our plugins", - "code": "Joost De Cock" - }, - "rendertest": { - "lab": false, - "org": false, - "description": "A FreeSewing pattern to test (y)our render engine our CSS", - "code": "Joost De Cock" - }, - "sandy": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a circle skirt", - "code": ["Erica Alcusa Sáez", "Joost De Cock"], - "design": "Erica Alcusa Sáez", - "difficulty": 3, - "tags": ["bottoms", "skirts"], - "techniques": ["curvedSeam", "button", "hem"] - }, - "shin": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for swim trunks", - "code": "Joost De Cock", - "design": "Joost De Cock", - "difficulty": 2, - "tags": ["bottoms", "swimwear"], - "techniques": ["hem", "stretch", "curvedSeam", "elastic"] - }, - "simon": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a button down shirt", - "code": "Joost De Cock", - "design": "Joost De Cock", - "difficulty": 4, - "tags": ["tops"], - "techniques": ["hem", "button", "interfacing", "curvedSeam", "flatFelledSeam", "flatSleeve"] - }, - "simone": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a button down shirt (Simone = Simon for people with breasts)", - "code": "Joost De Cock", - "design": "Joost De Cock", - "difficulty": 4, - "tags": ["tops"], - "techniques": ["hem", "button", "interfacing", "curvedSeam", "flatFelledSeam", "flatSleeve"] - }, "sven": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a straightforward sweater", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a straightforward sweater", "design": "Joost De Cock", "difficulty": 3, - "tags": ["tops"], - "techniques": ["curvedSeam", "flatSleeve", "ribbing"] + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "flatSleeve", + "ribbing" + ] }, "tamiko": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a zero-waste top", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a zero-waste top", "design": "Joost De Cock", "difficulty": 1, - "tags": ["tops"], - "techniques": ["curvedSeam"] + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam" + ] }, "teagan": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a T-shirt", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a T-shirt", "design": "Joost De Cock", "difficulty": 2, - "tags": ["tops"], - "techniques": ["curvedSeam", "hem", "flatSleeve", "knitBand"] - }, - "tiberius": { "lab": true, "org": true, - "description": "A FreeSewing pattern for a tunica, a historical Roman tunic", + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "hem", + "flatSleeve", + "knitBand" + ] + }, + "tiberius": { "code": "Rika Tamaike", + "description": "A FreeSewing pattern for a tunica, a historical Roman tunic", "design": "Rika Tamaike", "difficulty": 1, - "tags": ["tops", "historical"], + "lab": true, + "org": true, + "tags": [ + "tops", + "historical" + ], "techniques": [] }, "titan": { + "code": "Joost De Cock", + "description": "A FreeSewing pattern for a unisex trouser block", + "design": [ + "Debra Bean", + "Joost De Cock" + ], + "difficulty": 3, "lab": true, "org": true, - "description": "A FreeSewing pattern for a unisex trouser block", - "code": "Joost De Cock", - "design": ["Debra Bean", "Joost De Cock"], - "difficulty": 3, - "tags": ["blocks", "bottoms"], + "tags": [ + "blocks", + "bottoms" + ], "techniques": [] }, "trayvon": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a tie", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a tie", "design": "Joost De Cock", "difficulty": 2, - "tags": ["accessories"], - "techniques": ["precision", "lining"] + "lab": true, + "org": true, + "tags": [ + "accessories" + ], + "techniques": [ + "precision", + "lining" + ] }, "uma": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a basic, highly-customizable underwear pattern", "design": "Joost De Cock", "difficulty": 1, - "tags": ["bottoms", "underwear"], - "techniques": ["elastic", "curvedSeam"] + "lab": true, + "org": true, + "tags": [ + "bottoms", + "underwear" + ], + "techniques": [ + "elastic", + "curvedSeam" + ] }, "wahid": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a classic fitted waistcoat", "code": "Joost De Cock", + "description": "A FreeSewing pattern for a classic fitted waistcoat", "design": "Joost De Cock", "difficulty": 4, - "tags": ["tops"], - "techniques": ["curvedSeam", "hem", "interfacing", "lining", "weltPocket", "button"] - }, - "walburga": { "lab": true, "org": true, - "description": "A FreeSewing pattern for a wappenrock (tabard/surcoat), a historical European/medieval (ish) garment", + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "hem", + "interfacing", + "lining", + "weltPocket", + "button" + ] + }, + "walburga": { "code": "Rika Tamaike", + "description": "A FreeSewing pattern for a wappenrock (tabard/surcoat), a historical European/medieval (ish) garment", "design": "Rika Tamaike", "difficulty": 1, - "tags": ["bottoms", "historical"], - "techniques": ["hem"] + "lab": true, + "org": true, + "tags": [ + "bottoms", + "historical" + ], + "techniques": [ + "hem" + ] }, "waralee": { "lab": true, @@ -515,13 +836,30 @@ "techniques": ["curvedSeam", "hem", "weltPocket"] }, "yuri": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a fancy zipless sweater based on the Huey hoodie", "code": "Hellgy", + "description": "A FreeSewing pattern for a fancy zipless sweater based on the Huey hoodie", "design": "Biou", "difficulty": 3, - "tags": ["tops"], - "techniques": ["curvedSeam", "flatSleeve", "hem", "button"] + "lab": true, + "org": true, + "tags": [ + "tops" + ], + "techniques": [ + "curvedSeam", + "flatSleeve", + "hem", + "button" + ] + }, + "otis": { + "description": "A FreeSewing pattern for a romper", + "code": "Wouter Van Wageningen", + "design": "Wouter Van Wageningen", + "difficulty": 2, + "lab": true, + "org": true, + "tags": [ ], + "techniques": [ ] } } From 2b68d202f59c408c87ff4e6cfc1fe05d5dacffd2 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Sun, 15 Oct 2023 23:51:19 +0000 Subject: [PATCH 06/26] error --- designs/waralee/src/pantsproto.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index 7ee53135b74..912eac58fe2 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -1,5 +1,4 @@ import { pctBasedOn } from '@freesewing/core' -import path from 'path' export const options = { // Fit From e94afb36ab3d208e17e762c24983b7294808fb33 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Mon, 16 Oct 2023 04:56:56 +0000 Subject: [PATCH 07/26] gozer --- config/software/designs.json | 50 ++++-- designs/gozer/CHANGELOG.md | 17 +++ designs/gozer/README.md | 143 ++++++++++++++++++ designs/gozer/build.mjs | 35 +++++ designs/gozer/data.mjs | 4 + designs/gozer/i18n/de.json | 7 + designs/gozer/i18n/en.json | 7 + designs/gozer/i18n/es.json | 7 + designs/gozer/i18n/fr.json | 7 + designs/gozer/i18n/index.mjs | 8 + designs/gozer/i18n/nl.json | 7 + designs/gozer/i18n/uk.json | 7 + designs/gozer/package.json | 73 +++++++++ designs/gozer/src/ghost.mjs | 96 ++++++++++++ designs/gozer/src/index.mjs | 16 ++ designs/gozer/tests/shared.test.mjs | 20 +++ markdown/org/docs/designs/gozer/cutting/en.md | 6 + markdown/org/docs/designs/gozer/en.md | 8 + markdown/org/docs/designs/gozer/fabric/en.md | 7 + .../org/docs/designs/gozer/instructions/en.md | 15 ++ .../org/docs/designs/gozer/measurements/en.md | 5 + markdown/org/docs/designs/gozer/needs/en.md | 9 ++ markdown/org/docs/designs/gozer/notes/en.md | 6 + 23 files changed, 548 insertions(+), 12 deletions(-) create mode 100644 designs/gozer/CHANGELOG.md create mode 100644 designs/gozer/README.md create mode 100644 designs/gozer/build.mjs create mode 100644 designs/gozer/data.mjs create mode 100644 designs/gozer/i18n/de.json create mode 100644 designs/gozer/i18n/en.json create mode 100644 designs/gozer/i18n/es.json create mode 100644 designs/gozer/i18n/fr.json create mode 100644 designs/gozer/i18n/index.mjs create mode 100644 designs/gozer/i18n/nl.json create mode 100644 designs/gozer/i18n/uk.json create mode 100644 designs/gozer/package.json create mode 100644 designs/gozer/src/ghost.mjs create mode 100644 designs/gozer/src/index.mjs create mode 100644 designs/gozer/tests/shared.test.mjs create mode 100644 markdown/org/docs/designs/gozer/cutting/en.md create mode 100644 markdown/org/docs/designs/gozer/en.md create mode 100644 markdown/org/docs/designs/gozer/fabric/en.md create mode 100644 markdown/org/docs/designs/gozer/instructions/en.md create mode 100644 markdown/org/docs/designs/gozer/measurements/en.md create mode 100644 markdown/org/docs/designs/gozer/needs/en.md create mode 100644 markdown/org/docs/designs/gozer/notes/en.md diff --git a/config/software/designs.json b/config/software/designs.json index aac584f17e3..758847b31c2 100644 --- a/config/software/designs.json +++ b/config/software/designs.json @@ -609,14 +609,22 @@ ] }, "shelly": { - "lab": true, - "org": true, - "description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts", "code": "Thrunic", + "description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts", "design": "Thrunic", "difficulty": 2, - "tags": ["tops", "swimwear"], - "techniques": ["hem", "stretch", "curvedSeam", "raglanSleeve"] + "lab": true, + "org": true, + "tags": [ + "tops", + "swimwear" + ], + "techniques": [ + "hem", + "stretch", + "curvedSeam", + "raglanSleeve" + ] }, "shin": { "code": "Joost De Cock", @@ -675,14 +683,20 @@ ] }, "skully": { - "description": "A FreeSewing pattern for skully, our logo, a plushy toy", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for skully, our logo, a plushy toy", "design": "Wouter Van Wageningen", "difficulty": 4, "lab": true, "org": true, - "tags": ["accessories", "toys"], - "techniques": ["curvedSeam", "precision"] + "tags": [ + "accessories", + "toys" + ], + "techniques": [ + "curvedSeam", + "precision" + ] }, "sven": { "code": "Joost De Cock", @@ -856,13 +870,25 @@ ] }, "otis": { - "description": "A FreeSewing pattern for a romper", "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a romper", "design": "Wouter Van Wageningen", "difficulty": 2, "lab": true, "org": true, - "tags": [ ], - "techniques": [ ] + "tags": [], + "techniques": [] + }, + "gozer": { + "code": "Coder name", + "description": "A FreeSewing pattern that needs a description", + "design": "Designer name", + "difficulty": 1, + "tags": [ + "tagname" + ], + "techniques": [ + "techname" + ] } -} +} \ No newline at end of file diff --git a/designs/gozer/CHANGELOG.md b/designs/gozer/CHANGELOG.md new file mode 100644 index 00000000000..75e9b067844 --- /dev/null +++ b/designs/gozer/CHANGELOG.md @@ -0,0 +1,17 @@ +# Change log for: @freesewing/gozer + + +## 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/gozer/README.md b/designs/gozer/README.md new file mode 100644 index 00000000000..e730d3be4f7 --- /dev/null +++ b/designs/gozer/README.md @@ -0,0 +1,143 @@ +![FreeSewing](https://static.freesewing.org/banner.png) +

@freesewing/gozer on NPM + License: MIT + Code quality on DeepScan + Open issues tagged pkg:gozer + All Contributors +

Follow @freesewing_org on Twitter + Chat with us on Discord + Become a FreeSewing Patron + Follow @freesewing_org on Twitter +

+ +# @freesewing/gozer + +A FreeSewing pattern that needs a description + + + + +## 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/gozer + +If you're not entirely sure what to do or how to start, type this command: + +``` +npm run tips +``` + +> If you don't want to set up a dev environment, you can run it in your browser: +> +> [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/freesewing/freesewing) +> +> We recommend that you fork our repository and then +> put `gitpod.io/# 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/gozer/build.mjs b/designs/gozer/build.mjs new file mode 100644 index 00000000000..99ace216bc8 --- /dev/null +++ b/designs/gozer/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/gozer/data.mjs b/designs/gozer/data.mjs new file mode 100644 index 00000000000..9aeca4b6d73 --- /dev/null +++ b/designs/gozer/data.mjs @@ -0,0 +1,4 @@ +// This file is auto-generated | All changes you make will be overwritten. +export const name = '@freesewing/gozer' +export const version = '3.0.0' +export const data = { name, version } diff --git a/designs/gozer/i18n/de.json b/designs/gozer/i18n/de.json new file mode 100644 index 00000000000..51ffe6da861 --- /dev/null +++ b/designs/gozer/i18n/de.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern that needs a description", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/i18n/en.json b/designs/gozer/i18n/en.json new file mode 100644 index 00000000000..ba34971f9bd --- /dev/null +++ b/designs/gozer/i18n/en.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern for a Halloween costume", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/i18n/es.json b/designs/gozer/i18n/es.json new file mode 100644 index 00000000000..51ffe6da861 --- /dev/null +++ b/designs/gozer/i18n/es.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern that needs a description", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/i18n/fr.json b/designs/gozer/i18n/fr.json new file mode 100644 index 00000000000..51ffe6da861 --- /dev/null +++ b/designs/gozer/i18n/fr.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern that needs a description", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/i18n/index.mjs b/designs/gozer/i18n/index.mjs new file mode 100644 index 00000000000..36aac928b67 --- /dev/null +++ b/designs/gozer/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/gozer/i18n/nl.json b/designs/gozer/i18n/nl.json new file mode 100644 index 00000000000..51ffe6da861 --- /dev/null +++ b/designs/gozer/i18n/nl.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern that needs a description", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/i18n/uk.json b/designs/gozer/i18n/uk.json new file mode 100644 index 00000000000..51ffe6da861 --- /dev/null +++ b/designs/gozer/i18n/uk.json @@ -0,0 +1,7 @@ +{ + "t": "Gozer", + "d": "A FreeSewing pattern that needs a description", + "p": { }, + "s": { }, + "o": { } +} diff --git a/designs/gozer/package.json b/designs/gozer/package.json new file mode 100644 index 00000000000..d3aa65886da --- /dev/null +++ b/designs/gozer/package.json @@ -0,0 +1,73 @@ +{ + "name": "@freesewing/gozer", + "version": "3.0.0", + "description": "A FreeSewing pattern that needs a description", + "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/gozer/src/ghost.mjs b/designs/gozer/src/ghost.mjs new file mode 100644 index 00000000000..cab97332daa --- /dev/null +++ b/designs/gozer/src/ghost.mjs @@ -0,0 +1,96 @@ +export const ghost = { + name: 'gozer.ghost', + measurements: ['hpsToWaistBack', 'waistToFloor', 'head'], + draft: ({ measurements, Point, Path, points, paths, Snippet, snippets, sa, macro, part }) => { + const c = 0.55191502449351 + const eyeSize = measurements.head * 0.0416 + const size = + measurements.hpsToWaistBack + measurements.waistToFloor + measurements.head / Math.PI + + points.middle = new Point(0, 0) + points.eyeLine = points.middle.shift(270, measurements.head / Math.PI / 2) + points.eyeLeft = points.eyeLine.shift(180, measurements.head * 0.13) + points.eyeRight = points.eyeLine.shift(0, measurements.head * 0.13) + points.top = new Point(0, -1 * size) + points.left = new Point(-1 * size, 0) + points.right = new Point(size, 0) + points.bottom = new Point(0, size) + points.topCp1 = points.top.shift(180, size * c) + points.topCp2 = points.top.shift(0, size * c) + points.leftCp1 = points.left.shift(270, size * c) + points.leftCp2 = points.left.shift(90, size * c) + points.bottomCp1 = points.bottom.shift(0, size * c) + points.bottomCp2 = points.bottom.shift(180, size * c) + points.rightCp1 = points.right.shift(90, size * c) + points.rightCp2 = points.right.shift(270, size * c) + + points.eyeLefttop = points.eyeLeft.shift(90, size * eyeSize) + points.eyeLeftleft = points.eyeLeft.shift(180, size * eyeSize) + points.eyeLeftbottom = points.eyeLeft.shift(270, size * eyeSize) + points.eyeLeftright = points.eyeLeft.shift(0, size * eyeSize) + points.eyeLefttopCp1 = points.eyeLefttop.shift(180, size * c * eyeSize) + points.eyeLefttopCp2 = points.eyeLefttop.shift(0, size * c * eyeSize) + points.eyeLeftleftCp1 = points.eyeLeftleft.shift(270, size * c * eyeSize) + points.eyeLeftleftCp2 = points.eyeLeftleft.shift(90, size * c * eyeSize) + points.eyeLeftbottomCp1 = points.eyeLeftbottom.shift(0, size * c * eyeSize) + points.eyeLeftbottomCp2 = points.eyeLeftbottom.shift(180, size * c * eyeSize) + points.eyeLeftrightCp1 = points.eyeLeftright.shift(90, size * c * eyeSize) + points.eyeLeftrightCp2 = points.eyeLeftright.shift(270, size * c * eyeSize) + + points.eyeRighttop = points.eyeRight.shift(90, size * eyeSize) + points.eyeRightleft = points.eyeRight.shift(180, size * eyeSize) + points.eyeRightbottom = points.eyeRight.shift(270, size * eyeSize) + points.eyeRightright = points.eyeRight.shift(0, size * eyeSize) + points.eyeRighttopCp1 = points.eyeRighttop.shift(180, size * c * eyeSize) + points.eyeRighttopCp2 = points.eyeRighttop.shift(0, size * c * eyeSize) + points.eyeRightleftCp1 = points.eyeRightleft.shift(270, size * c * eyeSize) + points.eyeRightleftCp2 = points.eyeRightleft.shift(90, size * c * eyeSize) + points.eyeRightbottomCp1 = points.eyeRightbottom.shift(0, size * c * eyeSize) + points.eyeRightbottomCp2 = points.eyeRightbottom.shift(180, size * c * eyeSize) + points.eyeRightrightCp1 = points.eyeRightright.shift(90, size * c * eyeSize) + points.eyeRightrightCp2 = points.eyeRightright.shift(270, size * c * eyeSize) + + paths.seam = new Path() + .move(points.top) + .curve(points.topCp1, points.leftCp2, points.left) + .curve(points.leftCp1, points.bottomCp2, points.bottom) + .curve(points.bottomCp1, points.rightCp2, points.right) + .curve(points.rightCp1, points.topCp2, points.top) + .close() + .attr('class', 'fabric') + + paths.eyeLeft = new Path() + .move(points.eyeLefttop) + .curve(points.eyeLefttopCp1, points.eyeLeftleftCp2, points.eyeLeftleft) + .curve(points.eyeLeftleftCp1, points.eyeLeftbottomCp2, points.eyeLeftbottom) + .curve(points.eyeLeftbottomCp1, points.eyeLeftrightCp2, points.eyeLeftright) + .curve(points.eyeLeftrightCp1, points.eyeLefttopCp2, points.eyeLefttop) + .close() + .attr('class', 'fabric') + + paths.eyeRight = new Path() + .move(points.eyeRighttop) + .curve(points.eyeRighttopCp1, points.eyeRightleftCp2, points.eyeRightleft) + .curve(points.eyeRightleftCp1, points.eyeRightbottomCp2, points.eyeRightbottom) + .curve(points.eyeRightbottomCp1, points.eyeRightrightCp2, points.eyeRightright) + .curve(points.eyeRightrightCp1, points.eyeRighttopCp2, points.eyeRighttop) + .close() + .attr('class', 'fabric') + + points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) + macro('title', { + nr: 1, + at: points.title, + title: 'Gozer', + align: 'center', + }) + points.logo = points.middle.shiftFractionTowards(points.bottom, 0.5) + snippets.logo = new Snippet('logo', points.logo) + + if (sa) { + paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + } + + return part + }, +} diff --git a/designs/gozer/src/index.mjs b/designs/gozer/src/index.mjs new file mode 100644 index 00000000000..e7eaddaa418 --- /dev/null +++ b/designs/gozer/src/index.mjs @@ -0,0 +1,16 @@ +// + +import { Design } from '@freesewing/core' +import { i18n } from '../i18n/index.mjs' +import { data } from '../data.mjs' +// Parts +import { ghost } from './ghost.mjs' + +// Create new design +const Gozer = new Design({ + data, + parts: [ghost], +}) + +// Named exports +export { ghost, i18n, Gozer } diff --git a/designs/gozer/tests/shared.test.mjs b/designs/gozer/tests/shared.test.mjs new file mode 100644 index 00000000000..7d3887720d8 --- /dev/null +++ b/designs/gozer/tests/shared.test.mjs @@ -0,0 +1,20 @@ +// This file is auto-generated | Any changes you make will be overwritten. +import { Gozer, 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(Gozer) + +// Test translation +testPatternI18n(Gozer, i18n) + +// Test drafting - Change the second parameter to `true` to log errors +testPatternDrafting(Gozer, false) + +// Test sampling - Change the second parameter to `true` to log errors +testPatternSampling(Gozer, false) diff --git a/markdown/org/docs/designs/gozer/cutting/en.md b/markdown/org/docs/designs/gozer/cutting/en.md new file mode 100644 index 00000000000..1578525ee18 --- /dev/null +++ b/markdown/org/docs/designs/gozer/cutting/en.md @@ -0,0 +1,6 @@ +--- +title: "Gozer the ghost: Cutting Instructions" +--- + +- **Color 1; Traditionally white** + - Cut **1 Body** diff --git a/markdown/org/docs/designs/gozer/en.md b/markdown/org/docs/designs/gozer/en.md new file mode 100644 index 00000000000..4c57e0efe22 --- /dev/null +++ b/markdown/org/docs/designs/gozer/en.md @@ -0,0 +1,8 @@ +--- +title: Gozer the ghost +--- + + + + + diff --git a/markdown/org/docs/designs/gozer/fabric/en.md b/markdown/org/docs/designs/gozer/fabric/en.md new file mode 100644 index 00000000000..9d42741e68c --- /dev/null +++ b/markdown/org/docs/designs/gozer/fabric/en.md @@ -0,0 +1,7 @@ +--- +title: "Gozer the ghost: Fabric Options" +--- + +## Main Fabric + +Traditionally, white sheets are used. \ No newline at end of file diff --git a/markdown/org/docs/designs/gozer/instructions/en.md b/markdown/org/docs/designs/gozer/instructions/en.md new file mode 100644 index 00000000000..7f5d9d2550e --- /dev/null +++ b/markdown/org/docs/designs/gozer/instructions/en.md @@ -0,0 +1,15 @@ +--- +title: "Gozer the ghost: Sewing Instructions" +--- + +## Step 1: The eyes + +- Cut holes where marked. + +## Step 2: The body + +- Hem the body + +## Step 3: Enjoy! + +That's it, you are all done. Put it on and scare the neighborhood diff --git a/markdown/org/docs/designs/gozer/measurements/en.md b/markdown/org/docs/designs/gozer/measurements/en.md new file mode 100644 index 00000000000..d8c916e168b --- /dev/null +++ b/markdown/org/docs/designs/gozer/measurements/en.md @@ -0,0 +1,5 @@ +--- +title: "Gozer the ghost: Required Measurements" +--- + + \ No newline at end of file diff --git a/markdown/org/docs/designs/gozer/needs/en.md b/markdown/org/docs/designs/gozer/needs/en.md new file mode 100644 index 00000000000..4babe41b631 --- /dev/null +++ b/markdown/org/docs/designs/gozer/needs/en.md @@ -0,0 +1,9 @@ +--- +title: "Gozer the ghost: What You Need" +--- + +To make Gozer, you will need the following: + +- [Basic sewing supplies](/docs/sewing/basic-sewing-supplies) +- About 1 bed sheet + diff --git a/markdown/org/docs/designs/gozer/notes/en.md b/markdown/org/docs/designs/gozer/notes/en.md new file mode 100644 index 00000000000..5b00af821c8 --- /dev/null +++ b/markdown/org/docs/designs/gozer/notes/en.md @@ -0,0 +1,6 @@ +--- +title: "Gozer the ghost: Designer Notes" +--- + +The designer, nor FreeSewing, are liable for anything that follows the use of this pattern. You've been warned. + From 8f3a7958322f7719b19154c0eb62008b85088818 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Tue, 17 Oct 2023 08:22:15 +0200 Subject: [PATCH 08/26] chore: Keep config file alphabetic --- config/software/designs.json | 62 ++++++++++++++---------------------- 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/config/software/designs.json b/config/software/designs.json index 758847b31c2..5265b8c98b6 100644 --- a/config/software/designs.json +++ b/config/software/designs.json @@ -340,6 +340,18 @@ "curvedSeam" ] }, + "gozer": { + "code": "Wouter Van Wageningen", + "description": "A FreeSewing pattern for a ghost costume", + "design": "Wouter Van Wageningen", + "difficulty": 1, + "tags": [ + "costumes" + ], + "techniques": [ + "hem" + ] + }, "hi": { "code": "Wouter Van Wageningen", "description": "A FreeSewing pattern for a shark plush toy", @@ -609,22 +621,14 @@ ] }, "shelly": { - "code": "Thrunic", + "lab": true, + "org": true, "description": "A FreeSewing pattern for a raglan shirt, perfect for swimshirts", + "code": "Thrunic", "design": "Thrunic", "difficulty": 2, - "lab": true, - "org": true, - "tags": [ - "tops", - "swimwear" - ], - "techniques": [ - "hem", - "stretch", - "curvedSeam", - "raglanSleeve" - ] + "tags": ["tops", "swimwear"], + "techniques": ["hem", "stretch", "curvedSeam", "raglanSleeve"] }, "shin": { "code": "Joost De Cock", @@ -683,20 +687,14 @@ ] }, "skully": { - "code": "Wouter Van Wageningen", "description": "A FreeSewing pattern for skully, our logo, a plushy toy", + "code": "Wouter Van Wageningen", "design": "Wouter Van Wageningen", "difficulty": 4, "lab": true, "org": true, - "tags": [ - "accessories", - "toys" - ], - "techniques": [ - "curvedSeam", - "precision" - ] + "tags": ["accessories", "toys"], + "techniques": ["curvedSeam", "precision"] }, "sven": { "code": "Joost De Cock", @@ -870,25 +868,13 @@ ] }, "otis": { - "code": "Wouter Van Wageningen", "description": "A FreeSewing pattern for a romper", + "code": "Wouter Van Wageningen", "design": "Wouter Van Wageningen", "difficulty": 2, "lab": true, "org": true, - "tags": [], - "techniques": [] - }, - "gozer": { - "code": "Coder name", - "description": "A FreeSewing pattern that needs a description", - "design": "Designer name", - "difficulty": 1, - "tags": [ - "tagname" - ], - "techniques": [ - "techname" - ] + "tags": [ ], + "techniques": [ ] } -} \ No newline at end of file +} From b797cdfdabd99c1e2696b9fec5e6d650c8d36971 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Tue, 17 Oct 2023 08:23:24 +0200 Subject: [PATCH 09/26] chore(gozer): Add part name to translation --- designs/gozer/i18n/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designs/gozer/i18n/en.json b/designs/gozer/i18n/en.json index ba34971f9bd..246e78dbffa 100644 --- a/designs/gozer/i18n/en.json +++ b/designs/gozer/i18n/en.json @@ -1,7 +1,9 @@ { "t": "Gozer", "d": "A FreeSewing pattern for a Halloween costume", - "p": { }, + "p": { + "ghost": "ghost" + }, "s": { }, "o": { } } From ded3347d2ca40229d65e20118ec564af177f0930 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Tue, 17 Oct 2023 08:29:47 +0200 Subject: [PATCH 10/26] chore: Various prebuild/reconfigure steps to integrate gozer --- config/software/designs.json | 2 + designs/gozer/README.md | 2 +- designs/gozer/package.json | 2 +- markdown/org/docs/designs/gozer/en.md | 2 - .../org/docs/designs/gozer/instructions/en.md | 2 +- sites/lab/hooks/use-design.mjs | 2 + .../account/patterns/gozer/[id]/edit.mjs | 98 +++++++++++++++++++ .../account/patterns/skully/[id]/edit.mjs | 98 +++++++++++++++++++ sites/lab/pages/new/gozer.mjs | 41 ++++++++ sites/lab/pages/new/skully.mjs | 41 ++++++++ sites/org/hooks/use-design.mjs | 2 + .../account/patterns/gozer/[id]/edit.mjs | 98 +++++++++++++++++++ sites/org/pages/new/gozer.mjs | 41 ++++++++ sites/shared/i18n/designs.mjs | 2 + .../prebuild/data/design-measurements.mjs | 2 +- sites/shared/prebuild/data/design-options.mjs | 2 +- sites/shared/prebuild/data/designs.mjs | 2 +- 17 files changed, 431 insertions(+), 8 deletions(-) create mode 100644 sites/lab/pages/account/patterns/gozer/[id]/edit.mjs create mode 100644 sites/lab/pages/account/patterns/skully/[id]/edit.mjs create mode 100644 sites/lab/pages/new/gozer.mjs create mode 100644 sites/lab/pages/new/skully.mjs create mode 100644 sites/org/pages/account/patterns/gozer/[id]/edit.mjs create mode 100644 sites/org/pages/new/gozer.mjs diff --git a/config/software/designs.json b/config/software/designs.json index 5265b8c98b6..57e5a160386 100644 --- a/config/software/designs.json +++ b/config/software/designs.json @@ -345,6 +345,8 @@ "description": "A FreeSewing pattern for a ghost costume", "design": "Wouter Van Wageningen", "difficulty": 1, + "lab": true, + "org": true, "tags": [ "costumes" ], diff --git a/designs/gozer/README.md b/designs/gozer/README.md index e730d3be4f7..de44fcfc4ac 100644 --- a/designs/gozer/README.md +++ b/designs/gozer/README.md @@ -48,7 +48,7 @@ # @freesewing/gozer -A FreeSewing pattern that needs a description +A FreeSewing pattern for a ghost costume diff --git a/designs/gozer/package.json b/designs/gozer/package.json index d3aa65886da..e958cacc86e 100644 --- a/designs/gozer/package.json +++ b/designs/gozer/package.json @@ -1,7 +1,7 @@ { "name": "@freesewing/gozer", "version": "3.0.0", - "description": "A FreeSewing pattern that needs a description", + "description": "A FreeSewing pattern for a ghost costume", "author": "Joost De Cock (https://github.com/joostdecock)", "homepage": "https://freesewing.org/", "repository": "github:freesewing/freesewing", diff --git a/markdown/org/docs/designs/gozer/en.md b/markdown/org/docs/designs/gozer/en.md index 4c57e0efe22..092973a5b4d 100644 --- a/markdown/org/docs/designs/gozer/en.md +++ b/markdown/org/docs/designs/gozer/en.md @@ -2,7 +2,5 @@ title: Gozer the ghost --- - - diff --git a/markdown/org/docs/designs/gozer/instructions/en.md b/markdown/org/docs/designs/gozer/instructions/en.md index 7f5d9d2550e..49538720737 100644 --- a/markdown/org/docs/designs/gozer/instructions/en.md +++ b/markdown/org/docs/designs/gozer/instructions/en.md @@ -12,4 +12,4 @@ title: "Gozer the ghost: Sewing Instructions" ## Step 3: Enjoy! -That's it, you are all done. Put it on and scare the neighborhood +That's it, you are all done. Put it on and scare the neighborhood. diff --git a/sites/lab/hooks/use-design.mjs b/sites/lab/hooks/use-design.mjs index a458be92ca1..7d120a9c25f 100644 --- a/sites/lab/hooks/use-design.mjs +++ b/sites/lab/hooks/use-design.mjs @@ -20,6 +20,7 @@ import { Cornelius as cornelius } from '@freesewing/cornelius' import { Diana as diana } from '@freesewing/diana' import { Florence as florence } from '@freesewing/florence' import { Florent as florent } from '@freesewing/florent' +import { Gozer as gozer } from '@freesewing/gozer' import { Hi as hi } from '@freesewing/hi' import { Holmes as holmes } from '@freesewing/holmes' import { Hortensia as hortensia } from '@freesewing/hortensia' @@ -73,6 +74,7 @@ const designs = { diana, florence, florent, + gozer, hi, holmes, hortensia, diff --git a/sites/lab/pages/account/patterns/gozer/[id]/edit.mjs b/sites/lab/pages/account/patterns/gozer/[id]/edit.mjs new file mode 100644 index 00000000000..dd37081ced8 --- /dev/null +++ b/sites/lab/pages/account/patterns/gozer/[id]/edit.mjs @@ -0,0 +1,98 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Gozer } from 'designs/gozer/src/index.mjs' +// Dependencies +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +import { nsMerge } 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('gozer', wbNs, pageNs) + +const EditDesignComponent = ({ id, design, Design, settings, docs }) => ( + +) + +const EditGozerPage = ({ page, docs, id }) => { + 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]) + } + } + if (id) getPattern() + }, [id]) + + return ( + // prettier-ignore + + {pattern ? ( + + ) : ( +
+

{t('account:oneMomentPLease')}

+ +
+ )} +
+ ) +} + +export default EditGozerPage + +export async function getStaticProps({ locale, params }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + id: params.id, + page: { + locale, + path: ['account', 'patterns', 'gozer', params.id, 'edit'], + title: 'Gozer', + }, + }, + } +} + +/* + * getStaticPaths() is used to specify for which routes (think URLs) + * this page should be used to generate the result. + */ +export async function getStaticPaths() { + return { + paths: [], + fallback: 'blocking', + } +} diff --git a/sites/lab/pages/account/patterns/skully/[id]/edit.mjs b/sites/lab/pages/account/patterns/skully/[id]/edit.mjs new file mode 100644 index 00000000000..c2e21bc495d --- /dev/null +++ b/sites/lab/pages/account/patterns/skully/[id]/edit.mjs @@ -0,0 +1,98 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Skully } from 'designs/skully/src/index.mjs' +// Dependencies +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +import { nsMerge } 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('skully', wbNs, pageNs) + +const EditDesignComponent = ({ id, design, Design, settings, docs }) => ( + +) + +const EditSkullyPage = ({ page, docs, id }) => { + 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]) + } + } + if (id) getPattern() + }, [id]) + + return ( + // prettier-ignore + + {pattern ? ( + + ) : ( +
+

{t('account:oneMomentPLease')}

+ +
+ )} +
+ ) +} + +export default EditSkullyPage + +export async function getStaticProps({ locale, params }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + id: params.id, + page: { + locale, + path: ['account', 'patterns', 'skully', params.id, 'edit'], + title: 'Skully', + }, + }, + } +} + +/* + * getStaticPaths() is used to specify for which routes (think URLs) + * this page should be used to generate the result. + */ +export async function getStaticPaths() { + return { + paths: [], + fallback: 'blocking', + } +} diff --git a/sites/lab/pages/new/gozer.mjs b/sites/lab/pages/new/gozer.mjs new file mode 100644 index 00000000000..617cd503546 --- /dev/null +++ b/sites/lab/pages/new/gozer.mjs @@ -0,0 +1,41 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Gozer } from 'designs/gozer/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('gozer', wbNs, pageNs) + +const NewGozerPage = ({ page, docs }) => ( + + + +) + +export default NewGozerPage + +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + page: { + locale, + path: ['new', 'gozer'], + title: 'Gozer', + }, + }, + } +} diff --git a/sites/lab/pages/new/skully.mjs b/sites/lab/pages/new/skully.mjs new file mode 100644 index 00000000000..a9168a7d1fe --- /dev/null +++ b/sites/lab/pages/new/skully.mjs @@ -0,0 +1,41 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Skully } from 'designs/skully/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('skully', wbNs, pageNs) + +const NewSkullyPage = ({ page, docs }) => ( + + + +) + +export default NewSkullyPage + +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + page: { + locale, + path: ['new', 'skully'], + title: 'Skully', + }, + }, + } +} diff --git a/sites/org/hooks/use-design.mjs b/sites/org/hooks/use-design.mjs index 7a974cd89c3..21cc71e204b 100644 --- a/sites/org/hooks/use-design.mjs +++ b/sites/org/hooks/use-design.mjs @@ -20,6 +20,7 @@ import { Cornelius as cornelius } from '@freesewing/cornelius' import { Diana as diana } from '@freesewing/diana' import { Florence as florence } from '@freesewing/florence' import { Florent as florent } from '@freesewing/florent' +import { Gozer as gozer } from '@freesewing/gozer' import { Hi as hi } from '@freesewing/hi' import { Holmes as holmes } from '@freesewing/holmes' import { Hortensia as hortensia } from '@freesewing/hortensia' @@ -70,6 +71,7 @@ const designs = { diana, florence, florent, + gozer, hi, holmes, hortensia, diff --git a/sites/org/pages/account/patterns/gozer/[id]/edit.mjs b/sites/org/pages/account/patterns/gozer/[id]/edit.mjs new file mode 100644 index 00000000000..dd37081ced8 --- /dev/null +++ b/sites/org/pages/account/patterns/gozer/[id]/edit.mjs @@ -0,0 +1,98 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Gozer } from 'designs/gozer/src/index.mjs' +// Dependencies +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +import { nsMerge } 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('gozer', wbNs, pageNs) + +const EditDesignComponent = ({ id, design, Design, settings, docs }) => ( + +) + +const EditGozerPage = ({ page, docs, id }) => { + 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]) + } + } + if (id) getPattern() + }, [id]) + + return ( + // prettier-ignore + + {pattern ? ( + + ) : ( +
+

{t('account:oneMomentPLease')}

+ +
+ )} +
+ ) +} + +export default EditGozerPage + +export async function getStaticProps({ locale, params }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + id: params.id, + page: { + locale, + path: ['account', 'patterns', 'gozer', params.id, 'edit'], + title: 'Gozer', + }, + }, + } +} + +/* + * getStaticPaths() is used to specify for which routes (think URLs) + * this page should be used to generate the result. + */ +export async function getStaticPaths() { + return { + paths: [], + fallback: 'blocking', + } +} diff --git a/sites/org/pages/new/gozer.mjs b/sites/org/pages/new/gozer.mjs new file mode 100644 index 00000000000..617cd503546 --- /dev/null +++ b/sites/org/pages/new/gozer.mjs @@ -0,0 +1,41 @@ +/* + * This page is auto-generated. Do not edit it by hand. + */ +import { Gozer } from 'designs/gozer/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('gozer', wbNs, pageNs) + +const NewGozerPage = ({ page, docs }) => ( + + + +) + +export default NewGozerPage + +export async function getStaticProps({ locale }) { + return { + props: { + ...(await serverSideTranslations(locale, ns)), + page: { + locale, + path: ['new', 'gozer'], + title: 'Gozer', + }, + }, + } +} diff --git a/sites/shared/i18n/designs.mjs b/sites/shared/i18n/designs.mjs index 29b734e31e4..1d1447e4b1c 100644 --- a/sites/shared/i18n/designs.mjs +++ b/sites/shared/i18n/designs.mjs @@ -21,6 +21,7 @@ import { i18n as diana } from '@freesewing/diana' import { i18n as examples } from '@freesewing/examples' import { i18n as florence } from '@freesewing/florence' import { i18n as florent } from '@freesewing/florent' +import { i18n as gozer } from '@freesewing/gozer' import { i18n as hi } from '@freesewing/hi' import { i18n as holmes } from '@freesewing/holmes' import { i18n as hortensia } from '@freesewing/hortensia' @@ -76,6 +77,7 @@ export const designs = { examples, florence, florent, + gozer, hi, holmes, hortensia, diff --git a/sites/shared/prebuild/data/design-measurements.mjs b/sites/shared/prebuild/data/design-measurements.mjs index 3871dfb8247..4896da415c2 100644 --- a/sites/shared/prebuild/data/design-measurements.mjs +++ b/sites/shared/prebuild/data/design-measurements.mjs @@ -1,3 +1,3 @@ // __SDEFILE__ - This file is a dependency for the stand-alone environment // This file is auto-generated by the prebuild script | Any changes will be overwritten -export const measurements = {"aaron":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips"],"albert":["chest","hpsToWaistBack","waist","waistToKnee","hips"],"bee":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope","bustPointToUnderbust"],"bella":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope"],"benjamin":["neck"],"bent":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","shoulderToElbow","shoulderToWrist","wrist"],"bob":[],"breanna":["biceps","bustFront","bustSpan","highBust","highBustFront","hpsToBust","hpsToWaistBack","hpsToWaistFront","waist","waistToHips","neck","shoulderToShoulder","shoulderSlope","shoulderToWrist","wrist"],"brian":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","shoulderToWrist","wrist"],"bruce":["hips","upperLeg","waistToHips","waistToUpperLeg"],"carlita":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","waistToFloor","waistToSeat","seat","highBust","bustSpan","shoulderToElbow","shoulderToWrist","wrist"],"carlton":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","waistToFloor","waistToSeat","seat","shoulderToElbow","shoulderToWrist","wrist"],"cathrin":["underbust","waist","hips","waistToUnderbust","waistToHips"],"charlie":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg"],"cornelius":["waist","hips","inseam","seat","waistToKnee","waistToHips","waistToFloor","knee"],"diana":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToWrist","wrist"],"examples":["head"],"florence":["head"],"florent":["head"],"hi":[],"holmes":["head"],"hortensia":[],"huey":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"hugo":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"jaeger":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToElbow","shoulderToWrist","wrist"],"legend":[],"lucy":[],"lunetius":["waistToKnee","waistToUpperLeg","waistToFloor","hpsToWaistBack","neck","shoulderToShoulder","shoulderToElbow","waistToHips"],"magde":[],"noble":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope"],"octoplushy":[],"paco":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg","heel"],"penelope":["waist","seat","waistToHips","waistToSeat","waistToKnee"],"plugintest":["seat","seatBack","waist","waistBack","crossSeam","crossSeamFront"],"rendertest":[],"sandy":["waist","waistToFloor","waistToHips","hips"],"shelly":["neck","chest","hips","waistToHips","hpsToWaistBack","waistToArmpit","biceps","wrist","shoulderToWrist"],"shin":["hips","upperLeg","waistToUpperLeg","waistToHips"],"simon":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","hips","shoulderToWrist","wrist"],"simone":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","hips","highBust","bustSpan","shoulderToWrist","wrist"],"skully":[],"sven":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToWrist","wrist"],"tamiko":["shoulderToShoulder","chest","hpsToWaistBack","shoulderSlope","waistToHips"],"teagan":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist"],"tiberius":["head","shoulderToElbow","shoulderToShoulder","biceps","hpsToWaistBack","waistToKnee","waist","chest","seat","hips","waistToFloor","waistToUpperLeg"],"titan":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg"],"trayvon":["hpsToWaistBack","waistToHips","neck"],"uma":["waist","seat","waistToSeat","waistToUpperLeg"],"wahid":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist"],"walburga":["head","shoulderToShoulder","hpsToWaistBack","waistToKnee","waistToHips","waistToFloor","waistToUpperLeg","neck"],"waralee":["seat","inseam","crotchDepth","waistToHips"],"yuri":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"otis":["waist"]} +export const measurements = {"aaron":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips"],"albert":["chest","hpsToWaistBack","waist","waistToKnee","hips"],"bee":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope","bustPointToUnderbust"],"bella":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope"],"benjamin":["neck"],"bent":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","shoulderToElbow","shoulderToWrist","wrist"],"bob":[],"breanna":["biceps","bustFront","bustSpan","highBust","highBustFront","hpsToBust","hpsToWaistBack","hpsToWaistFront","waist","waistToHips","neck","shoulderToShoulder","shoulderSlope","shoulderToWrist","wrist"],"brian":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","shoulderToWrist","wrist"],"bruce":["hips","upperLeg","waistToHips","waistToUpperLeg"],"carlita":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","waistToFloor","waistToSeat","seat","highBust","bustSpan","shoulderToElbow","shoulderToWrist","wrist"],"carlton":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","waistToFloor","waistToSeat","seat","shoulderToElbow","shoulderToWrist","wrist"],"cathrin":["underbust","waist","hips","waistToUnderbust","waistToHips"],"charlie":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg"],"cornelius":["waist","hips","inseam","seat","waistToKnee","waistToHips","waistToFloor","knee"],"diana":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToWrist","wrist"],"examples":["head"],"florence":["head"],"florent":["head"],"gozer":["hpsToWaistBack","waistToFloor","head"],"hi":[],"holmes":["head"],"hortensia":[],"huey":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"hugo":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"jaeger":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToElbow","shoulderToWrist","wrist"],"legend":[],"lucy":[],"lunetius":["waistToKnee","waistToUpperLeg","waistToFloor","hpsToWaistBack","neck","shoulderToShoulder","shoulderToElbow","waistToHips"],"magde":[],"noble":["highBust","chest","underbust","waist","waistBack","bustSpan","neck","hpsToBust","hpsToWaistFront","hpsToWaistBack","shoulderToShoulder","shoulderSlope"],"octoplushy":[],"paco":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg","heel"],"penelope":["waist","seat","waistToHips","waistToSeat","waistToKnee"],"plugintest":["seat","seatBack","waist","waistBack","crossSeam","crossSeamFront"],"rendertest":[],"sandy":["waist","waistToFloor","waistToHips","hips"],"shelly":["neck","chest","hips","waistToHips","hpsToWaistBack","waistToArmpit","biceps","wrist","shoulderToWrist"],"shin":["hips","upperLeg","waistToUpperLeg","waistToHips"],"simon":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","hips","shoulderToWrist","wrist"],"simone":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","waist","hips","highBust","bustSpan","shoulderToWrist","wrist"],"skully":[],"sven":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist","shoulderToWrist","wrist"],"tamiko":["shoulderToShoulder","chest","hpsToWaistBack","shoulderSlope","waistToHips"],"teagan":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist"],"tiberius":["head","shoulderToElbow","shoulderToShoulder","biceps","hpsToWaistBack","waistToKnee","waist","chest","seat","hips","waistToFloor","waistToUpperLeg"],"titan":["crossSeam","crossSeamFront","knee","seat","seatBack","waist","waistBack","waistToFloor","waistToKnee","waistToHips","waistToSeat","waistToUpperLeg"],"trayvon":["hpsToWaistBack","waistToHips","neck"],"uma":["waist","seat","waistToSeat","waistToUpperLeg"],"wahid":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","waist"],"walburga":["head","shoulderToShoulder","hpsToWaistBack","waistToKnee","waistToHips","waistToFloor","waistToUpperLeg","neck"],"waralee":["seat","inseam","crotchDepth","waistToHips"],"yuri":["biceps","chest","hpsToBust","hpsToWaistBack","neck","shoulderToShoulder","shoulderSlope","waistToArmpit","waistToHips","hips","shoulderToWrist","wrist","head"],"otis":["waist"]} diff --git a/sites/shared/prebuild/data/design-options.mjs b/sites/shared/prebuild/data/design-options.mjs index 1a96841df19..5f05f146987 100644 --- a/sites/shared/prebuild/data/design-options.mjs +++ b/sites/shared/prebuild/data/design-options.mjs @@ -1,3 +1,3 @@ // __SDEFILE__ - This file is a dependency for the stand-alone environment // This file is auto-generated by the prebuild script | Any changes will be overwritten -export const options = {"aaron":{"brianFitSleeve":false,"brianFitCollar":false,"collarFactor":4.8,"bicepsEase":0.05,"chestEase":{"pct":8,"min":0,"max":20,"menu":"style"},"collarEase":0,"cuffEase":0,"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":10,"min":-20,"max":60,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":0.97,"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":0.6,"backNeckCutout":0.05,"frontArmholeDeeper":0,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"hipsEase":{"pct":8,"min":0,"max":20,"menu":"fit"},"stretchFactor":{"pct":5,"min":0,"max":15,"menu":"fit"},"armholeDrop":{"pct":10,"min":0,"max":75,"menu":"style"},"necklineBend":{"pct":100,"min":40,"max":100,"menu":"style"},"necklineDrop":{"pct":20,"min":10,"max":35,"menu":"style"},"shoulderStrapWidth":{"pct":15,"min":10,"max":40,"menu":"style"},"shoulderStrapPlacement":{"pct":40,"min":20,"max":80,"menu":"style"},"backlineBend":{"pct":50,"min":25,"max":100,"menu":"style"},"knitBindingWidth":{"pct":600,"min":300,"max":800,"menu":"style"}},"albert":{"backOpening":{"pct":10,"min":0,"max":25,"menu":"fit"},"bibWidth":{"pct":100,"min":50,"max":125,"menu":"style"},"bibLength":{"pct":75,"min":0,"max":90,"menu":"style"},"lengthBonus":{"pct":0,"min":-20,"max":25,"menu":"style"},"chestDepth":{"pct":22,"min":15,"max":90,"menu":"fit"},"strapWidth":{"pct":60,"min":20,"max":100,"menu":"style"}},"bee":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":10,"min":0,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"advanced"},"bustDartCurve":1,"bustDartLength":1,"waistDartLength":1,"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"advanced"},"backArmholeCurvature":0.63,"backArmholePitchDepth":0.35,"backArmholeSlant":5,"frontArmholeCurvature":0.63,"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"advanced"},"backHemSlope":2.5,"backNeckCutout":0.06,"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"},"ties":{"bool":true,"menu":"style"},"crossBackTies":{"bool":false,"menu":"style"},"bandLength":{"pct":85,"min":75,"max":90,"menu":"style"},"neckTieLength":{"pct":80,"min":70,"max":100,"menu":"style"},"neckTieWidth":{"pct":6,"min":2,"max":18,"snap":{"metric":[6,13,19,25,32,38],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1]},"menu":"style"},"reversible":{"bool":false,"menu":"style"},"topDepth":{"pct":54,"min":50,"max":80,"menu":"fit"},"bottomCupDepth":{"pct":8,"min":0,"max":20,"menu":"fit"},"sideDepth":{"pct":20.6,"min":0,"max":30,"menu":"fit"},"sideCurve":{"pct":0,"min":-50,"max":50,"menu":"fit"},"frontCurve":{"pct":0,"min":-50,"max":50,"menu":"fit"},"bellaGuide":{"bool":false,"menu":"fit"},"pointedTieEnds":{"bool":false,"menu":"style"},"duoColorTies":{"bool":false,"menu":"style"},"bandTieWidth":{"pct":3,"min":1,"max":9,"snap":{"metric":[6,13,19,25,32,38],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1]},"menu":"style"},"bandTieLength":{"pct":35,"min":30,"max":50,"menu":"style"}},"bella":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":10,"min":0,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"darts"},"bustDartCurve":{"pct":100,"min":0,"max":100,"menu":"darts"},"bustDartLength":{"pct":90,"min":75,"max":100,"menu":"darts"},"waistDartLength":{"pct":90,"min":75,"max":95,"menu":"darts"},"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"armhole"},"backArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"backArmholePitchDepth":{"pct":35,"max":40,"min":30,"menu":"armhole"},"backArmholeSlant":{"deg":5,"min":1,"max":9,"menu":"armhole"},"frontArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"armhole"},"backHemSlope":{"deg":2.5,"min":0,"max":5,"menu":"advanced"},"backNeckCutout":{"pct":6,"min":3,"max":9,"menu":"advanced"},"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"}},"benjamin":{"transitionLength":2,"bandLength":0.17,"adjustmentRibbonWidth":20,"collarEase":{"pct":3,"min":0,"max":6,"menu":"fit"},"adjustmentRibbon":{"bool":false,"menu":"fit"},"tipWidth":{"pct":15,"min":0,"max":20,"menu":"style"},"knotWidth":{"pct":7,"min":5,"max":10,"menu":"style"},"bowLength":{"pct":28,"min":23,"max":33,"menu":"style"},"bowStyle":{"dflt":"butterfly","list":["diamond","butterfly","square","widesquare"],"menu":"style"},"endStyle":{"dflt":"straight","list":["straight","pointed","rounded"],"menu":"style"},"collarBandHeight":{"pct":6,"min":5,"max":8,"menu":"style"}},"bent":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"chestEase":{"pct":8,"min":-4,"max":20,"menu":"fit"},"collarEase":{"pct":3.5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":40,"min":2,"max":100,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":60,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-20,"max":15,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"}},"bob":{"neckRatio":{"pct":80,"min":70,"max":90,"menu":"fit"},"widthRatio":{"pct":45,"min":35,"max":55,"menu":"fit"},"lengthRatio":{"pct":75,"min":55,"max":85,"menu":"fit"},"headSize":{"pct":100,"min":10,"max":200,"snap":5,"menu":"size"}},"breanna":{"collarFactor":4.8,"armholeDepthBase":0.6,"shoulderSeamLength":0.95,"sleeveWidthGuarantee":0.9,"breannaFitSleeve":true,"breannaFitCollar":true,"shoulderDart":{"bool":false,"menu":"fit"},"waistDart":{"bool":true,"menu":"fit"},"primaryBustDart":{"list":["06:00","07:00","08:00","09:00","10:00","11:00","11:30","12:00","12:30","13:00","13:30","14:00","15:00","16:00","17:00"],"dflt":"06:00","doNotTranslate":true,"menu":"style"},"secondaryBustDart":{"list":["none","06:00","07:00","08:00","09:00","10:00","11:00","11:30","12:00","12:30","13:00","13:30","14:00","15:00","16:00","17:00"],"dflt":"13:30","doNotTranslate":true,"menu":"style"},"acrossBackFactor":{"pct":96,"min":93,"max":100,"menu":"advanced"},"armholeDepthFactor":{"pct":100,"min":80,"max":120,"menu":"advanced"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"shoulderDartSize":{"pct":7,"min":4,"max":10},"shoulderDartLength":{"pct":85,"min":60,"max":100},"waistDartSize":{"pct":10,"min":4,"max":15},"waistDartLength":{"pct":85,"min":60,"max":100},"verticalEase":{"pct":2,"min":0,"max":8,"menu":"fit"},"frontArmholeDeeper":{"pct":1,"min":0,"max":5,"menu":"advanced"},"shoulderEase":{"pct":0,"min":0,"max":4,"menu":"fit"},"collarEase":{"pct":3.5,"min":0,"max":10,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"waistEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"primaryBustDartShaping":{"pct":50,"min":25,"max":75,"menu":"style"},"primaryBustDartLength":{"pct":85,"min":65,"max":95,"menu":"style"},"secondaryBustDartLength":{"pct":85,"min":65,"max":95,"menu":"style"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":100,"menu":"advanced"},"frontScyeDart":{"pct":25,"min":0,"max":45,"menu":"fit"},"sleevecapEase":{"pct":0.5,"min":0,"max":2.5,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":110,"min":35,"max":165,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":45,"min":35,"max":55,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":3,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":5.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":4.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"cuffEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"}},"brian":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"}},"bruce":{"hipRatioFront":0.245,"hipRatioBack":0.315,"legRatioInset":0.3,"legRatioBack":0.32,"gussetRatio":0.0666,"gussetInsetRatio":0.6,"heightRatioInset":0.65,"bulge":{"deg":20,"min":0,"max":40,"menu":"fit"},"legBonus":{"pct":0,"min":-10,"max":20,"menu":"style"},"rise":{"pct":10,"min":0,"max":25,"menu":"style"},"stretch":{"pct":15,"min":5,"max":25,"menu":"fit"},"legStretch":{"pct":40,"min":25,"max":45,"menu":"fit"},"backRise":{"pct":5,"min":0,"max":10,"menu":"fit"}},"carlita":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"collarEase":0.145,"cuffEase":{"pct":60,"min":30,"max":100,"menu":"fit"},"draftForHighBust":true,"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":0,"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"fit"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":65,"min":50,"max":70,"menu":"fit"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":12,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"buttonSpacingHorizontal":{"pct":43.5,"min":15,"max":60,"menu":"style"},"length":{"pct":69,"min":35,"max":100,"menu":"style"},"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"pocketPlacementHorizontal":{"pct":11,"min":5,"max":20,"menu":"pockets"},"pocketPlacementVertical":{"pct":6,"min":5,"max":60,"menu":"pockets"},"pocketWidth":{"pct":95,"min":70,"max":120,"menu":"pockets"},"pocketHeight":{"pct":15,"min":0,"max":40,"menu":"pockets"},"pocketRadius":{"pct":20,"min":0,"max":50,"menu":"pockets"},"pocketFlapRadius":{"pct":15,"min":0,"max":50,"menu":"pockets"},"chestPocketPlacement":{"pct":55,"min":30,"max":65,"menu":"pockets"},"chestPocketAngle":0,"chestPocketHeight":{"pct":60,"min":40,"max":80,"menu":"pockets"},"chestPocketWidth":{"pct":25,"min":15,"max":50,"menu":"pockets"},"innerPocketPlacement":{"pct":53,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"seatEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"contour":{"pct":50,"min":25,"max":75,"menu":"advanced"},"backPleat":0.048,"beltWidth":{"pct":15,"min":10,"max":20,"menu":"style"},"sleeveLengthBonus":{"pct":7,"min":0,"max":20,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"cuffLength":{"pct":15,"min":10,"max":20,"menu":"style"},"chestShapingMax":5,"collarHeight":{"pct":9.6,"min":8,"max":11,"menu":"collar"},"collarFlare":{"pct":20,"min":0,"max":40,"menu":"collar"},"collarSpread":{"deg":4,"min":2,"max":6,"menu":"collar"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"}},"carlton":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"collarEase":0.145,"cuffEase":{"pct":60,"min":30,"max":100,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":0,"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"fit"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":65,"min":50,"max":70,"menu":"fit"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":12,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"buttonSpacingHorizontal":{"pct":43.5,"min":15,"max":60,"menu":"style"},"length":{"pct":69,"min":35,"max":100,"menu":"style"},"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"pocketPlacementHorizontal":{"pct":11,"min":5,"max":20,"menu":"pockets"},"pocketPlacementVertical":{"pct":6,"min":5,"max":60,"menu":"pockets"},"pocketWidth":{"pct":95,"min":70,"max":120,"menu":"pockets"},"pocketHeight":{"pct":15,"min":0,"max":40,"menu":"pockets"},"pocketRadius":{"pct":20,"min":0,"max":50,"menu":"pockets"},"pocketFlapRadius":{"pct":15,"min":0,"max":50,"menu":"pockets"},"chestPocketPlacement":{"pct":55,"min":30,"max":65,"menu":"pockets"},"chestPocketAngle":{"deg":4,"min":0,"max":6,"menu":"pockets"},"chestPocketHeight":{"pct":60,"min":40,"max":80,"menu":"pockets"},"chestPocketWidth":{"pct":25,"min":15,"max":50,"menu":"pockets"},"innerPocketPlacement":{"pct":53,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"seatEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"backPleat":0.048,"beltWidth":{"pct":15,"min":10,"max":20,"menu":"style"},"sleeveLengthBonus":{"pct":7,"min":0,"max":20,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"cuffLength":{"pct":15,"min":10,"max":20,"menu":"style"},"chestShapingMax":5,"collarHeight":{"pct":9.6,"min":8,"max":11,"menu":"collar"},"collarFlare":{"pct":20,"min":0,"max":40,"menu":"collar"},"collarSpread":{"deg":4,"min":2,"max":6,"menu":"collar"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"}},"cathrin":{"waistReduction":{"pct":10,"min":2,"max":20,"menu":"fit"},"panels":{"list":["11","13"],"dflt":"13","menu":"fit"},"backOpening":{"pct":4,"min":3,"max":10,"menu":"style"},"backRise":{"pct":15,"min":1,"max":25,"menu":"style"},"backDrop":{"pct":2,"min":0,"max":5,"menu":"style"},"frontRise":{"pct":4,"min":0.1,"max":8,"menu":"style"},"frontDrop":{"pct":5,"min":0,"max":10,"menu":"style"},"hipRise":{"pct":5,"min":0,"max":15,"menu":"style"}},"charlie":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":false,"waistEase":{"pct":1,"min":0,"max":5,"menu":"fit"},"seatEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"kneeEase":{"pct":15,"min":10,"max":30,"menu":"fit"},"waistHeight":{"pct":-4,"min":-15,"max":40,"menu":"style"},"lengthBonus":{"pct":2,"min":-20,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":15,"menu":"style"},"fitKnee":true,"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":55,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":50,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"waistbandReduction":0.25,"waistbandFactor":0.1,"frontPocketSlantDepth":{"pct":85,"min":70,"max":100,"menu":"pockets.frontpockets"},"frontPocketSlantWidth":{"pct":25,"min":15,"max":35,"menu":"pockets.frontpockets"},"frontPocketSlantRound":{"pct":30,"min":5,"max":50,"menu":"pockets.frontpockets"},"frontPocketSlantBend":{"pct":25,"min":5,"max":50,"menu":"pockets.frontpockets"},"frontPocketWidth":{"pct":55,"min":45,"max":65,"menu":"pockets.frontpockets"},"frontPocketDepth":{"pct":100,"min":85,"max":110,"menu":"pockets.frontpockets"},"frontPocketFacing":{"pct":45,"min":25,"max":65,"menu":"pockets.frontpockets"},"flyCurve":{"pct":72,"min":50,"max":100,"menu":"advanced.fly"},"flyLength":{"pct":45,"min":30,"max":60,"menu":"advanced.fly"},"flyWidth":{"pct":15,"min":10,"max":20,"menu":"advanced.fly"},"backPocketVerticalPlacement":{"pct":24,"min":18,"max":30,"menu":"pockets.backpockets"},"backPocketHorizontalPlacement":{"pct":55,"min":48,"max":62,"menu":"pockets.backpockets"},"backPocketWidth":{"pct":55,"min":50,"max":60,"menu":"pockets.backpockets"},"backPocketDepth":{"pct":60,"min":40,"max":80,"menu":"pockets.backpockets"},"backPocketFacing":{"bool":true,"menu":"pockets.backpockets"},"waistbandCurve":{"pct":0,"min":0,"max":35,"menu":"fit"},"beltLoops":{"count":8,"min":6,"max":12,"menu":"advanced"}},"cornelius":{"pctAtoO":0.5,"pctAtoC":0.25,"pctUtoA":0.25,"pctJtoA":0.25,"pctSeatAdjustment":0.5,"ventLength":{"pct":70,"min":25,"max":110,"menu":"style"},"fullness":{"pct":0,"min":0,"max":55,"menu":"fit"},"waistbandBelowWaist":{"pct":5,"min":0,"max":15,"menu":"style"},"waistReduction":{"pct":1,"min":-2,"max":10,"menu":"fit"},"bandBelowKnee":{"pct":25,"min":15,"max":50,"menu":"advanced"},"pctZtoR":0.35,"pctRtoZin":0.75,"pctRtoZup":0.25,"pctRtoKin":0.75,"pctRtoKdown":0.25,"pctKtoRout":0.15,"pctKtoRup":0.25,"pctKtoH":0.7,"flyWidth":{"pct":0.38,"min":0.2,"max":0.6,"menu":"style"},"kneeToBelow":{"pct":94,"min":85,"max":110,"menu":"advanced"},"cuffWidth":{"pct":0,"min":-50,"max":150,"menu":"style"},"cuffStyle":{"dflt":"elegant","list":["traditional","elegant","keystone"],"menu":"style"}},"diana":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":0,"min":-5,"max":50,"menu":"fit"},"chestEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"collarEase":0,"cuffEase":{"pct":20,"min":0,"max":30,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":0,"max":50,"menu":"fit"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":0,"min":0,"max":20,"menu":"advanced"},"armholeDepthFactor":{"pct":55,"min":50,"max":70,"menu":"advanced"},"backNeckCutout":0.05,"frontArmholeDeeper":{"pct":0,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"drapeAngle":{"deg":20,"min":10,"max":30,"menu":"style"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"fit"},"shoulderSeamLength":{"pct":35,"min":0.1,"max":60,"menu":"style"},"waistEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"hipsEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":100,"min":35,"max":165,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":3,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":5.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":4.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":6,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"}},"examples":{"size":{"pct":50,"min":5,"max":100,"menu":"stack"},"x":{"pct":0,"min":-100,"max":100,"menu":"stack"},"y":{"pct":0,"min":-100,"max":100,"menu":"stack"},"stackIt":{"dflt":"Do stack","list":["Do stack","Do not stack"],"menu":"stack"}},"florence":{"length":{"pct":40,"min":35,"max":45,"menu":"fit"},"height":{"pct":26,"min":23,"max":29,"menu":"fit"},"curve":{"pct":12.5,"min":10,"max":15,"menu":"fit"}},"florent":{"topSide":0.8,"brim":0,"headEase":{"pct":2,"min":0,"max":5,"menu":"fit"}},"hi":{"length":1000,"size":{"pct":100,"min":5,"max":500,"menu":"style"},"nosePointiness":{"pct":0,"min":-5,"max":10,"menu":"style"},"aggressive":{"bool":false,"menu":"style"},"hungry":{"pct":50,"min":0,"max":100,"menu":"style"}},"holmes":{"headEase":{"pct":3,"min":0,"max":9,"snap":{"metric":[6,13,19,25,32,38,44,50],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1,44.45,50.8]},"menu":"fit"},"lengthRatio":{"pct":55,"min":40,"max":60,"menu":"style"},"gores":{"count":6,"min":4,"max":20,"menu":"style"},"visorAngle":{"deg":45,"min":10,"max":90,"menu":"style"},"visorWidth":{"pct":5,"min":1,"max":17,"snap":5,"menu":"style"},"visorLength":{"pct":100,"min":80,"max":150,"menu":"advanced"},"earLength":{"pct":100,"min":80,"max":150,"menu":"style"},"earWidth":{"pct":100,"min":80,"max":150,"menu":"style"},"buttonhole":{"bool":false,"menu":"style"}},"hortensia":{"width":230,"height":330,"size":{"pct":50,"min":20,"max":200,"menu":"style"},"zipperSize":{"dflt":"#5","list":["#3","#4","#4.5","#5","#6","#8","#10","invisible"],"menu":"style"},"minHandleSpaceWidth":80,"maxHandleSpaceWidth":250,"pctHandleSpace":50,"pctHandleVert":42,"handleWidth":{"pct":8.6,"min":4,"max":25,"menu":"style"},"strapLength":{"pct":160,"min":75,"max":250,"menu":"style"}},"huey":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"ribbing":{"bool":true,"menu":"style"},"ribbingHeight":{"pct":10,"min":5,"max":15,"menu":"style"},"hipsEase":{"pct":8,"min":4,"max":12,"menu":"fit"},"pocket":{"bool":true,"menu":"style"},"pocketHeight":{"pct":30,"min":25,"max":35,"menu":"style"},"pocketWidth":{"pct":60,"min":50,"max":70,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"},"hoodHeight":{"pct":59,"min":55,"max":65,"menu":"style"},"hoodCutback":{"pct":10,"min":5,"max":15,"menu":"style"},"hoodClosure":{"pct":13.5,"min":10,"max":15,"menu":"style"},"hoodDepth":{"pct":8.5,"min":5,"max":12,"menu":"style"},"hoodAngle":{"deg":5,"min":2,"max":8,"menu":"style"},"ribbingStretch":{"pct":15,"min":0,"max":30,"menu":"fit"}},"hugo":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":8,"min":4,"max":20,"menu":"fit"},"collarEase":0.05,"cuffEase":{"pct":20,"min":10,"max":50,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":10,"min":0,"max":20,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":0.5,"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":0,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"hipsEase":{"pct":12,"min":4,"max":20,"menu":"fit"},"ribbingHeight":{"pct":10,"min":4,"max":20,"menu":"style"},"pocketWidth":{"pct":50,"min":35,"max":65,"menu":"style"},"sleevecapEase":0,"sleevecapTopFactorX":0.5,"sleevecapTopFactorY":0.45,"sleevecapBackFactorX":0.6,"sleevecapBackFactorY":0.33,"sleevecapFrontFactorX":0.55,"sleevecapFrontFactorY":0.33,"sleevecapQ1Offset":0.017,"sleevecapQ2Offset":0.035,"sleevecapQ3Offset":0.025,"sleevecapQ4Offset":0.01,"sleevecapQ1Spread1":0.1,"sleevecapQ1Spread2":0.15,"sleevecapQ2Spread1":0.15,"sleevecapQ2Spread2":0.1,"sleevecapQ3Spread1":0.1,"sleevecapQ3Spread2":0.08,"sleevecapQ4Spread1":0.07,"sleevecapQ4Spread2":0.063,"sleeveWidthGuarantee":0.9,"sleeveLengthBonus":{"pct":2,"min":0,"max":10,"menu":"style"},"ribbingStretch":{"pct":5,"min":0,"max":10,"menu":"fit"}},"jaeger":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":19,"min":10,"max":25,"menu":"fit"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"centerBackDart":{"pct":0.5,"min":0,"max":1.5,"menu":"fit"},"hipsEase":{"pct":12,"min":8,"max":20,"menu":"fit"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"rollLineCollarHeight":{"pct":6,"min":5,"max":9,"menu":"collar"},"reduceWaistStandardFraction":0.08,"reduceWaistDartFraction":0.05,"reduceHipsStandardFraction":0.1,"centerFrontHemDrop":{"pct":2,"min":0,"max":4,"menu":"style"},"frontPocketPlacement":{"pct":75,"min":65,"max":85,"menu":"pockets"},"frontPocketWidth":{"pct":68,"min":55,"max":75,"menu":"pockets"},"frontPocketDepth":{"pct":110,"min":80,"max":130,"menu":"pockets"},"frontPocketRadius":{"pct":10,"min":0,"max":50,"menu":"pockets"},"frontDartPlacement":{"pct":55,"min":45,"max":60,"menu":"advanced"},"sideFrontPlacement":{"pct":85,"min":80,"max":90,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"innerPocketPlacement":{"pct":52,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"frontCutawayAngle":{"deg":2.5,"min":1,"max":4,"menu":"style"},"frontCutawayStart":{"pct":30,"min":10,"max":70,"menu":"style"},"frontCutawayEnd":{"pct":40,"min":10,"max":40,"menu":"style"},"hemRadius":{"pct":100,"min":35,"max":100,"menu":"style"},"chestPocketDepth":{"pct":110,"min":70,"max":150,"menu":"pockets"},"chestPocketWidth":{"pct":37,"min":30,"max":45,"menu":"pockets"},"chestPocketPlacement":{"pct":52,"min":40,"max":60,"menu":"pockets"},"chestPocketAngle":{"deg":2.5,"min":0,"max":7,"menu":"pockets"},"chestPocketWeltSize":{"pct":17.5,"min":10,"max":25,"menu":"pockets"},"lapelStart":{"pct":10,"min":0,"max":35,"menu":"style"},"collarHeight":{"pct":9,"min":7,"max":10,"menu":"collar"},"collarNotchDepth":{"pct":15,"min":15,"max":50,"menu":"collar"},"collarNotchAngle":{"deg":45,"min":30,"max":60,"menu":"collar"},"collarNotchReturn":{"pct":100,"min":50,"max":100,"menu":"collar"},"chestShaping":{"pct":30,"min":0,"max":100,"menu":"advanced"},"buttons":{"list":["1","2","3"],"dflt":"2","menu":"style"},"buttonLength":{"pct":30,"min":30,"max":60,"menu":"style"},"chestShapingMax":5,"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"style"},"backVent":{"count":1,"min":0,"max":2,"menu":"style"},"backVentLength":{"pct":35,"min":15,"max":100,"menu":"style"},"collarSpread":{"deg":13,"min":5,"max":35,"menu":"collar"},"collarRoll":{"pct":5,"min":0,"max":10,"menu":"collar"},"pocketFoldover":{"pct":25,"min":15,"max":35,"menu":"pockets"},"sleeveLengthBonus":{"pct":0,"min":-20,"max":15,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"sleeveVentLength":{"pct":35,"min":25,"max":55,"menu":"sleeves"},"sleeveVentWidth":{"pct":18,"min":10,"max":26,"menu":"sleeves"}},"legend":{},"lucy":{"width":{"pct":50,"min":30,"max":100,"menu":"style"},"length":{"pct":50,"min":30,"max":100,"menu":"style"},"edge":{"pct":25,"min":20,"max":50,"menu":"style"}},"lunetius":{"lengthRatio":{"pct":105,"min":60,"max":130,"menu":"style"},"widthRatio":{"pct":100,"min":50,"max":130,"menu":"style"},"length":{"list":["toKnee","toBelowKnee","toHips","toUpperLeg","toFloor"],"dflt":"toBelowKnee","menu":"style"}},"magde":{"size":{"pct":100,"min":15,"max":200,"menu":"style"},"taperRatio":{"pct":60,"min":50,"max":100,"menu":"style"},"flapHeightRatio":{"pct":83,"min":60,"max":100,"menu":"style"},"openingRatio":{"pct":66,"min":30,"max":90,"menu":"style"},"onePieceLid":{"bool":false,"menu":"style"},"useCommonWebbingSizes":{"bool":true,"menu":"style"}},"noble":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":0,"min":-5,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"darts"},"bustDartCurve":1,"bustDartLength":0.9,"waistDartLength":{"pct":90,"min":75,"max":95,"menu":"darts"},"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"armhole"},"backArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"backArmholePitchDepth":{"pct":35,"max":40,"min":30,"menu":"armhole"},"backArmholeSlant":{"deg":5,"min":1,"max":9,"menu":"armhole"},"frontArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"armhole"},"backHemSlope":{"deg":2.5,"min":0,"max":5,"menu":"advanced"},"backNeckCutout":{"pct":6,"min":3,"max":9,"menu":"advanced"},"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"},"armholeDartPosition":{"pct":50,"min":10,"max":90},"dartPosition":{"dflt":"shoulder","list":["shoulder","armhole"],"menu":"darts"},"shoulderDartPosition":{"pct":50,"min":10,"max":90},"shoulderToShoulderCorrection":0.995,"upperDartLength":{"pct":90,"min":80,"max":95,"menu":"darts"}},"octoplushy":{"sizeConstant":200,"size":{"pct":100,"min":5,"max":500,"menu":"style"},"type":{"dflt":"octoplushy","list":["octoplushy","octopus","squid"],"menu":"style"},"armWidth":{"pct":15,"min":10,"max":30,"menu":"style"},"armLength":{"pct":200,"min":100,"max":500,"menu":"style"},"neckWidth":{"pct":25,"min":25,"max":45,"menu":"style"},"armTaper":{"pct":25,"min":0,"max":50,"menu":"style"},"bottomTopArmRatio":{"pct":57,"min":25,"max":75,"menu":"style"},"bottomArmReduction":{"pct":90,"min":75,"max":125},"bottomArmReductionPlushy":{"pct":80,"min":75,"max":125}},"paco":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":false,"waistEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"seatEase":{"pct":5,"min":0,"max":15,"menu":"fit"},"kneeEase":0.06,"waistHeight":{"pct":5,"min":0,"max":100,"menu":"style"},"lengthBonus":{"pct":0,"min":-15,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":10,"menu":"style"},"fitKnee":false,"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":60,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":45,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"elastic"},"titanPaperless":false,"frontPocketHeelRatio":0.4,"backPocketWaistRatio":0.4,"backPocketHeightRatio":0.4,"backPocketWidthRatio":0.37,"waistbandHeight":0,"elasticatedCuff":{"bool":true,"menu":"style"},"ankleElastic":{"pct":5,"min":1,"max":13,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"elastic"},"heelEase":{"pct":5,"min":0,"max":50,"menu":"elastic"},"frontPockets":{"bool":true,"menu":"pockets"},"backPockets":{"bool":false,"menu":"pockets"},"frontPocketFlapSize":{"pct":3,"min":3,"max":3,"snap":{"metric":1,"imperial":0.79375},"menu":false},"weltFactor":0.15},"penelope":{"dartMaximumDifference":0.344,"dartMinimumDifference":0.2,"dartMinimumWidth":0.006888,"dartSideMinimum":10,"dartBackControl1":0.114,"dartBackControl2":5,"dartBackControl3":4,"curvePlacement":2.4,"dart2offset":32,"dart2factor":0.8,"hipCurveDividerDown":40,"hipCurveDividerUp":3,"sideSeamShiftPercentage":0.006,"backVentWidth":0.1,"paperlessOffset":15,"curvedDartControlAngle":2,"curvedDartTopControlOffset":0.2,"curvedDartBottomControlOffset":0.4,"curvedDarts":{"bool":true,"menu":"style"},"lengthBonus":{"pct":0,"min":-50,"max":50,"menu":"style"},"hemBonus":{"pct":0,"min":-35,"max":0,"menu":"style"},"hem":{"pct":2,"min":0,"max":5,"menu":"style"},"backVent":{"bool":true,"menu":"style"},"backVentLength":{"pct":40,"min":5,"max":70},"zipperLocation":{"dflt":"backSeam","list":["backSeam","sideSeam"],"menu":"style"},"nrOfDarts":{"count":2,"min":1,"max":2,"menu":"style"},"seatEase":{"pct":1,"min":0,"max":8,"menu":"fit"},"waistEase":{"pct":1,"min":0,"max":8,"menu":"fit"},"backDartDepthFactor":{"pct":50,"min":35,"max":70,"menu":"advanced"},"frontDartDepthFactor":{"pct":45,"min":30,"max":65,"menu":"advanced"},"dartToSideSeamFactor":{"pct":50,"min":30,"max":70,"menu":"advanced"},"waistband":{"bool":true,"menu":"style"},"waistbandWidth":{"pct":10,"min":5,"max":20},"waistbandOverlap":{"pct":3.5,"min":0,"max":10}},"plugintest":{"plugin":{"dflt":"all","list":["all","annotations","flip","gore","i18n","measurements","mirror","round","sprinkle","title","versionfreeSvg"],"menu":"tests"},"bannerDy":{"count":-1,"min":-15,"max":15,"menu":"annotations.banner"},"bannerSpaces":{"count":10,"min":0,"max":20,"menu":"annotations.banner"},"bannerRepeat":{"count":10,"min":1,"max":20,"menu":"annotations.banner"},"bartackLength":{"count":15,"min":2,"max":100,"menu":"annotations.bartack"},"bartackAngle":{"count":0,"min":-360,"max":360,"menu":"annotations.bartack"},"bartackDensity":{"count":3,"min":1,"max":5,"menu":"annotations.bartack"},"bartackWidth":{"count":3,"min":1,"max":5,"menu":"annotations.bartack"},"bartackStart":{"pct":25,"min":0,"max":100,"menu":"annotations.bartack"},"bartackEnd":{"pct":75,"min":0,"max":100,"menu":"annotations.bartack"},"crossboxText":{"bool":true,"menu":"annotations.crossboxText"},"cutonfoldMargin":{"pct":5,"min":0,"max":25,"menu":"annotations.cutonfold"},"cutonfoldOffset":{"count":15,"min":0,"max":100,"menu":"annotations.cutonfold"},"cutonfoldGrainline":{"bool":false,"menu":"annotations.cutonfold"},"dimensionsCustomText":{"bool":false,"menu":"annotations.dimensions"},"dimensionsEndMarker":{"bool":true,"menu":"annotations.dimensions"},"dimensionsStartMarker":{"bool":true,"menu":"annotations.dimensions"},"logoScale":{"pct":100,"min":10,"max":200,"menu":"annotations.logo"},"logoRotate":{"deg":0,"min":-360,"max":360,"menu":"annotations.logo"},"pleatMargin":{"count":35,"min":0,"max":50,"menu":"annotations.pleat"},"pleatReverse":{"bool":false,"menu":"annotations.pleat"},"scaleboxRotation":{"deg":0,"min":0,"max":360,"menu":"annotations.scalebox"},"scaleboxText":{"dflt":"default","list":["default","custom","suppress"],"menu":"annotations.scalebox"},"sewtogetherHinge":{"bool":true,"menu":"annotations.sewtogether"},"sewtogetherMiddle":{"bool":false,"menu":"annotations.sewtogether"},"titleNr":{"count":1,"min":0,"max":100,"menu":"annotations.title"},"titleTitle":{"bool":true,"menu":"annotations.title"},"titleMeta":{"bool":true,"menu":"annotations.title"},"titleScale":{"pct":100,"min":10,"max":200,"menu":"annotations.title"},"titleRotate":{"deg":0,"min":-360,"max":360,"menu":"annotations.title"},"snippetScale":{"pct":100,"min":10,"max":200,"menu":"annotations.snippets"},"snippetRotation":{"deg":0,"min":-360,"max":360,"menu":"annotations.snippets"},"flipAxis":{"dflt":"x","list":["x","y"],"menu":"flip"},"goreRadius":{"count":20,"min":10,"max":30,"menu":"gore"},"goreGoreNumber":{"count":6,"min":4,"max":8,"menu":"gore"},"goreExtraLength":{"count":10,"min":0,"max":20,"menu":"gore"},"mirrorLine":{"dflt":"a","list":["a","b","none"],"menu":"mirror"},"mirrorClone":{"bool":true,"menu":"mirror"},"roundRadius":{"count":10,"min":0,"max":50,"menu":"round"},"roundHide":{"bool":false,"menu":"round"},"sprinkleScale":{"pct":100,"min":10,"max":200,"menu":"sprinkle"},"sprinkleRotate":{"deg":0,"min":-360,"max":360,"menu":"sprinkle"},"sprinkleSnippet":{"dflt":"bnotch","list":["notch","bnotch","button","buttonhole","buttonhole-start","buttonhole-end","snap-stud","snap-socket","logo"],"menu":"sprinkle"}},"rendertest":{"width":{"mm":200,"min":50,"max":500,"testIgnore":false},"only":{"menu":"show","dflt":"false","list":["false","circles","colors","widths","styles","combos","text","snippets","macros"]}},"sandy":{"minimumOverlap":15,"seamlessFullCircle":{"bool":false,"menu":"construction"},"waistbandWidth":{"pct":4,"min":1,"max":8,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"waistbandPosition":{"pct":50,"min":0,"max":100,"menu":"fit"},"lengthBonus":{"pct":50,"min":10,"max":100,"menu":"style"},"circleRatio":{"pct":50,"min":20,"max":100,"menu":"style"},"waistbandOverlap":{"pct":3,"min":0,"max":15,"menu":"style"},"gathering":{"pct":0,"min":0,"max":200,"menu":"style"},"hemWidth":{"pct":2,"min":1,"max":10,"menu":"construction"},"waistbandShape":{"list":["straight","curved"],"dflt":"straight","menu":"fit"}},"shelly":{"neckEase":{"pct":50,"min":-30,"max":150,"menu":"fit"},"chestEase":{"pct":0,"min":-40,"max":50,"menu":"fit"},"straightSides":{"bool":true,"menu":"advanced"},"hipsEase":{"pct":0,"min":-30,"max":75,"menu":"advanced"},"bodyLength":{"pct":120,"min":20,"max":300,"menu":"style"},"neckBalance":{"pct":40,"min":0,"max":80,"menu":"fit"},"raglanScoopLength":{"pct":20,"min":0,"max":50,"menu":"advanced"},"raglanScoopMagnitude":{"pct":6,"min":0,"max":20,"menu":"advanced"},"hemWidth":{"pct":2,"min":0,"max":8,"menu":"construction"},"sideShape":{"pct":0,"min":-20,"max":20,"menu":"advanced"},"armholeTweakFactor":1.1,"bicepsPosition":0.2,"sleeveEase":{"pct":0,"min":-30,"max":50,"menu":"fit"},"wristEase":{"pct":0,"min":-30,"max":50,"menu":"fit"},"sleeveLength":{"pct":20,"min":0,"max":125,"menu":"style"},"sleeveHem":{"pct":2,"min":0,"max":8,"menu":"construction"},"neckbandLength":{"pct":80,"min":50,"max":100,"menu":"fit"},"neckbandWidth":{"pct":7.5,"min":0,"max":50,"menu":"fit"}},"shin":{"frontFactor":0.58,"legFrontFactor":0.48,"gussetFactor":0.0714,"angle":10,"elasticWidth":{"pct":10,"min":4,"max":20,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"stretch":{"pct":20,"min":10,"max":30,"menu":"fit"},"bulge":{"pct":2.5,"min":0,"max":5,"menu":"fit"},"legReduction":{"pct":5,"min":0,"max":10,"menu":"fit"},"rise":{"pct":0,"min":0,"max":25,"menu":"style"},"backRise":{"pct":5,"min":0,"max":10,"menu":"fit"}},"simon":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":2,"min":0,"max":15,"menu":"fit"},"lengthBonus":{"pct":25,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"backDarts":{"list":["auto","never","always"],"dflt":"auto","menu":"style"},"backDartShaping":{"pct":25,"min":5,"max":75,"menu":"advanced"},"boxPleat":{"bool":false,"menu":"style"},"boxPleatFold":{"pct":15,"min":10,"max":20,"menu":"advanced"},"boxPleatWidth":{"pct":7,"min":4,"max":10,"menu":"advanced"},"roundBack":{"pct":0,"min":0,"max":10,"menu":"fit"},"buttonholePlacketWidth":{"pct":8,"min":4,"max":12,"menu":"style.closure"},"buttonholePlacketFoldWidth":{"pct":16,"min":8,"max":24,"menu":"style.closure"},"buttonPlacketWidth":{"pct":5,"min":2,"max":8,"menu":"style.closure"},"hemCurve":{"pct":50,"min":25,"max":100,"menu":"style"},"hemStyle":{"list":["straight","baseball","slashed"],"dflt":"straight","menu":"style"},"hipsEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"yokeHeight":{"pct":70,"min":40,"max":90,"menu":"style"},"sleevePlacketWidth":{"pct":13,"min":8,"max":18,"menu":"style.cuffs"},"waistEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"buttonFreeLength":{"pct":2,"min":0,"max":15,"menu":"style.closure"},"extraTopButton":{"bool":true,"menu":"style.closure"},"separateButtonPlacket":{"bool":false,"menu":"style.closure"},"separateButtonholePlacket":{"bool":false,"menu":"style.closure"},"buttons":{"count":7,"min":4,"max":12,"menu":"style.closure"},"ffsa":{"pct":150,"min":100,"max":200,"menu":"advanced"},"collarAngle":{"deg":85,"min":60,"max":130,"menu":"style.collar"},"collarBend":{"pct":3.5,"min":0,"max":10,"menu":"style.collar"},"collarFlare":{"deg":3.5,"min":0,"max":10,"menu":"style.collar"},"collarGap":{"pct":2.5,"min":0,"max":6,"menu":"style.collar"},"collarRoll":{"pct":3,"min":0,"max":6,"menu":"style.collar"},"collarStandBend":{"deg":3,"min":0,"max":5,"menu":"style.collar"},"collarStandCurve":{"deg":2,"min":0,"max":5,"menu":"style.collar"},"collarStandWidth":{"pct":8,"min":3,"max":13,"menu":"style.collar"},"cuffOverlap":0.15,"barrelCuffNarrowButton":{"bool":true,"menu":"style.cuffs"},"cuffButtonRows":{"count":1,"min":1,"max":2,"menu":"style.cuffs"},"cuffDrape":{"pct":5,"min":0,"max":10,"menu":"style.cuffs"},"cuffLength":{"pct":10,"min":3,"max":15,"menu":"style.cuffs"},"cuffStyle":{"list":["roundedBarrelCuff","angledBarrelCuff","straightBarrelCuff","roundedFrenchCuff","angledFrenchCuff","straightFrenchCuff"],"dflt":"angledBarrelCuff","menu":"style.cuffs"},"buttonPlacketStyle":{"list":["classic","seamless"],"dflt":"classic"},"buttonholePlacketStyle":{"list":["classic","seamless"],"dflt":"seamless"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":3.5,"min":-40,"max":10,"menu":"fit"},"sleevePlacketLength":{"pct":25,"min":15,"max":35,"menu":"style.cuffs"},"splitYoke":{"bool":false,"menu":"style"}},"simone":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"draftForHighBust":true,"shoulderEase":{"pct":2,"min":0,"max":15,"menu":"fit"},"lengthBonus":{"pct":25,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"backDarts":{"list":["auto","never","always"],"dflt":"auto","menu":"style"},"backDartShaping":{"pct":25,"min":5,"max":75,"menu":"advanced"},"boxPleat":{"bool":false,"menu":"style"},"boxPleatFold":{"pct":15,"min":10,"max":20,"menu":"advanced"},"boxPleatWidth":{"pct":7,"min":4,"max":10,"menu":"advanced"},"roundBack":{"pct":0,"min":0,"max":10,"menu":"fit"},"buttonholePlacketWidth":{"pct":8,"min":4,"max":12,"menu":"style.closure"},"buttonholePlacketFoldWidth":{"pct":16,"min":8,"max":24,"menu":"style.closure"},"buttonPlacketWidth":{"pct":5,"min":2,"max":8,"menu":"style.closure"},"hemCurve":{"pct":50,"min":25,"max":100,"menu":"style"},"hemStyle":{"list":["straight","baseball","slashed"],"dflt":"straight","menu":"style"},"hipsEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"yokeHeight":{"pct":70,"min":40,"max":90,"menu":"style"},"sleevePlacketWidth":{"pct":13,"min":8,"max":18,"menu":"style.cuffs"},"waistEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"buttonFreeLength":{"pct":2,"min":0,"max":15,"menu":"style.closure"},"extraTopButton":{"bool":true,"menu":"style.closure"},"separateButtonPlacket":{"bool":false,"menu":"style.closure"},"separateButtonholePlacket":{"bool":false,"menu":"style.closure"},"buttons":{"count":7,"min":4,"max":12,"menu":"style.closure"},"ffsa":{"pct":150,"min":100,"max":200,"menu":"advanced"},"minimalDartShaping":5,"bustDartAngle":{"deg":10,"min":0,"max":20,"menu":"advanced"},"bustDartLength":{"pct":80,"min":50,"max":90,"menu":"advanced"},"frontDarts":{"bool":false,"menu":"advanced"},"frontDartLength":{"pct":45,"min":30,"max":60,"menu":"advanced"},"contour":{"pct":50,"min":30,"max":75,"menu":"style"},"bustAlignedButtons":{"dflt":"disabled","list":["even","split","disabled"],"menu":"style.closure"},"collarAngle":{"deg":85,"min":60,"max":130,"menu":"style.collar"},"collarBend":{"pct":3.5,"min":0,"max":10,"menu":"style.collar"},"collarFlare":{"deg":3.5,"min":0,"max":10,"menu":"style.collar"},"collarGap":{"pct":2.5,"min":0,"max":6,"menu":"style.collar"},"collarRoll":{"pct":3,"min":0,"max":6,"menu":"style.collar"},"collarStandBend":{"deg":3,"min":0,"max":5,"menu":"style.collar"},"collarStandCurve":{"deg":2,"min":0,"max":5,"menu":"style.collar"},"collarStandWidth":{"pct":8,"min":3,"max":13,"menu":"style.collar"},"cuffOverlap":0.15,"barrelCuffNarrowButton":{"bool":true,"menu":"style.cuffs"},"cuffButtonRows":{"count":1,"min":1,"max":2,"menu":"style.cuffs"},"cuffDrape":{"pct":5,"min":0,"max":10,"menu":"style.cuffs"},"cuffLength":{"pct":10,"min":3,"max":15,"menu":"style.cuffs"},"cuffStyle":{"list":["roundedBarrelCuff","angledBarrelCuff","straightBarrelCuff","roundedFrenchCuff","angledFrenchCuff","straightFrenchCuff"],"dflt":"angledBarrelCuff","menu":"style.cuffs"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":3.5,"min":-40,"max":10,"menu":"fit"},"sleevePlacketLength":{"pct":25,"min":15,"max":35,"menu":"style.cuffs"},"splitYoke":{"bool":false,"menu":"style"},"buttonPlacketStyle":{"list":["classic","seamless"],"dflt":"classic"},"buttonholePlacketStyle":{"list":["classic","seamless"],"dflt":"seamless"}},"skully":{"size":{"pct":75,"min":10,"max":300,"menu":"fit"}},"sven":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":10,"min":5,"max":30,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":15,"min":0,"max":30,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"waistEase":0.08,"sleeveLengthBonus":{"pct":3,"min":0,"max":10,"menu":"style"},"ribbingHeight":{"pct":8,"min":3,"max":15,"menu":"style"},"hipsEase":{"pct":8,"min":-4,"max":20,"menu":"fit"},"ribbing":{"bool":true,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"ribbingStretch":{"pct":15,"min":0,"max":30,"menu":"fit"}},"tamiko":{"armholeDepthFactor":{"pct":50,"min":40,"max":60,"menu":"fit"},"chestEase":{"pct":2,"min":1,"max":20,"menu":"fit"},"flare":{"deg":15,"min":-10,"max":30,"menu":"style"},"lengthBonus":{"pct":13,"min":0,"max":60,"menu":"style"},"shoulderseamLength":{"pct":10,"min":5,"max":25,"menu":"style"},"draftForHighBust":{"bool":false,"menu":"fit"}},"teagan":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":0.05,"chestEase":{"pct":12,"min":5,"max":25,"menu":"fit"},"collarEase":0,"cuffEase":0,"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":5,"min":-20,"max":60,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":8,"min":4,"max":12,"menu":"fit"},"frontArmholeDeeper":0.005,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveWidthGuarantee":0.85,"sleeveLength":{"pct":30,"min":20,"max":100,"menu":"fit"},"fitWaist":{"bool":false,"menu":"fit"},"waistEase":{"pct":25,"min":8,"max":40},"hipsEase":{"pct":18,"min":8,"max":30,"menu":"fit"},"necklineDepth":{"pct":25,"min":20,"max":40,"menu":"style"},"necklineWidth":{"pct":30,"min":10,"max":50,"menu":"style"},"necklineBend":{"pct":30,"min":0,"max":70,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveEase":{"pct":15,"min":5,"max":35,"menu":"style"}},"tiberius":{"headRatio":{"pct":100,"min":80,"max":120,"menu":"fit"},"armholeDrop":{"pct":110,"min":100,"max":150,"menu":"fit"},"lengthBonus":{"pct":90,"min":60,"max":130,"menu":"style"},"widthBonus":{"pct":100,"min":50,"max":130,"menu":"style"},"clavi":{"bool":false,"menu":"style.clavi"},"clavusLocation":{"pct":65,"min":50,"max":80,"menu":"style.clavi"},"clavusWidth":{"pct":100,"min":50,"max":150,"menu":"style.clavi"},"length":{"list":["toKnee","toMidLeg","toFloor"],"dflt":"toKnee","menu":"style"},"width":{"list":["toElbow","toShoulder","toMidArm"],"dflt":"toMidArm","menu":"style"},"forceWidth":{"bool":false,"menu":"advanced"}},"titan":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":true,"waistEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"seatEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"kneeEase":{"pct":6,"min":1,"max":25,"menu":"fit"},"waistHeight":{"pct":100,"min":0,"max":100,"menu":"style"},"lengthBonus":{"pct":2,"min":-20,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":15,"menu":"style"},"fitKnee":{"bool":false,"menu":"style"},"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":60,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":45,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"advanced"}},"trayvon":{"tipWidth":{"pct":15,"min":5,"max":35,"snap":{"metric":1,"imperial":0.79375},"menu":"style"},"knotWidth":{"pct":8,"min":4,"max":12,"snap":{"metric":1,"imperial":0.79375},"menu":"style"},"lengthBonus":{"pct":0,"min":-50,"max":50,"menu":"style"}},"uma":{"xStretch":{"pct":15,"min":0,"max":50,"menu":"fit"},"yStretch":{"pct":15,"min":0,"max":50,"menu":"fit"},"gussetWidth":{"pct":15,"min":5,"max":24,"menu":"fit"},"gussetLength":{"pct":12.7,"min":10,"max":16,"menu":"fit"},"gussetPosition":{"pct":70,"min":5,"max":95,"menu":"fit"},"bulge":{"deg":0,"min":0,"max":30,"menu":"fit"},"rise":{"pct":46,"min":30,"max":100,"menu":"style"},"legRise":{"pct":54,"min":5,"max":95,"menu":"style"},"frontDip":{"pct":5,"min":-5,"max":15,"menu":"style"},"frontExposure":{"pct":70,"min":5,"max":100,"menu":"style"},"backDip":{"pct":2.5,"min":-5,"max":15,"menu":"style"},"backExposure":{"pct":30,"min":25,"max":125,"menu":"style"}},"wahid":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":false},"chestEase":{"pct":2,"min":1,"max":10,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":false},"cuffEase":{"pct":20,"min":0,"max":200,"menu":false},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":false},"lengthBonus":{"pct":1,"min":0,"max":8,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":false},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":false},"acrossBackFactor":0.97,"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":70,"min":60,"max":80,"menu":"fit"},"backNeckCutout":{"pct":5,"min":-2,"max":8,"menu":false},"frontArmholeDeeper":0.005,"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":false},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"frontOverlap":0.01,"necklineDrop":{"pct":50,"min":35,"max":85,"menu":"style"},"frontStyle":{"dflt":"classic","list":["classic","rounded"],"menu":"style"},"frontInset":{"pct":15,"min":10,"max":20,"menu":"advanced"},"shoulderInset":{"pct":10,"min":0,"max":20,"menu":"advanced"},"neckInset":{"pct":5,"min":0,"max":10,"menu":"advanced"},"hemStyle":{"dflt":"classic","list":["classic","rounded","square"],"menu":"style"},"hemRadius":{"pct":6,"min":2,"max":12,"menu":"style"},"pocketWidth":{"pct":10,"max":15,"min":8,"menu":"style"},"pocketAngle":{"deg":5,"min":0,"max":5,"menu":"advanced"},"pocketLocation":{"pct":35,"min":25,"max":55,"menu":"style"},"frontScyeDart":{"deg":6,"min":0,"max":12,"menu":"fit"},"buttons":{"count":6,"min":4,"max":12,"menu":"style"},"waistEase":{"pct":8,"min":2,"max":15,"menu":"fit"},"hipsEase":{"pct":8,"min":2,"max":15,"menu":"fit"},"backInset":{"pct":15,"min":10,"max":20,"menu":"advanced"},"centerBackDart":{"pct":2,"min":0,"max":5,"menu":"fit"},"backScyeDart":{"deg":2,"min":0,"max":6,"menu":"fit"},"weltHeight":{"pct":12.5,"max":20,"min":10,"menu":"style"}},"walburga":{"headRatio":{"pct":100,"min":80,"max":120,"menu":"fit"},"lengthBonus":{"pct":85,"min":60,"max":130,"menu":"style"},"widthBonus":{"pct":95,"min":50,"max":130,"menu":"style"},"length":{"list":["toKnee","toMidLeg","toFloor"],"dflt":"toKnee","menu":"style"},"neckline":{"bool":true,"menu":"style"},"neckoRatio":{"pct":100,"min":10,"max":190,"menu":"style"}},"waralee":{"backPocket":{"bool":true,"menu":"style"},"backPocketDepth":140,"backPocketHorizontalOffset":0.045,"backPocketSize":0.45,"backPocketVerticalOffset":0.2,"backRaise":{"pct":10,"min":0,"max":25,"menu":"fit"},"backWaistAdjustment":0.3,"crotchBack":{"pct":45,"min":10,"max":70,"menu":"advanced"},"crotchEase":1.08,"crotchFactorBackHor":{"pct":90,"min":10,"max":100,"menu":"advanced"},"crotchFactorBackVer":{"pct":60,"min":20,"max":90,"menu":"advanced"},"crotchFactorFrontHor":{"pct":90,"min":10,"max":100,"menu":"advanced"},"crotchFactorFrontVer":{"pct":30,"min":10,"max":70,"menu":"advanced"},"crotchFront":{"pct":30,"min":10,"max":70,"menu":"advanced"},"fitWaist":{"bool":true,"menu":"fit"},"frontPocket":{"bool":true,"menu":"style"},"frontPocketDepthFactor":1.6,"frontPocketHorizontalOffset":0.18,"frontPocketSize":0.45,"frontPocketStyle":{"dflt":"welt","list":["welt","waistband"],"menu":"style"},"frontPocketVerticalOffset":0.07,"frontWaistAdjustment":0.163,"hemWidth":{"pct":1.75,"min":1,"max":2.5,"menu":"style"},"knotInFront":{"bool":true,"menu":"style"},"legShortening":{"pct":25,"min":-10,"max":50,"menu":"style"},"minimizer":4,"separateWaistband":{"bool":false,"menu":"style"},"showMini":{"bool":true,"menu":"options"},"waistOverlap":{"pct":50,"min":10,"max":100,"menu":"style"},"waistRaise":{"pct":0,"min":-20,"max":40,"menu":"fit"},"waistbandWidth":{"pct":3.5,"min":2,"max":5,"menu":"style"}},"yuri":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":20,"min":10,"max":30,"menu":"fit"},"cuffEase":{"pct":30,"min":20,"max":60,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":10,"min":5,"max":15,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveLengthBonus":{"pct":1,"min":0,"max":10,"menu":"fit"},"hipsEase":{"pct":0,"min":0,"max":10,"menu":"fit"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"}},"otis":{"ease":{"pct":14,"min":0,"max":30,"menu":"fit"},"snapPlacket":{"pct":5,"min":0,"max":30,"menu":"advanced"},"sleeveType":{"dflt":"short","list":["short","long"],"menu":"style"},"hem":{"pct":10,"min":0,"max":30,"menu":"advanced"},"binding":{"pct":11,"min":2,"max":30,"menu":"advanced"}}} +export const options = {"aaron":{"brianFitSleeve":false,"brianFitCollar":false,"collarFactor":4.8,"bicepsEase":0.05,"chestEase":{"pct":8,"min":0,"max":20,"menu":"style"},"collarEase":0,"cuffEase":0,"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":10,"min":-20,"max":60,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":0.97,"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":0.6,"backNeckCutout":0.05,"frontArmholeDeeper":0,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"hipsEase":{"pct":8,"min":0,"max":20,"menu":"fit"},"stretchFactor":{"pct":5,"min":0,"max":15,"menu":"fit"},"armholeDrop":{"pct":10,"min":0,"max":75,"menu":"style"},"necklineBend":{"pct":100,"min":40,"max":100,"menu":"style"},"necklineDrop":{"pct":20,"min":10,"max":35,"menu":"style"},"shoulderStrapWidth":{"pct":15,"min":10,"max":40,"menu":"style"},"shoulderStrapPlacement":{"pct":40,"min":20,"max":80,"menu":"style"},"backlineBend":{"pct":50,"min":25,"max":100,"menu":"style"},"knitBindingWidth":{"pct":600,"min":300,"max":800,"menu":"style"}},"albert":{"backOpening":{"pct":10,"min":0,"max":25,"menu":"fit"},"bibWidth":{"pct":100,"min":50,"max":125,"menu":"style"},"bibLength":{"pct":75,"min":0,"max":90,"menu":"style"},"lengthBonus":{"pct":0,"min":-20,"max":25,"menu":"style"},"chestDepth":{"pct":22,"min":15,"max":90,"menu":"fit"},"strapWidth":{"pct":60,"min":20,"max":100,"menu":"style"}},"bee":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":10,"min":0,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"advanced"},"bustDartCurve":1,"bustDartLength":1,"waistDartLength":1,"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"advanced"},"backArmholeCurvature":0.63,"backArmholePitchDepth":0.35,"backArmholeSlant":5,"frontArmholeCurvature":0.63,"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"advanced"},"backHemSlope":2.5,"backNeckCutout":0.06,"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"},"ties":{"bool":true,"menu":"style"},"crossBackTies":{"bool":false,"menu":"style"},"bandLength":{"pct":85,"min":75,"max":90,"menu":"style"},"neckTieLength":{"pct":80,"min":70,"max":100,"menu":"style"},"neckTieWidth":{"pct":6,"min":2,"max":18,"snap":{"metric":[6,13,19,25,32,38],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1]},"menu":"style"},"reversible":{"bool":false,"menu":"style"},"topDepth":{"pct":54,"min":50,"max":80,"menu":"fit"},"bottomCupDepth":{"pct":8,"min":0,"max":20,"menu":"fit"},"sideDepth":{"pct":20.6,"min":0,"max":30,"menu":"fit"},"sideCurve":{"pct":0,"min":-50,"max":50,"menu":"fit"},"frontCurve":{"pct":0,"min":-50,"max":50,"menu":"fit"},"bellaGuide":{"bool":false,"menu":"fit"},"pointedTieEnds":{"bool":false,"menu":"style"},"duoColorTies":{"bool":false,"menu":"style"},"bandTieWidth":{"pct":3,"min":1,"max":9,"snap":{"metric":[6,13,19,25,32,38],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1]},"menu":"style"},"bandTieLength":{"pct":35,"min":30,"max":50,"menu":"style"}},"bella":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":10,"min":0,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"darts"},"bustDartCurve":{"pct":100,"min":0,"max":100,"menu":"darts"},"bustDartLength":{"pct":90,"min":75,"max":100,"menu":"darts"},"waistDartLength":{"pct":90,"min":75,"max":95,"menu":"darts"},"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"armhole"},"backArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"backArmholePitchDepth":{"pct":35,"max":40,"min":30,"menu":"armhole"},"backArmholeSlant":{"deg":5,"min":1,"max":9,"menu":"armhole"},"frontArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"armhole"},"backHemSlope":{"deg":2.5,"min":0,"max":5,"menu":"advanced"},"backNeckCutout":{"pct":6,"min":3,"max":9,"menu":"advanced"},"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"}},"benjamin":{"transitionLength":2,"bandLength":0.17,"adjustmentRibbonWidth":20,"collarEase":{"pct":3,"min":0,"max":6,"menu":"fit"},"adjustmentRibbon":{"bool":false,"menu":"fit"},"tipWidth":{"pct":15,"min":0,"max":20,"menu":"style"},"knotWidth":{"pct":7,"min":5,"max":10,"menu":"style"},"bowLength":{"pct":28,"min":23,"max":33,"menu":"style"},"bowStyle":{"dflt":"butterfly","list":["diamond","butterfly","square","widesquare"],"menu":"style"},"endStyle":{"dflt":"straight","list":["straight","pointed","rounded"],"menu":"style"},"collarBandHeight":{"pct":6,"min":5,"max":8,"menu":"style"}},"bent":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"chestEase":{"pct":8,"min":-4,"max":20,"menu":"fit"},"collarEase":{"pct":3.5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":40,"min":2,"max":100,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":60,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-20,"max":15,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"}},"bob":{"neckRatio":{"pct":80,"min":70,"max":90,"menu":"fit"},"widthRatio":{"pct":45,"min":35,"max":55,"menu":"fit"},"lengthRatio":{"pct":75,"min":55,"max":85,"menu":"fit"},"headSize":{"pct":100,"min":10,"max":200,"snap":5,"menu":"size"}},"breanna":{"collarFactor":4.8,"armholeDepthBase":0.6,"shoulderSeamLength":0.95,"sleeveWidthGuarantee":0.9,"breannaFitSleeve":true,"breannaFitCollar":true,"shoulderDart":{"bool":false,"menu":"fit"},"waistDart":{"bool":true,"menu":"fit"},"primaryBustDart":{"list":["06:00","07:00","08:00","09:00","10:00","11:00","11:30","12:00","12:30","13:00","13:30","14:00","15:00","16:00","17:00"],"dflt":"06:00","doNotTranslate":true,"menu":"style"},"secondaryBustDart":{"list":["none","06:00","07:00","08:00","09:00","10:00","11:00","11:30","12:00","12:30","13:00","13:30","14:00","15:00","16:00","17:00"],"dflt":"13:30","doNotTranslate":true,"menu":"style"},"acrossBackFactor":{"pct":96,"min":93,"max":100,"menu":"advanced"},"armholeDepthFactor":{"pct":100,"min":80,"max":120,"menu":"advanced"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"shoulderDartSize":{"pct":7,"min":4,"max":10},"shoulderDartLength":{"pct":85,"min":60,"max":100},"waistDartSize":{"pct":10,"min":4,"max":15},"waistDartLength":{"pct":85,"min":60,"max":100},"verticalEase":{"pct":2,"min":0,"max":8,"menu":"fit"},"frontArmholeDeeper":{"pct":1,"min":0,"max":5,"menu":"advanced"},"shoulderEase":{"pct":0,"min":0,"max":4,"menu":"fit"},"collarEase":{"pct":3.5,"min":0,"max":10,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"waistEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"primaryBustDartShaping":{"pct":50,"min":25,"max":75,"menu":"style"},"primaryBustDartLength":{"pct":85,"min":65,"max":95,"menu":"style"},"secondaryBustDartLength":{"pct":85,"min":65,"max":95,"menu":"style"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":100,"menu":"advanced"},"frontScyeDart":{"pct":25,"min":0,"max":45,"menu":"fit"},"sleevecapEase":{"pct":0.5,"min":0,"max":2.5,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":110,"min":35,"max":165,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":45,"min":35,"max":55,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":3,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":5.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":4.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":12.5,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"cuffEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"}},"brian":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"}},"bruce":{"hipRatioFront":0.245,"hipRatioBack":0.315,"legRatioInset":0.3,"legRatioBack":0.32,"gussetRatio":0.0666,"gussetInsetRatio":0.6,"heightRatioInset":0.65,"bulge":{"deg":20,"min":0,"max":40,"menu":"fit"},"legBonus":{"pct":0,"min":-10,"max":20,"menu":"style"},"rise":{"pct":10,"min":0,"max":25,"menu":"style"},"stretch":{"pct":15,"min":5,"max":25,"menu":"fit"},"legStretch":{"pct":40,"min":25,"max":45,"menu":"fit"},"backRise":{"pct":5,"min":0,"max":10,"menu":"fit"}},"carlita":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"collarEase":0.145,"cuffEase":{"pct":60,"min":30,"max":100,"menu":"fit"},"draftForHighBust":true,"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":0,"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"fit"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":65,"min":50,"max":70,"menu":"fit"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":12,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"buttonSpacingHorizontal":{"pct":43.5,"min":15,"max":60,"menu":"style"},"length":{"pct":69,"min":35,"max":100,"menu":"style"},"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"pocketPlacementHorizontal":{"pct":11,"min":5,"max":20,"menu":"pockets"},"pocketPlacementVertical":{"pct":6,"min":5,"max":60,"menu":"pockets"},"pocketWidth":{"pct":95,"min":70,"max":120,"menu":"pockets"},"pocketHeight":{"pct":15,"min":0,"max":40,"menu":"pockets"},"pocketRadius":{"pct":20,"min":0,"max":50,"menu":"pockets"},"pocketFlapRadius":{"pct":15,"min":0,"max":50,"menu":"pockets"},"chestPocketPlacement":{"pct":55,"min":30,"max":65,"menu":"pockets"},"chestPocketAngle":0,"chestPocketHeight":{"pct":60,"min":40,"max":80,"menu":"pockets"},"chestPocketWidth":{"pct":25,"min":15,"max":50,"menu":"pockets"},"innerPocketPlacement":{"pct":53,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"seatEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"contour":{"pct":50,"min":25,"max":75,"menu":"advanced"},"backPleat":0.048,"beltWidth":{"pct":15,"min":10,"max":20,"menu":"style"},"sleeveLengthBonus":{"pct":7,"min":0,"max":20,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"cuffLength":{"pct":15,"min":10,"max":20,"menu":"style"},"chestShapingMax":5,"collarHeight":{"pct":9.6,"min":8,"max":11,"menu":"collar"},"collarFlare":{"pct":20,"min":0,"max":40,"menu":"collar"},"collarSpread":{"deg":4,"min":2,"max":6,"menu":"collar"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"}},"carlton":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":20,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":10,"min":5,"max":20,"menu":"fit"},"collarEase":0.145,"cuffEase":{"pct":60,"min":30,"max":100,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":0,"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"fit"},"armholeDepth":{"pct":5,"min":-10,"max":50},"armholeDepthFactor":{"pct":65,"min":50,"max":70,"menu":"fit"},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.5,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":12,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"buttonSpacingHorizontal":{"pct":43.5,"min":15,"max":60,"menu":"style"},"length":{"pct":69,"min":35,"max":100,"menu":"style"},"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"pocketPlacementHorizontal":{"pct":11,"min":5,"max":20,"menu":"pockets"},"pocketPlacementVertical":{"pct":6,"min":5,"max":60,"menu":"pockets"},"pocketWidth":{"pct":95,"min":70,"max":120,"menu":"pockets"},"pocketHeight":{"pct":15,"min":0,"max":40,"menu":"pockets"},"pocketRadius":{"pct":20,"min":0,"max":50,"menu":"pockets"},"pocketFlapRadius":{"pct":15,"min":0,"max":50,"menu":"pockets"},"chestPocketPlacement":{"pct":55,"min":30,"max":65,"menu":"pockets"},"chestPocketAngle":{"deg":4,"min":0,"max":6,"menu":"pockets"},"chestPocketHeight":{"pct":60,"min":40,"max":80,"menu":"pockets"},"chestPocketWidth":{"pct":25,"min":15,"max":50,"menu":"pockets"},"innerPocketPlacement":{"pct":53,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"seatEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"backPleat":0.048,"beltWidth":{"pct":15,"min":10,"max":20,"menu":"style"},"sleeveLengthBonus":{"pct":7,"min":0,"max":20,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"cuffLength":{"pct":15,"min":10,"max":20,"menu":"style"},"chestShapingMax":5,"collarHeight":{"pct":9.6,"min":8,"max":11,"menu":"collar"},"collarFlare":{"pct":20,"min":0,"max":40,"menu":"collar"},"collarSpread":{"deg":4,"min":2,"max":6,"menu":"collar"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"}},"cathrin":{"waistReduction":{"pct":10,"min":2,"max":20,"menu":"fit"},"panels":{"list":["11","13"],"dflt":"13","menu":"fit"},"backOpening":{"pct":4,"min":3,"max":10,"menu":"style"},"backRise":{"pct":15,"min":1,"max":25,"menu":"style"},"backDrop":{"pct":2,"min":0,"max":5,"menu":"style"},"frontRise":{"pct":4,"min":0.1,"max":8,"menu":"style"},"frontDrop":{"pct":5,"min":0,"max":10,"menu":"style"},"hipRise":{"pct":5,"min":0,"max":15,"menu":"style"}},"charlie":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":false,"waistEase":{"pct":1,"min":0,"max":5,"menu":"fit"},"seatEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"kneeEase":{"pct":15,"min":10,"max":30,"menu":"fit"},"waistHeight":{"pct":-4,"min":-15,"max":40,"menu":"style"},"lengthBonus":{"pct":2,"min":-20,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":15,"menu":"style"},"fitKnee":true,"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":55,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":50,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"waistbandReduction":0.25,"waistbandFactor":0.1,"frontPocketSlantDepth":{"pct":85,"min":70,"max":100,"menu":"pockets.frontpockets"},"frontPocketSlantWidth":{"pct":25,"min":15,"max":35,"menu":"pockets.frontpockets"},"frontPocketSlantRound":{"pct":30,"min":5,"max":50,"menu":"pockets.frontpockets"},"frontPocketSlantBend":{"pct":25,"min":5,"max":50,"menu":"pockets.frontpockets"},"frontPocketWidth":{"pct":55,"min":45,"max":65,"menu":"pockets.frontpockets"},"frontPocketDepth":{"pct":100,"min":85,"max":110,"menu":"pockets.frontpockets"},"frontPocketFacing":{"pct":45,"min":25,"max":65,"menu":"pockets.frontpockets"},"flyCurve":{"pct":72,"min":50,"max":100,"menu":"advanced.fly"},"flyLength":{"pct":45,"min":30,"max":60,"menu":"advanced.fly"},"flyWidth":{"pct":15,"min":10,"max":20,"menu":"advanced.fly"},"backPocketVerticalPlacement":{"pct":24,"min":18,"max":30,"menu":"pockets.backpockets"},"backPocketHorizontalPlacement":{"pct":55,"min":48,"max":62,"menu":"pockets.backpockets"},"backPocketWidth":{"pct":55,"min":50,"max":60,"menu":"pockets.backpockets"},"backPocketDepth":{"pct":60,"min":40,"max":80,"menu":"pockets.backpockets"},"backPocketFacing":{"bool":true,"menu":"pockets.backpockets"},"waistbandCurve":{"pct":0,"min":0,"max":35,"menu":"fit"},"beltLoops":{"count":8,"min":6,"max":12,"menu":"advanced"}},"cornelius":{"pctAtoO":0.5,"pctAtoC":0.25,"pctUtoA":0.25,"pctJtoA":0.25,"pctSeatAdjustment":0.5,"ventLength":{"pct":70,"min":25,"max":110,"menu":"style"},"fullness":{"pct":0,"min":0,"max":55,"menu":"fit"},"waistbandBelowWaist":{"pct":5,"min":0,"max":15,"menu":"style"},"waistReduction":{"pct":1,"min":-2,"max":10,"menu":"fit"},"bandBelowKnee":{"pct":25,"min":15,"max":50,"menu":"advanced"},"pctZtoR":0.35,"pctRtoZin":0.75,"pctRtoZup":0.25,"pctRtoKin":0.75,"pctRtoKdown":0.25,"pctKtoRout":0.15,"pctKtoRup":0.25,"pctKtoH":0.7,"flyWidth":{"pct":0.38,"min":0.2,"max":0.6,"menu":"style"},"kneeToBelow":{"pct":94,"min":85,"max":110,"menu":"advanced"},"cuffWidth":{"pct":0,"min":-50,"max":150,"menu":"style"},"cuffStyle":{"dflt":"elegant","list":["traditional","elegant","keystone"],"menu":"style"}},"diana":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":0,"min":-5,"max":50,"menu":"fit"},"chestEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"collarEase":0,"cuffEase":{"pct":20,"min":0,"max":30,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":0,"max":50,"menu":"fit"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":97,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":0,"min":0,"max":20,"menu":"advanced"},"armholeDepthFactor":{"pct":55,"min":50,"max":70,"menu":"advanced"},"backNeckCutout":0.05,"frontArmholeDeeper":{"pct":0,"min":0,"max":1.5,"menu":"advanced"},"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"drapeAngle":{"deg":20,"min":10,"max":30,"menu":"style"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"fit"},"shoulderSeamLength":{"pct":35,"min":0.1,"max":60,"menu":"style"},"waistEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"hipsEase":{"pct":0,"min":-10,"max":20,"menu":"fit"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":100,"min":35,"max":165,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":3,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":5.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":4.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":6,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"}},"examples":{"size":{"pct":50,"min":5,"max":100,"menu":"stack"},"x":{"pct":0,"min":-100,"max":100,"menu":"stack"},"y":{"pct":0,"min":-100,"max":100,"menu":"stack"},"stackIt":{"dflt":"Do stack","list":["Do stack","Do not stack"],"menu":"stack"}},"florence":{"length":{"pct":40,"min":35,"max":45,"menu":"fit"},"height":{"pct":26,"min":23,"max":29,"menu":"fit"},"curve":{"pct":12.5,"min":10,"max":15,"menu":"fit"}},"florent":{"topSide":0.8,"brim":0,"headEase":{"pct":2,"min":0,"max":5,"menu":"fit"}},"gozer":{},"hi":{"length":1000,"size":{"pct":100,"min":5,"max":500,"menu":"style"},"nosePointiness":{"pct":0,"min":-5,"max":10,"menu":"style"},"aggressive":{"bool":false,"menu":"style"},"hungry":{"pct":50,"min":0,"max":100,"menu":"style"}},"holmes":{"headEase":{"pct":3,"min":0,"max":9,"snap":{"metric":[6,13,19,25,32,38,44,50],"imperial":[6.35,12.7,19.05,25.4,31.75,38.1,44.45,50.8]},"menu":"fit"},"lengthRatio":{"pct":55,"min":40,"max":60,"menu":"style"},"gores":{"count":6,"min":4,"max":20,"menu":"style"},"visorAngle":{"deg":45,"min":10,"max":90,"menu":"style"},"visorWidth":{"pct":5,"min":1,"max":17,"snap":5,"menu":"style"},"visorLength":{"pct":100,"min":80,"max":150,"menu":"advanced"},"earLength":{"pct":100,"min":80,"max":150,"menu":"style"},"earWidth":{"pct":100,"min":80,"max":150,"menu":"style"},"buttonhole":{"bool":false,"menu":"style"}},"hortensia":{"width":230,"height":330,"size":{"pct":50,"min":20,"max":200,"menu":"style"},"zipperSize":{"dflt":"#5","list":["#3","#4","#4.5","#5","#6","#8","#10","invisible"],"menu":"style"},"minHandleSpaceWidth":80,"maxHandleSpaceWidth":250,"pctHandleSpace":50,"pctHandleVert":42,"handleWidth":{"pct":8.6,"min":4,"max":25,"menu":"style"},"strapLength":{"pct":160,"min":75,"max":250,"menu":"style"}},"huey":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":0,"min":-4,"max":60,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"ribbing":{"bool":true,"menu":"style"},"ribbingHeight":{"pct":10,"min":5,"max":15,"menu":"style"},"hipsEase":{"pct":8,"min":4,"max":12,"menu":"fit"},"pocket":{"bool":true,"menu":"style"},"pocketHeight":{"pct":30,"min":25,"max":35,"menu":"style"},"pocketWidth":{"pct":60,"min":50,"max":70,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":0,"min":-40,"max":10,"menu":"style"},"hoodHeight":{"pct":59,"min":55,"max":65,"menu":"style"},"hoodCutback":{"pct":10,"min":5,"max":15,"menu":"style"},"hoodClosure":{"pct":13.5,"min":10,"max":15,"menu":"style"},"hoodDepth":{"pct":8.5,"min":5,"max":12,"menu":"style"},"hoodAngle":{"deg":5,"min":2,"max":8,"menu":"style"},"ribbingStretch":{"pct":15,"min":0,"max":30,"menu":"fit"}},"hugo":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":8,"min":4,"max":20,"menu":"fit"},"collarEase":0.05,"cuffEase":{"pct":20,"min":10,"max":50,"menu":"fit"},"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":10,"min":0,"max":20,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":0.5,"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":0,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"hipsEase":{"pct":12,"min":4,"max":20,"menu":"fit"},"ribbingHeight":{"pct":10,"min":4,"max":20,"menu":"style"},"pocketWidth":{"pct":50,"min":35,"max":65,"menu":"style"},"sleevecapEase":0,"sleevecapTopFactorX":0.5,"sleevecapTopFactorY":0.45,"sleevecapBackFactorX":0.6,"sleevecapBackFactorY":0.33,"sleevecapFrontFactorX":0.55,"sleevecapFrontFactorY":0.33,"sleevecapQ1Offset":0.017,"sleevecapQ2Offset":0.035,"sleevecapQ3Offset":0.025,"sleevecapQ4Offset":0.01,"sleevecapQ1Spread1":0.1,"sleevecapQ1Spread2":0.15,"sleevecapQ2Spread1":0.15,"sleevecapQ2Spread2":0.1,"sleevecapQ3Spread1":0.1,"sleevecapQ3Spread2":0.08,"sleevecapQ4Spread1":0.07,"sleevecapQ4Spread2":0.063,"sleeveWidthGuarantee":0.9,"sleeveLengthBonus":{"pct":2,"min":0,"max":10,"menu":"style"},"ribbingStretch":{"pct":5,"min":0,"max":10,"menu":"fit"}},"jaeger":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":19,"min":10,"max":25,"menu":"fit"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"centerBackDart":{"pct":0.5,"min":0,"max":1.5,"menu":"fit"},"hipsEase":{"pct":12,"min":8,"max":20,"menu":"fit"},"waistEase":{"pct":14,"min":8,"max":25,"menu":"fit"},"rollLineCollarHeight":{"pct":6,"min":5,"max":9,"menu":"collar"},"reduceWaistStandardFraction":0.08,"reduceWaistDartFraction":0.05,"reduceHipsStandardFraction":0.1,"centerFrontHemDrop":{"pct":2,"min":0,"max":4,"menu":"style"},"frontPocketPlacement":{"pct":75,"min":65,"max":85,"menu":"pockets"},"frontPocketWidth":{"pct":68,"min":55,"max":75,"menu":"pockets"},"frontPocketDepth":{"pct":110,"min":80,"max":130,"menu":"pockets"},"frontPocketRadius":{"pct":10,"min":0,"max":50,"menu":"pockets"},"frontDartPlacement":{"pct":55,"min":45,"max":60,"menu":"advanced"},"sideFrontPlacement":{"pct":85,"min":80,"max":90,"menu":"advanced"},"frontOverlap":{"pct":1.5,"min":1,"max":2,"menu":"advanced"},"innerPocketPlacement":{"pct":52,"min":42,"max":62,"menu":"pockets"},"innerPocketWidth":{"pct":50,"min":45,"max":65,"menu":"pockets"},"innerPocketDepth":{"pct":110,"min":75,"max":140,"menu":"pockets"},"innerPocketWeltHeight":{"pct":3.5,"min":2.5,"max":5,"menu":"pockets"},"frontCutawayAngle":{"deg":2.5,"min":1,"max":4,"menu":"style"},"frontCutawayStart":{"pct":30,"min":10,"max":70,"menu":"style"},"frontCutawayEnd":{"pct":40,"min":10,"max":40,"menu":"style"},"hemRadius":{"pct":100,"min":35,"max":100,"menu":"style"},"chestPocketDepth":{"pct":110,"min":70,"max":150,"menu":"pockets"},"chestPocketWidth":{"pct":37,"min":30,"max":45,"menu":"pockets"},"chestPocketPlacement":{"pct":52,"min":40,"max":60,"menu":"pockets"},"chestPocketAngle":{"deg":2.5,"min":0,"max":7,"menu":"pockets"},"chestPocketWeltSize":{"pct":17.5,"min":10,"max":25,"menu":"pockets"},"lapelStart":{"pct":10,"min":0,"max":35,"menu":"style"},"collarHeight":{"pct":9,"min":7,"max":10,"menu":"collar"},"collarNotchDepth":{"pct":15,"min":15,"max":50,"menu":"collar"},"collarNotchAngle":{"deg":45,"min":30,"max":60,"menu":"collar"},"collarNotchReturn":{"pct":100,"min":50,"max":100,"menu":"collar"},"chestShaping":{"pct":30,"min":0,"max":100,"menu":"advanced"},"buttons":{"list":["1","2","3"],"dflt":"2","menu":"style"},"buttonLength":{"pct":30,"min":30,"max":60,"menu":"style"},"chestShapingMax":5,"lapelReduction":{"pct":5,"min":0,"max":10,"menu":"style"},"backVent":{"count":1,"min":0,"max":2,"menu":"style"},"backVentLength":{"pct":35,"min":15,"max":100,"menu":"style"},"collarSpread":{"deg":13,"min":5,"max":35,"menu":"collar"},"collarRoll":{"pct":5,"min":0,"max":10,"menu":"collar"},"pocketFoldover":{"pct":25,"min":15,"max":35,"menu":"pockets"},"sleeveLengthBonus":{"pct":0,"min":-20,"max":15,"menu":"fit"},"sleeveBend":{"deg":10,"min":0,"max":20,"menu":"fit"},"sleevecapHeight":{"pct":45,"min":40,"max":60,"menu":"advanced"},"sleevecapEase":{"pct":1,"min":0,"max":10,"menu":"advanced"},"sleeveVentLength":{"pct":35,"min":25,"max":55,"menu":"sleeves"},"sleeveVentWidth":{"pct":18,"min":10,"max":26,"menu":"sleeves"}},"legend":{},"lucy":{"width":{"pct":50,"min":30,"max":100,"menu":"style"},"length":{"pct":50,"min":30,"max":100,"menu":"style"},"edge":{"pct":25,"min":20,"max":50,"menu":"style"}},"lunetius":{"lengthRatio":{"pct":105,"min":60,"max":130,"menu":"style"},"widthRatio":{"pct":100,"min":50,"max":130,"menu":"style"},"length":{"list":["toKnee","toBelowKnee","toHips","toUpperLeg","toFloor"],"dflt":"toBelowKnee","menu":"style"}},"magde":{"size":{"pct":100,"min":15,"max":200,"menu":"style"},"taperRatio":{"pct":60,"min":50,"max":100,"menu":"style"},"flapHeightRatio":{"pct":83,"min":60,"max":100,"menu":"style"},"openingRatio":{"pct":66,"min":30,"max":90,"menu":"style"},"onePieceLid":{"bool":false,"menu":"style"},"useCommonWebbingSizes":{"bool":true,"menu":"style"}},"noble":{"acrossBackFactor":0.925,"shoulderSlopeBack":1.23,"neckWidthBack":0.197,"neckWidthFront":0.17,"backDartLocation":0.145,"backCenterWaistReduction":0.35,"collarFactor":0.19,"bustSpanEase":{"pct":0,"min":-5,"max":20,"menu":"fit"},"chestEase":{"pct":11,"min":5,"max":20,"menu":"fit"},"fullChestEaseReduction":{"pct":4,"min":0,"max":8,"menu":"fit"},"shoulderToShoulderEase":{"pct":-0.5,"min":-1,"max":5,"menu":"fit"},"waistEase":{"pct":5,"min":1,"max":20,"menu":"fit"},"backDartHeight":{"pct":46,"min":38,"max":54,"menu":"darts"},"bustDartCurve":1,"bustDartLength":0.9,"waistDartLength":{"pct":90,"min":75,"max":95,"menu":"darts"},"armholeDepth":{"pct":44,"min":38,"max":46,"menu":"armhole"},"backArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"backArmholePitchDepth":{"pct":35,"max":40,"min":30,"menu":"armhole"},"backArmholeSlant":{"deg":5,"min":1,"max":9,"menu":"armhole"},"frontArmholeCurvature":{"pct":63,"min":50,"max":85,"menu":"armhole"},"frontArmholePitchDepth":{"pct":29,"max":31,"min":27,"menu":"armhole"},"backHemSlope":{"deg":2.5,"min":0,"max":5,"menu":"advanced"},"backNeckCutout":{"pct":6,"min":3,"max":9,"menu":"advanced"},"frontShoulderWidth":{"pct":95,"max":98,"min":92,"menu":"advanced"},"highBustWidth":{"pct":86,"max":92,"min":80,"menu":"advanced"},"armholeDartPosition":{"pct":50,"min":10,"max":90},"dartPosition":{"dflt":"shoulder","list":["shoulder","armhole"],"menu":"darts"},"shoulderDartPosition":{"pct":50,"min":10,"max":90},"shoulderToShoulderCorrection":0.995,"upperDartLength":{"pct":90,"min":80,"max":95,"menu":"darts"}},"octoplushy":{"sizeConstant":200,"size":{"pct":100,"min":5,"max":500,"menu":"style"},"type":{"dflt":"octoplushy","list":["octoplushy","octopus","squid"],"menu":"style"},"armWidth":{"pct":15,"min":10,"max":30,"menu":"style"},"armLength":{"pct":200,"min":100,"max":500,"menu":"style"},"neckWidth":{"pct":25,"min":25,"max":45,"menu":"style"},"armTaper":{"pct":25,"min":0,"max":50,"menu":"style"},"bottomTopArmRatio":{"pct":57,"min":25,"max":75,"menu":"style"},"bottomArmReduction":{"pct":90,"min":75,"max":125},"bottomArmReductionPlushy":{"pct":80,"min":75,"max":125}},"paco":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":false,"waistEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"seatEase":{"pct":5,"min":0,"max":15,"menu":"fit"},"kneeEase":0.06,"waistHeight":{"pct":5,"min":0,"max":100,"menu":"style"},"lengthBonus":{"pct":0,"min":-15,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":10,"menu":"style"},"fitKnee":false,"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":60,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":45,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"elastic"},"titanPaperless":false,"frontPocketHeelRatio":0.4,"backPocketWaistRatio":0.4,"backPocketHeightRatio":0.4,"backPocketWidthRatio":0.37,"waistbandHeight":0,"elasticatedCuff":{"bool":true,"menu":"style"},"ankleElastic":{"pct":5,"min":1,"max":13,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"elastic"},"heelEase":{"pct":5,"min":0,"max":50,"menu":"elastic"},"frontPockets":{"bool":true,"menu":"pockets"},"backPockets":{"bool":false,"menu":"pockets"},"frontPocketFlapSize":{"pct":3,"min":3,"max":3,"snap":{"metric":1,"imperial":0.79375},"menu":false},"weltFactor":0.15},"penelope":{"dartMaximumDifference":0.344,"dartMinimumDifference":0.2,"dartMinimumWidth":0.006888,"dartSideMinimum":10,"dartBackControl1":0.114,"dartBackControl2":5,"dartBackControl3":4,"curvePlacement":2.4,"dart2offset":32,"dart2factor":0.8,"hipCurveDividerDown":40,"hipCurveDividerUp":3,"sideSeamShiftPercentage":0.006,"backVentWidth":0.1,"paperlessOffset":15,"curvedDartControlAngle":2,"curvedDartTopControlOffset":0.2,"curvedDartBottomControlOffset":0.4,"curvedDarts":{"bool":true,"menu":"style"},"lengthBonus":{"pct":0,"min":-50,"max":50,"menu":"style"},"hemBonus":{"pct":0,"min":-35,"max":0,"menu":"style"},"hem":{"pct":2,"min":0,"max":5,"menu":"style"},"backVent":{"bool":true,"menu":"style"},"backVentLength":{"pct":40,"min":5,"max":70},"zipperLocation":{"dflt":"backSeam","list":["backSeam","sideSeam"],"menu":"style"},"nrOfDarts":{"count":2,"min":1,"max":2,"menu":"style"},"seatEase":{"pct":1,"min":0,"max":8,"menu":"fit"},"waistEase":{"pct":1,"min":0,"max":8,"menu":"fit"},"backDartDepthFactor":{"pct":50,"min":35,"max":70,"menu":"advanced"},"frontDartDepthFactor":{"pct":45,"min":30,"max":65,"menu":"advanced"},"dartToSideSeamFactor":{"pct":50,"min":30,"max":70,"menu":"advanced"},"waistband":{"bool":true,"menu":"style"},"waistbandWidth":{"pct":10,"min":5,"max":20},"waistbandOverlap":{"pct":3.5,"min":0,"max":10}},"plugintest":{"plugin":{"dflt":"all","list":["all","annotations","flip","gore","i18n","measurements","mirror","round","sprinkle","title","versionfreeSvg"],"menu":"tests"},"bannerDy":{"count":-1,"min":-15,"max":15,"menu":"annotations.banner"},"bannerSpaces":{"count":10,"min":0,"max":20,"menu":"annotations.banner"},"bannerRepeat":{"count":10,"min":1,"max":20,"menu":"annotations.banner"},"bartackLength":{"count":15,"min":2,"max":100,"menu":"annotations.bartack"},"bartackAngle":{"count":0,"min":-360,"max":360,"menu":"annotations.bartack"},"bartackDensity":{"count":3,"min":1,"max":5,"menu":"annotations.bartack"},"bartackWidth":{"count":3,"min":1,"max":5,"menu":"annotations.bartack"},"bartackStart":{"pct":25,"min":0,"max":100,"menu":"annotations.bartack"},"bartackEnd":{"pct":75,"min":0,"max":100,"menu":"annotations.bartack"},"crossboxText":{"bool":true,"menu":"annotations.crossboxText"},"cutonfoldMargin":{"pct":5,"min":0,"max":25,"menu":"annotations.cutonfold"},"cutonfoldOffset":{"count":15,"min":0,"max":100,"menu":"annotations.cutonfold"},"cutonfoldGrainline":{"bool":false,"menu":"annotations.cutonfold"},"dimensionsCustomText":{"bool":false,"menu":"annotations.dimensions"},"dimensionsEndMarker":{"bool":true,"menu":"annotations.dimensions"},"dimensionsStartMarker":{"bool":true,"menu":"annotations.dimensions"},"logoScale":{"pct":100,"min":10,"max":200,"menu":"annotations.logo"},"logoRotate":{"deg":0,"min":-360,"max":360,"menu":"annotations.logo"},"pleatMargin":{"count":35,"min":0,"max":50,"menu":"annotations.pleat"},"pleatReverse":{"bool":false,"menu":"annotations.pleat"},"scaleboxRotation":{"deg":0,"min":0,"max":360,"menu":"annotations.scalebox"},"scaleboxText":{"dflt":"default","list":["default","custom","suppress"],"menu":"annotations.scalebox"},"sewtogetherHinge":{"bool":true,"menu":"annotations.sewtogether"},"sewtogetherMiddle":{"bool":false,"menu":"annotations.sewtogether"},"titleNr":{"count":1,"min":0,"max":100,"menu":"annotations.title"},"titleTitle":{"bool":true,"menu":"annotations.title"},"titleMeta":{"bool":true,"menu":"annotations.title"},"titleScale":{"pct":100,"min":10,"max":200,"menu":"annotations.title"},"titleRotate":{"deg":0,"min":-360,"max":360,"menu":"annotations.title"},"snippetScale":{"pct":100,"min":10,"max":200,"menu":"annotations.snippets"},"snippetRotation":{"deg":0,"min":-360,"max":360,"menu":"annotations.snippets"},"flipAxis":{"dflt":"x","list":["x","y"],"menu":"flip"},"goreRadius":{"count":20,"min":10,"max":30,"menu":"gore"},"goreGoreNumber":{"count":6,"min":4,"max":8,"menu":"gore"},"goreExtraLength":{"count":10,"min":0,"max":20,"menu":"gore"},"mirrorLine":{"dflt":"a","list":["a","b","none"],"menu":"mirror"},"mirrorClone":{"bool":true,"menu":"mirror"},"roundRadius":{"count":10,"min":0,"max":50,"menu":"round"},"roundHide":{"bool":false,"menu":"round"},"sprinkleScale":{"pct":100,"min":10,"max":200,"menu":"sprinkle"},"sprinkleRotate":{"deg":0,"min":-360,"max":360,"menu":"sprinkle"},"sprinkleSnippet":{"dflt":"bnotch","list":["notch","bnotch","button","buttonhole","buttonhole-start","buttonhole-end","snap-stud","snap-socket","logo"],"menu":"sprinkle"}},"rendertest":{"width":{"mm":200,"min":50,"max":500,"testIgnore":false},"only":{"menu":"show","dflt":"false","list":["false","circles","colors","widths","styles","combos","text","snippets","macros"]}},"sandy":{"minimumOverlap":15,"seamlessFullCircle":{"bool":false,"menu":"construction"},"waistbandWidth":{"pct":4,"min":1,"max":8,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"waistbandPosition":{"pct":50,"min":0,"max":100,"menu":"fit"},"lengthBonus":{"pct":50,"min":10,"max":100,"menu":"style"},"circleRatio":{"pct":50,"min":20,"max":100,"menu":"style"},"waistbandOverlap":{"pct":3,"min":0,"max":15,"menu":"style"},"gathering":{"pct":0,"min":0,"max":200,"menu":"style"},"hemWidth":{"pct":2,"min":1,"max":10,"menu":"construction"},"waistbandShape":{"list":["straight","curved"],"dflt":"straight","menu":"fit"}},"shelly":{"neckEase":{"pct":50,"min":-30,"max":150,"menu":"fit"},"chestEase":{"pct":0,"min":-40,"max":50,"menu":"fit"},"straightSides":{"bool":true,"menu":"advanced"},"hipsEase":{"pct":0,"min":-30,"max":75,"menu":"advanced"},"bodyLength":{"pct":120,"min":20,"max":300,"menu":"style"},"neckBalance":{"pct":40,"min":0,"max":80,"menu":"fit"},"raglanScoopLength":{"pct":20,"min":0,"max":50,"menu":"advanced"},"raglanScoopMagnitude":{"pct":6,"min":0,"max":20,"menu":"advanced"},"hemWidth":{"pct":200,"min":0,"max":800,"menu":"construction"},"sideShape":{"pct":0,"min":-20,"max":20,"menu":"advanced"},"armholeTweakFactor":1.1,"bicepsPosition":0.2,"sleeveEase":{"pct":0,"min":-30,"max":50,"menu":"fit"},"wristEase":{"pct":0,"min":-30,"max":50,"menu":"fit"},"sleeveLength":{"pct":20,"min":0,"max":125,"menu":"style"},"sleeveHem":{"pct":200,"min":0,"max":800,"menu":"construction"},"neckbandLength":{"pct":80,"min":50,"max":100,"menu":"fit"},"neckbandWidth":{"pct":7.5,"min":0,"max":50,"menu":"fit"}},"shin":{"frontFactor":0.58,"legFrontFactor":0.48,"gussetFactor":0.0714,"angle":10,"elasticWidth":{"pct":10,"min":4,"max":20,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"style"},"stretch":{"pct":20,"min":10,"max":30,"menu":"fit"},"bulge":{"pct":2.5,"min":0,"max":5,"menu":"fit"},"legReduction":{"pct":5,"min":0,"max":10,"menu":"fit"},"rise":{"pct":0,"min":0,"max":25,"menu":"style"},"backRise":{"pct":5,"min":0,"max":10,"menu":"fit"}},"simon":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":2,"min":0,"max":15,"menu":"fit"},"lengthBonus":{"pct":25,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"backDarts":{"list":["auto","never","always"],"dflt":"auto","menu":"style"},"backDartShaping":{"pct":25,"min":5,"max":75,"menu":"advanced"},"boxPleat":{"bool":false,"menu":"style"},"boxPleatFold":{"pct":15,"min":10,"max":20,"menu":"advanced"},"boxPleatWidth":{"pct":7,"min":4,"max":10,"menu":"advanced"},"roundBack":{"pct":0,"min":0,"max":10,"menu":"fit"},"buttonholePlacketWidth":{"pct":8,"min":4,"max":12,"menu":"style.closure"},"buttonholePlacketFoldWidth":{"pct":16,"min":8,"max":24,"menu":"style.closure"},"buttonPlacketWidth":{"pct":5,"min":2,"max":8,"menu":"style.closure"},"hemCurve":{"pct":50,"min":25,"max":100,"menu":"style"},"hemStyle":{"list":["straight","baseball","slashed"],"dflt":"straight","menu":"style"},"hipsEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"yokeHeight":{"pct":70,"min":40,"max":90,"menu":"style"},"sleevePlacketWidth":{"pct":13,"min":8,"max":18,"menu":"style.cuffs"},"waistEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"buttonFreeLength":{"pct":2,"min":0,"max":15,"menu":"style.closure"},"extraTopButton":{"bool":true,"menu":"style.closure"},"separateButtonPlacket":{"bool":false,"menu":"style.closure"},"separateButtonholePlacket":{"bool":false,"menu":"style.closure"},"buttons":{"count":7,"min":4,"max":12,"menu":"style.closure"},"ffsa":{"pct":150,"min":100,"max":200,"menu":"advanced"},"collarAngle":{"deg":85,"min":60,"max":130,"menu":"style.collar"},"collarBend":{"pct":3.5,"min":0,"max":10,"menu":"style.collar"},"collarFlare":{"deg":3.5,"min":0,"max":10,"menu":"style.collar"},"collarGap":{"pct":2.5,"min":0,"max":6,"menu":"style.collar"},"collarRoll":{"pct":3,"min":0,"max":6,"menu":"style.collar"},"collarStandBend":{"deg":3,"min":0,"max":5,"menu":"style.collar"},"collarStandCurve":{"deg":2,"min":0,"max":5,"menu":"style.collar"},"collarStandWidth":{"pct":8,"min":3,"max":13,"menu":"style.collar"},"cuffOverlap":0.15,"barrelCuffNarrowButton":{"bool":true,"menu":"style.cuffs"},"cuffButtonRows":{"count":1,"min":1,"max":2,"menu":"style.cuffs"},"cuffDrape":{"pct":5,"min":0,"max":10,"menu":"style.cuffs"},"cuffLength":{"pct":10,"min":3,"max":15,"menu":"style.cuffs"},"cuffStyle":{"list":["roundedBarrelCuff","angledBarrelCuff","straightBarrelCuff","roundedFrenchCuff","angledFrenchCuff","straightFrenchCuff"],"dflt":"angledBarrelCuff","menu":"style.cuffs"},"buttonPlacketStyle":{"list":["classic","seamless"],"dflt":"classic"},"buttonholePlacketStyle":{"list":["classic","seamless"],"dflt":"seamless"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":3.5,"min":-40,"max":10,"menu":"fit"},"sleevePlacketLength":{"pct":25,"min":15,"max":35,"menu":"style.cuffs"},"splitYoke":{"bool":false,"menu":"style"}},"simone":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":5,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"cuffEase":{"pct":20,"min":10,"max":40,"menu":"fit"},"draftForHighBust":true,"shoulderEase":{"pct":2,"min":0,"max":15,"menu":"fit"},"lengthBonus":{"pct":25,"min":-4,"max":60,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"backDarts":{"list":["auto","never","always"],"dflt":"auto","menu":"style"},"backDartShaping":{"pct":25,"min":5,"max":75,"menu":"advanced"},"boxPleat":{"bool":false,"menu":"style"},"boxPleatFold":{"pct":15,"min":10,"max":20,"menu":"advanced"},"boxPleatWidth":{"pct":7,"min":4,"max":10,"menu":"advanced"},"roundBack":{"pct":0,"min":0,"max":10,"menu":"fit"},"buttonholePlacketWidth":{"pct":8,"min":4,"max":12,"menu":"style.closure"},"buttonholePlacketFoldWidth":{"pct":16,"min":8,"max":24,"menu":"style.closure"},"buttonPlacketWidth":{"pct":5,"min":2,"max":8,"menu":"style.closure"},"hemCurve":{"pct":50,"min":25,"max":100,"menu":"style"},"hemStyle":{"list":["straight","baseball","slashed"],"dflt":"straight","menu":"style"},"hipsEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"yokeHeight":{"pct":70,"min":40,"max":90,"menu":"style"},"sleevePlacketWidth":{"pct":13,"min":8,"max":18,"menu":"style.cuffs"},"waistEase":{"pct":15,"min":10,"max":35,"menu":"fit"},"buttonFreeLength":{"pct":2,"min":0,"max":15,"menu":"style.closure"},"extraTopButton":{"bool":true,"menu":"style.closure"},"separateButtonPlacket":{"bool":false,"menu":"style.closure"},"separateButtonholePlacket":{"bool":false,"menu":"style.closure"},"buttons":{"count":7,"min":4,"max":12,"menu":"style.closure"},"ffsa":{"pct":150,"min":100,"max":200,"menu":"advanced"},"minimalDartShaping":5,"bustDartAngle":{"deg":10,"min":0,"max":20,"menu":"advanced"},"bustDartLength":{"pct":80,"min":50,"max":90,"menu":"advanced"},"frontDarts":{"bool":false,"menu":"advanced"},"frontDartLength":{"pct":45,"min":30,"max":60,"menu":"advanced"},"contour":{"pct":50,"min":30,"max":75,"menu":"style"},"bustAlignedButtons":{"dflt":"disabled","list":["even","split","disabled"],"menu":"style.closure"},"collarAngle":{"deg":85,"min":60,"max":130,"menu":"style.collar"},"collarBend":{"pct":3.5,"min":0,"max":10,"menu":"style.collar"},"collarFlare":{"deg":3.5,"min":0,"max":10,"menu":"style.collar"},"collarGap":{"pct":2.5,"min":0,"max":6,"menu":"style.collar"},"collarRoll":{"pct":3,"min":0,"max":6,"menu":"style.collar"},"collarStandBend":{"deg":3,"min":0,"max":5,"menu":"style.collar"},"collarStandCurve":{"deg":2,"min":0,"max":5,"menu":"style.collar"},"collarStandWidth":{"pct":8,"min":3,"max":13,"menu":"style.collar"},"cuffOverlap":0.15,"barrelCuffNarrowButton":{"bool":true,"menu":"style.cuffs"},"cuffButtonRows":{"count":1,"min":1,"max":2,"menu":"style.cuffs"},"cuffDrape":{"pct":5,"min":0,"max":10,"menu":"style.cuffs"},"cuffLength":{"pct":10,"min":3,"max":15,"menu":"style.cuffs"},"cuffStyle":{"list":["roundedBarrelCuff","angledBarrelCuff","straightBarrelCuff","roundedFrenchCuff","angledFrenchCuff","straightFrenchCuff"],"dflt":"angledBarrelCuff","menu":"style.cuffs"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"sleeveLengthBonus":{"pct":3.5,"min":-40,"max":10,"menu":"fit"},"sleevePlacketLength":{"pct":25,"min":15,"max":35,"menu":"style.cuffs"},"splitYoke":{"bool":false,"menu":"style"},"buttonPlacketStyle":{"list":["classic","seamless"],"dflt":"classic"},"buttonholePlacketStyle":{"list":["classic","seamless"],"dflt":"seamless"}},"skully":{"size":{"pct":75,"min":10,"max":300,"menu":"fit"}},"sven":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":10,"min":5,"max":30,"menu":"fit"},"cuffEase":{"pct":20,"min":0,"max":200,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":15,"min":0,"max":30,"menu":"style"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"waistEase":0.08,"sleeveLengthBonus":{"pct":3,"min":0,"max":10,"menu":"style"},"ribbingHeight":{"pct":8,"min":3,"max":15,"menu":"style"},"hipsEase":{"pct":8,"min":-4,"max":20,"menu":"fit"},"ribbing":{"bool":true,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"},"ribbingStretch":{"pct":15,"min":0,"max":30,"menu":"fit"}},"tamiko":{"armholeDepthFactor":{"pct":50,"min":40,"max":60,"menu":"fit"},"chestEase":{"pct":2,"min":1,"max":20,"menu":"fit"},"flare":{"deg":15,"min":-10,"max":30,"menu":"style"},"lengthBonus":{"pct":13,"min":0,"max":60,"menu":"style"},"shoulderseamLength":{"pct":10,"min":5,"max":25,"menu":"style"},"draftForHighBust":{"bool":false,"menu":"fit"}},"teagan":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":0.05,"chestEase":{"pct":12,"min":5,"max":25,"menu":"fit"},"collarEase":0,"cuffEase":0,"draftForHighBust":{"bool":false,"menu":"fit"},"shoulderEase":0,"lengthBonus":{"pct":5,"min":-20,"max":60,"menu":"style"},"s3Collar":0,"s3Armhole":0,"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":8,"min":4,"max":12,"menu":"fit"},"frontArmholeDeeper":0.005,"shoulderSlopeReduction":0,"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveWidthGuarantee":0.85,"sleeveLength":{"pct":30,"min":20,"max":100,"menu":"fit"},"fitWaist":{"bool":false,"menu":"fit"},"waistEase":{"pct":25,"min":8,"max":40},"hipsEase":{"pct":18,"min":8,"max":30,"menu":"fit"},"necklineDepth":{"pct":25,"min":20,"max":40,"menu":"style"},"necklineWidth":{"pct":30,"min":10,"max":50,"menu":"style"},"necklineBend":{"pct":30,"min":0,"max":70,"menu":"style"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveEase":{"pct":15,"min":5,"max":35,"menu":"style"}},"tiberius":{"headRatio":{"pct":100,"min":80,"max":120,"menu":"fit"},"armholeDrop":{"pct":110,"min":100,"max":150,"menu":"fit"},"lengthBonus":{"pct":90,"min":60,"max":130,"menu":"style"},"widthBonus":{"pct":100,"min":50,"max":130,"menu":"style"},"clavi":{"bool":false,"menu":"style.clavi"},"clavusLocation":{"pct":65,"min":50,"max":80,"menu":"style.clavi"},"clavusWidth":{"pct":100,"min":50,"max":150,"menu":"style.clavi"},"length":{"list":["toKnee","toMidLeg","toFloor"],"dflt":"toKnee","menu":"style"},"width":{"list":["toElbow","toShoulder","toMidArm"],"dflt":"toMidArm","menu":"style"},"forceWidth":{"bool":false,"menu":"advanced"}},"titan":{"fitCrossSeam":true,"fitCrossSeamFront":true,"fitCrossSeamBack":true,"fitGuides":true,"waistEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"seatEase":{"pct":2,"min":0,"max":10,"menu":"fit"},"kneeEase":{"pct":6,"min":1,"max":25,"menu":"fit"},"waistHeight":{"pct":100,"min":0,"max":100,"menu":"style"},"lengthBonus":{"pct":2,"min":-20,"max":10,"menu":"style"},"crotchDrop":{"pct":2,"min":0,"max":15,"menu":"style"},"fitKnee":{"bool":false,"menu":"style"},"legBalance":{"pct":57.5,"min":52.5,"max":62.5,"menu":"advanced"},"crossSeamCurveStart":{"pct":85,"min":60,"max":100,"menu":"advanced"},"crossSeamCurveBend":{"pct":65,"min":45,"max":85,"menu":"advanced"},"crossSeamCurveAngle":{"deg":12,"min":0,"max":20,"menu":"advanced"},"crotchSeamCurveStart":{"pct":80,"min":60,"max":95,"menu":"advanced"},"crotchSeamCurveBend":{"pct":80,"min":45,"max":100,"menu":"advanced"},"crotchSeamCurveAngle":{"deg":25,"min":0,"max":35,"menu":"advanced"},"waistBalance":{"pct":60,"min":30,"max":90,"menu":"advanced"},"grainlinePosition":{"pct":45,"min":30,"max":60,"menu":"advanced"},"waistbandWidth":{"pct":3,"min":1,"max":6,"snap":{"metric":[3.5,5,10,12,20,25,30,40,50,60,80,100,120],"imperial":[3.175,6.35,9.524999999999999,12.7,15.875,19.049999999999997,25.4,31.75,38.099999999999994,44.449999999999996,50.8,76.19999999999999,101.6,127]},"menu":"advanced"}},"trayvon":{"tipWidth":{"pct":15,"min":5,"max":35,"snap":{"metric":1,"imperial":0.79375},"menu":"style"},"knotWidth":{"pct":8,"min":4,"max":12,"snap":{"metric":1,"imperial":0.79375},"menu":"style"},"lengthBonus":{"pct":0,"min":-50,"max":50,"menu":"style"}},"uma":{"xStretch":{"pct":15,"min":0,"max":50,"menu":"fit"},"yStretch":{"pct":15,"min":0,"max":50,"menu":"fit"},"gussetWidth":{"pct":15,"min":5,"max":24,"menu":"fit"},"gussetLength":{"pct":12.7,"min":10,"max":16,"menu":"fit"},"gussetPosition":{"pct":70,"min":5,"max":95,"menu":"fit"},"bulge":{"deg":0,"min":0,"max":30,"menu":"fit"},"rise":{"pct":46,"min":30,"max":100,"menu":"style"},"legRise":{"pct":54,"min":5,"max":95,"menu":"style"},"frontDip":{"pct":5,"min":-5,"max":15,"menu":"style"},"frontExposure":{"pct":70,"min":5,"max":100,"menu":"style"},"backDip":{"pct":2.5,"min":-5,"max":15,"menu":"style"},"backExposure":{"pct":30,"min":25,"max":125,"menu":"style"}},"wahid":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":false},"chestEase":{"pct":2,"min":1,"max":10,"menu":"fit"},"collarEase":{"pct":5,"min":0,"max":10,"menu":false},"cuffEase":{"pct":20,"min":0,"max":200,"menu":false},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":false},"lengthBonus":{"pct":1,"min":0,"max":8,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":false},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":false},"acrossBackFactor":0.97,"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":70,"min":60,"max":80,"menu":"fit"},"backNeckCutout":{"pct":5,"min":-2,"max":8,"menu":false},"frontArmholeDeeper":0.005,"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":false},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"frontOverlap":0.01,"necklineDrop":{"pct":50,"min":35,"max":85,"menu":"style"},"frontStyle":{"dflt":"classic","list":["classic","rounded"],"menu":"style"},"frontInset":{"pct":15,"min":10,"max":20,"menu":"advanced"},"shoulderInset":{"pct":10,"min":0,"max":20,"menu":"advanced"},"neckInset":{"pct":5,"min":0,"max":10,"menu":"advanced"},"hemStyle":{"dflt":"classic","list":["classic","rounded","square"],"menu":"style"},"hemRadius":{"pct":6,"min":2,"max":12,"menu":"style"},"pocketWidth":{"pct":10,"max":15,"min":8,"menu":"style"},"pocketAngle":{"deg":5,"min":0,"max":5,"menu":"advanced"},"pocketLocation":{"pct":35,"min":25,"max":55,"menu":"style"},"frontScyeDart":{"deg":6,"min":0,"max":12,"menu":"fit"},"buttons":{"count":6,"min":4,"max":12,"menu":"style"},"waistEase":{"pct":8,"min":2,"max":15,"menu":"fit"},"hipsEase":{"pct":8,"min":2,"max":15,"menu":"fit"},"backInset":{"pct":15,"min":10,"max":20,"menu":"advanced"},"centerBackDart":{"pct":2,"min":0,"max":5,"menu":"fit"},"backScyeDart":{"deg":2,"min":0,"max":6,"menu":"fit"},"weltHeight":{"pct":12.5,"max":20,"min":10,"menu":"style"}},"walburga":{"headRatio":{"pct":100,"min":80,"max":120,"menu":"fit"},"lengthBonus":{"pct":85,"min":60,"max":130,"menu":"style"},"widthBonus":{"pct":95,"min":50,"max":130,"menu":"style"},"length":{"list":["toKnee","toMidLeg","toFloor"],"dflt":"toKnee","menu":"style"},"neckline":{"bool":true,"menu":"style"},"neckoRatio":{"pct":100,"min":10,"max":190,"menu":"style"}},"waralee":{"backPocket":{"bool":true,"menu":"style"},"backPocketDepth":140,"backPocketHorizontalOffset":0.045,"backPocketSize":0.45,"backPocketVerticalOffset":0.2,"backRaise":{"pct":10,"min":0,"max":25,"menu":"fit"},"backWaistAdjustment":0.3,"crotchBack":{"pct":45,"min":10,"max":70,"menu":"advanced"},"crotchEase":1.08,"crotchFactorBackHor":{"pct":90,"min":10,"max":100,"menu":"advanced"},"crotchFactorBackVer":{"pct":60,"min":20,"max":90,"menu":"advanced"},"crotchFactorFrontHor":{"pct":90,"min":10,"max":100,"menu":"advanced"},"crotchFactorFrontVer":{"pct":30,"min":10,"max":70,"menu":"advanced"},"crotchFront":{"pct":30,"min":10,"max":70,"menu":"advanced"},"fitWaist":{"bool":true,"menu":"fit"},"frontPocket":{"bool":true,"menu":"style"},"frontPocketDepthFactor":1.6,"frontPocketHorizontalOffset":0.18,"frontPocketSize":0.45,"frontPocketStyle":{"dflt":"welt","list":["welt","waistband"],"menu":"style"},"frontPocketVerticalOffset":0.07,"frontWaistAdjustment":0.163,"hemWidth":{"pct":1.75,"min":1,"max":2.5,"menu":"style"},"knotInFront":{"bool":true,"menu":"style"},"legShortening":{"pct":25,"min":-10,"max":50,"menu":"style"},"minimizer":4,"separateWaistband":{"bool":false,"menu":"style"},"showMini":{"bool":true,"menu":"options"},"waistOverlap":{"pct":50,"min":10,"max":100,"menu":"style"},"waistRaise":{"pct":0,"min":-20,"max":40,"menu":"fit"},"waistbandWidth":{"pct":3.5,"min":2,"max":5,"menu":"style"}},"yuri":{"brianFitSleeve":true,"brianFitCollar":true,"collarFactor":4.8,"bicepsEase":{"pct":15,"min":0,"max":50,"menu":"fit"},"chestEase":{"pct":15,"min":-4,"max":35,"menu":"fit"},"collarEase":{"pct":20,"min":10,"max":30,"menu":"fit"},"cuffEase":{"pct":30,"min":20,"max":60,"menu":"fit"},"draftForHighBust":{"bool":false},"shoulderEase":{"pct":0,"min":-2,"max":6,"menu":"fit"},"lengthBonus":{"pct":10,"min":5,"max":15,"menu":"fit"},"s3Collar":{"pct":0,"min":-100,"max":100,"menu":"style"},"s3Armhole":{"pct":0,"min":-100,"max":100,"menu":"style"},"acrossBackFactor":{"pct":98,"min":93,"max":100,"menu":"advanced"},"armholeDepth":{"pct":2,"min":-10,"max":50},"armholeDepthFactor":{"pct":55,"min":50,"max":70},"backNeckCutout":{"pct":5,"min":2,"max":8,"menu":"advanced"},"frontArmholeDeeper":{"pct":0.2,"min":0,"max":0.5,"menu":"advanced"},"shoulderSlopeReduction":{"pct":0,"min":0,"max":80,"menu":"advanced"},"legacyArmholeDepth":{"bool":false,"menu":"advanced"},"sleeveLengthBonus":{"pct":1,"min":0,"max":10,"menu":"fit"},"hipsEase":{"pct":0,"min":0,"max":10,"menu":"fit"},"sleevecapEase":{"pct":0,"min":0,"max":10,"menu":"advanced.sleevecap"},"sleevecapTopFactorX":{"pct":50,"min":25,"max":75,"menu":"advanced.sleevecap"},"sleevecapTopFactorY":{"pct":45,"min":35,"max":125,"menu":"advanced.sleevecap"},"sleevecapBackFactorX":{"pct":60,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapBackFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorX":{"pct":55,"min":35,"max":65,"menu":"advanced.sleevecap"},"sleevecapFrontFactorY":{"pct":33,"min":30,"max":65,"menu":"advanced.sleevecap"},"sleevecapQ1Offset":{"pct":1.7,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ2Offset":{"pct":3.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ3Offset":{"pct":2.5,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ4Offset":{"pct":1,"min":0,"max":7,"menu":"advanced.sleevecap"},"sleevecapQ1Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ1Spread2":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread1":{"pct":15,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ2Spread2":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread1":{"pct":10,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ3Spread2":{"pct":8,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread1":{"pct":7,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleevecapQ4Spread2":{"pct":6.3,"min":4,"max":20,"menu":"advanced.sleevecap"},"sleeveWidthGuarantee":{"pct":90,"min":25,"max":100,"menu":"advanced"}},"otis":{"ease":{"pct":14,"min":0,"max":30,"menu":"fit"},"snapPlacket":{"pct":5,"min":0,"max":30,"menu":"advanced"},"sleeveType":{"dflt":"short","list":["short","long"],"menu":"style"},"hem":{"pct":10,"min":0,"max":30,"menu":"advanced"},"binding":{"pct":11,"min":2,"max":30,"menu":"advanced"}}} diff --git a/sites/shared/prebuild/data/designs.mjs b/sites/shared/prebuild/data/designs.mjs index a39147aa657..aa0d9a41833 100644 --- a/sites/shared/prebuild/data/designs.mjs +++ b/sites/shared/prebuild/data/designs.mjs @@ -1,3 +1,3 @@ // __SDEFILE__ - This file is a dependency for the stand-alone environment // This file is auto-generated by the prebuild script | Any changes will be overwritten -export const designs = ["aaron","albert","bee","bella","benjamin","bent","bob","breanna","brian","bruce","carlita","carlton","cathrin","charlie","cornelius","diana","examples","florence","florent","hi","holmes","hortensia","huey","hugo","jaeger","legend","lucy","lunetius","magde","noble","octoplushy","paco","penelope","plugintest","rendertest","sandy","shelly","shin","simon","simone","skully","sven","tamiko","teagan","tiberius","titan","trayvon","uma","wahid","walburga","waralee","yuri","otis"] +export const designs = ["aaron","albert","bee","bella","benjamin","bent","bob","breanna","brian","bruce","carlita","carlton","cathrin","charlie","cornelius","diana","examples","florence","florent","gozer","hi","holmes","hortensia","huey","hugo","jaeger","legend","lucy","lunetius","magde","noble","octoplushy","paco","penelope","plugintest","rendertest","sandy","shelly","shin","simon","simone","skully","sven","tamiko","teagan","tiberius","titan","trayvon","uma","wahid","walburga","waralee","yuri","otis"] From b0b3dee005bc88dd7a9843c84a502023ef93ea6c Mon Sep 17 00:00:00 2001 From: FreeSewing bot Date: Tue, 17 Oct 2023 15:49:55 +0200 Subject: [PATCH 11/26] feat: New showcase post simone-by-gaelle by Natalia --- markdown/org/showcase/simone-by-gaelle/en.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 markdown/org/showcase/simone-by-gaelle/en.md diff --git a/markdown/org/showcase/simone-by-gaelle/en.md b/markdown/org/showcase/simone-by-gaelle/en.md new file mode 100644 index 00000000000..366b654f25b --- /dev/null +++ b/markdown/org/showcase/simone-by-gaelle/en.md @@ -0,0 +1,19 @@ +--- +title: "Simone by Gaëlle" +caption: "A lovely Simone shirt with beautiful details" +date: 20231017 +intro: "This Simone shirt features beautiful details, including coordinated buttons and custom labels." +designs: ["simone"] +maker: Natalia +--- + +The talented Gaëlle shared this Simone shirt. Don't miss the the detail photos. + +![Another view of the front](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-simone-by-gaelle-1/public "Another view of the front") + +![Collar details](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-simone-by-gaelle-2/public "Collar details") + +![Cuff button details](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-simone-by-gaelle-4/public "Cuff button details") + +![Custom label tags](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-simone-by-gaelle-5/public "Custom label tags") + From 0c8a26f94753ca7a610a4549698926deb14f6083 Mon Sep 17 00:00:00 2001 From: FreeSewing bot Date: Tue, 17 Oct 2023 15:55:56 +0200 Subject: [PATCH 12/26] feat: New showcase post breanna-dress-by-andrea-cretu by Natalia --- .../breanna-dress-by-andrea-cretu/en.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 markdown/org/showcase/breanna-dress-by-andrea-cretu/en.md diff --git a/markdown/org/showcase/breanna-dress-by-andrea-cretu/en.md b/markdown/org/showcase/breanna-dress-by-andrea-cretu/en.md new file mode 100644 index 00000000000..d60d5eb7fae --- /dev/null +++ b/markdown/org/showcase/breanna-dress-by-andrea-cretu/en.md @@ -0,0 +1,17 @@ +--- +title: "Breanna dress by Andrea Cretu" +caption: "Andrea made this lovely dress based on the Breanna block" +date: 20231017 +intro: "Andrea added a circle skirt to the Breanna block to make this charming dress." +designs: ["breanna"] +maker: Natalia +--- + +Andrea added a circle skirt to the Breanna block to make this charming dress. We love the choice of fabric and buttons! + +Andrea shared these helpful details: + +> Made a dress based on the Breanna body block, with a circle skirt. Next iteration I'll scoop out the armholes and neck and add length to the bottom, so the skirt starts a little lower. Also will make the darts end earlier on the bust and later on the back. + +Andrea is a talented creator, and the owner at [Yarnandy.com](Yarnandy.com). + From 47b43afb3798d51ffbce9948937c7bac8c48ef36 Mon Sep 17 00:00:00 2001 From: FreeSewing bot Date: Tue, 17 Oct 2023 16:06:50 +0200 Subject: [PATCH 13/26] feat: New showcase post four-versions-of-otis-and-a-bonus-bob by Natalia --- .../en.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 markdown/org/showcase/four-versions-of-otis-and-a-bonus-bob/en.md diff --git a/markdown/org/showcase/four-versions-of-otis-and-a-bonus-bob/en.md b/markdown/org/showcase/four-versions-of-otis-and-a-bonus-bob/en.md new file mode 100644 index 00000000000..771073a3a20 --- /dev/null +++ b/markdown/org/showcase/four-versions-of-otis-and-a-bonus-bob/en.md @@ -0,0 +1,23 @@ +--- +title: "Four versions of Otis and a bonus Bob" +caption: "An Otis baby romper and Bob bib" +date: 20231017 +intro: "Wouter made four versions of Otis for newborn Otis, and a Bob to complete the ensemble." +designs: ["otis", "bob"] +maker: Natalia +--- + +Wouter, the designer, made these: + +> Four versions of otis. One with long sleeves, and one that is reversible (don’t try this; figuring out how seams go together and in which sequence causes headaches). + +We are head over heels for his adorable fabric choices. The cute baby doesn't hurt. + +![Otis on Otis](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-four-versions-of-otis-and-a-bonus-bob-1/public "Otis on Otis") + +![A polka dot Otis](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-four-versions-of-otis-and-a-bonus-bob-2/public "A polka dot Otis") + +![This Otis is out of this world](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-four-versions-of-otis-and-a-bonus-bob-3/public "This Otis is out of this world") + +![A view of the reverse](https://imagedelivery.net/ouSuR9yY1bHt-fuAokSA5Q/showcase-four-versions-of-otis-and-a-bonus-bob-4/public "A view of the reverse") + From 4a04332d6ce20f7e9c54b9ea0e9b818a8172e198 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 14:34:11 +0000 Subject: [PATCH 14/26] Fixes Joost comments and adds dimensions --- designs/gozer/src/ghost.mjs | 70 ++++++++++++++----------------------- 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/designs/gozer/src/ghost.mjs b/designs/gozer/src/ghost.mjs index cab97332daa..9f857c2d713 100644 --- a/designs/gozer/src/ghost.mjs +++ b/designs/gozer/src/ghost.mjs @@ -1,8 +1,12 @@ +import { cbqc } from '@freesewing/core' + export const ghost = { name: 'gozer.ghost', measurements: ['hpsToWaistBack', 'waistToFloor', 'head'], draft: ({ measurements, Point, Path, points, paths, Snippet, snippets, sa, macro, part }) => { - const c = 0.55191502449351 + // const c = 0.55191502449351 + const c = cbqc + console.log({ c: c }) const eyeSize = measurements.head * 0.0416 const size = measurements.hpsToWaistBack + measurements.waistToFloor + measurements.head / Math.PI @@ -24,31 +28,8 @@ export const ghost = { points.rightCp1 = points.right.shift(90, size * c) points.rightCp2 = points.right.shift(270, size * c) - points.eyeLefttop = points.eyeLeft.shift(90, size * eyeSize) - points.eyeLeftleft = points.eyeLeft.shift(180, size * eyeSize) - points.eyeLeftbottom = points.eyeLeft.shift(270, size * eyeSize) - points.eyeLeftright = points.eyeLeft.shift(0, size * eyeSize) - points.eyeLefttopCp1 = points.eyeLefttop.shift(180, size * c * eyeSize) - points.eyeLefttopCp2 = points.eyeLefttop.shift(0, size * c * eyeSize) - points.eyeLeftleftCp1 = points.eyeLeftleft.shift(270, size * c * eyeSize) - points.eyeLeftleftCp2 = points.eyeLeftleft.shift(90, size * c * eyeSize) - points.eyeLeftbottomCp1 = points.eyeLeftbottom.shift(0, size * c * eyeSize) - points.eyeLeftbottomCp2 = points.eyeLeftbottom.shift(180, size * c * eyeSize) - points.eyeLeftrightCp1 = points.eyeLeftright.shift(90, size * c * eyeSize) - points.eyeLeftrightCp2 = points.eyeLeftright.shift(270, size * c * eyeSize) - - points.eyeRighttop = points.eyeRight.shift(90, size * eyeSize) - points.eyeRightleft = points.eyeRight.shift(180, size * eyeSize) - points.eyeRightbottom = points.eyeRight.shift(270, size * eyeSize) - points.eyeRightright = points.eyeRight.shift(0, size * eyeSize) - points.eyeRighttopCp1 = points.eyeRighttop.shift(180, size * c * eyeSize) - points.eyeRighttopCp2 = points.eyeRighttop.shift(0, size * c * eyeSize) - points.eyeRightleftCp1 = points.eyeRightleft.shift(270, size * c * eyeSize) - points.eyeRightleftCp2 = points.eyeRightleft.shift(90, size * c * eyeSize) - points.eyeRightbottomCp1 = points.eyeRightbottom.shift(0, size * c * eyeSize) - points.eyeRightbottomCp2 = points.eyeRightbottom.shift(180, size * c * eyeSize) - points.eyeRightrightCp1 = points.eyeRightright.shift(90, size * c * eyeSize) - points.eyeRightrightCp2 = points.eyeRightright.shift(270, size * c * eyeSize) + points.eyeLeft.addCircle(eyeSize) + points.eyeRight.addCircle(eyeSize) paths.seam = new Path() .move(points.top) @@ -59,24 +40,6 @@ export const ghost = { .close() .attr('class', 'fabric') - paths.eyeLeft = new Path() - .move(points.eyeLefttop) - .curve(points.eyeLefttopCp1, points.eyeLeftleftCp2, points.eyeLeftleft) - .curve(points.eyeLeftleftCp1, points.eyeLeftbottomCp2, points.eyeLeftbottom) - .curve(points.eyeLeftbottomCp1, points.eyeLeftrightCp2, points.eyeLeftright) - .curve(points.eyeLeftrightCp1, points.eyeLefttopCp2, points.eyeLefttop) - .close() - .attr('class', 'fabric') - - paths.eyeRight = new Path() - .move(points.eyeRighttop) - .curve(points.eyeRighttopCp1, points.eyeRightleftCp2, points.eyeRightleft) - .curve(points.eyeRightleftCp1, points.eyeRightbottomCp2, points.eyeRightbottom) - .curve(points.eyeRightbottomCp1, points.eyeRightrightCp2, points.eyeRightright) - .curve(points.eyeRightrightCp1, points.eyeRighttopCp2, points.eyeRighttop) - .close() - .attr('class', 'fabric') - points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) macro('title', { nr: 1, @@ -91,6 +54,25 @@ export const ghost = { paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') } + macro('hd', { + from: points.left, + to: points.right, + id: 'width', + y: points.right.y, + }) + macro('hd', { + from: points.eyeLeft, + to: points.middle, + id: 'eye', + y: points.eyeLeft.y, + }) + macro('vd', { + from: points.eyeLeft, + to: points.middle, + id: 'eye', + x: points.eyeLeft.x, + }) + return part }, } From 21a6707738d0552b5a6ec8e5b7f3601c56a36e46 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 14:37:59 +0000 Subject: [PATCH 15/26] cbqc and addClass --- designs/gozer/src/ghost.mjs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/designs/gozer/src/ghost.mjs b/designs/gozer/src/ghost.mjs index 9f857c2d713..bb2b9980b87 100644 --- a/designs/gozer/src/ghost.mjs +++ b/designs/gozer/src/ghost.mjs @@ -4,9 +4,6 @@ export const ghost = { name: 'gozer.ghost', measurements: ['hpsToWaistBack', 'waistToFloor', 'head'], draft: ({ measurements, Point, Path, points, paths, Snippet, snippets, sa, macro, part }) => { - // const c = 0.55191502449351 - const c = cbqc - console.log({ c: c }) const eyeSize = measurements.head * 0.0416 const size = measurements.hpsToWaistBack + measurements.waistToFloor + measurements.head / Math.PI @@ -19,14 +16,14 @@ export const ghost = { points.left = new Point(-1 * size, 0) points.right = new Point(size, 0) points.bottom = new Point(0, size) - points.topCp1 = points.top.shift(180, size * c) - points.topCp2 = points.top.shift(0, size * c) - points.leftCp1 = points.left.shift(270, size * c) - points.leftCp2 = points.left.shift(90, size * c) - points.bottomCp1 = points.bottom.shift(0, size * c) - points.bottomCp2 = points.bottom.shift(180, size * c) - points.rightCp1 = points.right.shift(90, size * c) - points.rightCp2 = points.right.shift(270, size * c) + points.topCp1 = points.top.shift(180, size * cbqc) + points.topCp2 = points.top.shift(0, size * cbqc) + points.leftCp1 = points.left.shift(270, size * cbqc) + points.leftCp2 = points.left.shift(90, size * cbqc) + points.bottomCp1 = points.bottom.shift(0, size * cbqc) + points.bottomCp2 = points.bottom.shift(180, size * cbqc) + points.rightCp1 = points.right.shift(90, size * cbqc) + points.rightCp2 = points.right.shift(270, size * cbqc) points.eyeLeft.addCircle(eyeSize) points.eyeRight.addCircle(eyeSize) @@ -38,7 +35,7 @@ export const ghost = { .curve(points.bottomCp1, points.rightCp2, points.right) .curve(points.rightCp1, points.topCp2, points.top) .close() - .attr('class', 'fabric') + .addClass('fabric') points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) macro('title', { @@ -51,7 +48,7 @@ export const ghost = { snippets.logo = new Snippet('logo', points.logo) if (sa) { - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + paths.sa = paths.seam.offset(sa).addClass('fabric sa') } macro('hd', { From 927e6d91652965b6852762d04e35b2e788c51113 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 18:45:29 +0000 Subject: [PATCH 16/26] Cleanup --- designs/gozer/src/ghost.mjs | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/designs/gozer/src/ghost.mjs b/designs/gozer/src/ghost.mjs index bb2b9980b87..8416418f8b8 100644 --- a/designs/gozer/src/ghost.mjs +++ b/designs/gozer/src/ghost.mjs @@ -1,5 +1,3 @@ -import { cbqc } from '@freesewing/core' - export const ghost = { name: 'gozer.ghost', measurements: ['hpsToWaistBack', 'waistToFloor', 'head'], @@ -8,47 +6,29 @@ export const ghost = { const size = measurements.hpsToWaistBack + measurements.waistToFloor + measurements.head / Math.PI - points.middle = new Point(0, 0) + points.middle = new Point(0, 0).addCircle(size, 'fabric') + points.eyeLine = points.middle.shift(270, measurements.head / Math.PI / 2) points.eyeLeft = points.eyeLine.shift(180, measurements.head * 0.13) points.eyeRight = points.eyeLine.shift(0, measurements.head * 0.13) - points.top = new Point(0, -1 * size) points.left = new Point(-1 * size, 0) points.right = new Point(size, 0) - points.bottom = new Point(0, size) - points.topCp1 = points.top.shift(180, size * cbqc) - points.topCp2 = points.top.shift(0, size * cbqc) - points.leftCp1 = points.left.shift(270, size * cbqc) - points.leftCp2 = points.left.shift(90, size * cbqc) - points.bottomCp1 = points.bottom.shift(0, size * cbqc) - points.bottomCp2 = points.bottom.shift(180, size * cbqc) - points.rightCp1 = points.right.shift(90, size * cbqc) - points.rightCp2 = points.right.shift(270, size * cbqc) points.eyeLeft.addCircle(eyeSize) points.eyeRight.addCircle(eyeSize) - paths.seam = new Path() - .move(points.top) - .curve(points.topCp1, points.leftCp2, points.left) - .curve(points.leftCp1, points.bottomCp2, points.bottom) - .curve(points.bottomCp1, points.rightCp2, points.right) - .curve(points.rightCp1, points.topCp2, points.top) - .close() - .addClass('fabric') - - points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) + points.title = points.middle.shift(270, size * 0.65) macro('title', { nr: 1, at: points.title, title: 'Gozer', align: 'center', }) - points.logo = points.middle.shiftFractionTowards(points.bottom, 0.5) + points.logo = points.middle.shift(270, size * 0.5) snippets.logo = new Snippet('logo', points.logo) if (sa) { - paths.sa = paths.seam.offset(sa).addClass('fabric sa') + points.sa = new Point(0, 0).addCircle(size + sa, 'fabric sa') } macro('hd', { From 51c539affefbd59ee083e6c10a1782837498056c Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 18:51:54 +0000 Subject: [PATCH 17/26] lint --- designs/gozer/src/ghost.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designs/gozer/src/ghost.mjs b/designs/gozer/src/ghost.mjs index 8416418f8b8..91b79e98149 100644 --- a/designs/gozer/src/ghost.mjs +++ b/designs/gozer/src/ghost.mjs @@ -1,7 +1,7 @@ export const ghost = { name: 'gozer.ghost', measurements: ['hpsToWaistBack', 'waistToFloor', 'head'], - draft: ({ measurements, Point, Path, points, paths, Snippet, snippets, sa, macro, part }) => { + draft: ({ measurements, Point, points, Snippet, snippets, sa, macro, part }) => { const eyeSize = measurements.head * 0.0416 const size = measurements.hpsToWaistBack + measurements.waistToFloor + measurements.head / Math.PI From 3a12615f8d60849c201b7df638a6e47725503186 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 21:08:20 +0000 Subject: [PATCH 18/26] fixes --- designs/waralee/src/backpocket.mjs | 11 ++- designs/waralee/src/cutout.mjs | 2 - designs/waralee/src/facings.mjs | 10 ++- designs/waralee/src/ghost.mjs | 107 ----------------------------- designs/waralee/src/mini.mjs | 27 +++----- designs/waralee/src/pants.mjs | 14 ++-- designs/waralee/src/pantsproto.mjs | 45 +++++------- designs/waralee/src/pocket.mjs | 24 +++---- designs/waralee/src/waistband.mjs | 11 +-- 9 files changed, 56 insertions(+), 195 deletions(-) delete mode 100644 designs/waralee/src/ghost.mjs diff --git a/designs/waralee/src/backpocket.mjs b/designs/waralee/src/backpocket.mjs index d4f81d7ced4..5070c8b1973 100644 --- a/designs/waralee/src/backpocket.mjs +++ b/designs/waralee/src/backpocket.mjs @@ -25,7 +25,7 @@ export const backPocket = { const pocketDepth = options.backPocketDepth * measurements.crotchDepth if (!expand) { - // Expand is on, do not draw the part but flag this to the user + // Expand is off, do not draw the part but flag this to the user store.flag.note({ msg: `waralee:cutBackPocket`, replace: { @@ -69,7 +69,7 @@ export const backPocket = { .line(points.bottomRight) .join(paths.seamSA) .close() - .attr('class', 'fabric') + .addClass('fabric') macro('cutonfold', { from: points.bottomLeft, @@ -87,12 +87,9 @@ export const backPocket = { points.logo = points.title.shift(270, 75) snippets.logo = new Snippet('logo', points.logo) - points.text = points.logo - .shift(-90, 25) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + points.text = points.logo.shift(-90, 25).addText('Waralee', 'center') - if (sa) paths.sa = paths.seamSA.close().offset(sa).attr('class', 'fabric sa') + if (sa) paths.sa = paths.seamSA.close().offset(sa).addClass('fabric sa') macro('hd', { id: 1, diff --git a/designs/waralee/src/cutout.mjs b/designs/waralee/src/cutout.mjs index d7efc65dac2..28c88d0348c 100644 --- a/designs/waralee/src/cutout.mjs +++ b/designs/waralee/src/cutout.mjs @@ -21,8 +21,6 @@ export const cutout = { .close() .attr('class', 'fabric') - // paths.cutout.hide() - points.title = points.mWaist.shift(270, 75) macro('title', { nr: 2, diff --git a/designs/waralee/src/facings.mjs b/designs/waralee/src/facings.mjs index 935429038a0..f7ce9e62f32 100644 --- a/designs/waralee/src/facings.mjs +++ b/designs/waralee/src/facings.mjs @@ -19,10 +19,8 @@ function waraleeFacing( part, } ) { - const frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ - const backPocketSize = - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + const frontPocketSize = options.frontPocketSize * measurements.crotchDepth + const backPocketSize = options.backPocketSize * measurements.crotchDepth if (type == 'front') { if (!options.frontPocket || 'welt' != options.frontPocketStyle) { @@ -38,7 +36,7 @@ function waraleeFacing( const height = (type == 'front' ? frontPocketSize : backPocketSize) / 2 if (!expand) { - // Expand is on, do not draw the part but flag this to the user + // Expand is off, do not draw the part but flag this to the user store.flag.note({ msg: `waralee:cutFacing` + type, replace: { @@ -71,7 +69,7 @@ function waraleeFacing( .line(points.tr) .line(points.tl) .close() - .attr('class', 'fabric') + .addClass('fabric') store.cutlist.addCut({ cut: type == 'front' ? 4 : 2, from: 'fabric' }) diff --git a/designs/waralee/src/ghost.mjs b/designs/waralee/src/ghost.mjs deleted file mode 100644 index 17f50036788..00000000000 --- a/designs/waralee/src/ghost.mjs +++ /dev/null @@ -1,107 +0,0 @@ -import { pantsProto } from './pantsproto.mjs' - -export const ghost = { - name: 'waralee.ghost', - after: pantsProto, - draft: ({ - options, - measurements, - Point, - Path, - points, - paths, - Snippet, - snippets, - sa, - macro, - part, - }) => { - const c = 0.55191502449351 - const eyeSize = 0.02 - const size = 500 - - points.middle = new Point(0, 0) - points.eyeLine = points.middle.shift(270, size / 10) - points.eyeLeft = points.eyeLine.shift(180, size / 20) - points.eyeRight = points.eyeLine.shift(0, size / 20) - points.top = new Point(0, -1 * size) - points.left = new Point(-1 * size, 0) - points.right = new Point(size, 0) - points.bottom = new Point(0, size) - points.topCp1 = points.top.shift(180, size * c) - points.topCp2 = points.top.shift(0, size * c) - points.leftCp1 = points.left.shift(270, size * c) - points.leftCp2 = points.left.shift(90, size * c) - points.bottomCp1 = points.bottom.shift(0, size * c) - points.bottomCp2 = points.bottom.shift(180, size * c) - points.rightCp1 = points.right.shift(90, size * c) - points.rightCp2 = points.right.shift(270, size * c) - - points.eyeLefttop = points.eyeLeft.shift(90, size * eyeSize) - points.eyeLeftleft = points.eyeLeft.shift(180, size * eyeSize) - points.eyeLeftbottom = points.eyeLeft.shift(270, size * eyeSize) - points.eyeLeftright = points.eyeLeft.shift(0, size * eyeSize) - points.eyeLefttopCp1 = points.eyeLefttop.shift(180, size * c * eyeSize) - points.eyeLefttopCp2 = points.eyeLefttop.shift(0, size * c * eyeSize) - points.eyeLeftleftCp1 = points.eyeLeftleft.shift(270, size * c * eyeSize) - points.eyeLeftleftCp2 = points.eyeLeftleft.shift(90, size * c * eyeSize) - points.eyeLeftbottomCp1 = points.eyeLeftbottom.shift(0, size * c * eyeSize) - points.eyeLeftbottomCp2 = points.eyeLeftbottom.shift(180, size * c * eyeSize) - points.eyeLeftrightCp1 = points.eyeLeftright.shift(90, size * c * eyeSize) - points.eyeLeftrightCp2 = points.eyeLeftright.shift(270, size * c * eyeSize) - - points.eyeRighttop = points.eyeRight.shift(90, size * eyeSize) - points.eyeRightleft = points.eyeRight.shift(180, size * eyeSize) - points.eyeRightbottom = points.eyeRight.shift(270, size * eyeSize) - points.eyeRightright = points.eyeRight.shift(0, size * eyeSize) - points.eyeRighttopCp1 = points.eyeRighttop.shift(180, size * c * eyeSize) - points.eyeRighttopCp2 = points.eyeRighttop.shift(0, size * c * eyeSize) - points.eyeRightleftCp1 = points.eyeRightleft.shift(270, size * c * eyeSize) - points.eyeRightleftCp2 = points.eyeRightleft.shift(90, size * c * eyeSize) - points.eyeRightbottomCp1 = points.eyeRightbottom.shift(0, size * c * eyeSize) - points.eyeRightbottomCp2 = points.eyeRightbottom.shift(180, size * c * eyeSize) - points.eyeRightrightCp1 = points.eyeRightright.shift(90, size * c * eyeSize) - points.eyeRightrightCp2 = points.eyeRightright.shift(270, size * c * eyeSize) - - console.log({ points: JSON.parse(JSON.stringify(points)) }) - - paths.seam = new Path() - .move(points.top) - .curve(points.topCp1, points.leftCp2, points.left) - .curve(points.leftCp1, points.bottomCp2, points.bottom) - .curve(points.bottomCp1, points.rightCp2, points.right) - .curve(points.rightCp1, points.topCp2, points.top) - .close() - .attr('class', 'fabric') - - paths.eyeLeft = new Path() - .move(points.eyeLefttop) - .curve(points.eyeLefttopCp1, points.eyeLeftleftCp2, points.eyeLeftleft) - .curve(points.eyeLeftleftCp1, points.eyeLeftbottomCp2, points.eyeLeftbottom) - .curve(points.eyeLeftbottomCp1, points.eyeLeftrightCp2, points.eyeLeftright) - .curve(points.eyeLeftrightCp1, points.eyeLefttopCp2, points.eyeLefttop) - .close() - .attr('class', 'fabric') - - paths.eyeRight = new Path() - .move(points.eyeRighttop) - .curve(points.eyeRighttopCp1, points.eyeRightleftCp2, points.eyeRightleft) - .curve(points.eyeRightleftCp1, points.eyeRightbottomCp2, points.eyeRightbottom) - .curve(points.eyeRightbottomCp1, points.eyeRightrightCp2, points.eyeRightright) - .curve(points.eyeRightrightCp1, points.eyeRighttopCp2, points.eyeRighttop) - .close() - .attr('class', 'fabric') - - points.title = points.middle.shiftFractionTowards(points.bottom, 0.65) - macro('title', { - nr: 1, - at: points.title, - title: 'Gozer', - align: 'center', - }) - points.logo = points.middle.shiftFractionTowards(points.bottom, 0.5) - snippets.logo = new Snippet('logo', points.logo) - - return part - }, -} diff --git a/designs/waralee/src/mini.mjs b/designs/waralee/src/mini.mjs index c0478ead897..ee9a2ca3dd9 100644 --- a/designs/waralee/src/mini.mjs +++ b/designs/waralee/src/mini.mjs @@ -22,27 +22,23 @@ export const mini = { paths.waistFoldBack = paths.waistBack .offset((-1 * store.get('waistBand')) / mini) - .attr('class', 'fabric stroke-sm') + .addClass('fabric stroke-sm') paths.waistFoldFront = paths.waistFront .offset((-1 * store.get('waistBand')) / mini) - .attr('class', 'fabric stroke-sm') + .addClass('fabric stroke-sm') paths.frontFold = paths.front .offset((-1 * store.get('hem')) / mini) - .attr('class', 'fabric stroke-sm') - paths.legFold = paths.leg - .offset((-1 * store.get('hem')) / mini) - .attr('class', 'fabric stroke-sm') - paths.backFold = paths.back - .offset((-1 * store.get('hem')) / mini) - .attr('class', 'fabric stroke-sm') + .addClass('fabric stroke-sm') + paths.legFold = paths.leg.offset((-1 * store.get('hem')) / mini).addClass('fabric stroke-sm') + paths.backFold = paths.back.offset((-1 * store.get('hem')) / mini).addClass('fabric stroke-sm') paths.cutOut = new Path() .move(separateWaistband ? points.bWaistSideSeam : points.bWaistSide) .line(points.mWaist2) .line(points.mWaist1) .line(separateWaistband ? points.fWaistSideSeam : points.fWaistSide) - .attr('class', 'help') + .addClass('help') paths.seam.unhide() @@ -56,21 +52,18 @@ export const mini = { } if (sa) { - paths.sa = paths.seam.offset(sa / mini).attr('class', 'fabric sa') + paths.sa = paths.seam.offset(sa / mini).addClass('fabric sa') } points.pText1 = points.mHip .shiftFractionTowards(points.mLeg, 0.5) - .attr('data-text', 'waralee:thisIsNotAPart') - .attr('data-text-class', 'center') + .addText('waralee:thisIsNotAPart', 'center') points.pText2 = points.mHip .shiftFractionTowards(points.mLeg, 0.6) - .attr('data-text', 'waralee:doNotCutFromFabric') - .attr('data-text-class', 'center') + .addText('waralee:doNotCutFromFabric', 'center') points.pText3 = points.mHip .shiftFractionTowards(points.mLeg, 0.7) - .attr('data-text', 'waralee:useMeasurementsToCutFromFabric') - .attr('data-text-class', 'center') + .addText('waralee:useMeasurementsToCutFromFabric', 'center') const fWaistSide = separateWaistband ? points.fWaistSideSeam : points.fWaistSide const fWaistFrontOverlap = separateWaistband diff --git a/designs/waralee/src/pants.mjs b/designs/waralee/src/pants.mjs index ff944ce81ec..83c9a116216 100644 --- a/designs/waralee/src/pants.mjs +++ b/designs/waralee/src/pants.mjs @@ -19,7 +19,7 @@ export const pants = { }, }) } else { - // Expand is on, do not draw the part but flag this to the user + // Expand is off, do not draw the part but flag this to the user store.flag.note({ msg: `waralee:hidePants`, }) @@ -34,16 +34,16 @@ export const pants = { .move(points.bWaistSideHem) .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackHem) .line(separateWaistband ? points.bWaistBackSeam : points.bWaistBackOverlapHem) - .attr('class', 'fabric stroke-sm') + .addClass('fabric stroke-sm') paths.waistFoldFront = new Path() .move(points.fWaistSideHem) .line(points.fWaistFrontOverlapHem) - .attr('class', 'fabric stroke-sm') + .addClass('fabric stroke-sm') } - paths.frontFold = paths.front.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') - paths.legFold = paths.leg.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') - paths.backFold = paths.back.offset(-1 * store.get('hem')).attr('class', 'fabric stroke-sm') + paths.frontFold = paths.front.offset(-1 * store.get('hem')).addClass('fabric stroke-sm') + paths.legFold = paths.leg.offset(-1 * store.get('hem')).addClass('fabric stroke-sm') + paths.backFold = paths.back.offset(-1 * store.get('hem')).addClass('fabric stroke-sm') paths.seam.unhide() @@ -61,7 +61,7 @@ export const pants = { macro('scalebox', { at: points.mHip.shift(-90, 70) }) - if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (sa) paths.sa = paths.seam.offset(sa).addClass('fabric sa') if (options.frontPocket && 'welt' == options.frontPocketStyle) { paths.frontPocket.unhide() diff --git a/designs/waralee/src/pantsproto.mjs b/designs/waralee/src/pantsproto.mjs index 912eac58fe2..f8e6e56b219 100644 --- a/designs/waralee/src/pantsproto.mjs +++ b/designs/waralee/src/pantsproto.mjs @@ -74,10 +74,7 @@ export const pantsProto = { optionalMeasurements: ['waist', 'waistBack'], options, draft: ({ options, measurements, Point, Path, points, paths, store, part, utils }) => { - const seatDepth = - measurements.crotchDepth /* - measurements.waistToHips */ * - (1 + options.waistRaise) * - options.crotchEase + const seatDepth = measurements.crotchDepth * (1 + options.waistRaise) * options.crotchEase const waist = typeof measurements.waist == 'undefined' || false == options.fitWaist ? measurements.seat @@ -94,10 +91,13 @@ export const pantsProto = { const hem = measurements.inseam * options.hemWidth const waistBand = measurements.inseam * options.waistbandWidth + const frontPocketSize = options.frontPocketSize * measurements.crotchDepth const pocketDepth = - (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor - const frontPocketSize = - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor > + frontPocketSize * 1.75 + ? (measurements.crotchDepth - measurements.waistToHips) * options.frontPocketDepthFactor + : frontPocketSize * 1.75 + const frontPocketHeight = frontPocketSize * options.frontPocketWidthHeightRatio store.set('waistBand', waistBand) store.set('hem', hem) @@ -310,25 +310,23 @@ export const pantsProto = { .join(paths.waistBack) .join(paths.cutout) .close() - .attr('class', 'fabric') + .addClass('fabric') .hide() if (options.frontPocket) { points.frontPocketTop = points.fWaistSideSeam .shift( 270, - options.frontPocketVerticalOffset * - measurements.crotchDepth /*- measurements.waistToHips*/ + + options.frontPocketVerticalOffset * measurements.crotchDepth + waistBand * (separateWaistband ? 1 : 2) ) .shift(180, options.frontPocketHorizontalOffset * measurements.seat) - const frontPocketHeight = frontPocketSize * options.frontPocketWidthHeightRatio - points.frontPocketTop2 = points.frontPocketTop.shift(340, frontPocketHeight) points.frontPocketBottom = points.frontPocketTop.shift( 250, - options.frontPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + frontPocketSize + // options.frontPocketSize * measurements.crotchDepth ) points.frontPocketBottom2 = points.frontPocketBottom.shift(340, frontPocketHeight) @@ -338,7 +336,7 @@ export const pantsProto = { .line(points.frontPocketBottom2) .line(points.frontPocketTop2) .close() - .attr('class', 'fabric') + .addClass('fabric') .hide() points.frontPocketSeam = utils.beamsIntersect( @@ -389,7 +387,7 @@ export const pantsProto = { .line(points.frontPocketTopRight) .join(paths.frontPocketSeamSA) .close() - .attr('class', 'dotted mark') + .addClass('dotted mark') .hide() } @@ -398,20 +396,18 @@ export const pantsProto = { .shiftTowards(points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat) .shift( 270, - options.backPocketVerticalOffset * - measurements.crotchDepth /*- measurements.waistToHips*/ + + options.backPocketVerticalOffset * measurements.crotchDepth + waistBand * (separateWaistband ? 1 : 2) ) points.backPocketLeft = points.bWaistBack .shiftTowards( points.bWaistSide, options.backPocketHorizontalOffset * measurements.seat + - options.backPocketSize * measurements.crotchDepth /*- measurements.waistToHips*/ + options.backPocketSize * measurements.crotchDepth ) .shift( 270, - options.backPocketVerticalOffset * - measurements.crotchDepth /*- measurements.waistToHips*/ + + options.backPocketVerticalOffset * measurements.crotchDepth + waistBand * (separateWaistband ? 1 : 2) ) points.backPocketRight2 = points.backPocketRight.shift( @@ -429,17 +425,10 @@ export const pantsProto = { .line(points.backPocketRight2) .line(points.backPocketRight) .close() - .attr('class', 'fabric') + .addClass('fabric') .hide() } - path.temp = new Path() - .move(points.bWaistSide) - .line(points.fWaistSide) - .line(points.fLegFront) - .line(points.bLegBack) - .close() - return part.hide() }, } diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index f34dd0336c2..8deecff04a6 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -1,3 +1,4 @@ +import { cbqc } from '@freesewing/core' import { pantsProto } from './pantsproto.mjs' export const pocket = { @@ -8,8 +9,6 @@ export const pocket = { return part.hide() } - const c = 0.55191502449351 - const frontPocketSize = store.get('frontPocketSize') if ('welt' != options.frontPocketStyle) { @@ -23,17 +22,17 @@ export const pocket = { points.bottomLeftCornerOver = points.bottomLeft.shift(0, frontPocketSize / 4) points.bottomLeftCornerOverCp2 = points.bottomLeftCornerOver.shift( 180, - (frontPocketSize / 4) * c + (frontPocketSize / 4) * cbqc ) points.bottomRightCornerUp = points.bottomRight.shift(90, frontPocketSize / 4) points.bottomRightCornerUpCp2 = points.bottomRightCornerUp.shift( 270, - (frontPocketSize / 4) * c + (frontPocketSize / 4) * cbqc ) points.bottomRightCornerOver = points.bottomRight.shift(180, frontPocketSize / 4) points.bottomRightCornerOverCp1 = points.bottomRightCornerOver.shift( 0, - (frontPocketSize / 4) * c + (frontPocketSize / 4) * cbqc ) paths.seam = new Path() @@ -53,13 +52,15 @@ export const pocket = { .line(points.topRight) .line(points.topLeft) .close() - .attr('class', 'fabric') + .addClass('fabric') - paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + paths.sa = paths.seam.offset(sa).addClass('fabric sa') } else { - paths.frontPocketSeam.setClass('fabric') + paths.frontPocketSeam.unhide().setClass('fabric') - paths.sa = paths.frontPocketSeamSA.offset(sa).close().attr('class', 'fabric sa') + if (sa) { + paths.sa = paths.frontPocketSeamSA.offset(sa).close().addClass('fabric sa') + } paths.frontPocket.unhide().setClass('mark') @@ -80,10 +81,7 @@ export const pocket = { points.logo = points.title.shift(270, 75) snippets.logo = new Snippet('logo', points.logo) - points.text = points.logo - .shift(-90, 25) - .attr('data-text', 'Waralee') - .attr('data-text-class', 'center') + points.text = points.logo.shift(-90, 25).addText('Waralee', 'center') if ('welt' == options.frontPocketStyle) { macro('hd', { diff --git a/designs/waralee/src/waistband.mjs b/designs/waralee/src/waistband.mjs index 0e3c5d294d9..5b0dc0237fd 100644 --- a/designs/waralee/src/waistband.mjs +++ b/designs/waralee/src/waistband.mjs @@ -59,7 +59,7 @@ function waraleeWaistband( } if (!expand) { - // Expand is on, do not draw the part but flag this to the user + // Expand is off, do not draw the part but flag this to the user store.flag.note({ msg: `waralee:cut` + type, replace: { @@ -97,13 +97,9 @@ function waraleeWaistband( .line(points.br) .close() - paths.fold = new Path() - .move(points.tm) - .line(points.bm) - .attr('class', 'fabric dotted') - .setText('fold') + paths.fold = new Path().move(points.tm).line(points.bm).addClass('fabric dotted').setText('fold') - if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (sa) paths.sa = paths.seam.offset(sa).addClass('fabric sa') store.cutlist.addCut({ cut: 1, from: 'fabric' }) @@ -112,7 +108,6 @@ function waraleeWaistband( nr: partNr, at: points.title, title: type, - prefix: 'front', scale: 0.4, align: 'center', }) From cd220351ace7f3c9546a16037855f358adcc0b12 Mon Sep 17 00:00:00 2001 From: woutervdub Date: Tue, 17 Oct 2023 21:39:29 +0000 Subject: [PATCH 19/26] oops, an error --- designs/waralee/src/pocket.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designs/waralee/src/pocket.mjs b/designs/waralee/src/pocket.mjs index 8deecff04a6..3fe4316d548 100644 --- a/designs/waralee/src/pocket.mjs +++ b/designs/waralee/src/pocket.mjs @@ -18,7 +18,10 @@ export const pocket = { points.bottomRight = points.topRight.shift(270, frontPocketSize * 1.5) points.bottomLeftCornerUp = points.bottomLeft.shift(90, frontPocketSize / 4) - points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift(270, (frontPocketSize / 4) * c) + points.bottomLeftCornerUpCp1 = points.bottomLeftCornerUp.shift( + 270, + (frontPocketSize / 4) * cbqc + ) points.bottomLeftCornerOver = points.bottomLeft.shift(0, frontPocketSize / 4) points.bottomLeftCornerOverCp2 = points.bottomLeftCornerOver.shift( 180, From fbb4128466a3cd33d66ea447bf4104f0a0c11c91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:30:15 +0000 Subject: [PATCH 20/26] chore(deps): bump react-zoom-pan-pinch from 3.1.0 to 3.2.0 Bumps [react-zoom-pan-pinch](https://github.com/prc5/react-zoom-pan-pinch) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/prc5/react-zoom-pan-pinch/releases) - [Changelog](https://github.com/BetterTyped/react-zoom-pan-pinch/blob/master/CHANGELOG.md) - [Commits](https://github.com/prc5/react-zoom-pan-pinch/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: react-zoom-pan-pinch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sites/sde/package.json | 2 +- sites/shared/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sites/sde/package.json b/sites/sde/package.json index a2ed4ef2253..799f4676294 100644 --- a/sites/sde/package.json +++ b/sites/sde/package.json @@ -71,7 +71,7 @@ "react-dropzone": "14.2.3", "react-swipeable": "7.0.1", "react-timeago": "7.2.0", - "react-zoom-pan-pinch": "3.1.0", + "react-zoom-pan-pinch": "3.2.0", "remark-gfm": "3.0.1", "remark-frontmatter": "4.0.1", "remark-mdx-frontmatter": "3.0.0", diff --git a/sites/shared/package.json b/sites/shared/package.json index a9ebafea2a8..cfd8c65b7ca 100644 --- a/sites/shared/package.json +++ b/sites/shared/package.json @@ -44,7 +44,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-timeago": "7.2.0", - "react-zoom-pan-pinch": "3.1.0", + "react-zoom-pan-pinch": "3.2.0", "rehype-autolink-headings": "7.0.0", "rehype-highlight": "7.0.0", "remark-frontmatter": "4.0.1", diff --git a/yarn.lock b/yarn.lock index 8217010a772..6e99cf7fdc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11373,10 +11373,10 @@ react-timeago@7.2.0: resolved "https://registry.yarnpkg.com/react-timeago/-/react-timeago-7.2.0.tgz#ae929d7423a63cbc3dc228e49d22fbf586d459ca" integrity sha512-2KsBEEs+qRhKx/kekUVNSTIpop3Jwd7SRBm0R4Eiq3mPeswRGSsftY9FpKsE/lXLdURyQFiHeHFrIUxLYskG5g== -react-zoom-pan-pinch@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.1.0.tgz#d87a66fd22a97f5dd56b54076411a9dce1f448cd" - integrity sha512-a3LlP8QPgTikvteCNkZ3X6wIWC0lrg1geP5WkUJyx2MXXAhHQek3r17N1nT/esOiWGuPIECnsd9AGoK8jOeGcg== +react-zoom-pan-pinch@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.2.0.tgz#6ce7d014a8dc4aa62ce83ca57f85e76cf2e934b8" + integrity sha512-7MS0wYWoXjr6PrmpgHOVpVyNQr9gj7LEr4xIvq6lBy62nuNwjdI1r+XxahQ0SDHhWrLuSF11e2PTL/YLengYyg== react@18.2.0, react@^18.2.0: version "18.2.0" From 3cea1df815357250631e47a9088bfd298609ec26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:30:38 +0000 Subject: [PATCH 21/26] chore(deps-dev): bump @commitlint/cli from 17.7.2 to 17.8.0 Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 17.7.2 to 17.8.0. - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v17.8.0/@commitlint/cli) --- updated-dependencies: - dependency-name: "@commitlint/cli" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8217010a772..d1167df1906 100644 --- a/yarn.lock +++ b/yarn.lock @@ -896,13 +896,13 @@ integrity sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA== "@commitlint/cli@^17.0.2": - version "17.7.2" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.7.2.tgz#3a0287373224db14968ab160b2b4988c693d3400" - integrity sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg== + version "17.8.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.0.tgz#917761331df4b7a0b97b2b31415b006847b6fd02" + integrity sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ== dependencies: "@commitlint/format" "^17.4.4" - "@commitlint/lint" "^17.7.0" - "@commitlint/load" "^17.7.2" + "@commitlint/lint" "^17.8.0" + "@commitlint/load" "^17.8.0" "@commitlint/read" "^17.5.1" "@commitlint/types" "^17.4.4" execa "^5.0.0" @@ -951,28 +951,28 @@ "@commitlint/types" "^17.4.4" chalk "^4.1.0" -"@commitlint/is-ignored@^17.7.0": - version "17.7.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz#df9b284420bdb1aed5fdb2be44f4e98cc4826014" - integrity sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw== +"@commitlint/is-ignored@^17.8.0": + version "17.8.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.0.tgz#429a050cebe8dc56dd4fe4f4c23ea9e1a679dfc6" + integrity sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg== dependencies: "@commitlint/types" "^17.4.4" semver "7.5.4" -"@commitlint/lint@^17.7.0": - version "17.7.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.7.0.tgz#33f831298dc43679e4de6b088aea63d1f884c7e7" - integrity sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA== +"@commitlint/lint@^17.8.0": + version "17.8.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.0.tgz#d3a7fafe810db060aea15322e30384896da887f9" + integrity sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA== dependencies: - "@commitlint/is-ignored" "^17.7.0" + "@commitlint/is-ignored" "^17.8.0" "@commitlint/parse" "^17.7.0" "@commitlint/rules" "^17.7.0" "@commitlint/types" "^17.4.4" -"@commitlint/load@^17.7.2": - version "17.7.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.7.2.tgz#85730900a501c50f0bc890bb50e4a2167ee3085a" - integrity sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw== +"@commitlint/load@^17.8.0": + version "17.8.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.0.tgz#82f6c7555daecb4ce4b8a6282fcecc3665747578" + integrity sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw== dependencies: "@commitlint/config-validator" "^17.6.7" "@commitlint/execute-rule" "^17.4.0" From f7011957836834d3ea1612f49259cb613c9c7112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:31:10 +0000 Subject: [PATCH 22/26] chore(deps): bump daisyui from 3.9.2 to 3.9.3 Bumps [daisyui](https://github.com/saadeghi/daisyui) from 3.9.2 to 3.9.3. - [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md) - [Commits](https://github.com/saadeghi/daisyui/compare/v3.9.2...v3.9.3) --- updated-dependencies: - dependency-name: daisyui dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sites/dev/package.json | 2 +- sites/lab/package.json | 2 +- sites/org/package.json | 2 +- sites/sde/package.json | 2 +- sites/shared/package.json | 2 +- yarn.lock | 8 ++++---- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sites/dev/package.json b/sites/dev/package.json index a4dd815beab..317dfc410f5 100644 --- a/sites/dev/package.json +++ b/sites/dev/package.json @@ -35,7 +35,7 @@ "@next/bundle-analyzer": "13.5.5", "@tailwindcss/typography": "0.5.10", "algoliasearch": "4.20.0", - "daisyui": "3.9.2", + "daisyui": "3.9.3", "lodash.get": "4.4.2", "lodash.orderby": "4.6.0", "lodash.set": "4.3.2", diff --git a/sites/lab/package.json b/sites/lab/package.json index 2d3792ade46..011c0a68177 100644 --- a/sites/lab/package.json +++ b/sites/lab/package.json @@ -35,7 +35,7 @@ "d3-dispatch": "3.0.1", "d3-drag": "3.0.0", "d3-selection": "3.0.0", - "daisyui": "3.9.2", + "daisyui": "3.9.3", "i18next": "23.5.1", "lodash.get": "4.4.2", "lodash.orderby": "4.6.0", diff --git a/sites/org/package.json b/sites/org/package.json index 5ac3c14fe31..335efc697c0 100644 --- a/sites/org/package.json +++ b/sites/org/package.json @@ -36,7 +36,7 @@ "@tailwindcss/typography": "0.5.10", "algoliasearch": "4.20.0", "react-copy-to-clipboard": "5.1.0", - "daisyui": "3.9.2", + "daisyui": "3.9.3", "echarts": "5.4.3", "echarts-for-react": "3.0.2", "jotai": "2.4.3", diff --git a/sites/sde/package.json b/sites/sde/package.json index a2ed4ef2253..923b8997f18 100644 --- a/sites/sde/package.json +++ b/sites/sde/package.json @@ -48,7 +48,7 @@ "d3-dispatch": "3.0.1", "d3-drag": "3.0.0", "d3-selection": "3.0.0", - "daisyui": "3.9.2", + "daisyui": "3.9.3", "file-saver": "2.0.5", "i18next": "23.5.1", "jotai": "2.4.3", diff --git a/sites/shared/package.json b/sites/shared/package.json index a9ebafea2a8..856911dfc30 100644 --- a/sites/shared/package.json +++ b/sites/shared/package.json @@ -23,7 +23,7 @@ "d3-dispatch": "3.0.1", "d3-drag": "3.0.0", "d3-selection": "3.0.0", - "daisyui": "3.9.2", + "daisyui": "3.9.3", "feed": "4.2.2", "file-saver": "2.0.5", "front-matter": "4.0.2", diff --git a/yarn.lock b/yarn.lock index 8217010a772..dcf2cfe33a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4593,10 +4593,10 @@ dagre-d3-es@7.0.10: d3 "^7.8.2" lodash-es "^4.17.21" -daisyui@3.9.2: - version "3.9.2" - resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-3.9.2.tgz#73c83d46ff86186568b211be2d231f4aee5a9ecc" - integrity sha512-yJZ1QjHUaL+r9BkquTdzNHb7KIgAJVFh0zbOXql2Wu0r7zx5qZNLxclhjN0WLoIpY+o2h/8lqXg7ijj8oTigOw== +daisyui@3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-3.9.3.tgz#d8cd193feb57460d56a5fdf9e15063fd667842ec" + integrity sha512-8li177QCu6dqlEOzE3h/dAV1y9Movbjx5bzJIO/hNqMNZtJkbHM0trjTzbDejV7N57eNGdjBvAGtxZYKzS4jow== dependencies: colord "^2.9" css-selector-tokenizer "^0.8" From 7d4d65ceb24195a348c3afde5b05ea83ae91c062 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:31:46 +0000 Subject: [PATCH 23/26] chore(deps-dev): bump esbuild from 0.19.4 to 0.19.5 Bumps [esbuild](https://github.com/evanw/esbuild) from 0.19.4 to 0.19.5. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.19.4...v0.19.5) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sites/backend/package.json | 2 +- yarn.lock | 228 ++++++++++++++++++------------------- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/sites/backend/package.json b/sites/backend/package.json index 73b0dd3c5a1..96d29ad28f0 100644 --- a/sites/backend/package.json +++ b/sites/backend/package.json @@ -49,7 +49,7 @@ "devDependencies": { "chai": "4.3.10", "chai-http": "4.4.0", - "esbuild": "0.19.4", + "esbuild": "0.19.5", "mocha": "10.2.0", "mocha-steps": "1.3.0", "nodemon": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 8217010a772..fae2078615f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1063,115 +1063,115 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@esbuild/android-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz#74752a09301b8c6b9a415fbda9fb71406a62a7b7" - integrity sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg== +"@esbuild/android-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" + integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== -"@esbuild/android-arm@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.4.tgz#c27363e1e280e577d9b5c8fa7c7a3be2a8d79bf5" - integrity sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ== +"@esbuild/android-arm@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" + integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== -"@esbuild/android-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.4.tgz#6c9ee03d1488973d928618100048b75b147e0426" - integrity sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g== +"@esbuild/android-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" + integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== -"@esbuild/darwin-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz#64e2ee945e5932cd49812caa80e8896e937e2f8b" - integrity sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA== +"@esbuild/darwin-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" + integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== -"@esbuild/darwin-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz#d8e26e1b965df284692e4d1263ba69a49b39ac7a" - integrity sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw== +"@esbuild/darwin-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" + integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== -"@esbuild/freebsd-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz#29751a41b242e0a456d89713b228f1da4f45582f" - integrity sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ== +"@esbuild/freebsd-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" + integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== -"@esbuild/freebsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz#873edc0f73e83a82432460ea59bf568c1e90b268" - integrity sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw== +"@esbuild/freebsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" + integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== -"@esbuild/linux-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz#659f2fa988d448dbf5010b5cc583be757cc1b914" - integrity sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA== +"@esbuild/linux-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" + integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== -"@esbuild/linux-arm@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz#d5b13a7ec1f1c655ce05c8d319b3950797baee55" - integrity sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg== +"@esbuild/linux-arm@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" + integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== -"@esbuild/linux-ia32@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz#878cd8bf24c9847c77acdb5dd1b2ef6e4fa27a82" - integrity sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ== +"@esbuild/linux-ia32@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" + integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== -"@esbuild/linux-loong64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz#df890499f6e566b7de3aa2361be6df2b8d5fa015" - integrity sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg== +"@esbuild/linux-loong64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" + integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== -"@esbuild/linux-mips64el@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz#76eae4e88d2ce9f4f1b457e93892e802851b6807" - integrity sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw== +"@esbuild/linux-mips64el@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" + integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== -"@esbuild/linux-ppc64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz#c49032f4abbcfa3f747b543a106931fe3dce41ff" - integrity sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw== +"@esbuild/linux-ppc64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" + integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== -"@esbuild/linux-riscv64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz#0f815a090772138503ee0465a747e16865bf94b1" - integrity sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig== +"@esbuild/linux-riscv64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" + integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== -"@esbuild/linux-s390x@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz#8d2cca20cd4e7c311fde8701d9f1042664f8b92b" - integrity sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg== +"@esbuild/linux-s390x@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" + integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== -"@esbuild/linux-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz#f618bec2655de49bff91c588777e37b5e3169d4a" - integrity sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg== +"@esbuild/linux-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" + integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== -"@esbuild/netbsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz#7889744ca4d60f1538d62382b95e90a49687cef2" - integrity sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A== +"@esbuild/netbsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" + integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== -"@esbuild/openbsd-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz#c3e436eb9271a423d2e8436fcb120e3fd90e2b01" - integrity sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw== +"@esbuild/openbsd-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" + integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== -"@esbuild/sunos-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz#f63f5841ba8c8c1a1c840d073afc99b53e8ce740" - integrity sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw== +"@esbuild/sunos-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" + integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== -"@esbuild/win32-arm64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz#80be69cec92da4da7781cf7a8351b95cc5a236b0" - integrity sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w== +"@esbuild/win32-arm64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" + integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== -"@esbuild/win32-ia32@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz#15dc0ed83d2794872b05d8edc4a358fecf97eb54" - integrity sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg== +"@esbuild/win32-ia32@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" + integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== -"@esbuild/win32-x64@0.19.4": - version "0.19.4" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz#d46a6e220a717f31f39ae80f49477cc3220be0f0" - integrity sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA== +"@esbuild/win32-x64@0.19.5": + version "0.19.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" + integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -5256,33 +5256,33 @@ esbuild-plugin-yaml@^0.0.1: fs-extra "^9.1.0" js-yaml "^4.0.0" -esbuild@0.19.4, esbuild@^0.19.0: - version "0.19.4" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.4.tgz#cdf5c4c684956d550bc3c6d0c01dac7fef6c75b1" - integrity sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA== +esbuild@0.19.5, esbuild@^0.19.0: + version "0.19.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" + integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== optionalDependencies: - "@esbuild/android-arm" "0.19.4" - "@esbuild/android-arm64" "0.19.4" - "@esbuild/android-x64" "0.19.4" - "@esbuild/darwin-arm64" "0.19.4" - "@esbuild/darwin-x64" "0.19.4" - "@esbuild/freebsd-arm64" "0.19.4" - "@esbuild/freebsd-x64" "0.19.4" - "@esbuild/linux-arm" "0.19.4" - "@esbuild/linux-arm64" "0.19.4" - "@esbuild/linux-ia32" "0.19.4" - "@esbuild/linux-loong64" "0.19.4" - "@esbuild/linux-mips64el" "0.19.4" - "@esbuild/linux-ppc64" "0.19.4" - "@esbuild/linux-riscv64" "0.19.4" - "@esbuild/linux-s390x" "0.19.4" - "@esbuild/linux-x64" "0.19.4" - "@esbuild/netbsd-x64" "0.19.4" - "@esbuild/openbsd-x64" "0.19.4" - "@esbuild/sunos-x64" "0.19.4" - "@esbuild/win32-arm64" "0.19.4" - "@esbuild/win32-ia32" "0.19.4" - "@esbuild/win32-x64" "0.19.4" + "@esbuild/android-arm" "0.19.5" + "@esbuild/android-arm64" "0.19.5" + "@esbuild/android-x64" "0.19.5" + "@esbuild/darwin-arm64" "0.19.5" + "@esbuild/darwin-x64" "0.19.5" + "@esbuild/freebsd-arm64" "0.19.5" + "@esbuild/freebsd-x64" "0.19.5" + "@esbuild/linux-arm" "0.19.5" + "@esbuild/linux-arm64" "0.19.5" + "@esbuild/linux-ia32" "0.19.5" + "@esbuild/linux-loong64" "0.19.5" + "@esbuild/linux-mips64el" "0.19.5" + "@esbuild/linux-ppc64" "0.19.5" + "@esbuild/linux-riscv64" "0.19.5" + "@esbuild/linux-s390x" "0.19.5" + "@esbuild/linux-x64" "0.19.5" + "@esbuild/netbsd-x64" "0.19.5" + "@esbuild/openbsd-x64" "0.19.5" + "@esbuild/sunos-x64" "0.19.5" + "@esbuild/win32-arm64" "0.19.5" + "@esbuild/win32-ia32" "0.19.5" + "@esbuild/win32-x64" "0.19.5" escalade@^3.1.1: version "3.1.1" From 75b50e2c272b57f5662e46455152f483b8ff9613 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:32:05 +0000 Subject: [PATCH 24/26] chore(deps-dev): bump lerna from 7.3.1 to 7.4.0 Bumps [lerna](https://github.com/lerna/lerna/tree/HEAD/packages/lerna) from 7.3.1 to 7.4.0. - [Release notes](https://github.com/lerna/lerna/releases) - [Changelog](https://github.com/lerna/lerna/blob/main/packages/lerna/CHANGELOG.md) - [Commits](https://github.com/lerna/lerna/commits/v7.4.0/packages/lerna) --- updated-dependencies: - dependency-name: lerna dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8217010a772..7c13e925af4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1304,21 +1304,21 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lerna/child-process@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.3.1.tgz#ed9122a583adb828c26a5a6a662a3353e979495b" - integrity sha512-9neRI51jOhyIGT3/xKUQZftzg78ZY5Ya8iBCmVQYWwo8rLiMqUqcgwIwFHFFYyY41Sb4/HXatQ0iiuTTB/vr8A== +"@lerna/child-process@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.4.0.tgz#90e2ef119fed904845cad9977002f71354df2b68" + integrity sha512-KhocFx7HI04N2tUdKv/kJDy627m9TzIDrtudRTMTFVS8vKzGtxpfjgWZAnJ20hwQqe/MvvfrOhHsvDBrcBEW/g== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.3.1.tgz#9e968935deb2d5c11dd3cbfce52d4f62a4d2285c" - integrity sha512-+gHt9rzWYaC0pxE/xMC8hQaLXJKW24rWlWJ7Vq6gETsl6D5v3rSy2VIlvoDE9WsvROnMSoXw2PZY371X79hNBw== +"@lerna/create@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.4.0.tgz#5a7214b7f67e4804e7ce07d9e6c4275bfe85b3d5" + integrity sha512-VmuJCS/cC2itJjpMNNBWBl1YRfYNBjo6BR4+KVdDYPO2/WT+CWqv5gWGrm0bU5/djwGJ2BN96STzHnWegACK0A== dependencies: - "@lerna/child-process" "7.3.1" + "@lerna/child-process" "7.4.0" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" @@ -8058,12 +8058,12 @@ leac@^0.6.0: integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== lerna@^7.2.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.3.1.tgz#eda0021dbd48287e9f1de3c69c48a2089ff0952c" - integrity sha512-4Lt6nKIqCDqWgRlKu02g6+0Gfl5Hx9ZK3EIJTjMntea6QBuOgfSpJEj3j20osmE1tzFCkbAltJRyeLE1CImv+A== + version "7.4.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.4.0.tgz#e6dabe956cc771eabe90c97e5e4759eb5d5117ef" + integrity sha512-Dp5js6R7mygy3Ncxc/1HxDd5EgiE7mFqZbCAYKm6FzeOn/GLcqyOPJHLsck6PlSu/uvqUh1lZO4wGaJJQAcW2Q== dependencies: - "@lerna/child-process" "7.3.1" - "@lerna/create" "7.3.1" + "@lerna/child-process" "7.4.0" + "@lerna/create" "7.4.0" "@npmcli/run-script" "6.0.2" "@nx/devkit" ">=16.5.1 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" From cb045e01d194fa7889ba69beb5b78cbb590b2401 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:32:32 +0000 Subject: [PATCH 25/26] chore(deps): bump next-i18next from 14.0.0 to 14.0.3 Bumps [next-i18next](https://github.com/i18next/next-i18next) from 14.0.0 to 14.0.3. - [Release notes](https://github.com/i18next/next-i18next/releases) - [Changelog](https://github.com/i18next/next-i18next/blob/master/CHANGELOG.md) - [Commits](https://github.com/i18next/next-i18next/compare/v14.0.0...v14.0.3) --- updated-dependencies: - dependency-name: next-i18next dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sites/lab/package.json | 2 +- sites/sde/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sites/lab/package.json b/sites/lab/package.json index 2d3792ade46..f3a510773fe 100644 --- a/sites/lab/package.json +++ b/sites/lab/package.json @@ -41,7 +41,7 @@ "lodash.orderby": "4.6.0", "lodash.set": "4.3.2", "next": "13.5.5", - "next-i18next": "14.0.0", + "next-i18next": "14.0.3", "ora": "7.0.1", "react": "18.2.0", "react-copy-to-clipboard": "5.1.0", diff --git a/sites/sde/package.json b/sites/sde/package.json index a2ed4ef2253..1f849ade94d 100644 --- a/sites/sde/package.json +++ b/sites/sde/package.json @@ -60,7 +60,7 @@ "lodash.set": "4.3.2", "mustache": "4.2.0", "next": "13.5.5", - "next-i18next": "14.0.0", + "next-i18next": "14.0.3", "pdfkit": "0.13.0", "postcss-for": "2.1.1", "react": "18.2.0", diff --git a/yarn.lock b/yarn.lock index 8217010a772..89d08528cc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9828,10 +9828,10 @@ nested-error-stacks@^2.0.0: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== -next-i18next@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/next-i18next/-/next-i18next-14.0.0.tgz#fd637c81df96c9d6f2cc4716037130ac4e5d6968" - integrity sha512-umv8hOZoSoAA+td3ErfemyO/5Ib2pnYCdQ8/Oy+fncS2skFIL3hHKRer3Oa3Nfm4Xbv5p6DHWzm3NhT1j4tWwg== +next-i18next@14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/next-i18next/-/next-i18next-14.0.3.tgz#9c17e69483b3af4172b15454af2ef92c5f79be48" + integrity sha512-FtnjRMfhlamk8YyeyWqd+pndNL+3er83iMZnH4M4mhiGA93l0+vtBUvuObgOAMHDJGLLB2SS2xOOZq69oiJh7A== dependencies: "@babel/runtime" "^7.20.13" "@types/hoist-non-react-statics" "^3.3.1" From 5aa9fe0bad8664ac5fee14acdc0e89859ed62894 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:33:11 +0000 Subject: [PATCH 26/26] chore(deps): bump @aws-sdk/client-sesv2 from 3.429.0 to 3.430.0 Bumps [@aws-sdk/client-sesv2](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-sesv2) from 3.429.0 to 3.430.0. - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-sesv2/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.430.0/clients/client-sesv2) --- updated-dependencies: - dependency-name: "@aws-sdk/client-sesv2" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sites/backend/package.json | 2 +- yarn.lock | 195 ++++++++++++++++++++----------------- 2 files changed, 104 insertions(+), 93 deletions(-) diff --git a/sites/backend/package.json b/sites/backend/package.json index 73b0dd3c5a1..74fc5bbe333 100644 --- a/sites/backend/package.json +++ b/sites/backend/package.json @@ -28,7 +28,7 @@ }, "peerDependencies": {}, "dependencies": { - "@aws-sdk/client-sesv2": "3.429.0", + "@aws-sdk/client-sesv2": "3.430.0", "@prisma/client": "5.4.2", "bcryptjs": "2.4.3", "cors": "2.8.5", diff --git a/yarn.lock b/yarn.lock index 8217010a772..b480a4ae078 100644 --- a/yarn.lock +++ b/yarn.lock @@ -197,35 +197,35 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/client-sesv2@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sesv2/-/client-sesv2-3.429.0.tgz#c637e7c820e929568545dee9320b71f0c561199b" - integrity sha512-NIK5DWFK7XlOnynMxbJ2XAnXVeUd+Hak4dfrVGxprtu3piYC9QcXtDNpiZH2PD1QZlFv44r4Hq1Oi7vcrTw3cw== +"@aws-sdk/client-sesv2@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sesv2/-/client-sesv2-3.430.0.tgz#35966fa6b356978926c3cbd2472c3798c1971654" + integrity sha512-KRFZZCsR+AcIjj0cwVjexi6TOkLhEI6ejC7kpgh8d9fN3p08FkdeipP6o+u73whDY9sB2S7gc+7hkbkeYemTAw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.429.0" - "@aws-sdk/credential-provider-node" "3.429.0" + "@aws-sdk/client-sts" "3.430.0" + "@aws-sdk/credential-provider-node" "3.430.0" "@aws-sdk/middleware-host-header" "3.429.0" "@aws-sdk/middleware-logger" "3.428.0" "@aws-sdk/middleware-recursion-detection" "3.428.0" "@aws-sdk/middleware-signing" "3.428.0" "@aws-sdk/middleware-user-agent" "3.428.0" - "@aws-sdk/region-config-resolver" "3.428.0" + "@aws-sdk/region-config-resolver" "3.430.0" "@aws-sdk/types" "3.428.0" "@aws-sdk/util-endpoints" "3.428.0" "@aws-sdk/util-user-agent-browser" "3.428.0" - "@aws-sdk/util-user-agent-node" "3.428.0" - "@smithy/config-resolver" "^2.0.14" + "@aws-sdk/util-user-agent-node" "3.430.0" + "@smithy/config-resolver" "^2.0.15" "@smithy/fetch-http-handler" "^2.2.3" "@smithy/hash-node" "^2.0.11" "@smithy/invalid-dependency" "^2.0.11" "@smithy/middleware-content-length" "^2.0.13" - "@smithy/middleware-endpoint" "^2.1.1" - "@smithy/middleware-retry" "^2.0.16" + "@smithy/middleware-endpoint" "^2.1.2" + "@smithy/middleware-retry" "^2.0.17" "@smithy/middleware-serde" "^2.0.11" "@smithy/middleware-stack" "^2.0.5" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/node-http-handler" "^2.1.7" "@smithy/protocol-http" "^3.0.7" "@smithy/smithy-client" "^2.1.11" @@ -235,15 +235,15 @@ "@smithy/util-body-length-browser" "^2.0.0" "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.15" - "@smithy/util-defaults-mode-node" "^2.0.19" + "@smithy/util-defaults-mode-node" "^2.0.20" "@smithy/util-retry" "^2.0.4" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" -"@aws-sdk/client-sso@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.429.0.tgz#756e47451621476a01b7b0a860a0479fb242c2b8" - integrity sha512-Bz802NpXUrFI1KB9uu1GwCbmi0xpw+GY6+TIyaGTXbGQjg4fYOJQLUtMxmb1c1/qUTZX/x5qetF3QBwgpBbLug== +"@aws-sdk/client-sso@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.430.0.tgz#0ae8371a89ea1bed02c4927d73eeded5962af581" + integrity sha512-NxQJkTZCgl6LpdY12MCwsqGned6Ax19WsTCGLEiA/tsNE4vNrYLHHBR317G0sGWbIUQuhwsoM7wIrqJO7CacuQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" @@ -251,21 +251,21 @@ "@aws-sdk/middleware-logger" "3.428.0" "@aws-sdk/middleware-recursion-detection" "3.428.0" "@aws-sdk/middleware-user-agent" "3.428.0" - "@aws-sdk/region-config-resolver" "3.428.0" + "@aws-sdk/region-config-resolver" "3.430.0" "@aws-sdk/types" "3.428.0" "@aws-sdk/util-endpoints" "3.428.0" "@aws-sdk/util-user-agent-browser" "3.428.0" - "@aws-sdk/util-user-agent-node" "3.428.0" - "@smithy/config-resolver" "^2.0.14" + "@aws-sdk/util-user-agent-node" "3.430.0" + "@smithy/config-resolver" "^2.0.15" "@smithy/fetch-http-handler" "^2.2.3" "@smithy/hash-node" "^2.0.11" "@smithy/invalid-dependency" "^2.0.11" "@smithy/middleware-content-length" "^2.0.13" - "@smithy/middleware-endpoint" "^2.1.1" - "@smithy/middleware-retry" "^2.0.16" + "@smithy/middleware-endpoint" "^2.1.2" + "@smithy/middleware-retry" "^2.0.17" "@smithy/middleware-serde" "^2.0.11" "@smithy/middleware-stack" "^2.0.5" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/node-http-handler" "^2.1.7" "@smithy/protocol-http" "^3.0.7" "@smithy/smithy-client" "^2.1.11" @@ -275,40 +275,40 @@ "@smithy/util-body-length-browser" "^2.0.0" "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.15" - "@smithy/util-defaults-mode-node" "^2.0.19" + "@smithy/util-defaults-mode-node" "^2.0.20" "@smithy/util-retry" "^2.0.4" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" -"@aws-sdk/client-sts@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.429.0.tgz#fa248b2ade0cd4354540b30a381643ca502318fc" - integrity sha512-yNRYHXqGIYjEGlpaIll9zJDsVOQWjwbvR2zfTpUwEtN4I17k/psjLAsznfTbq/4tEftkpAJ2pNsVrkHUOmCewA== +"@aws-sdk/client-sts@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.430.0.tgz#cd906fb14cc5aeb5eeb38bd2de28c6ca9febedb6" + integrity sha512-njUY3QeZH0CG+tG/6jhoG+Zr7rI1aGoVkZi3l6woKTz57hIlkwu2jQlLbJujm7PKrLhPaN5+4AqBQuHFVgMobw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/credential-provider-node" "3.429.0" + "@aws-sdk/credential-provider-node" "3.430.0" "@aws-sdk/middleware-host-header" "3.429.0" "@aws-sdk/middleware-logger" "3.428.0" "@aws-sdk/middleware-recursion-detection" "3.428.0" "@aws-sdk/middleware-sdk-sts" "3.428.0" "@aws-sdk/middleware-signing" "3.428.0" "@aws-sdk/middleware-user-agent" "3.428.0" - "@aws-sdk/region-config-resolver" "3.428.0" + "@aws-sdk/region-config-resolver" "3.430.0" "@aws-sdk/types" "3.428.0" "@aws-sdk/util-endpoints" "3.428.0" "@aws-sdk/util-user-agent-browser" "3.428.0" - "@aws-sdk/util-user-agent-node" "3.428.0" - "@smithy/config-resolver" "^2.0.14" + "@aws-sdk/util-user-agent-node" "3.430.0" + "@smithy/config-resolver" "^2.0.15" "@smithy/fetch-http-handler" "^2.2.3" "@smithy/hash-node" "^2.0.11" "@smithy/invalid-dependency" "^2.0.11" "@smithy/middleware-content-length" "^2.0.13" - "@smithy/middleware-endpoint" "^2.1.1" - "@smithy/middleware-retry" "^2.0.16" + "@smithy/middleware-endpoint" "^2.1.2" + "@smithy/middleware-retry" "^2.0.17" "@smithy/middleware-serde" "^2.0.11" "@smithy/middleware-stack" "^2.0.5" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/node-http-handler" "^2.1.7" "@smithy/protocol-http" "^3.0.7" "@smithy/smithy-client" "^2.1.11" @@ -318,7 +318,7 @@ "@smithy/util-body-length-browser" "^2.0.0" "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.15" - "@smithy/util-defaults-mode-node" "^2.0.19" + "@smithy/util-defaults-mode-node" "^2.0.20" "@smithy/util-retry" "^2.0.4" "@smithy/util-utf8" "^2.0.0" fast-xml-parser "4.2.5" @@ -334,14 +334,14 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@aws-sdk/credential-provider-ini@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.429.0.tgz#436887f1fee1a3dc4ab35924a07cbf020f74f3bd" - integrity sha512-rG1ecwU/8KojyXsx80tK/b+DDGqSbReakOm/db5fx2RzVnkAGdH9fvPNrhjjHZ1wGbPrUtXGmHGXP3eqnylazg== +"@aws-sdk/credential-provider-ini@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.430.0.tgz#003ba7475aa7eadecd0d7701437a90b1dadeca5a" + integrity sha512-m3NcmDyVYr/w8RV9kMArrA/0982aXMsvoSXi4wFVbgg/T5hO+6i5CY7fB/0xpKIuEJ+rw63rYNnBzLwwW48kWg== dependencies: "@aws-sdk/credential-provider-env" "3.428.0" "@aws-sdk/credential-provider-process" "3.428.0" - "@aws-sdk/credential-provider-sso" "3.429.0" + "@aws-sdk/credential-provider-sso" "3.430.0" "@aws-sdk/credential-provider-web-identity" "3.428.0" "@aws-sdk/types" "3.428.0" "@smithy/credential-provider-imds" "^2.0.0" @@ -350,15 +350,15 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@aws-sdk/credential-provider-node@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.429.0.tgz#801bfa9367470f551c1a4aa9d2686acafd8b54c6" - integrity sha512-XaXCIeF8UWAvqzXX/UaBQhICjyIjRksjuP0xMW+A23Nu4yPjYufuHL9AR4i6MVYEKP3inXHGAS7N0t35A8acOw== +"@aws-sdk/credential-provider-node@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.430.0.tgz#9f4fcac99b05753f06574add3e1509bed15b523c" + integrity sha512-ItOHJcqOhpI0QM+aho5uMrk2ZP34hsdisMHxd8/6FT41U8TOe9kQKaZ2l2AsVf4QuM6RJe2LangcVGGstCf8Sw== dependencies: "@aws-sdk/credential-provider-env" "3.428.0" - "@aws-sdk/credential-provider-ini" "3.429.0" + "@aws-sdk/credential-provider-ini" "3.430.0" "@aws-sdk/credential-provider-process" "3.428.0" - "@aws-sdk/credential-provider-sso" "3.429.0" + "@aws-sdk/credential-provider-sso" "3.430.0" "@aws-sdk/credential-provider-web-identity" "3.428.0" "@aws-sdk/types" "3.428.0" "@smithy/credential-provider-imds" "^2.0.0" @@ -378,13 +378,13 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@aws-sdk/credential-provider-sso@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.429.0.tgz#4251950cdddb30722e7222c2ad09646608ec6bea" - integrity sha512-Nx3/18ZxV/trGz3HAQD6eGxO5Goqx3U5YR+CJsWPBh+4Jwkoo+HC5cyxq6cJIcZ5n75Wc4kPt7Im4ffVjTaJIg== +"@aws-sdk/credential-provider-sso@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.430.0.tgz#9693dd6b85ffec2b8d05a9574957f4204308534e" + integrity sha512-6de/aH9OFI+Ah7hL4alrZFqiNw5D6F+R92tLbIpFRQg7DxO/TuQTTtK94mLkft/AP/mGzVVBENjsyS1nJt166w== dependencies: - "@aws-sdk/client-sso" "3.429.0" - "@aws-sdk/token-providers" "3.429.0" + "@aws-sdk/client-sso" "3.430.0" + "@aws-sdk/token-providers" "3.430.0" "@aws-sdk/types" "3.428.0" "@smithy/property-provider" "^2.0.0" "@smithy/shared-ini-file-loader" "^2.0.6" @@ -464,21 +464,21 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@aws-sdk/region-config-resolver@3.428.0": - version "3.428.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.428.0.tgz#c275998078cbd784febd212e987e546905efafc7" - integrity sha512-VqyHZ/Hoz3WrXXMx8cAhFBl8IpjodbRsTjBI117QPq1YRCegxNdGvqmGZnJj8N2Ef9MP1iU30ZWQB+sviDcogA== +"@aws-sdk/region-config-resolver@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.430.0.tgz#c7fe238e9771da91bafe7016afda21305a661473" + integrity sha512-9lqgtkcd4dqsQ2yN6V/i06blyDh4yLmS+fAS7LwEZih/NZZ2cBIR+5kb9c236auvTcuMcL1zFxVRloWwesYZjA== dependencies: - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/types" "^2.3.5" "@smithy/util-config-provider" "^2.0.0" "@smithy/util-middleware" "^2.0.4" tslib "^2.5.0" -"@aws-sdk/token-providers@3.429.0": - version "3.429.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.429.0.tgz#e952cfe55276ed75aa41f378a66341a2cfecb65e" - integrity sha512-1Lp5XW/aSHekMURfcoxhWR2ig0UlesD0wC1kcdrkhZGCPtvCE0VzMqgTmYkwtPKOWfRQf0qfu468ohBHBmzHdA== +"@aws-sdk/token-providers@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.430.0.tgz#f5d20454c62ff65e5981d35b5a9b7660263bcc06" + integrity sha512-vE+QnqG0A4MWhMEFXXPg8gPXjw03b4Q3XZbHyrANoZ+tVrzh8JhpHIcbkesGh6WrjirNqId0UghzI9VanKxsLw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" @@ -489,17 +489,17 @@ "@aws-sdk/types" "3.428.0" "@aws-sdk/util-endpoints" "3.428.0" "@aws-sdk/util-user-agent-browser" "3.428.0" - "@aws-sdk/util-user-agent-node" "3.428.0" - "@smithy/config-resolver" "^2.0.14" + "@aws-sdk/util-user-agent-node" "3.430.0" + "@smithy/config-resolver" "^2.0.15" "@smithy/fetch-http-handler" "^2.2.3" "@smithy/hash-node" "^2.0.11" "@smithy/invalid-dependency" "^2.0.11" "@smithy/middleware-content-length" "^2.0.13" - "@smithy/middleware-endpoint" "^2.1.1" - "@smithy/middleware-retry" "^2.0.16" + "@smithy/middleware-endpoint" "^2.1.2" + "@smithy/middleware-retry" "^2.0.17" "@smithy/middleware-serde" "^2.0.11" "@smithy/middleware-stack" "^2.0.5" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/node-http-handler" "^2.1.7" "@smithy/property-provider" "^2.0.0" "@smithy/protocol-http" "^3.0.7" @@ -511,7 +511,7 @@ "@smithy/util-body-length-browser" "^2.0.0" "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.15" - "@smithy/util-defaults-mode-node" "^2.0.19" + "@smithy/util-defaults-mode-node" "^2.0.20" "@smithy/util-retry" "^2.0.4" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" @@ -549,13 +549,13 @@ bowser "^2.11.0" tslib "^2.5.0" -"@aws-sdk/util-user-agent-node@3.428.0": - version "3.428.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.428.0.tgz#3966016d3592f0ccff4b0123c3b223e1e231279a" - integrity sha512-s721C3H8TkNd0usWLPEAy7yW2lEglR8QAYojdQGzE0e0wymc671nZAFePSZFRtmqZiFOSfk0R602L5fDbP3a8Q== +"@aws-sdk/util-user-agent-node@3.430.0": + version "3.430.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.430.0.tgz#efa200f7c21182d769b424ba4fff569857ff42f4" + integrity sha512-DPpFPL3mFMPtipFxjY7TKQBjnhmsPzYCr4Y+qna0oR6ij8jZOz2ILQDK33GxTRNh3+bV9YYbx+ZGDOnxoK5Mhw== dependencies: "@aws-sdk/types" "3.428.0" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/types" "^2.3.5" tslib "^2.5.0" @@ -2039,18 +2039,18 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@smithy/config-resolver@^2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.14.tgz#16163e14053949f5a717be6f5802a7039e5ff4d1" - integrity sha512-K1K+FuWQoy8j/G7lAmK85o03O89s2Vvh6kMFmzEmiHUoQCRH1rzbDtMnGNiaMHeSeYJ6y79IyTusdRG+LuWwtg== +"@smithy/config-resolver@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.15.tgz#dff48ef54e989df4eeb90001a2fef9ae3c5bb884" + integrity sha512-a2Pfocla5nSrG2RyB8i20jcWgMyR71TUeFKm8pmrnZotr/X22tlg4y/EhSvBK2oTE8MKHlKh4YdpDO2AryJbGQ== dependencies: - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/types" "^2.3.5" "@smithy/util-config-provider" "^2.0.0" "@smithy/util-middleware" "^2.0.4" tslib "^2.5.0" -"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.0.16": +"@smithy/credential-provider-imds@^2.0.0": version "2.0.16" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.16.tgz#07da7ecd43eff92156ddc54f3b5330bbc128d5cd" integrity sha512-tKa2xF+69TvGxJT+lnJpGrKxUuAZDLYXFhqnPEgnHz+psTpkpcB4QRjHj63+uj83KaeFJdTfW201eLZeRn6FfA== @@ -2061,6 +2061,17 @@ "@smithy/url-parser" "^2.0.11" tslib "^2.5.0" +"@smithy/credential-provider-imds@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.17.tgz#004463c314b9c3df4883fe643f0b3855f1f64d40" + integrity sha512-2XcD414yrwbxxuYueTo7tzLC2/w3jj9FZqfenpv3MQkocdOEmuOVS0v9WHsY/nW6V+2EcR340rj/z5HnvsHncQ== + dependencies: + "@smithy/node-config-provider" "^2.1.2" + "@smithy/property-provider" "^2.0.12" + "@smithy/types" "^2.3.5" + "@smithy/url-parser" "^2.0.11" + tslib "^2.5.0" + "@smithy/eventstream-codec@^2.0.11": version "2.0.11" resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz#1ba090ea5dbf956e32d3d0d0986ffb0d0af8c57d" @@ -2116,7 +2127,7 @@ "@smithy/types" "^2.3.5" tslib "^2.5.0" -"@smithy/middleware-endpoint@^2.1.1": +"@smithy/middleware-endpoint@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.2.tgz#c6610f17b3c5773e4f272eb4de5c18a878607fe0" integrity sha512-dua4r2EbSTRzNefz72snz+KDuXN73RCe1K+rGeemzUyYemxuh1jujFbLQbTU6DVlTgHkhtrbH0+kdOFY/SV4Qg== @@ -2129,12 +2140,12 @@ "@smithy/util-middleware" "^2.0.4" tslib "^2.5.0" -"@smithy/middleware-retry@^2.0.16": - version "2.0.16" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.16.tgz#f87401a01317de351df5228e4591961d04663607" - integrity sha512-Br5+0yoiMS0ugiOAfJxregzMMGIRCbX4PYo1kDHtLgvkA/d++aHbnHB819m5zOIAMPvPE7AThZgcsoK+WOsUTA== +"@smithy/middleware-retry@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.17.tgz#bf154e441accef071e9f3455bc673c8e7cae14e6" + integrity sha512-ZYVU1MmshCTbEKTNc5h7/Pps1vhH5C7hRclQWnAbVYKkIT+PEGu9dSVqprzEo/nlMA8Zv4Dj5Y+fv3pRnUwElw== dependencies: - "@smithy/node-config-provider" "^2.1.1" + "@smithy/node-config-provider" "^2.1.2" "@smithy/protocol-http" "^3.0.7" "@smithy/service-error-classification" "^2.0.4" "@smithy/types" "^2.3.5" @@ -2324,14 +2335,14 @@ bowser "^2.11.0" tslib "^2.5.0" -"@smithy/util-defaults-mode-node@^2.0.19": - version "2.0.19" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.19.tgz#8996479c76dd68baae65fd863180a802a66fdf5d" - integrity sha512-7pScU4jBFADB2MBYKM3zb5onMh6Nn0X3IfaFVLYPyCarTIZDLUtUl1GtruzEUJPmDzP+uGeqOtU589HDY0Ni6g== +"@smithy/util-defaults-mode-node@^2.0.20": + version "2.0.20" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.20.tgz#4381d74cb6c7cbca3a2609dc81a7437973d7cdd2" + integrity sha512-kJjcZ/Lzvs3sPDKBwlhZsFFcgPNIpB3CMb6/saCakawRzo0E+JkyS3ZZRjVR3ce29yHtwoP/0YLKC1PeH0Dffg== dependencies: - "@smithy/config-resolver" "^2.0.14" - "@smithy/credential-provider-imds" "^2.0.16" - "@smithy/node-config-provider" "^2.1.1" + "@smithy/config-resolver" "^2.0.15" + "@smithy/credential-provider-imds" "^2.0.17" + "@smithy/node-config-provider" "^2.1.2" "@smithy/property-provider" "^2.0.12" "@smithy/smithy-client" "^2.1.11" "@smithy/types" "^2.3.5"