From 89f21eb6412424890782962c469ecfc48e40d61a Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Fri, 17 May 2024 16:30:40 +0200 Subject: [PATCH 1/7] change(bibi): Add finishing options for neck, cuff, armhole and waistband, fix documentation --- designs/bibi/i18n/en.json | 44 ++- designs/bibi/src/armholeBinding.mjs | 48 +++ designs/bibi/src/back.mjs | 136 ++------- designs/bibi/src/cuff.mjs | 121 ++++++++ designs/bibi/src/front.mjs | 67 +++-- designs/bibi/src/index.mjs | 10 +- designs/bibi/src/neckBinding.mjs | 44 +++ designs/bibi/src/shared.mjs | 250 +++++++++++++--- designs/bibi/src/sleeve.mjs | 42 ++- designs/bibi/src/waistband.mjs | 119 ++++++++ markdown/org/docs/designs/bibi/cutting/en.md | 26 +- markdown/org/docs/designs/bibi/en.md | 2 - markdown/org/docs/designs/bibi/fabric/en.md | 15 +- .../org/docs/designs/bibi/instructions/en.md | 119 +++++++- .../bibi/instructions/knitbinding_a.svg | 212 +++++++++++++ .../bibi/instructions/knitbinding_b.svg | 264 ++++++++++++++++ .../bibi/instructions/knitbinding_c.svg | 212 +++++++++++++ .../bibi/instructions/knitbinding_d.svg | 185 ++++++++++++ .../bibi/instructions/knitbinding_e.svg | 198 ++++++++++++ .../designs/bibi/instructions/ribbing.svg | 283 ++++++++++++++++++ markdown/org/docs/designs/bibi/notes/en.md | 14 +- .../designs/bibi/options/bindingheight/en.md | 11 + .../docs/designs/bibi/options/length/en.md | 8 +- .../designs/bibi/options/ribbingheight/en.md | 11 + .../designs/bibi/options/ribbingstretch/en.md | 11 + .../bibi/options/shoulderslopereduction/de.md | 2 - .../bibi/options/shoulderslopereduction/en.md | 2 - .../bibi/options/shoulderslopereduction/es.md | 2 - .../bibi/options/shoulderslopereduction/fr.md | 2 - .../bibi/options/shoulderslopereduction/nl.md | 2 - .../bibi/options/shoulderslopereduction/uk.md | 2 - .../bibi/options/sleevecapbackfactorx/de.md | 2 - .../bibi/options/sleevecapbackfactorx/en.md | 2 - .../bibi/options/sleevecapbackfactorx/es.md | 2 - .../bibi/options/sleevecapbackfactorx/fr.md | 2 - .../bibi/options/sleevecapbackfactorx/nl.md | 2 - .../bibi/options/sleevecapbackfactorx/uk.md | 2 - .../bibi/options/sleevecapbackfactory/de.md | 2 - .../bibi/options/sleevecapbackfactory/en.md | 2 - .../bibi/options/sleevecapbackfactory/es.md | 2 - .../bibi/options/sleevecapbackfactory/fr.md | 2 - .../bibi/options/sleevecapbackfactory/nl.md | 2 - .../bibi/options/sleevecapbackfactory/uk.md | 2 - .../bibi/options/sleevecapfrontfactorx/de.md | 2 - .../bibi/options/sleevecapfrontfactorx/en.md | 2 - .../bibi/options/sleevecapfrontfactorx/es.md | 2 - .../bibi/options/sleevecapfrontfactorx/fr.md | 2 - .../bibi/options/sleevecapfrontfactorx/nl.md | 2 - .../bibi/options/sleevecapfrontfactorx/uk.md | 2 - .../bibi/options/sleevecapfrontfactory/de.md | 2 - .../bibi/options/sleevecapfrontfactory/en.md | 2 - .../bibi/options/sleevecapfrontfactory/es.md | 2 - .../bibi/options/sleevecapfrontfactory/fr.md | 2 - .../bibi/options/sleevecapfrontfactory/nl.md | 2 - .../bibi/options/sleevecapfrontfactory/uk.md | 2 - .../bibi/options/sleevecapq1spread1/de.md | 2 - .../bibi/options/sleevecapq1spread1/en.md | 2 - .../bibi/options/sleevecapq1spread1/es.md | 2 - .../bibi/options/sleevecapq1spread1/fr.md | 2 - .../bibi/options/sleevecapq1spread1/nl.md | 2 - .../bibi/options/sleevecapq1spread1/uk.md | 2 - .../bibi/options/sleevecapq1spread2/de.md | 2 - .../bibi/options/sleevecapq1spread2/en.md | 2 - .../bibi/options/sleevecapq1spread2/es.md | 2 - .../bibi/options/sleevecapq1spread2/fr.md | 2 - .../bibi/options/sleevecapq1spread2/nl.md | 2 - .../bibi/options/sleevecapq1spread2/uk.md | 2 - .../bibi/options/sleevecapq2spread1/de.md | 2 - .../bibi/options/sleevecapq2spread1/en.md | 2 - .../bibi/options/sleevecapq2spread1/es.md | 2 - .../bibi/options/sleevecapq2spread1/fr.md | 2 - .../bibi/options/sleevecapq2spread1/nl.md | 2 - .../bibi/options/sleevecapq2spread1/uk.md | 2 - .../bibi/options/sleevecapq2spread2/de.md | 2 - .../bibi/options/sleevecapq2spread2/en.md | 2 - .../bibi/options/sleevecapq2spread2/es.md | 2 - .../bibi/options/sleevecapq2spread2/fr.md | 2 - .../bibi/options/sleevecapq2spread2/nl.md | 2 - .../bibi/options/sleevecapq2spread2/uk.md | 2 - .../bibi/options/sleevecapq3offset/de.md | 2 - .../bibi/options/sleevecapq3offset/en.md | 2 - .../bibi/options/sleevecapq3offset/es.md | 2 - .../bibi/options/sleevecapq3offset/fr.md | 2 - .../bibi/options/sleevecapq3offset/nl.md | 2 - .../bibi/options/sleevecapq3spread1/de.md | 2 - .../bibi/options/sleevecapq3spread1/en.md | 2 - .../bibi/options/sleevecapq3spread1/es.md | 2 - .../bibi/options/sleevecapq3spread1/fr.md | 2 - .../bibi/options/sleevecapq3spread1/nl.md | 2 - .../bibi/options/sleevecapq3spread1/uk.md | 2 - .../bibi/options/sleevecapq3spread2/de.md | 2 - .../bibi/options/sleevecapq3spread2/en.md | 2 - .../bibi/options/sleevecapq3spread2/es.md | 2 - .../bibi/options/sleevecapq3spread2/fr.md | 2 - .../bibi/options/sleevecapq3spread2/nl.md | 2 - .../bibi/options/sleevecapq3spread2/uk.md | 2 - .../bibi/options/sleevecapq4offset/de.md | 2 - .../bibi/options/sleevecapq4offset/en.md | 2 - .../bibi/options/sleevecapq4offset/es.md | 2 - .../bibi/options/sleevecapq4offset/fr.md | 2 - .../bibi/options/sleevecapq4offset/nl.md | 2 - .../bibi/options/sleevecapq4offset/uk.md | 2 - .../bibi/options/sleevecapq4spread1/de.md | 2 - .../bibi/options/sleevecapq4spread1/en.md | 2 - .../bibi/options/sleevecapq4spread1/es.md | 2 - .../bibi/options/sleevecapq4spread1/fr.md | 2 - .../bibi/options/sleevecapq4spread1/nl.md | 2 - .../bibi/options/sleevecapq4spread1/uk.md | 2 - .../bibi/options/sleevecapq4spread2/de.md | 2 - .../bibi/options/sleevecapq4spread2/en.md | 2 - .../bibi/options/sleevecapq4spread2/es.md | 2 - .../bibi/options/sleevecapq4spread2/fr.md | 2 - .../bibi/options/sleevecapq4spread2/nl.md | 2 - .../bibi/options/sleevecapq4spread2/uk.md | 2 - .../bibi/options/sleevecaptopfactorx/de.md | 2 - .../bibi/options/sleevecaptopfactorx/en.md | 2 - .../bibi/options/sleevecaptopfactorx/es.md | 2 - .../bibi/options/sleevecaptopfactorx/fr.md | 2 - .../bibi/options/sleevecaptopfactorx/nl.md | 2 - .../bibi/options/sleevecaptopfactorx/uk.md | 2 - .../bibi/options/sleevecaptopfactory/de.md | 2 - .../bibi/options/sleevecaptopfactory/en.md | 2 - .../bibi/options/sleevecaptopfactory/es.md | 2 - .../bibi/options/sleevecaptopfactory/fr.md | 2 - .../bibi/options/sleevecaptopfactory/nl.md | 2 - .../bibi/options/sleevecaptopfactory/uk.md | 2 - .../designs/bibi/options/usecuffribbing/en.md | 13 + .../bibi/options/usewaistribbing/en.md | 9 + 128 files changed, 2256 insertions(+), 420 deletions(-) create mode 100644 designs/bibi/src/armholeBinding.mjs create mode 100644 designs/bibi/src/cuff.mjs create mode 100644 designs/bibi/src/neckBinding.mjs create mode 100644 designs/bibi/src/waistband.mjs create mode 100644 markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg create mode 100644 markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg create mode 100644 markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg create mode 100644 markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg create mode 100644 markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg create mode 100644 markdown/org/docs/designs/bibi/instructions/ribbing.svg create mode 100644 markdown/org/docs/designs/bibi/options/bindingheight/en.md create mode 100644 markdown/org/docs/designs/bibi/options/ribbingheight/en.md create mode 100644 markdown/org/docs/designs/bibi/options/ribbingstretch/en.md create mode 100644 markdown/org/docs/designs/bibi/options/usecuffribbing/en.md create mode 100644 markdown/org/docs/designs/bibi/options/usewaistribbing/en.md diff --git a/designs/bibi/i18n/en.json b/designs/bibi/i18n/en.json index e44015cf695..45503f8a7ed 100644 --- a/designs/bibi/i18n/en.json +++ b/designs/bibi/i18n/en.json @@ -4,7 +4,11 @@ "p": { "back": "Back", "front": "Front", - "sleeve": "Sleeve" + "sleeve": "Sleeve", + "waistband": "Waistband", + "cuff": "Cuff", + "neckBinding": "Neck Binding", + "armholeBinding": "Armhole Binding" }, "s": { "dartNo.t": "No bust dart", @@ -30,7 +34,23 @@ "length.knee.t": "Knee", "length.knee.d": "Create a knee-length dress.", "length.floor.t": "Floor", - "length.floor.d": "Create a floor-length dress. Use a negative length bonus to prevent the garment from actually dragging on the floor." + "length.floor.d": "Create a floor-length dress. Use a negative length bonus to prevent the garment from actually dragging on the floor.", + "cutCuff.t": "The cuff is not shown", + "cutCuff.d": "The **Cuff** (6) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.", + "cutWaistband.t": "The waistband is not shown", + "cutWaistband.d": "The **Waistband** (5) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.", + "cutNeckBinding.t": "The neck binding is not shown", + "cutNeckBinding.d": "The **Neck Binding** (3) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.", + "cutArmholeBinding.t": "The armhole binding is not shown", + "cutArmholeBinding.d": "The **Armhole Binding** (4) is a rectangular piece of ribbing fabric {{{ w }}} wide and {{{ l }}} long.", + "useWaistRibbingNo.t": "No ribbing", + "useWaistRibbingNo.d": "Do not include ribbing", + "useWaistRibbingYes.t": "Include ribbing", + "useWaistRibbingYes.d": "Include ribbing on the waistband", + "useCuffRibbingNo.t": "No ribbing", + "useCuffRibbingNo.d": "Do not include ribbing", + "useCuffRibbingYes.t": "Include ribbing", + "useCuffRibbingYes.d": "Include ribbing on the sleeve" }, "o": { "draftForHighBust": { @@ -124,6 +144,26 @@ "length": { "t": "Length", "d": "Which measurement line to use for the bottom hem. You can do fine adjustments using the bonus length option." + }, + "useWaistRibbing": { + "t": "Waistband Ribbing", + "d": "Include ribbing on the waistband" + }, + "useCuffRibbing": { + "t": "Cuff Ribbing", + "d": "Include ribbing on the sleeve" + }, + "ribbingHeight": { + "t": "Ribbing Height", + "d": "Controls the height of the ribbing" + }, + "ribbingStretch": { + "t": "Ribbing stretch", + "d": "Use this to adapt the pattern to how stretchy the ribbing that you are using is." + }, + "bindingHeight": { + "t": "Knit binding height", + "d": "Controls the height of the knit binding for neck and armhole." } } } diff --git a/designs/bibi/src/armholeBinding.mjs b/designs/bibi/src/armholeBinding.mjs new file mode 100644 index 00000000000..661c5c5b079 --- /dev/null +++ b/designs/bibi/src/armholeBinding.mjs @@ -0,0 +1,48 @@ +import { front } from './front.mjs' +import { back } from './back.mjs' +import { draftKnitBinding } from './shared.mjs' + +export const armholeBinding = { + name: 'bibi.armholeBinding', + after: [front, back], + options: { + bindingHeight: { + pct: 2.5, + min: 1.25, + max: 5, + menu: 'style', + snap: { + metric: [10, 15, 20, 25, 30], + imperial: [12.7, 19.05, 25.4, 31.75, 38.1], + }, + toAbs: (val, { measurements }) => + (measurements.hpsToWaistBack + measurements.waistToHips) * val, + }, + }, + draft: bibiArmholeBinding, +} + +function bibiArmholeBinding({ part, store, points, macro }) { + if (store.separateSleeves) { + return part.hide() + } + + draftKnitBinding(part, store.armholeSizeBack + store.armholeSizeFront) + + /* + * Annotations + */ + // Cutlist + store.cutlist.setCut({ cut: 2, from: 'ribbing', identical: true }) + + // Title + macro('title', { + at: points.title, + nr: 4, + scale: 0.5, + rotation: 90, + title: 'armholeBinding', + }) + + return part +} diff --git a/designs/bibi/src/back.mjs b/designs/bibi/src/back.mjs index a3c983c3ab3..211463448d5 100644 --- a/designs/bibi/src/back.mjs +++ b/designs/bibi/src/back.mjs @@ -1,4 +1,5 @@ import { base } from '@freesewing/brian' +import { waistband } from './waistband.mjs' import { adjustSidePoints, constructBackHem, @@ -15,92 +16,16 @@ export const back = { measurements: ['hips', 'waist', 'hpsToWaistBack', 'chest', 'seat', 'seatBack', 'waistToSeat'], optionalMeasurements: ['bustSpan', 'highBust', 'waistToUnderbust', 'waistToKnee', 'waistToFloor'], hide: { from: true }, - after: sleeve, + after: [waistband, sleeve], options: { - // Brian overrides - s3Collar: 0, - s3Armhole: 0, - brianFitSleeve: true, - brianFitCollar: false, - bicepsEase: { pct: 5, min: 0, max: 50, menu: 'fit' }, - collarEase: 0, - shoulderSlopeReduction: 0, - sleeveWidthGuarantee: 0.85, - frontArmholeDeeper: 0.01, - legacyArmholeDepth: false, - // Unused as legacyArmholeDepth is disabled, hide option in documentation - armholeDepthFactor: 0.5, - shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' }, - // Note: we reuse Brian's cuff ease as "armhole fullness" - cuffEase: { - pct: 20, - min: 0, - max: 200, - menu: (settings, mergedOptions) => - mergedOptions.sleeves === false ? false : 'style.sleeves', - }, - armholeDepth: { - pct: 2, - min: -10, - max: 50, - menu: (settings, mergedOptions) => - mergedOptions?.legacyArmholeDepth ? false : 'style.sleeves', - }, - armholeCurveBack: { - pct: 30, - min: -10, - max: 120, - menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), - }, - armholeDropBack: { - pct: 20, - min: -50, - max: 50, - menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), - }, - - lengthBonus: { pct: 0, min: -30, max: 30, menu: 'style.length' }, - draftForHighBust: { bool: true, menu: 'fit' }, - // Bibi specific - fitWaist: { bool: true, menu: 'fit', order: 'EBA' }, - waistEase: { - pct: 1, - min: -10, - max: 20, - menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false), - order: 'EBB', - }, - hipsEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'ECA' }, - seatEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'EDA' }, - chestEase: { pct: 2, min: -5, max: 25, menu: 'fit', order: 'EAB' }, - - length: { - dflt: 'seat', - list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'], - menu: 'style.length', - }, - flare: { - pct: 5, - min: 0, - max: 150, - menu: (settings, mergedOptions) => - (mergedOptions.length === 'seat' && mergedOptions.lengthBonus > 0) || - mergedOptions.length === 'knee' || - mergedOptions.length === 'floor' - ? 'style.length' - : false, - }, necklineWidth: { pct: 15, min: -5, max: 90, menu: 'style' }, strapWidth: { pct: 40, - min: 5, + min: 15, max: 100, menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), }, sleeves: { bool: true, menu: 'style.sleeves' }, - - backNeckCutout: { pct: 6, min: 2, max: 110, menu: 'style' }, - backNeckBend: { pct: 50, min: 0, max: 70, menu: 'style' }, }, draft: bibiBack, } @@ -115,12 +40,10 @@ function bibiBack({ Snippet, snippets, options, - measurements, + absoluteOptions, macro, complete, - utils, part, - log, }) { // Hide Brian paths for (const key of Object.keys(paths)) paths[key].hide() @@ -140,15 +63,13 @@ function bibiBack({ delete points.cfNeck delete points.cfNeckCp1 - constructBackPoints(points, Point, measurements, options) + constructBackPoints(part) - adjustSidePoints(points, options) + adjustSidePoints(part) - correctArmHole(points, paths, Path, options, utils) + correctArmHole(part) - points.cbHem = new Point(0, points.cbWaist.y + measurements.waistToHips * options.lengthBonus) - - constructBackHem(points, measurements, options, Point, paths, Path, log) + constructBackHem(part, options.useWaistRibbing ? -store.get('ribbingHeight') : 0) store.set('backSideSeamLength', paths.sideSeam.length()) @@ -171,20 +92,7 @@ function bibiBack({ .move(points.neck) .curve(points.neckCp2, points.cbNeckCp1, points.cbNeck) .addClass('fabric') - createArmHoles( - options, - store, - points, - paths, - Path, - snippets, - Snippet, - strapWidth, - options.armholeCurveBack, - options.armholeDropBack, - utils, - 'bnotch' - ) + createArmHoles(part, strapWidth, options.armholeCurveBack, options.armholeDropBack, 'bnotch') paths.centerLine = new Path().move(points.cbNeck).line(points.cbHem).addClass('fabric') @@ -197,6 +105,9 @@ function bibiBack({ Math.min(paths.sideSeam.length() * 0.8, points.armhole.dy(points.cbWaist) * 0.5) ) + store.set('armholeSizeBack', paths.armhole.length()) + store.set('neckSizeBack', paths.backNeck.length()) + const reverse = paths.sideSeam.reverse() snippets.gatherAreaStart = new Snippet('notch', reverse.shiftAlong(store.get('gatherAreaStart'))) snippets.gatherAreaBack = new Snippet( @@ -207,12 +118,11 @@ function bibiBack({ if (sa) { paths.sa = new Path() .move(points.cbHem) - .join(paths.hem.offset(sa * 3)) + .join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3))) .join(paths.sideSeam.offset(sa)) - .join(paths.armhole.offset(sa)) + .join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0))) .join(paths.shoulder.offset(sa)) - .join(paths.backNeck.offset(sa)) - .line(points.cbNeck) + .line(points.neck) .attr('class', 'fabric sa') } @@ -228,9 +138,19 @@ function bibiBack({ macro('title', { at: points.title, nr: 2, title: 'back' }) - if (complete && points.hem.y > points.waist.y) - paths.waist = new Path().move(points.cbWaist).line(points.waist).attr('class', 'help') + if (complete) { + if (points.hem.y > points.waist.y) + paths.waist = new Path().move(points.cbWaist).line(points.waist).attr('class', 'help') + if (!store.separateSleeves) { + paths.armholeBinding = paths.armhole + .offset(-absoluteOptions.bindingHeight) + .addClass('various help') + } + paths.neckBinding = paths.backNeck + .offset(-absoluteOptions.bindingHeight) + .addClass('various help') + } macro('pd', { id: 'pArmhole', path: paths.armhole.reverse(), @@ -284,7 +204,7 @@ function bibiBack({ x: points.armhole.x + sa + 30, }) - plotSideLineMeasurements(points, paths.sideSeam, utils, macro) + plotSideLineMeasurements(part, paths.sideSeam) return part } diff --git a/designs/bibi/src/cuff.mjs b/designs/bibi/src/cuff.mjs new file mode 100644 index 00000000000..4c58d100a53 --- /dev/null +++ b/designs/bibi/src/cuff.mjs @@ -0,0 +1,121 @@ +import { sleevecap as brianSleeveCap } from '@freesewing/brian' +import { hidePresets } from '@freesewing/core' +import { draftRibbing } from './shared.mjs' + +export const cuff = { + name: 'bibi.cuff', + from: brianSleeveCap, + hide: hidePresets.HIDE_TREE, + + options: { + // Brian overrides, placed here as this is the first loaded part that inherits from brian base + s3Collar: 0, + s3Armhole: 0, + brianFitSleeve: true, + brianFitCollar: false, + bicepsEase: { pct: 5, min: 0, max: 50, menu: 'fit' }, + collarEase: 0, + shoulderSlopeReduction: 0, + sleeveWidthGuarantee: 0.85, + frontArmholeDeeper: 0.01, + legacyArmholeDepth: false, + // Unused as legacyArmholeDepth is disabled, hide option in documentation + armholeDepthFactor: 0.5, + shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' }, + // Note: we reuse Brian's cuff ease as "armhole fullness" + cuffEase: { + pct: 20, + min: 0, + max: 200, + menu: (settings, mergedOptions) => + mergedOptions.sleeves === false ? false : 'style.sleeves', + }, + armholeDepth: { + pct: 2, + min: -10, + max: 50, + menu: (settings, mergedOptions) => + mergedOptions?.legacyArmholeDepth ? false : 'style.sleeves', + }, + armholeCurveBack: { + pct: 30, + min: -10, + max: 120, + menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), + }, + armholeDropBack: { + pct: 20, + min: -50, + max: 50, + menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), + }, + // cuff specific settings + useCuffRibbing: { + bool: false, + menu: (settings, mergedOptions) => + mergedOptions.sleeves && mergedOptions.sleeveLength >= 0.05 ? 'style' : false, + }, + ribbingStretch: { pct: 15, min: 0, max: 30, menu: 'fit' }, + ribbingHeight: { + pct: 10, + min: 5, + max: 15, + menu: (settings, mergedOptions) => + mergedOptions.useWaistRibbing || mergedOptions.useCuffRibbing ? 'style' : false, + toAbs: (val, { measurements }) => + (measurements.hpsToWaistBack + measurements.waistToHips) * val, + }, + }, + draft: bibiCuff, +} + +function bibiCuff({ part, store, measurements, options, paths, points, Point, macro }) { + store.set( + 'ribbingHeight', + (measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight + ) + + if (!options.useCuffRibbing || !options.sleeves || options.sleeveLength < 0.05) { + store.set('cuffSize', 0) + return part.hide() + } + + points.sleeveTip = paths.sleevecap.edge('top') + points.sleeveTop = new Point(0, points.sleeveTip.y) // Always in center + + // Wrist + points.centerWrist = points.sleeveTop.shift(-90, measurements.shoulderToWrist) + points.wristRight = points.centerWrist.shift(0, (measurements.wrist * (1 + options.cuffEase)) / 2) + points.wristLeft = points.wristRight.rotate(180, points.centerWrist) + + points.cuffRight = points.bicepsRight.shiftFractionTowards( + points.wristRight, + options.sleeveLength + ) + points.cuffLeft = points.bicepsLeft.shiftFractionTowards(points.wristLeft, options.sleeveLength) + points.centerCuff = points.cuffRight.shiftFractionTowards(points.cuffLeft, 0.5) + + store.set('cuffSize', points.cuffLeft.dist(points.cuffRight)) + + // clean up temporary stuff + delete paths.sleevecap + + draftRibbing(part, store.cuffSize * (1 - options.ribbingStretch)) + + /* + * Annotations + */ + // Cutlist + store.cutlist.setCut({ cut: 2, from: 'ribbing', identical: true }) + + // Title + macro('title', { + at: points.title, + nr: 6, + scale: 0.5, + rotation: 90, + title: 'cuff', + }) + + return part +} diff --git a/designs/bibi/src/front.mjs b/designs/bibi/src/front.mjs index a7fb5fa09e9..f4407e7d80c 100644 --- a/designs/bibi/src/front.mjs +++ b/designs/bibi/src/front.mjs @@ -59,12 +59,11 @@ function bibiFront({ Snippet, snippets, options, + absoluteOptions, measurements, macro, complete, - utils, part, - log, }) { // Hide Brian paths for (const key of Object.keys(paths)) paths[key].hide() @@ -84,7 +83,7 @@ function bibiFront({ delete points.cbHem delete points.cbNeck - constructFrontPoints(points, Point, measurements, options) + constructFrontPoints(part) // FBA points.originalChest = points.chest @@ -114,9 +113,9 @@ function bibiFront({ points.shoulderCp1 = fba.rotateUpper(points.shoulderCp1) points.shoulder = fba.rotateUpper(points.shoulder) } - adjustSidePoints(points, options) + adjustSidePoints(part) - correctArmHole(points, paths, Path, options, utils) + correctArmHole(part) const strapWidth = options.sleeves ? 0 : options.strapWidth points.neck = points.hps.shiftFractionTowards( @@ -137,7 +136,7 @@ function bibiFront({ .move(points.neck) .curve(points.neckCp2, points.cfNeckCp1, points.cfNeck) .addClass('fabric') - constructFrontHem(points, measurements, options, Point, paths, Path, log) + constructFrontHem(part, options.useWaistRibbing ? -store.get('ribbingHeight') : 0) store.set('frontSideSeamLength', paths.sideSeam.length()) const frontLength = store.get('frontSideSeamLength') @@ -240,19 +239,10 @@ function bibiFront({ .addText('gather', 'center various help') } } - createArmHoles( - options, - store, - points, - paths, - Path, - snippets, - Snippet, - strapWidth, - options.armholeCurveFront, - 0, - utils - ) + createArmHoles(part, strapWidth, options.armholeCurveFront, 0) + + store.set('armholeSizeFront', paths.armhole.length()) + store.set('neckSizeFront', paths.frontNeck.length()) paths.centerLine = new Path().move(points.cfNeck).line(points.cfHem).addClass('fabric') @@ -267,32 +257,43 @@ function bibiFront({ }) if (sa) { - if (paths.sideSeam1) + if (paths.sideSeam1) { paths.sa = new Path() .move(points.cfHem) - .join(paths.hem.offset(sa * 3)) + .join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3))) .join(paths.sideSeam1.offset(sa)) .join(paths.sideSeam2.offset(sa)) - .join(paths.armhole.offset(sa)) + .join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0))) .join(paths.shoulder.offset(sa)) - .join(paths.frontNeck.offset(sa)) - .line(points.cfNeck) + .line(points.neck) .attr('class', 'fabric sa') - else + } else { paths.sa = new Path() .move(points.cfHem) - .join(paths.hem.offset(sa * 3)) + .join(paths.hem.offset(sa * (options.useWaistRibbing ? 1 : 3))) .join(paths.sideSeam.offset(sa)) - .join(paths.armhole.offset(sa)) + .join(paths.armhole.offset(sa * (store.separateSleeves ? 1 : 0))) .join(paths.shoulder.offset(sa)) - .join(paths.frontNeck.offset(sa)) - .line(points.cfNeck) + .line(points.neck) .attr('class', 'fabric sa') + } } - // Waist line - if (complete && points.hem.y > points.waist.y) - paths.waist = new Path().move(points.cfWaist).line(points.waist).attr('class', 'help') + if (complete) { + // Waist line + if (points.hem.y > points.waist.y) { + paths.waist = new Path().move(points.cfWaist).line(points.waist).attr('class', 'help') + } + + if (!store.separateSleeves) { + paths.armholeBinding = paths.armhole + .offset(-absoluteOptions.bindingHeight) + .addClass('various help') + } + paths.neckBinding = paths.frontNeck + .offset(-absoluteOptions.bindingHeight) + .addClass('various help') + } macro('pd', { id: 'pArmhole', @@ -371,7 +372,7 @@ function bibiFront({ snippets.bustPoint = new Snippet('notch', points.bust) - plotSideLineMeasurements(points, paths.sideSeamWithDart, utils, macro) + plotSideLineMeasurements(part, paths.sideSeamWithDart) return part } diff --git a/designs/bibi/src/index.mjs b/designs/bibi/src/index.mjs index 7770e7c28a5..5cb358aeb44 100644 --- a/designs/bibi/src/index.mjs +++ b/designs/bibi/src/index.mjs @@ -4,6 +4,10 @@ import { i18n as brianI18n } from '@freesewing/brian' import { i18n as bibiI18n } from '../i18n/index.mjs' import { front } from './front.mjs' import { back } from './back.mjs' +import { waistband } from './waistband.mjs' +import { cuff } from './cuff.mjs' +import { armholeBinding } from './armholeBinding.mjs' +import { neckBinding } from './neckBinding.mjs' import { sleeve } from './sleeve.mjs' import { constructFrontPoints, @@ -21,7 +25,7 @@ import { // Setup our new design const Bibi = new Design({ data, - parts: [sleeve, back, front], + parts: [waistband, cuff, armholeBinding, neckBinding, sleeve, back, front], }) // Merge translations @@ -34,6 +38,10 @@ export { front, back, sleeve, + waistband, + neckBinding, + armholeBinding, + cuff, constructFrontPoints, constructBackPoints, calculateFba, diff --git a/designs/bibi/src/neckBinding.mjs b/designs/bibi/src/neckBinding.mjs new file mode 100644 index 00000000000..f6ec75590bd --- /dev/null +++ b/designs/bibi/src/neckBinding.mjs @@ -0,0 +1,44 @@ +import { front } from './front.mjs' +import { back } from './back.mjs' +import { draftKnitBinding } from './shared.mjs' + +export const neckBinding = { + name: 'bibi.neckBinding', + after: [front, back], + options: { + bindingHeight: { + pct: 2.5, + min: 1.25, + max: 5, + menu: 'style', + snap: { + metric: [10, 15, 20, 25, 30], + imperial: [12.7, 19.05, 25.4, 31.75, 38.1], + }, + toAbs: (val, { measurements }) => + (measurements.hpsToWaistBack + measurements.waistToHips) * val, + }, + }, + draft: bibiNeckBinding, +} + +function bibiNeckBinding({ part, store, points, macro }) { + draftKnitBinding(part, 2 * (store.neckSizeBack + store.neckSizeFront)) + + /* + * Annotations + */ + // Cutlist + store.cutlist.setCut({ cut: 1, from: 'ribbing' }) + + // Title + macro('title', { + at: points.title, + nr: 3, + scale: 0.5, + rotation: 90, + title: 'neckBinding', + }) + + return part +} diff --git a/designs/bibi/src/shared.mjs b/designs/bibi/src/shared.mjs index 1c044ba5a6f..8b71b7dcc53 100644 --- a/designs/bibi/src/shared.mjs +++ b/designs/bibi/src/shared.mjs @@ -1,4 +1,7 @@ -function createLowerPoints(points, measurements, options, prefix) { +import { capitalize } from '@freesewing/core' + +function createLowerPoints(part, prefix) { + const { measurements, options, points } = part.shorthand() // These lengths are typically not critical, so use a rough estimate if not given // We don't want the user to need these measurements, as this design can also be used for shorter tops if (typeof measurements.waistToKnee !== 'undefined') { @@ -20,7 +23,8 @@ function createLowerPoints(points, measurements, options, prefix) { points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * (1 + options.flare), 0) } -export function constructFrontPoints(points, Point, measurements, options) { +export function constructFrontPoints(part) { + const { measurements, options, points, Point } = part.shorthand() points.cfBust = new Point(0, measurements.hpsToBust) if (measurements.bustSpan) { points.bust = new Point(measurements.bustSpan / 2, measurements.hpsToBust) @@ -61,10 +65,11 @@ export function constructFrontPoints(points, Point, measurements, options) { points.seat = seatAdjustment(points.seatBase, points.hips, -seatExtra) // points.cfSeat = points.cfSeat.shift(-90, -seatExtra * 2) - createLowerPoints(points, measurements, options, 'cf') + createLowerPoints(part, 'cf') } -export function constructBackPoints(points, Point, measurements, options) { +export function constructBackPoints(part) { + const { measurements, options, points, Point } = part.shorthand() points.chest = new Point( (measurements.chest * (1 + options.chestEase)) / 4, measurements.hpsToBust @@ -89,7 +94,7 @@ export function constructBackPoints(points, Point, measurements, options) { points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra) // points.cbSeat = points.cbSeat.shift(-90, seatExtra * 2) - createLowerPoints(points, measurements, options, 'cb') + createLowerPoints(part, 'cb') } function seatAdjustment(seatBase, anchor, seatExtra) { @@ -133,7 +138,8 @@ export function calculateFba(anchor, bust, side, dx, Point) { } } -export function correctArmHole(points, paths, Path, options, utils) { +export function correctArmHole(part) { + const { options, points, utils } = part.shorthand() points.armholeCp1 = points.chest if (!options.sleeves && points.armhole.y > points.chest.y) { @@ -158,7 +164,8 @@ function extendSideLine(points, intersectionY) { return points.seat.shiftFractionTowards(points.sideTarget, fraction) } -export function constructSideSeam(Path, Point, points, height, bottomSmoothness) { +export function constructSideSeam(part, height, bottomSmoothness) { + const { points, Path, Point } = part.shorthand() const base = new Path() .move(points.armhole) .curve(points.armholeCp1, points.waistCp2, points.waist) @@ -204,7 +211,8 @@ export function constructSideSeam(Path, Point, points, height, bottomSmoothness) return result.curve(intersectionCp1, intersectionCp2, bottom).reverse() } -export function adjustSidePoints(points, options) { +export function adjustSidePoints(part) { + const { options, points } = part.shorthand() // Remove waist fitting if option is disabled if (!options.fitWaist || points.waist.x > points.armhole.x) { if (points.waist.x < points.armhole.x) { @@ -243,7 +251,8 @@ function getBottomSmoothness(bottom, points) { return (Math.min(bottom, points.seat.y) - points.armhole.y) * 0.3 } -export function constructBackHem(points, measurements, options, Point, paths, Path, log) { +export function constructBackHem(part, bonusLength = 0) { + const { measurements, options, points, paths, Path, Point, log } = part.shorthand() let centerPoint // Extra length for butt @@ -280,28 +289,31 @@ export function constructBackHem(points, measurements, options, Point, paths, Pa centerPoint = points.cbSeat } - let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + bonusLength if (hemBottom <= points.armhole.y * 1.1) { log.warn('Adjusting hem as it would be above or too close to armhole.') hemBottom = points.armhole.y * 1.1 } + if (hemBottom <= points.underbust.y) { + log.warn('Adjusting hem as it would be above the underbust.') + hemBottom = points.underbust.y + } points.cbHem = new Point(0, hemBottom + extraBackLength) - points.midHem = new Point(points.hem.x * 0.66, points.cbHem.y) paths.sideSeam = constructSideSeam( - Path, - Point, - points, + part, hemBottom, getBottomSmoothness(hemBottom, points) ).addClass('fabric') + points.midHem = new Point(points.hem.x * 0.66, points.cbHem.y) paths.hem = new Path() .move(points.cbHem) .curve(points.midHem, points.midHem, points.hem) .addClass('fabric') } -export function constructFrontHem(points, measurements, options, Point, paths, Path, log) { +export function constructFrontHem(part, bonusLength = 0) { + const { measurements, options, points, paths, Path, Point, log } = part.shorthand() let centerPoint let bonusLengthMeasurement = measurements.hpsToWaistBack switch (options.length) { @@ -332,20 +344,22 @@ export function constructFrontHem(points, measurements, options, Point, paths, P centerPoint = points.cfSeat } - let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + let hemBottom = centerPoint.y + bonusLengthMeasurement * options.lengthBonus + bonusLength if (hemBottom <= points.armhole.y * 1.1) { log.warn('Adjusting hem as it would be above or too close to armhole.') hemBottom = points.armhole.y * 1.1 } + if (hemBottom <= points.underbust.y) { + log.warn('Adjusting hem as it would be above the underbust.') + hemBottom = points.underbust.y + } points.cfHem = new Point(0, hemBottom) - points.midHem = new Point(points.hem.x * 0.66, points.cfHem.y) paths.sideSeam = constructSideSeam( - Path, - Point, - points, + part, hemBottom, getBottomSmoothness(hemBottom, points) ).addClass('fabric') + points.midHem = new Point(points.hem.x * 0.66, points.cfHem.y) paths.hem = new Path() .move(points.cfHem) @@ -353,20 +367,8 @@ export function constructFrontHem(points, measurements, options, Point, paths, P .addClass('fabric') } -export function createArmHoles( - options, - store, - points, - paths, - Path, - snippets, - Snippet, - strapWidth, - armholeCurve, - armholeDrop, - utils, - notchType = 'notch' -) { +export function createArmHoles(part, strapWidth, armholeCurve, armholeDrop, notchType = 'notch') { + const { store, options, points, paths, Path, snippets, Snippet, utils } = part.shorthand() if (options.sleeves) { if (store.get('capSleeves')) { const sleeveCapFactor = (options.sleeveLength + 0.2) * 4 @@ -379,7 +381,10 @@ export function createArmHoles( points.neck.angle(points.shoulder), capLength * -0.2 ) - points.armholePitchCp1 = points.sleeveCapStart.rotate(90, points.sleeveCap) + points.armholePitchCp1 = points.sleeveCap.shiftFractionTowards( + points.sleeveCapStart.rotate(90, points.sleeveCap), + 0.5 + ) points.sleeveCapCp = points.sleeveCap .shiftTowards(points.armholePitchCp1, capLength * 0.3) .rotate(-90, points.sleeveCap) @@ -443,7 +448,8 @@ export function createArmHoles( } } -export function plotSideLineMeasurements(points, sideSeam, utils, macro) { +export function plotSideLineMeasurements(part, sideSeam) { + const { points, macro, utils } = part.shorthand() const offsets = { seat: points.seat.y, hips: points.hips.y, @@ -489,3 +495,175 @@ export function plotSideLineMeasurements(points, sideSeam, utils, macro) { } } } + +export function draftRibbing(part, length) { + const { store, measurements, options, points, paths, Path, Point, expand, sa, macro, units } = + part.shorthand() + // Don't run this every time, except when sampling + if (typeof store.get('ribbingHeight') === 'undefined' || part.context.settings.sample) { + store.set( + 'ribbingHeight', + (measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight + ) + } + const height = store.get('ribbingHeight') + + if (expand) { + store.flag.preset('expandIsOn') + } else { + // Expand is off, do not draw the part but flag this to the user + const extraSa = sa ? 2 * sa : 0 + store.flag.note({ + msg: `bibi:cut${capitalize(part.name.split('.')[1])}`, + notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'], + replace: { + w: units(2 * height + extraSa), + l: units(length + extraSa), + }, + suggest: { + text: 'flag:show', + icon: 'expand', + update: { + settings: ['expand', 1], + }, + }, + }) + // Also hint about expand + store.flag.preset('expandIsOff') + + return part.hide() + } + + points.topLeft = new Point(0, 0) + points.topRight = new Point(height * 2, 0) + points.topFold = new Point(height, 0) + points.bottomLeft = new Point(0, length) + points.bottomRight = new Point(points.topRight.x, length) + points.bottomFold = new Point(points.topFold.x, length) + + paths.seam = new Path() + .move(points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .line(points.bottomLeft) + .line(points.bottomRight) + .close() + .addClass('various') + + paths.fold = new Path().move(points.topFold).line(points.bottomFold).addClass('various help') + + if (sa) paths.sa = paths.seam.offset(sa).addClass('various sa') + + /* + * Annotations + */ + // Title + points.title = new Point(points.bottomRight.x / 3, points.bottomRight.y / 3) + + // Dimensions + macro('vd', { + id: 'hFull', + from: points.bottomRight, + to: points.topRight, + x: points.topRight.x + sa + 15, + }) + macro('hd', { + id: 'wFull', + from: points.topLeft, + to: points.topRight, + y: points.topRight.y - sa - 15, + }) +} + +export function draftKnitBinding(part, length) { + const { store, absoluteOptions, points, paths, Path, Point, expand, sa, macro, units } = + part.shorthand() + // Don't run this every time, except when sampling + if (typeof store.get('bindingHeight') === 'undefined' || part.context.settings.sample) { + store.set('bindingHeight', absoluteOptions.bindingHeight) + } + const height = store.get('bindingHeight') + + if (expand) { + store.flag.preset('expandIsOn') + } else { + // Expand is off, do not draw the part but flag this to the user + const extraSa = sa ? 2 * sa : 0 + store.flag.note({ + msg: `bibi:cut${capitalize(part.name.split('.')[1])}`, + notes: [sa ? 'flag:saIncluded' : 'flag:saExcluded', 'flag:partHiddenByExpand'], + replace: { + w: units(4 * height), + l: units(length + extraSa), + }, + suggest: { + text: 'flag:show', + icon: 'expand', + update: { + settings: ['expand', 1], + }, + }, + }) + // Also hint about expand + store.flag.preset('expandIsOff') + + return part.hide() + } + + points.topLeft = new Point(0, 0) + points.topRight = new Point(height * 4, 0) + points.topFold = new Point(height, 0) + points.bottomLeft = new Point(0, length) + points.bottomRight = new Point(points.topRight.x, length) + points.bottomFold = new Point(points.topFold.x, length) + + paths.seam = new Path() + .move(points.bottomRight) + .line(points.topRight) + .line(points.topLeft) + .line(points.bottomLeft) + .line(points.bottomRight) + .close() + .addClass('various') + + paths.fold = new Path().move(points.topFold).line(points.bottomFold).addClass('various help') + + if (sa) { + paths.sa = new Path() + .move(points.topLeft) + .line(points.topLeft.translate(0, -sa)) + .line(points.topRight.translate(0, -sa)) + .line(points.topRight) + .move(points.bottomLeft) + .line(points.bottomLeft.translate(0, sa)) + .line(points.bottomRight.translate(0, sa)) + .line(points.bottomRight) + .addClass('various sa') + } + + /* + * Annotations + */ + // Title + points.title = new Point(points.bottomRight.x / 3, points.bottomRight.y / 3) + + // Dimensions + macro('vd', { + id: 'hFull', + from: points.bottomRight, + to: points.topRight, + x: points.topRight.x + sa + 15, + }) + macro('hd', { + id: 'wFull', + from: points.topLeft, + to: points.topRight, + y: points.topRight.y - sa - 15, + }) + macro('hd', { + id: 'wFold', + from: points.bottomFold, + to: points.bottomRight, + y: points.bottomFold.y + sa + 15, + }) +} diff --git a/designs/bibi/src/sleeve.mjs b/designs/bibi/src/sleeve.mjs index d1a075246b1..5fe7053c659 100644 --- a/designs/bibi/src/sleeve.mjs +++ b/designs/bibi/src/sleeve.mjs @@ -1,9 +1,11 @@ import { sleevecap as brianSleeveCap } from '@freesewing/brian' import { hidePresets } from '@freesewing/core' +import { cuff } from './cuff.mjs' export const sleeve = { name: 'bibi.sleeve', from: brianSleeveCap, + after: cuff, hide: hidePresets.HIDE_TREE, options: { sleeveLength: { @@ -13,13 +15,6 @@ export const sleeve = { menu: (settings, mergedOptions) => mergedOptions.sleeves === false ? false : 'style.sleeves', }, - cuffEase: { - pct: 20, - min: 0, - max: 200, - menu: (settings, mergedOptions) => - mergedOptions.sleeves === false ? false : 'style.sleeves', - }, }, measurements: ['shoulderToWrist', 'wrist'], draft: bibiSleeve, @@ -38,6 +33,7 @@ function bibiSleeve({ snippets, Snippet, part, + utils, }) { points.sleeveTip = paths.sleevecap.edge('top') points.sleeveTop = new Point(0, points.sleeveTip.y) // Always in center @@ -46,14 +42,17 @@ function bibiSleeve({ store.set('sleeveLength', measurements.shoulderToWrist * options.sleeveLength) store.set('capSleeves', options.sleeveLength < 0.05) + store.set('separateSleeves', true) store.set('sleeveCapHeight', -points.sleeveTop.y) if (store.get('capSleeves')) { + store.set('separateSleeves', false) return part.hide() } if (!options.sleeves) { store.set('sleeveLength', 0) + store.set('separateSleeves', false) return part.hide() } @@ -67,6 +66,18 @@ function bibiSleeve({ options.sleeveLength ) points.cuffLeft = points.bicepsLeft.shiftFractionTowards(points.wristLeft, options.sleeveLength) + + if (store.cuffSize > 0) { + let intersectionY + if (points.bicepsLeft.dy(points.cuffLeft) > store.ribbingHeight * 1.5) { + intersectionY = points.cuffLeft.y - store.ribbingHeight + } else { + intersectionY = store.ribbingHeight * 0.5 + } + points.cuffLeft = utils.beamIntersectsY(points.bicepsLeft, points.cuffLeft, intersectionY) + points.cuffRight = utils.beamIntersectsY(points.bicepsRight, points.cuffRight, intersectionY) + } + points.centerCuff = points.cuffRight.shiftFractionTowards(points.cuffLeft, 0.5) // Paths @@ -80,7 +91,20 @@ function bibiSleeve({ .close() .attr('class', 'fabric') - if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + if (sa) + paths.sa = new Path() + .move(points.bicepsLeft) + .join( + new Path() + .move(points.cuffLeft) + .line(points.cuffRight) + .offset(store.cuffSize > 0 ? 0 : sa * 2) + ) + .line(points.bicepsRight) + .join(paths.sleevecap) + .close() + .offset(sa) + .attr('class', 'fabric sa') /* * Annotations @@ -103,7 +127,7 @@ function bibiSleeve({ snippets.logo = new Snippet('logo', points.logo) // Title - macro('title', { at: points.centerBiceps, nr: 3, title: 'sleeve' }) + macro('title', { at: points.centerBiceps, nr: 4, title: 'sleeve' }) // Notches points.frontNotch = paths.sleevecap.shiftAlong(store.get('frontArmholeToArmholePitch')) diff --git a/designs/bibi/src/waistband.mjs b/designs/bibi/src/waistband.mjs new file mode 100644 index 00000000000..62332826088 --- /dev/null +++ b/designs/bibi/src/waistband.mjs @@ -0,0 +1,119 @@ +import { base } from '@freesewing/brian' +import { + adjustSidePoints, + constructBackHem, + constructBackPoints, + constructFrontHem, + constructFrontPoints, + correctArmHole, + draftRibbing, +} from './shared.mjs' + +export const waistband = { + name: 'bibi.waistband', + from: base, + hide: { from: true }, + + options: { + // Bibi specific, places here as this is the earliest part that drafts the sideseam + fitWaist: { bool: true, menu: 'fit', order: 'EBA' }, + waistEase: { + pct: 1, + min: -10, + max: 20, + menu: (settings, mergedOptions) => (mergedOptions.fitWaist ? 'fit' : false), + order: 'EBB', + }, + hipsEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'ECA' }, + seatEase: { pct: 2, min: -5, max: 50, menu: 'fit', order: 'EDA' }, + chestEase: { pct: 2, min: -5, max: 25, menu: 'fit', order: 'EAB' }, + length: { + dflt: 'seat', + list: ['underbust', 'waist', 'hips', 'seat', 'knee', 'floor'], + menu: 'style.length', + }, + flare: { + pct: 5, + min: 0, + max: 150, + menu: (settings, mergedOptions) => + (mergedOptions.length === 'seat' && mergedOptions.lengthBonus > 0) || + mergedOptions.length === 'knee' || + mergedOptions.length === 'floor' + ? 'style.length' + : false, + }, + backNeckCutout: { pct: 6, min: 2, max: 110, menu: 'style' }, + backNeckBend: { pct: 50, min: 0, max: 70, menu: 'style' }, + lengthBonus: { pct: 0, min: -30, max: 30, menu: 'style.length' }, + draftForHighBust: { bool: true, menu: 'fit' }, + // waistband specific + useWaistRibbing: { bool: false, menu: 'style' }, + ribbingStretch: { pct: 15, min: 0, max: 30, menu: 'fit' }, + ribbingHeight: { + pct: 10, + min: 5, + max: 15, + menu: (settings, mergedOptions) => + mergedOptions.useWaistRibbing || mergedOptions.useCuffRibbing ? 'style' : false, + toAbs: (val, { measurements }) => + (measurements.hpsToWaistBack + measurements.waistToHips) * val, + }, + }, + draft: bibiWaistband, +} + +function bibiWaistband({ part, store, measurements, options, paths, points, snippets, macro }) { + store.set( + 'ribbingHeight', + (measurements.hpsToWaistBack + measurements.waistToHips) * options.ribbingHeight + ) + + if (!options.useWaistRibbing) { + return part.hide() + } + + // draft a simple version of front and back to determine hem length + + constructBackPoints(part) + + adjustSidePoints(part) + + correctArmHole(part) + + constructBackHem(part) + + store.set('backHemLength', paths.hem.length() * 2) + + constructFrontPoints(part) + + adjustSidePoints(part) + + constructFrontHem(part) + + store.set('frontHemLength', paths.hem.length() * 2) + + // clean up temporary stuff + for (const key of Object.keys(paths)) delete paths[key] + for (const key of Object.keys(snippets)) delete snippets[key] + for (const key of Object.keys(points)) delete points[key] + + draftRibbing(part, (store.frontHemLength + store.backHemLength) * (1 - options.ribbingStretch)) + + /* + * Annotations + */ + // Cutlist + store.cutlist.setCut({ cut: 1, from: 'ribbing' }) + + // Title + macro('title', { + at: points.title, + nr: 5, + scale: 0.5, + rotation: 90, + title: 'waistband', + }) + + return part +} diff --git a/markdown/org/docs/designs/bibi/cutting/en.md b/markdown/org/docs/designs/bibi/cutting/en.md index 75f6a5ccb87..527fcc86026 100644 --- a/markdown/org/docs/designs/bibi/cutting/en.md +++ b/markdown/org/docs/designs/bibi/cutting/en.md @@ -4,13 +4,25 @@ maintainers: - Jonathan Haas --- -- Cut 1 back on the fold. -- Cut 1 front on the fold. -- Cut 2 sleeves _with good sides together_ (optional) - - If you cut sleeves separately, remember that one has to be a mirror image of the other. - - There is no sleeve part if sleeves are disabled or the sleeve length setting is below 5% +- **Main fabric** + - Cut 1 *Front* on the fold + - Cut 1 *Back* on the fold + - Cut 2 *Sleeve(s)* mirrored (if enabled) +- **Ribbing** + - Cut 1 *Neck Binding* + - Cut 2 *Armhole Binding(s)* or *Cuff(s)* (depending on selected options) + - Cut 1 *Waistband* (if enabled) ## Caveats -- There is extra hem allowance at the hem. -- Depending on how you want to finish the neck and armholes, choose an appropriate seam allowance. +- There is extra hem allowance at the bottom hem if there is no *Waistband* part. +- There is extra hem allowance at the sleeve part if there is no *Cuff* part. +- There is no seam allowance on the neck opening. +- There is no seam allowance on the armhole if the sleeve is disabled. +- There is no seam allowance on the long sides of the *Armhole Binding* and *Neck Binding* parts. + + +You can cut the front or back parts on the fold, or you can cut the halves separately and sew them together. This is especially +useful if you only have smaller pieces of fabric or if you want to add buttons or zippers to your design. In this case, make sure +to add sufficient seam allowance on the center fold. + diff --git a/markdown/org/docs/designs/bibi/en.md b/markdown/org/docs/designs/bibi/en.md index 94b14478992..412190874fc 100644 --- a/markdown/org/docs/designs/bibi/en.md +++ b/markdown/org/docs/designs/bibi/en.md @@ -1,7 +1,5 @@ --- title: "Bibi body block" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/fabric/en.md b/markdown/org/docs/designs/bibi/fabric/en.md index 2c2dcfe9d57..3acb6df6061 100644 --- a/markdown/org/docs/designs/bibi/fabric/en.md +++ b/markdown/org/docs/designs/bibi/fabric/en.md @@ -6,8 +6,19 @@ maintainers: Bibi is by default designed as a close-fitting top and is best suited to knit fabrics with some stretch, such as jersey. -Woven fabrics with good drape could also work. Increase ease settings and ensure the neck hole is large enough to fit a head through. +If your main fabric is elastic enough, can use strips of it to finish the waistband, armholes/cuffs and neck opening. +Alternatively, you can also use rib fabric or store-bought strips of knit binding. -If you're new to sewing, interlock jersey is nice to work with, as it doesn't roll up. Prefer jersey with a few percent spandex for better recovery. Fabric weights can also help you make your choice. A weight of 130-200 grams per square meter (or 4-6 ounces per square yard) is likely to be about right. +If you're new to sewing, interlock jersey is nice to work with, as it doesn't roll up. +Prefer jersey with a few percent spandex for better recovery. + +Fabric weights can also help you make your choice. +A weight of 130-200 grams per square meter (or 4-6 ounces per square yard) is likely to be about right for a basic shirt. + + +Woven fabrics with good drape and thicker fabrics such as sweat could also work. +Increase all ease settings to around 15% and ensure the neck hole is large enough to fit a head through. +Alternatively, you can also attach a zipper or buttons to the front or back to make it easier to put on. + diff --git a/markdown/org/docs/designs/bibi/instructions/en.md b/markdown/org/docs/designs/bibi/instructions/en.md index 82f29526536..bbcddfd401a 100644 --- a/markdown/org/docs/designs/bibi/instructions/en.md +++ b/markdown/org/docs/designs/bibi/instructions/en.md @@ -6,23 +6,36 @@ maintainers: -###### Bibi is a pattern building block +###### Bibi is a customizable pattern building block -Bibi can be sewn as a simple top, but is mostly designed as a building block for other patterns or custom designs. +Bibi can be sewn as a simple top, but it is mostly designed as a building block for other patterns or custom designs. -Bibi is highly customizable, but it does not in itself represent a specific garment or style. Some option combinations might not make much sense. +Bibi is highly customizable, but it does not in itself represent a specific garment or style. +Some option combinations might not make much sense, and you may need to experiment with different options. You may want to finish the hem, armholes, and/or neck using knit bands, knit binding or ribbing fabric. -In this case, you may want to look at instructions from other designs, like Aaron or Teagan. +These instructions give basic guidelines for that, +but you might also want to look at instructions from other designs, like Sven, Aaron or Teagan. There is also lots of other stuff you could customize. + + +As with all knits and stretch fabrics, a serger/overlock will make your life easier. +If you don't have one, don't despair. You don't really need one. +All serged seams on Bibi can also be sewn with a short, narrow zigzag stitch (~2 mm wide) on a standard sewing machine. + +For the topstitching steps, a coverlock works best, but if you don't have a coverlock, a twin needle will also give good results. +Of course, you can also use a zigzag stitch. + + + ### Step 0: Prepare the fabric Cut out the parts including seam allowance and transfer markings and notches to the fabric. -Note that there are two different kinds of notches. You probably want to use a different notch shape or a different pen/chalk color for notches with an ×. +Note that there are two different kinds of notches. You probably want to use a different notch shape or a different pen/chalk color for ×-notches. ### Step 1: Prepare the front part @@ -33,7 +46,7 @@ If your pattern contains neither an indicated gathering section nor a dart, skip #### Bust darts -If you drafted the pattern with _darts_, fold your front part _good sides together_ along the center line of the dart. +If the pattern was drafted with _darts_, fold your front part _good sides together_ along the center line of the dart. Sew using an elastic stitch along the dart line from the side seam towards the bust. Near the dart tip, make sure to stitch as parallel to the fold line as possible while still stitching over the folded edge. @@ -51,7 +64,7 @@ The stiches should have a longer stitch length setting, and you must *not* secur Keep the thread ends loose and long. Hold the bobbin threads with one hand tight and bunch together the fabric with the other hand until -you've gathered the side seam to the same length as the distance between the notches on the back part pattern. +you've gathered the section to the same length as the distance between the notches on the back part pattern. Secure the threads by tying a knot. @@ -101,6 +114,94 @@ With the front part on top, sew using an elastic stitch. Repeat for both sides. ![sideseam.svg](sideseam.svg) -### Step 5: Hem the openings +### Step 5: Create the hem -If not using knit binding or knit bands fold over the fabric at the remaining openings _wrong sides together_ once and topstitch in place with an elastic stitch. +#### Using a waistband + +If you've chosen to finish the hem with a waistband, +sew together the short sides of the waistband, _good sides together_, +to create a tube. + +Then fold the fabric in half along its length, raw edges together, so the good sides are outside. + +With the main body piece turned inside-out, pin the ring inside the bottom opening, matching raw edges. +Mark and align quarters for a consistent stretch. +The ribbing is a bit shorter, so stretch it a bit while pinning. + +Sew using an elastic stitch. + +Fold the hem to the outside. + +Optional: Topstitch the seam allowance towards the main body piece to keep it in place. + +![Attach the ribbing](ribbing.svg) + +#### Simple hem + +If you've chosen the option without a waistband, +fold over the hem allowance to the inside and topstitch in place using an elastic stitch. + +### Step 6: Finish the neck + + +This is explained in more detail in the [Teagan instructions](/docs/designs/teagan/instructions#step-3-sew-the-neck-finish) and on [this page](/docs/sewing/knit-binding). + + +Turn the main body piece right side out. +Place the knit binding piece _good sides together_ on the back of the neck, +matching the raw edge of the neck opening. +The solid line on the pattern (where the seam allowance ends) should be exactly at the center back of the garment. + +![Place your binding](knitbinding_a.svg) + +Sew the neck binding to the main body piece. +The distance of the stitch to the raw edge is the width of the neck band +divided by four. +This is probably not equal to the standard seam allowance! +For example, if your knit band is 6 cm wide, sew 1.5 cm from the edge. + +Place your presser foot 3 cm along the knit binding, so a 3 cm tail will be left unstitched. +This will help us join the ends of the binding later. + +Stop sewing 3 cm before the end, leaving a tail like we did at the beginning. + +![Sew binding in place](knitbinding_b.svg) + +Sew the tails _good sides together_ to close the loop, making sure the neck binding is stretched evenly. + +![Sew binding ends](knitbinding_c.svg) + +Then sew down the remaining, unstitched length of the neck binding, keeping the same distance as before. + +![Finish binding](knitbinding_d.svg) + +Fold the neck binding upwards and to the inside of the top. +This will create a fold at the stitch line you just created, +and another one at the original raw edge from the front and back parts. + +Topstitch the neck binding in place from the outside. +The inside edge can be left raw if you're using knit fabric. +Trim loose fabric from the inside to reduce bulk. + +![Sew down binding](knitbinding_e.svg) + +### Step 7: Finish the armholes + +#### With sleeves + +If your design has a sleeve part, +follow the waistband instructions again for the cuff or sleeve opening +and either attach a piece of ribbing or do a simple folded hem. + + + +Alternatively, you can also finish the bottom edge of the sleeves right at the start. +This is a little bit easier as you can work on flat fabric, but the inside of the sleeves won't be as clean +as the bottom seam will go right to the armhole opening and won't be hidden. + + + +#### Without sleeves + +If your design is sleeveless or has only short cap sleeves as part of the main body, +finish the armholes the same way you finished the neckline. diff --git a/markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg b/markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg new file mode 100644 index 00000000000..638b2412e81 --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/knitbinding_a.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + seam allowance + + center back + + diff --git a/markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg b/markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg new file mode 100644 index 00000000000..b9dc6b4ddac --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/knitbinding_b.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + 3 cm + + + + ¼ + + diff --git a/markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg b/markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg new file mode 100644 index 00000000000..2c6ec4471fb --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/knitbinding_c.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg b/markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg new file mode 100644 index 00000000000..0fb29435b95 --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/knitbinding_d.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg b/markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg new file mode 100644 index 00000000000..3242311b2fe --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/knitbinding_e.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/markdown/org/docs/designs/bibi/instructions/ribbing.svg b/markdown/org/docs/designs/bibi/instructions/ribbing.svg new file mode 100644 index 00000000000..41f1d242690 --- /dev/null +++ b/markdown/org/docs/designs/bibi/instructions/ribbing.svg @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/markdown/org/docs/designs/bibi/notes/en.md b/markdown/org/docs/designs/bibi/notes/en.md index c23cfb38757..0544004f4b7 100644 --- a/markdown/org/docs/designs/bibi/notes/en.md +++ b/markdown/org/docs/designs/bibi/notes/en.md @@ -19,11 +19,17 @@ it also works fine as a base for unisex clothes or t-shirts. However, it's also important to talk about what Bibi is not: -Bibi can be sewn as a simple top or dress, but it's mostly designed as a building block for other patterns or your custom designs. +Bibi can definitely be sewn as a simple top or dress, +but it's mainly designed as a building block for other patterns or your custom designs. -Bibi is highly customizable, but it does not itself represent a specific garment or follow a specific style. -Some option combinations might not make much sense and you'll have to experiment with different options -yourself to find the design you're looking for. +Bibi is highly customizable, but it does not necessarily represent a specific garment or follow a specific style. +Some option combinations might not make much sense, and you may have to experiment with different options +yourself to find the design you're looking for. + +For example, when you make a dress with Bibi out of woven fabric, you'll have to ensure yourself that there +is enough room for leg movement. +Depending on the shape around the waist or the size of the neck hole, +you also may have to add buttons or zippers on the front or back so you can actually put it on. Bibi is also not a standard block/sloper for woven fabric. It only does a very basic front bust adjustment designed for stretchy knit fabric and will not work well as a base for fitted shirts and blouses from woven fabric. diff --git a/markdown/org/docs/designs/bibi/options/bindingheight/en.md b/markdown/org/docs/designs/bibi/options/bindingheight/en.md new file mode 100644 index 00000000000..1b8ad66b006 --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/bindingheight/en.md @@ -0,0 +1,11 @@ +--- +title: "Knit binding height" +maintainers: + - Jonathan Haas +--- + +Controls the height of the knit binding on the neck and armhole. + + + + diff --git a/markdown/org/docs/designs/bibi/options/length/en.md b/markdown/org/docs/designs/bibi/options/length/en.md index 6938ee5eaf2..299656e080a 100644 --- a/markdown/org/docs/designs/bibi/options/length/en.md +++ b/markdown/org/docs/designs/bibi/options/length/en.md @@ -4,12 +4,10 @@ maintainers: - Jonathan Haas --- -Which measurement to use for the hem. If the length bonus is zero, the bottom of the garment will be at exactly the selected measurement. +Which measurement to use for the bottom hem. +If the length bonus is zero, the bottom of the garment will be at exactly the selected measurement. Note that the options *underbust*, *knee* and *floor* require the corresponding optional vertical measurements. If they are missing, a very rough estimate is used instead. - - - - +Use a negative length bonus when selecting *floor* to prevent the garment from actually dragging on the floor. diff --git a/markdown/org/docs/designs/bibi/options/ribbingheight/en.md b/markdown/org/docs/designs/bibi/options/ribbingheight/en.md new file mode 100644 index 00000000000..542d3dda960 --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/ribbingheight/en.md @@ -0,0 +1,11 @@ +--- +title: "Ribbing height" +maintainers: + - Jonathan Haas +--- + +Controls the height of the ribbing on the cuff and/or waistband. + + + + diff --git a/markdown/org/docs/designs/bibi/options/ribbingstretch/en.md b/markdown/org/docs/designs/bibi/options/ribbingstretch/en.md new file mode 100644 index 00000000000..691c89a50ad --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/ribbingstretch/en.md @@ -0,0 +1,11 @@ +--- +title: "Ribbing stretch" +maintainers: + - Jonathan Haas +--- + +Controls how much the ribbing on the cuff and/or waistband is stretched relative to the fabric. + + + + diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/de.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/de.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/de.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/de.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/en.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/en.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/en.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/en.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/es.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/es.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/es.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/es.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/fr.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/fr.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/fr.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/fr.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/nl.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/nl.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/nl.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/nl.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/uk.md b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/uk.md index bdb8029a432..3dab25572e3 100644 --- a/markdown/org/docs/designs/bibi/options/shoulderslopereduction/uk.md +++ b/markdown/org/docs/designs/bibi/options/shoulderslopereduction/uk.md @@ -1,7 +1,5 @@ --- title: Shoulder slope reduction -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/de.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/de.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/en.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/en.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/es.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/es.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/fr.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/nl.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/uk.md index 870c53f0707..7c77410cb1a 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactorx/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/de.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/de.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/en.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/en.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/es.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/es.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/fr.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/nl.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/uk.md index 89e7a5dc873..eca542671d6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapbackfactory/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap back Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/de.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/de.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/en.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/en.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/es.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/es.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/fr.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/nl.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/uk.md index af44cd9d0f0..c3201f817f5 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactorx/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/de.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/de.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/en.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/en.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/es.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/es.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/fr.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/nl.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/uk.md index 986e87cb9c2..472decd0ea9 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapfrontfactory/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap front Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/de.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/en.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/es.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/fr.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/nl.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/uk.md index c1158f62b03..2b1cd9f81a6 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread1/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/de.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/en.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/es.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/fr.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/nl.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/uk.md index 47784508c01..b52be093b99 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq1spread2/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q1 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/de.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/en.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/es.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/fr.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/nl.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/uk.md index 3ade5fdf715..e0f7b66c227 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread1/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/de.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/en.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/es.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/fr.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/nl.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/uk.md index ac684fcbba7..626add9bb78 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq2spread2/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q2 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/de.md index 818a46677a2..fe01e75d6ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/en.md index 818a46677a2..fe01e75d6ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/es.md index 818a46677a2..fe01e75d6ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/fr.md index 818a46677a2..fe01e75d6ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/nl.md index 818a46677a2..fe01e75d6ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3offset/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3offset/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/de.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/en.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/es.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/fr.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/nl.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/uk.md index 13cf1ef4d94..3defb3758fd 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread1/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/de.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/en.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/es.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/fr.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/nl.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/uk.md index 7b63088a2b1..da6265e434c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq3spread2/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q3 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/de.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/en.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/es.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/fr.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/nl.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/uk.md index 3b926fbfe94..7cfcf0b6e45 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4offset/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4offset/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 offset" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/de.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/en.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/es.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/fr.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/nl.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/uk.md index 9564e8148e6..ea2606553bf 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread1/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 upward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/de.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/de.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/en.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/en.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/es.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/es.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/fr.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/fr.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/nl.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/nl.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/uk.md b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/uk.md index 6aaccbad890..32a3874a05c 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecapq4spread2/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap Q4 downward spread" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/de.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/de.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/en.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/en.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/es.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/es.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/fr.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/fr.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/nl.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/nl.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/uk.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/uk.md index 66a457a25d0..395f6624aed 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactorx/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top X" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/de.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/de.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/de.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/de.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/en.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/en.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/en.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/en.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/es.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/es.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/es.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/es.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/fr.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/fr.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/fr.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/fr.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/nl.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/nl.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/nl.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/nl.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/uk.md b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/uk.md index e95db61bf43..f82577c78ee 100644 --- a/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/uk.md +++ b/markdown/org/docs/designs/bibi/options/sleevecaptopfactory/uk.md @@ -1,7 +1,5 @@ --- title: "Sleevecap top Y" -maintainers: - - Jonathan Haas maintainers: - Jonathan Haas --- diff --git a/markdown/org/docs/designs/bibi/options/usecuffribbing/en.md b/markdown/org/docs/designs/bibi/options/usecuffribbing/en.md new file mode 100644 index 00000000000..fa36221e41c --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/usecuffribbing/en.md @@ -0,0 +1,13 @@ +--- +title: "Use cuff ribbing" +maintainers: + - Jonathan Haas +--- + +Enable or disable ribbing on the cuffs. +Ribbing on cuffs is typically used on sweatshirts +and similar garments with long sleeves and thicker fabric. + + + + diff --git a/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md b/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md new file mode 100644 index 00000000000..3b0c1af9e3d --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md @@ -0,0 +1,9 @@ +--- +title: "Use waistband ribbing" +maintainers: + - Jonathan Haas +--- + +Enable or disable the separate waistband part. +A waistband made form ribbing fabric provides a tighter fit and cleaner finish. +and is typically used on sweatshirts, crop tops, and bralettes. From 43cb1b6c2b043b1ecf5f256b1d473b0beb79be4c Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Sun, 19 May 2024 09:59:50 +0200 Subject: [PATCH 2/7] change(bibi): Make sleeve hem allowance hourglass shaped for a better fit --- designs/bibi/src/sleeve.mjs | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/designs/bibi/src/sleeve.mjs b/designs/bibi/src/sleeve.mjs index 5fe7053c659..33ca910265a 100644 --- a/designs/bibi/src/sleeve.mjs +++ b/designs/bibi/src/sleeve.mjs @@ -84,27 +84,41 @@ function bibiSleeve({ paths.sleevecap.hide() paths.seam = new Path() .move(points.bicepsLeft) - .move(points.cuffLeft) - .move(points.cuffRight) + .line(points.cuffLeft) + .line(points.cuffRight) .line(points.bicepsRight) .join(paths.sleevecap) .close() .attr('class', 'fabric') - if (sa) + if (sa) { + if (store.cuffSize === 0) { + // modify seam allowance to add mirrored/hourglass shape + points.hemLeft = utils + .beamIntersectsY(points.bicepsRight, points.cuffRight, points.cuffRight.y + sa * 2) + .translate(points.cuffRight.dx(points.cuffLeft), 0) + points.hemRight = utils + .beamIntersectsY(points.bicepsLeft, points.cuffLeft, points.cuffLeft.y + sa * 2) + .translate(points.cuffLeft.dx(points.cuffRight), 0) + paths.saBottom = new Path() + .move(points.cuffLeft) + .line(points.hemLeft) + .line(points.hemRight) + .line(points.cuffRight) + .hide() + } else { + paths.saBottom = new Path().move(points.cuffLeft).line(points.cuffRight).hide() + } + paths.sa = new Path() .move(points.bicepsLeft) - .join( - new Path() - .move(points.cuffLeft) - .line(points.cuffRight) - .offset(store.cuffSize > 0 ? 0 : sa * 2) - ) + .join(paths.saBottom) .line(points.bicepsRight) .join(paths.sleevecap) .close() .offset(sa) .attr('class', 'fabric sa') + } /* * Annotations From de7c96b0ab6e155b1a00c3abddf184fb3873424d Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 22 May 2024 14:00:10 +0200 Subject: [PATCH 3/7] change(bibi): Export additional functions --- designs/bibi/src/index.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/designs/bibi/src/index.mjs b/designs/bibi/src/index.mjs index 5cb358aeb44..9b7d68b56a2 100644 --- a/designs/bibi/src/index.mjs +++ b/designs/bibi/src/index.mjs @@ -20,6 +20,8 @@ import { constructFrontHem, createArmHoles, plotSideLineMeasurements, + draftRibbing, + draftKnitBinding, } from './shared.mjs' // Setup our new design @@ -52,6 +54,8 @@ export { constructFrontHem, createArmHoles, plotSideLineMeasurements, + draftRibbing, + draftKnitBinding, Bibi, i18n, } From 3431fa1d7df71d69524e5f9a7357762a0ff44720 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Thu, 23 May 2024 22:12:21 +0200 Subject: [PATCH 4/7] change(bibi): Rework side seam construction according to discord discussion --- designs/bibi/i18n/en.json | 10 +- designs/bibi/src/back.mjs | 12 + designs/bibi/src/cuff.mjs | 2 +- designs/bibi/src/front.mjs | 7 +- designs/bibi/src/shared.mjs | 349 ++++++++++++++---- designs/bibi/src/waistband.mjs | 6 +- .../bibi/options/curvatureadjustment/en.md | 10 + .../org/docs/designs/bibi/options/flare/en.md | 2 +- .../bibi/options/seatbackadjustment/en.md | 10 + 9 files changed, 323 insertions(+), 85 deletions(-) create mode 100644 markdown/org/docs/designs/bibi/options/curvatureadjustment/en.md create mode 100644 markdown/org/docs/designs/bibi/options/seatbackadjustment/en.md diff --git a/designs/bibi/i18n/en.json b/designs/bibi/i18n/en.json index 45503f8a7ed..746f300b941 100644 --- a/designs/bibi/i18n/en.json +++ b/designs/bibi/i18n/en.json @@ -115,7 +115,7 @@ }, "flare": { "t": "Flare", - "d": "How much fabric to use at the bottom hem of the design. Only applies when the design goes below the seat." + "d": "How much fabric to use at the bottom hem of the design. Only applies when the design goes below the waist." }, "dart": { "t": "Allow bust dart", @@ -164,6 +164,14 @@ "bindingHeight": { "t": "Knit binding height", "d": "Controls the height of the knit binding for neck and armhole." + }, + "seatBackAdjustment": { + "t": "Seat back adjustment", + "d": "Controls the influence of the seat back measurement." + }, + "curvatureAdjustment": { + "t": "Curvature adjustment", + "d": "Controls how straight the side seam is above the hem." } } } diff --git a/designs/bibi/src/back.mjs b/designs/bibi/src/back.mjs index 211463448d5..ca8093d4655 100644 --- a/designs/bibi/src/back.mjs +++ b/designs/bibi/src/back.mjs @@ -26,6 +26,18 @@ export const back = { menu: (settings, mergedOptions) => (mergedOptions.sleeves ? false : 'style.sleeves'), }, sleeves: { bool: true, menu: 'style.sleeves' }, + seatBackAdjustment: { + pct: 20, + min: 0, + max: 100, + menu: 'advanced', + }, + curvatureAdjustment: { + pct: 20, + min: 0.1, + max: 100, + menu: 'advanced', + }, }, draft: bibiBack, } diff --git a/designs/bibi/src/cuff.mjs b/designs/bibi/src/cuff.mjs index 4c58d100a53..ec94b4a209c 100644 --- a/designs/bibi/src/cuff.mjs +++ b/designs/bibi/src/cuff.mjs @@ -98,7 +98,7 @@ function bibiCuff({ part, store, measurements, options, paths, points, Point, ma store.set('cuffSize', points.cuffLeft.dist(points.cuffRight)) // clean up temporary stuff - delete paths.sleevecap + paths.sleevecap.hide() draftRibbing(part, store.cuffSize * (1 - options.ribbingStretch)) diff --git a/designs/bibi/src/front.mjs b/designs/bibi/src/front.mjs index f4407e7d80c..a3f164fa2aa 100644 --- a/designs/bibi/src/front.mjs +++ b/designs/bibi/src/front.mjs @@ -8,6 +8,7 @@ import { correctArmHole, createArmHoles, plotSideLineMeasurements, + verticalSplit, } from './shared.mjs' export const front = { @@ -144,7 +145,7 @@ function bibiFront({ const dartLength = frontLength - backLength const constructDart = (path, tip, dartLength) => { const length = path.length() - + console.log('dart', length, path) dartLength = Math.max(0, Math.min(dartLength, length)) const gatherArea = (store.get('gatherAreaLength') ?? 0) + dartLength @@ -158,9 +159,9 @@ function bibiFront({ const endDartAlpha = path.shiftAlong(offset + auxLength + dartLength) const endSplit = path.shiftAlong(offset + gatherArea) - let tmp = path.split(startSplit) + let tmp = verticalSplit(Path, path, startSplit) const pathBefore = tmp[0] - tmp = tmp[1].split(endSplit) + tmp = verticalSplit(Path, tmp[1], endSplit) const pathGather = tmp[0] const pathAfter = tmp[1] const angleBefore = path.angleAt(startSplit) diff --git a/designs/bibi/src/shared.mjs b/designs/bibi/src/shared.mjs index 8b71b7dcc53..a5139308b6c 100644 --- a/designs/bibi/src/shared.mjs +++ b/designs/bibi/src/shared.mjs @@ -1,7 +1,14 @@ import { capitalize } from '@freesewing/core' +export function verticalSplit(Path, path, splitPoint) { + const tmp = path.split(splitPoint) + if (Array.isArray(tmp[0])) tmp[0] = new Path().move(splitPoint) + if (Array.isArray(tmp[1])) tmp[1] = new Path().move(splitPoint) + return tmp +} + function createLowerPoints(part, prefix) { - const { measurements, options, points } = part.shorthand() + const { measurements, points } = part.shorthand() // These lengths are typically not critical, so use a rough estimate if not given // We don't want the user to need these measurements, as this design can also be used for shorter tops if (typeof measurements.waistToKnee !== 'undefined') { @@ -20,7 +27,7 @@ function createLowerPoints(part, prefix) { measurements.hpsToWaistBack * 2.5 ) } - points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * (1 + options.flare), 0) + points.sideTarget = points[prefix + 'Knee'].translate(points.seatBase.x * 1.2, 0) } export function constructFrontPoints(part) { @@ -62,8 +69,11 @@ export function constructFrontPoints(part) { const seatExtra = (measurements.seatBack - seatFront) / 4 points.cfSeat = new Point(0, points.cfWaist.y + measurements.waistToSeat) points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cfSeat.y) - points.seat = seatAdjustment(points.seatBase, points.hips, -seatExtra) - // points.cfSeat = points.cfSeat.shift(-90, -seatExtra * 2) + points.seat = seatAdjustment( + points.seatBase, + points.hips, + -seatExtra * options.seatBackAdjustment + ) createLowerPoints(part, 'cf') } @@ -91,12 +101,24 @@ export function constructBackPoints(part) { const seatFront = measurements.seat - measurements.seatBack const seatExtra = (measurements.seatBack - seatFront) / 4 points.seatBase = new Point((measurements.seat * (1 + options.seatEase)) / 4, points.cbSeat.y) - points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra) + points.seat = seatAdjustment(points.seatBase, points.hips, seatExtra * options.seatBackAdjustment) // points.cbSeat = points.cbSeat.shift(-90, seatExtra * 2) createLowerPoints(part, 'cb') } +function newtonIterationStep(t, f) { + return t - (t * t * (3 - 2 * t) - f) / (-6 * (t - 1) * t) +} + +function findT(f) { + let t = 0.5 + for (let i = 0; i < 10; i++) { + t = newtonIterationStep(t, f) + } + return t +} + function seatAdjustment(seatBase, anchor, seatExtra) { const r = anchor.dist(seatBase) return seatBase.rotate((seatExtra / r) * 90, anchor) @@ -140,75 +162,262 @@ export function calculateFba(anchor, bust, side, dx, Point) { export function correctArmHole(part) { const { options, points, utils } = part.shorthand() - points.armholeCp1 = points.chest + + points.chestBelowArmhole = points.chest.y > points.armhole.y ? points.chest : points.armhole if (!options.sleeves && points.armhole.y > points.chest.y) { points.armhole = utils.beamIntersectsY(points.chest, points.waist, points.armhole.y) points.armholeCp2 = points.armhole.shift(180, points._tmp1.dx(points.armhole) / 4) } - if (points.armhole.y > points.armholeCp1.y * 0.8) { - const frac = Math.min( - 1, - (points.armhole.y - points.armholeCp1.y * 0.8) / (0.2 * points.armholeCp1.y) - ) - points.armholeCp1 = points.chest.shiftFractionTowards( - points.armholeCp2.rotate(90, points.armhole), - frac + if (points.armhole.y > points.chest.y * 0.8) { + points.armholeCp1 = points.chestBelowArmhole.shift( + points.armholeCp2.angle(points.armhole) - 90, + points.chest.y * 0.2 ) + } else { + points.armholeCp1 = points.chest.shiftFractionTowards(points.armhole, -1) } } function extendSideLine(points, intersectionY) { - const fraction = (intersectionY - points.seat.y) / points.seat.dy(points.sideTarget) - return points.seat.shiftFractionTowards(points.sideTarget, fraction) + const fraction = (intersectionY - points.baseBottom.y) / points.baseBottom.dy(points.sideTarget) + return points.baseBottom.shiftFractionTowards(points.sideTarget, fraction) } -export function constructSideSeam(part, height, bottomSmoothness) { - const { points, Path, Point } = part.shorthand() +/** + * Constructs a simple side seam curve, used for the part between the armpit/chest point and the waist + * @param Path path constructor + * @param points points collection + * @param {Point} start upper point + * @param {Point|null} cp1 first control point, can be null to use default + * @param {Point|null} cp2 second control point, can be null to use default + * @param end lower point (typically waist) + * @param endSmoothness relative length of the control point below end, determines curve + * @returns Psth + */ +function constructShortSideSeam(Path, points, start, cp1, cp2, end, endSmoothness) { + points.waistCp1 = cp1 ?? start.translate(0, start.dy(end) * 0.2) + points.hemCp2 = cp2 ?? end.translate(0, start.dy(end) * -endSmoothness) + return new Path().move(start).curve(points.waistCp1, points.hemCp2, end) +} + +/** + * Calculates the control points for the side seam below the waist using bezier maths. + * @param Point point constructor + * @param start start point; This is typically the waist point + * @param {[Point]} inBetweenPoints array of points that the line should go through (or at least go right of) + * @param end end point, this is typically the point where the waistband meets the bottom hem + * @param defaultEndSmoothness relative length of the control point above the end point + * @returns {[Point, Point, Point]} cp1, cp2 and the end point (which might have been adjusted) + */ +function calculateControlPointsForHipCurve( + Point, + start, + inBetweenPoints, + end, + defaultEndSmoothness +) { + // loop used for correction if we don't find a solution + outer: for (;;) { + let resultB = null + let resultD = null + let minCurveFactor = null + // ensure the end point is right of the in-between points + for (const point of inBetweenPoints) { + if (point.x > end.x) { + end = new Point(point.x, end.y) + } + } + for (const point of inBetweenPoints) { + const xFactor = start.dx(point) / start.dx(end) + const yFactor = start.dy(point) / start.dy(end) + const c = start.dy(point) / start.dy(end) + const maxFactor = 0.95 + if (xFactor > maxFactor && yFactor > maxFactor) { + // ignore points that are very close to the end point + continue + } + // Find the parameter t on the bezier curve for the in-between point + // based on its x location relative to start and end point + const t = findT(xFactor) + + /* The resulting curve roughly looks like this, start and end are always vertical: + + O Start + | + | b + | + O Cp1 + + O ← in between point + + O Cp2 + | + | d + | + O End + + Start and End are given, and we need to figure out the distances b and d so the curve goes through the + in-between point. d defaults to the defaultEndSmoothness given as parameter and b needs to be figured out. + + The general formula for the y coordinate of the + in-between point on the curve is |inBetweenPoint = (b)(3(1-t)²t)+(1-d)(3(1-t)t²)+t³| + + This formula assumes End is at (1/1) and Start is at (0/0), which is why we calculated the xFactor and yFactor above. + */ + + /* First we check if we need to increase d above its default value, to catch an in-between point that's very + far on the upper right. + For this we assume some "default" b value and calculate d + */ + let defaultB = 0.5 + let d = 1 - (c - 3 * defaultB * (1 - t) * (1 - t) * t - t * t * t) / (3 * (1 - t) * t * t) + // if d is above defaultEndSmoothness, increase it (but not more than 1.0) + d = Math.max(defaultEndSmoothness, Math.min(d, 1)) + // now let's calculate the b for this d value + let b = (c - 3 * (1 - d) * (1 - t) * t * t - t * t * t) / (3 * (1 - t) * (1 - t) * t) + if (b < 0) { + // We haven't found a good solution. Let's shift the end point to the right and try again + end = end.translate(5, 0) + continue outer + } + // limit b to sensible values + b = Math.min(0.5, b) + // calculate d again, as it might have changed because we limited b + d = 1 - (c - 3 * b * (1 - t) * (1 - t) * t - t * t * t) / (3 * (1 - t) * t * t) + // limit d to sensible values, don't go below defaultEndSmoothness so the end stays vertical even + // if it could go inwards directly + d = Math.max(defaultEndSmoothness, Math.min(d, 1)) + + let curveFactor = b - d + + // if we had multiple in-between-points find the one with the smallest b + if (d > 0 && (minCurveFactor === null || curveFactor < minCurveFactor)) { + resultB = b + resultD = d + minCurveFactor = curveFactor + } + } + + if (resultB === null) { + // We had no relevant in-between points at all, so just generate a smooth curve + resultB = 0.5 + resultD = defaultEndSmoothness + } + + return [ + start.translate(0, resultB * start.dy(end)), + end.translate(0, -resultD * start.dy(end)), + end, + ] + } +} + +/** + * does the same as path.intersectsY(sideOffset) with a small bugfix + * @param path Path + * @param sideOffset y coordinate + * @returns {[Point]} intersections + */ +function getIntersectionY(path, sideOffset) { + const y = path.intersectsY(sideOffset) + if (y.length > 0) return y + // Sometimes the intersection is directly on a node of the sidepath + // So shift the y coordinate a little bit. + // Intersecting the path exactly on the corner points sometimes doesn't work. + // See issue #3367 + sideOffset += 0.001 + return path.intersectsY(sideOffset) +} + +export function constructSideSeam(part, height) { + const { points, options, paths, Path, Point } = part.shorthand() + + const tempPoints = calculateControlPointsForHipCurve( + Point, + points.waist, + [points.hips], + points.seat, + options.curvatureAdjustment + ) + const base = new Path() .move(points.armhole) + .line(points.chestBelowArmhole) .curve(points.armholeCp1, points.waistCp2, points.waist) - .smurve(points.hipsCp2, points.hips) - .smurve(points.seatCp2, points.seat) - const intersectionY = Math.min(height, points.seat.y) - bottomSmoothness - let bottom = base.intersectsY(height)[0] + .curve(tempPoints[0], tempPoints[1], tempPoints[2]) + + paths.base = base.hide() + + points.baseBottom = tempPoints[2] + + let bottom = getIntersectionY(base, height)[0] if (!bottom) { // below seat bottom = extendSideLine(points, height) } points.hem = bottom - let intersection = base.intersectsY(intersectionY)[0] + let result + if (points.hem.y < points.waist.y) { + result = new Path() + .move(points.armhole) + .line(points.chestBelowArmhole) + .join( + constructShortSideSeam( + Path, + points, + points.chestBelowArmhole, + points.armholeCp1, + null, + points.hem, + options.curvatureAdjustment + ) + ) + } else { + result = new Path() + .move(points.armhole) + .line(points.chestBelowArmhole) + .curve(points.armholeCp1, points.waistCp2, points.waist) - if (!intersection) { - if (intersectionY >= points.seat.y) { - // below seat - intersection = extendSideLine(points, intersectionY) + let controlPoints + let inBetweenPoints + if (points.hem.y <= points.hips.y) { + inBetweenPoints = [] + } else if (points.hem.y <= points.seat.y) { + inBetweenPoints = [points.hips] } else { - //above armhole - intersection = points.armhole + inBetweenPoints = [points.hips, points.seat] } + controlPoints = calculateControlPointsForHipCurve( + Point, + points.waist, + inBetweenPoints, + points.hem, + options.curvatureAdjustment + ) + points.waistCp1 = controlPoints[0] + + points.hemCp2 = controlPoints[1] + points.hem = controlPoints[2] + + // flare out the hem + let flareFactor = options.flare / 2 + if (points.hem.y < points.waist.y) { + flareFactor = 0 + } else if (points.hem.y < points.seat.y) { + flareFactor *= points.waist.dy(points.hem) / points.waist.dy(points.seat) + } + + points.waistCp1 = points.waistCp1.shiftFractionTowards(points.waist, flareFactor) + points.hemCp2 = points.hemCp2 + .rotate(flareFactor * 45, points.waist) + .shiftFractionTowards(points.waist, flareFactor) + points.hem = points.hem.rotate(flareFactor * 90, points.waist) + + result = result.curve(points.waistCp1, points.hemCp2, points.hem) } - - bottom.x = (bottom.x + intersection.x) / 2 // creates a smoother bottom as the bottom is vertical - - points.intersection = intersection - - const angle = base.angleAt(intersection) - if (!angle) { - return base - } - const intersectionCp1 = intersection.shift(angle, bottomSmoothness * 0.3) - const intersectionCp2 = new Point(bottom.x, bottom.y - bottomSmoothness * 0.3) - - points.intersectionCp1 = intersectionCp1 - points.intersectionCp2 = intersectionCp2 - - let result = base.split(intersection)[0] - if (!result.curve) { - result = new Path().move(points.armhole) - } - return result.curve(intersectionCp1, intersectionCp2, bottom).reverse() + return result.reverse() } export function adjustSidePoints(part) { @@ -228,18 +437,9 @@ export function adjustSidePoints(part) { if (points.hips.x < points.waist.x) { points.hips.x = points.waist.x } - // prevent excessive hips narrowing - if (points.hips.x < (points.waist.x + points.seat.x) / 2) { - points.hips.x = (points.waist.x + points.seat.x) / 2 - } - // prevent smaller seat than hips if (points.seat.x < points.hips.x) { points.seat.x = points.hips.x } - // prevent excessive waist narrowing - if (points.waist.x < 2 * points.hips.x - points.seat.x) { - points.waist.x = 2 * points.hips.x - points.seat.x - } // curve points points.waistCp2 = points.waist.shift(90, points.armhole.dy(points.waist) * 0.2) @@ -247,10 +447,6 @@ export function adjustSidePoints(part) { points.hipsCp2 = points.waist.shiftFractionTowards(points.hips, 0.6) } -function getBottomSmoothness(bottom, points) { - return (Math.min(bottom, points.seat.y) - points.armhole.y) * 0.3 -} - export function constructBackHem(part, bonusLength = 0) { const { measurements, options, points, paths, Path, Point, log } = part.shorthand() let centerPoint @@ -299,16 +495,15 @@ export function constructBackHem(part, bonusLength = 0) { hemBottom = points.underbust.y } points.cbHem = new Point(0, hemBottom + extraBackLength) - paths.sideSeam = constructSideSeam( - part, - hemBottom, - getBottomSmoothness(hemBottom, points) - ).addClass('fabric') + paths.sideSeam = constructSideSeam(part, hemBottom).addClass('fabric') - points.midHem = new Point(points.hem.x * 0.66, points.cbHem.y) + points.midHemCp1 = new Point(points.hem.x * 0.66, points.cbHem.y) + points.midHemCp2 = points.hem + .shiftTowards(points.hemCp2, points.hem.x * 0.1) + .rotate(90, points.hem) paths.hem = new Path() .move(points.cbHem) - .curve(points.midHem, points.midHem, points.hem) + .curve(points.midHemCp1, points.midHemCp2, points.hem) .addClass('fabric') } @@ -354,16 +549,14 @@ export function constructFrontHem(part, bonusLength = 0) { hemBottom = points.underbust.y } points.cfHem = new Point(0, hemBottom) - paths.sideSeam = constructSideSeam( - part, - hemBottom, - getBottomSmoothness(hemBottom, points) - ).addClass('fabric') - points.midHem = new Point(points.hem.x * 0.66, points.cfHem.y) - + paths.sideSeam = constructSideSeam(part, hemBottom).addClass('fabric') + points.midHemCp1 = new Point(points.hem.x * 0.66, points.cfHem.y) + points.midHemCp2 = points.hem + .shiftTowards(points.hemCp2, points.hem.x * 0.1) + .rotate(90, points.hem) paths.hem = new Path() .move(points.cfHem) - .curve(points.midHem, points.midHem, points.hem) + .curve(points.midHemCp1, points.midHemCp2, points.hem) .addClass('fabric') } @@ -667,3 +860,5 @@ export function draftKnitBinding(part, length) { y: points.bottomFold.y + sa + 15, }) } + +console.log(findT(0.01) + findT(0.99)) diff --git a/designs/bibi/src/waistband.mjs b/designs/bibi/src/waistband.mjs index 62332826088..774ba4347a3 100644 --- a/designs/bibi/src/waistband.mjs +++ b/designs/bibi/src/waistband.mjs @@ -33,11 +33,13 @@ export const waistband = { menu: 'style.length', }, flare: { - pct: 5, + pct: 0, min: 0, max: 150, menu: (settings, mergedOptions) => - (mergedOptions.length === 'seat' && mergedOptions.lengthBonus > 0) || + (mergedOptions.length === 'waist' && mergedOptions.lengthBonus > 0) || + mergedOptions.length === 'hips' || + mergedOptions.length === 'seat' || mergedOptions.length === 'knee' || mergedOptions.length === 'floor' ? 'style.length' diff --git a/markdown/org/docs/designs/bibi/options/curvatureadjustment/en.md b/markdown/org/docs/designs/bibi/options/curvatureadjustment/en.md new file mode 100644 index 00000000000..e1f7d2592b4 --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/curvatureadjustment/en.md @@ -0,0 +1,10 @@ +--- +title: "Curvature adjustment" +maintainers: + - Jonathan Haas +--- + +Adjust by how much the side seam goes straight up above the hem, by default. + +This option will often not have much effect, if any. Fitting the hips and seat measurements (including ease) has priority +over this option and adjusting these ease settings instead is often a better idea. diff --git a/markdown/org/docs/designs/bibi/options/flare/en.md b/markdown/org/docs/designs/bibi/options/flare/en.md index d747331cfb5..253ae4895f0 100644 --- a/markdown/org/docs/designs/bibi/options/flare/en.md +++ b/markdown/org/docs/designs/bibi/options/flare/en.md @@ -4,7 +4,7 @@ maintainers: - Jonathan Haas --- -If the garment is longer than the seat, this option controls how much it flares out towards the hem. +If the garment is longer than the waist, this option controls how much it flares out towards the hem. In other words, this option controls how wide the bottom hem is around the legs. diff --git a/markdown/org/docs/designs/bibi/options/seatbackadjustment/en.md b/markdown/org/docs/designs/bibi/options/seatbackadjustment/en.md new file mode 100644 index 00000000000..71234a07236 --- /dev/null +++ b/markdown/org/docs/designs/bibi/options/seatbackadjustment/en.md @@ -0,0 +1,10 @@ +--- +title: "Seat back adjustment" +maintainers: + - Jonathan Haas +--- + +Controls the influence of the seat back measurement on the garment width. + +* At 0%, the front and back parts will have the same widths around the seat, equal to half the seat measurement (plus ease). +* At 100%, the back part will have a width equal to the seat back measurement (plus ease) and the front part will cover the remaining seat measurement (plus ease). From e61fee8dc194ed3cff2629980610763d8fabb753 Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Mon, 27 May 2024 13:48:31 +0200 Subject: [PATCH 5/7] change(bibi): Add Bibi changes to changelog.yaml --- config/changelog.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/changelog.yaml b/config/changelog.yaml index 811a68637f0..22e8b00b383 100644 --- a/config/changelog.yaml +++ b/config/changelog.yaml @@ -9,6 +9,10 @@ Unreleased: cathrin: - Allow negative values in backDrop option. Fixes #6563 - Allow negative values for the frontRise options. Fixes #6563 + bibi: + - Changed the algorithm to draft the side seam, so the measurements are followed more precisely + - Reduced default influence of the seat back measurement and added an option to adjust it. + - Added various options for ribbing and knit binding on waistband, armscyes/cuffs and neck hole and included more documentation huey: - The lengthBonus option default was changed from 0% to 15%. Fixes #6596 onyx: From c9ab6ad60aa4740fc6827536b11e6d482909eb1f Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 12 Jun 2024 14:34:44 +0200 Subject: [PATCH 6/7] bibi: fix typo --- markdown/org/docs/designs/bibi/options/usewaistribbing/en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md b/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md index 3b0c1af9e3d..a9019bcf3df 100644 --- a/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md +++ b/markdown/org/docs/designs/bibi/options/usewaistribbing/en.md @@ -5,5 +5,5 @@ maintainers: --- Enable or disable the separate waistband part. -A waistband made form ribbing fabric provides a tighter fit and cleaner finish. +A waistband made from ribbing fabric provides a tighter fit and cleaner finish and is typically used on sweatshirts, crop tops, and bralettes. From 03e214349a9ab25915aff7309aca1d3bb6e7794a Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 12 Jun 2024 16:30:37 +0200 Subject: [PATCH 7/7] bibi: remove logging --- designs/bibi/src/front.mjs | 1 - designs/bibi/src/shared.mjs | 2 -- 2 files changed, 3 deletions(-) diff --git a/designs/bibi/src/front.mjs b/designs/bibi/src/front.mjs index a3f164fa2aa..718dd8a091d 100644 --- a/designs/bibi/src/front.mjs +++ b/designs/bibi/src/front.mjs @@ -145,7 +145,6 @@ function bibiFront({ const dartLength = frontLength - backLength const constructDart = (path, tip, dartLength) => { const length = path.length() - console.log('dart', length, path) dartLength = Math.max(0, Math.min(dartLength, length)) const gatherArea = (store.get('gatherAreaLength') ?? 0) + dartLength diff --git a/designs/bibi/src/shared.mjs b/designs/bibi/src/shared.mjs index a5139308b6c..876a78a918f 100644 --- a/designs/bibi/src/shared.mjs +++ b/designs/bibi/src/shared.mjs @@ -860,5 +860,3 @@ export function draftKnitBinding(part, length) { y: points.bottomFold.y + sa + 15, }) } - -console.log(findT(0.01) + findT(0.99))