1
0
Fork 0

Port Carlton to v3.

This commit is contained in:
Benjamin F 2022-09-04 11:37:23 -07:00
parent 08fe1d4583
commit e8f4903148
20 changed files with 295 additions and 274 deletions

View file

@ -1,176 +0,0 @@
import pkg from '../package.json' assert { type: 'json' }
const { version } = pkg
export default {
version,
name: 'carlton',
design: ['Anneke Caramin', 'Joost De Cock'],
code: 'Joost De Cock',
department: 'coats',
type: 'pattern',
difficulty: 5,
optionGroups: {
fit: [
'acrossBackFactor',
'armholeDepthFactor',
'bicepsEase',
'chestEase',
'cuffEase',
'shoulderEase',
'sleeveBend',
'sleeveLengthBonus',
'waistEase',
'seatEase',
'draftForHighBust',
],
advanced: [
'backNeckCutout',
'frontArmholeDeeper',
'frontOverlap',
'lapelReduction',
'shoulderSlopeReduction',
'sleevecapHeight',
'sleevecapEase',
],
pockets: [
'pocketPlacementHorizontal',
'pocketPlacementVertical',
'pocketWidth',
'pocketHeight',
'pocketRadius',
'pocketFlapRadius',
'chestPocketHeight',
'chestPocketWidth',
'chestPocketPlacement',
'chestPocketAngle',
'innerPocketPlacement',
'innerPocketWidth',
'innerPocketDepth',
'innerPocketWeltHeight',
],
style: [
'beltWidth',
'buttonSpacingHorizontal',
'cuffLength',
'length',
's3Collar',
's3Armhole',
],
collar: ['collarHeight', 'collarSpread', 'collarFlare'],
},
measurements: [
'biceps',
'chest',
'hips',
'hpsToWaistBack',
'waist',
'waistToHips',
'neck',
'shoulderSlope',
'shoulderToElbow',
'shoulderToShoulder',
'shoulderToWrist',
'wrist',
'waistToFloor',
'waistToSeat',
'seat',
],
optionalMeasurements: ['highBust'],
dependencies: {
bentBack: 'bentBase',
bentFront: 'bentBack',
bentTopSleeve: 'bentSleeve',
bentUnderSleeve: 'bentSleeve',
front: 'bentFront',
back: 'bentBack',
tail: ['front', 'back'],
topSleeve: ['bentTopSleeve', 'bentFront'],
underSleeve: ['bentUnderSleeve', 'bentFront'],
belt: 'back',
collarStand: ['front', 'back'],
collar: 'collarStand',
cuffFacing: ['topSleeve', 'underSleeve', 'bentFront'],
pocket: 'front',
pocketFlap: 'front',
pocketLining: 'pocket',
chestPocketWelt: 'front',
chestPocketBag: 'front',
innerPocketWelt: 'front',
innerPocketBag: 'front',
innerPocketTab: 'front',
},
inject: {
bentBack: 'bentBase',
bentFront: 'bentBack',
bentTopSleeve: 'bentSleeve',
bentUnderSleeve: 'bentSleeve',
front: 'bentFront',
back: 'bentBack',
topSleeve: 'bentTopSleeve',
underSleeve: 'bentUnderSleeve',
collar: 'collarStand',
pocketLining: 'pocket',
},
hide: ['bentBase', 'bentBack', 'bentFront', 'bentSleeve', 'bentTopSleeve', 'bentUnderSleeve'],
options: {
// Constants
brianFitSleeve: true,
brianFitCollar: true,
collarFactor: 4.8,
chestShapingMax: 5,
backPleat: 0.048,
lengthBonus: 0,
collarEase: 0.145,
// Options inherited from Bent
acrossBackFactor: { pct: 97, min: 93, max: 100 },
armholeDepthFactor: { pct: 65, min: 50, max: 70 },
bicepsEase: { pct: 20, min: 0, max: 50 },
chestEase: { pct: 10, min: 5, max: 20 },
cuffEase: { pct: 60, min: 30, max: 100 },
shoulderEase: { pct: 0, min: -2, max: 6 },
sleeveBend: { deg: 10, min: 0, max: 20 },
sleevecapHeight: { pct: 45, min: 40, max: 60 },
sleevecapEase: { pct: 1, min: 0, max: 10 },
sleeveLengthBonus: { pct: 7, min: 0, max: 20 },
shoulderSlopeReduction: { pct: 12, min: 0, max: 80 },
backNeckCutout: { pct: 5, min: 2, max: 8 },
frontArmholeDeeper: { pct: 0.5, min: 0, max: 1.5 },
// Carlton options
waistEase: { pct: 14, min: 8, max: 25 },
seatEase: { pct: 14, min: 8, max: 25 },
length: { pct: 69, min: 35, max: 100 },
buttonSpacingHorizontal: { pct: 43.5, min: 15, max: 60 },
frontOverlap: { pct: 1.5, min: 1, max: 2 },
lapelReduction: { pct: 5, min: 0, max: 10 },
pocketPlacementHorizontal: { pct: 11, min: 5, max: 60 },
pocketPlacementVertical: { pct: 6, min: 5, max: 60 },
pocketWidth: { pct: 95, min: 70, max: 120 },
pocketHeight: { pct: 15, min: 0, max: 40 },
pocketRadius: { pct: 20, min: 0, max: 50 },
pocketFlapRadius: { pct: 15, min: 0, max: 50 },
chestPocketHeight: { pct: 60, min: 40, max: 80 },
chestPocketWidth: { pct: 25, min: 15, max: 50 },
chestPocketPlacement: { pct: 55, min: 30, max: 65 },
chestPocketAngle: { deg: 4, min: 0, max: 6 },
innerPocketPlacement: { pct: 53, min: 42, max: 62 },
innerPocketWidth: { pct: 50, min: 45, max: 65 },
innerPocketDepth: { pct: 110, min: 75, max: 140 },
innerPocketWeltHeight: { pct: 3.5, min: 2.5, max: 5 },
beltWidth: { pct: 15, min: 10, max: 20 },
cuffLength: { pct: 15, min: 10, max: 20 },
collarHeight: { pct: 9.6, min: 8, max: 11 },
collarSpread: { deg: 4, min: 2, max: 6 },
collarFlare: { pct: 20, min: 0, max: 40 },
// s3 is short for Shoulder Seam Shift
s3Collar: { pct: 0, min: -100, max: 100 },
s3Armhole: { pct: 0, min: -100, max: 100 },
// draft for high bust
draftForHighBust: { bool: false },
},
}

View file

@ -1,6 +1,7 @@
import { calculateRatios } from './shared'
import { back as bentBack } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs'
export default function (part) {
function draftCarltonBack (part) {
let {
paperless,
sa,
@ -226,3 +227,20 @@ export default function (part) {
return part
}
export const back = {
name: 'carlton.back',
from: bentBack,
hideDependencies: true,
measurements: [
'chest',
'hpsToWaistBack',
],
options: {
backPleat: 0.048,
beltWidth: { pct: 15, min: 10, max: 20, menu: 'style' },
waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
},
draft: draftCarltonBack,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { back } from './back.mjs'
function draftCarltonBelt (part) {
let { paperless, sa, snippets, Snippet, store, complete, points, macro, Point, paths, Path } =
part.shorthand()
@ -82,3 +84,9 @@ export default function (part) {
return part
}
export const belt = {
name: 'carlton.belt',
after: back,
draft: draftCarltonBelt,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonChestPocketBag (part) {
let { units, paperless, sa, store, complete, points, macro, Point, paths, Path } =
part.shorthand()
@ -65,3 +67,9 @@ export default function (part) {
return part
}
export const chestPocketBag = {
name: 'carlton.chestPocketBag',
after: front,
draft: draftCarltonChestPocketBag,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonChestPocketWelt (part) {
let { paperless, sa, store, complete, points, macro, Point, paths, Path } = part.shorthand()
points.topLeft = new Point(0, 0)
@ -45,3 +47,9 @@ export default function (part) {
return part
}
export const chestPocketWelt = {
name: 'carlton.chestPocketWelt',
after: front,
draft: draftCarltonChestPocketWelt,
}

View file

@ -1,10 +1,12 @@
import { collarStand } from './collarstand.mjs'
/**
* This collar is the most difficult part about this pattern
* That's because slash&spread is easy with paper and scissors
* but gets complicated when doing it in code.
*/
export default function (part) {
function draftCarltonCollar (part) {
let { paperless, sa, complete, points, options, macro, paths, Path } = part.shorthand()
// We're going to slash and spread this collar. Slashing first:
@ -243,3 +245,12 @@ export default function (part) {
return part
}
export const collar = {
name: 'carlton.collar',
from: collarStand,
options: {
collarSpread: { deg: 4, min: 2, max: 6, menu: 'collar' },
},
draft: draftCarltonCollar,
}

View file

@ -1,4 +1,7 @@
export default function (part) {
import { front } from './front.mjs'
import { back } from './back.mjs'
function draftCarltonCollarStand (part) {
let { paperless, sa, store, complete, points, measurements, options, macro, Point, paths, Path } =
part.shorthand()
@ -68,3 +71,13 @@ export default function (part) {
return part
}
export const collarStand = {
name: 'carlton.collarStand',
after: [ front, back ],
options: {
collarHeight: { pct: 9.6, min: 8, max: 11, menu: 'collar' },
collarFlare: { pct: 20, min: 0, max: 40, menu: 'collar' },
},
draft: draftCarltonCollarStand,
}

View file

@ -1,4 +1,7 @@
export default function (part) {
import { topSleeve } from './topsleeve.mjs'
import { underSleeve } from './undersleeve.mjs'
function draftCarltonCuffFacing (part) {
let { paperless, sa, store, complete, points, macro, Point, paths, Path } = part.shorthand()
points.topLeft = new Point(0, 0)
@ -75,3 +78,9 @@ export default function (part) {
return part
}
export const cuffFacing = {
name: 'carlton.cuffFacing',
after: [ topSleeve, underSleeve ],
draft: draftCarltonCuffFacing,
}

View file

@ -1,6 +1,7 @@
import { calculateRatios } from './shared'
import { front as bentFront } from '@freesewing/bent'
import { calculateRatios } from './shared.mjs'
export default function (part) {
function draftCarltonFront (part) {
let {
paperless,
sa,
@ -473,3 +474,37 @@ export default function (part) {
return part
}
export const front = {
name: 'carlton.front',
from: bentFront,
hideDependencies: true,
measurements: [
'waist',
'waistToFloor',
'waistToSeat',
],
options: {
chestEase: { pct: 10, min: 5, max: 20, menu: 'fit' },
buttonSpacingHorizontal: { pct: 43.5, min: 15, max: 60, menu: 'style' },
length: { pct: 69, min: 35, max: 100, menu: 'style' },
lapelReduction: { pct: 5, min: 0, max: 10, menu: 'advanced' },
frontOverlap: { pct: 1.5, min: 1, max: 2, menu: 'advanced' },
pocketPlacementHorizontal: { pct: 11, min: 5, max: 60, menu: 'pockets' },
pocketPlacementVertical: { pct: 6, min: 5, max: 60, menu: 'pockets' },
pocketWidth: { pct: 95, min: 70, max: 120, menu: 'pockets' },
pocketHeight: { pct: 15, min: 0, max: 40, menu: 'pockets' },
pocketRadius: { pct: 20, min: 0, max: 50, menu: 'pockets' },
pocketFlapRadius: { pct: 15, min: 0, max: 50, menu: 'pockets' },
chestPocketPlacement: { pct: 55, min: 30, max: 65, menu: 'pockets' },
chestPocketAngle: { deg: 4, min: 0, max: 6, menu: 'pockets' },
chestPocketHeight: { pct: 60, min: 40, max: 80, menu: 'pockets' },
chestPocketWidth: { pct: 25, min: 15, max: 50, menu: 'pockets' },
innerPocketPlacement: { pct: 53, min: 42, max: 62, menu: 'pockets' },
innerPocketWidth: { pct: 50, min: 45, max: 65, menu: 'pockets' },
waistEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
seatEase: { pct: 14, min: 8, max: 25, menu: 'fit' },
innerPocketWeltHeight: { pct: 3.5, min: 2.5, max: 5, menu: 'pockets' },
},
draft: draftCarltonFront,
}

View file

@ -1,83 +1,36 @@
import freesewing from '@freesewing/core'
import plugins from '@freesewing/plugin-bundle'
import plugin from '@freesewing/plugin-bust' // Note: conditional plugin
import Bent from '@freesewing/bent'
import config from '../config'
import { Design } from '@freesewing/core'
import { data } from '../data.mjs'
// Parts
import draftFront from './front'
import draftBack from './back'
import draftTail from './tail'
import draftTopSleeve from './topsleeve'
import draftUnderSleeve from './undersleeve'
import draftBelt from './belt'
import draftCollarStand from './collarstand'
import draftCollar from './collar'
import draftCuffFacing from './cufffacing'
import draftPocket from './pocket'
import draftPocketFlap from './pocketflap'
import draftPocketLining from './pocketlining'
import draftChestPocketWelt from './chestpocketwelt'
import draftChestPocketBag from './chestpocketbag'
import draftInnerPocketWelt from './innerpocketwelt'
import draftInnerPocketBag from './innerpocketbag'
import draftInnerPocketTab from './innerpockettab'
/* Check to see whether we should load the bust plugin
* Only of the `draftForHighBust` options is set
* AND the highBust measurement is available
*/
const condition = (settings = false) =>
settings &&
settings.options &&
settings.options.draftForHighBust &&
settings.measurements.highBust
? true
: false
import { front } from './front.mjs'
import { back } from './back.mjs'
import { tail } from './tail.mjs'
import { topSleeve } from './topsleeve.mjs'
import { underSleeve } from './undersleeve.mjs'
import { belt } from './belt.mjs'
import { collarStand } from './collarstand.mjs'
import { collar } from './collar.mjs'
import { cuffFacing } from './cufffacing.mjs'
import { pocket } from './pocket.mjs'
import { pocketFlap } from './pocketflap.mjs'
import { pocketLining } from './pocketlining.mjs'
import { chestPocketWelt } from './chestpocketwelt.mjs'
import { chestPocketBag } from './chestpocketbag.mjs'
import { innerPocketWelt } from './innerpocketwelt.mjs'
import { innerPocketBag } from './innerpocketbag.mjs'
import { innerPocketTab } from './innerpockettab.mjs'
// Create design
const Carlton = new freesewing.Design(config, plugins, { plugin, condition })
// Attach draft methods from Bent to prototype
Carlton.prototype.draftBentBase = function (part) {
return new Bent(this.settings).draftBase(part)
}
Carlton.prototype.draftBentFront = function (part) {
return new Bent(this.settings).draftFront(part)
}
Carlton.prototype.draftBentBack = function (part) {
return new Bent(this.settings).draftBack(part)
}
Carlton.prototype.draftBentSleeve = function (part) {
return new Bent(this.settings).draftSleeve(part)
}
Carlton.prototype.draftBentTopSleeve = function (part) {
return new Bent(this.settings).draftTopSleeve(part)
}
Carlton.prototype.draftBentUnderSleeve = function (part) {
return new Bent(this.settings).draftUnderSleeve(part)
}
// Attach own draft methods to prototype
Carlton.prototype.draftFront = draftFront
Carlton.prototype.draftBack = draftBack
Carlton.prototype.draftTail = draftTail
Carlton.prototype.draftTopSleeve = draftTopSleeve
Carlton.prototype.draftUnderSleeve = draftUnderSleeve
Carlton.prototype.draftBelt = draftBelt
Carlton.prototype.draftCollarStand = draftCollarStand
Carlton.prototype.draftCollar = draftCollar
Carlton.prototype.draftCuffFacing = draftCuffFacing
Carlton.prototype.draftPocket = draftPocket
Carlton.prototype.draftPocketFlap = draftPocketFlap
Carlton.prototype.draftPocketLining = draftPocketLining
Carlton.prototype.draftChestPocketWelt = draftChestPocketWelt
Carlton.prototype.draftChestPocketBag = draftChestPocketBag
Carlton.prototype.draftInnerPocketWelt = draftInnerPocketWelt
Carlton.prototype.draftInnerPocketBag = draftInnerPocketBag
Carlton.prototype.draftInnerPocketTab = draftInnerPocketTab
const Carlton = new Design({
data,
parts: [ front, back, tail, topSleeve, underSleeve, belt, collarStand,
collar, cuffFacing, pocket, pocketFlap, pocketLining, chestPocketWelt,
chestPocketBag, innerPocketWelt, innerPocketBag, innerPocketTab, ],
})
// Named exports
export { config, Carlton }
// Default export
export default Carlton
export {
front, back, tail, topSleeve, underSleeve, belt, collarStand, collar,
cuffFacing, pocket, pocketFlap, pocketLining, chestPocketWelt,
chestPocketBag, innerPocketWelt, innerPocketBag, innerPocketTab,
Carlton
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonInnerPocketBag (part) {
let { units, paperless, sa, store, complete, points, options, macro, Point, paths, Path } =
part.shorthand()
@ -65,3 +67,12 @@ export default function (part) {
return part
}
export const innerPocketBag = {
name: 'carlton.innerPocketBag',
after: front,
options: {
innerPocketDepth: { pct: 110, min: 75, max: 140, menu: 'pockets' },
},
draft: draftCarltonInnerPocketBag,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonInnerPocketTab (part) {
let { paperless, sa, store, complete, points, macro, Point, paths, Path } = part.shorthand()
points.topLeft = new Point(0, 0)
@ -55,3 +57,9 @@ export default function (part) {
return part
}
export const innerPocketTab = {
name: 'carlton.innerPocketTab',
after: front,
draft: draftCarltonInnerPocketTab,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonInnerPocketWelt (part) {
let { paperless, sa, store, complete, points, macro, Point, paths, Path } = part.shorthand()
points.topLeft = new Point(0, 0)
@ -78,3 +80,9 @@ export default function (part) {
}
return part
}
export const innerPocketWelt = {
name: 'carlton.innerPocketWelt',
after: front,
draft: draftCarltonInnerPocketWelt,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonPocket (part) {
let { paperless, sa, store, complete, points, options, macro, Point, paths, Path } =
part.shorthand()
@ -85,3 +87,9 @@ export default function (part) {
return part
}
export const pocket = {
name: 'carlton.pocket',
after: front,
draft: draftCarltonPocket,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { front } from './front.mjs'
function draftCarltonPocketFlap (part) {
let { paperless, sa, store, complete, points, options, macro, Point, paths, Path } =
part.shorthand()
@ -80,3 +82,9 @@ export default function (part) {
return part
}
export const pocketFlap = {
name: 'carlton.pocketFlap',
after: front,
draft: draftCarltonPocketFlap,
}

View file

@ -1,4 +1,6 @@
export default function (part) {
import { pocket } from './pocket.mjs'
function draftCarltonPocketLining (part) {
let { paperless, sa, store, complete, points, options, macro, Point, paths, Path } =
part.shorthand()
@ -72,3 +74,9 @@ export default function (part) {
return part
}
export const pocketLining = {
name: 'carlton.pocketLining',
from: pocket,
draft: draftCarltonPocketLining,
}

View file

@ -1,7 +1,7 @@
/**
* This calculates a bunch of helper variables and stores them
*/
export const calculateRatios = (part) => {
export function calculateRatios (part) {
let { store, measurements, options } = part.shorthand()
// Calculate different values for reducing from chest to hips via waist

View file

@ -1,4 +1,7 @@
export default function (part) {
import { front } from './front.mjs'
import { back } from './back.mjs'
function draftCarltonTail (part) {
let { units, paperless, sa, store, complete, points, macro, Point, paths, Path } =
part.shorthand()
@ -117,3 +120,9 @@ export default function (part) {
return part
}
export const tail = {
name: 'carlton.tail',
after: [ front, back ],
draft: draftCarltonTail,
}

View file

@ -1,4 +1,7 @@
export default function (part) {
import { topSleeve as bentTopSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent'
function draftCarltonTopSleeve (part) {
let {
paperless,
sa,
@ -138,3 +141,37 @@ export default function (part) {
return part
}
export const topSleeve = {
name: 'carlton.topSleeve',
from: bentTopSleeve,
after: bentFront,
hideDependencies: true,
measurements: [ 'shoulderToWrist' ],
options: {
cuffLength: { pct: 15, min: 10, max: 20, menu: 'style' },
// The remainder of options are for Bent sleeves.
brianFitSleeve: true,
brianFitCollar: true,
collarFactor: 4.8,
chestShapingMax: 5,
lengthBonus: 0,
collarEase: 0.145,
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'fit' },
armholeDepthFactor: { pct: 65, min: 50, max: 70, menu: 'fit' },
bicepsEase: { pct: 20, min: 0, max: 50, menu: 'fit' },
cuffEase: { pct: 60, min: 30, max: 100, menu: 'fit' },
shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
sleeveBend: { deg: 10, min: 0, max: 20, menu: 'fit' },
sleeveLengthBonus: { pct: 7, min: 0, max: 20, menu: 'fit' },
s3Collar: { pct: 0, min: -100, max: 100, menu: 'style' },
s3Armhole: { pct: 0, min: -100, max: 100, menu: 'style' },
draftForHighBust: { bool: false, menu: 'fit' },
backNeckCutout: { pct: 5, min: 2, max: 8, menu: 'advanced' },
frontArmholeDeeper: { pct: 0.5, min: 0, max: 1.5, menu: 'advanced' },
shoulderSlopeReduction: { pct: 12, min: 0, max: 80, menu: 'advanced' },
sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' },
sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' },
},
draft: draftCarltonTopSleeve,
}

View file

@ -1,4 +1,7 @@
export default function (part) {
import { underSleeve as bentUnderSleeve } from '@freesewing/bent'
import { front as bentFront } from '@freesewing/bent'
function draftCarltonUnderSleeve (part) {
let { paperless, sa, store, complete, points, measurements, options, macro, Point, paths, Path } =
part.shorthand()
@ -105,3 +108,37 @@ export default function (part) {
return part
}
export const underSleeve = {
name: 'carlton.underSleeve',
from: bentUnderSleeve,
after: bentFront,
hideDependencies: true,
measurements: [ 'shoulderToWrist' ],
options: {
cuffLength: { pct: 15, min: 10, max: 20, menu: 'style' },
// The remainder of options are for Bent sleeves.
brianFitSleeve: true,
brianFitCollar: true,
collarFactor: 4.8,
chestShapingMax: 5,
lengthBonus: 0,
collarEase: 0.145,
acrossBackFactor: { pct: 97, min: 93, max: 100, menu: 'fit' },
armholeDepthFactor: { pct: 65, min: 50, max: 70, menu: 'fit' },
bicepsEase: { pct: 20, min: 0, max: 50, menu: 'fit' },
cuffEase: { pct: 60, min: 30, max: 100, menu: 'fit' },
shoulderEase: { pct: 0, min: -2, max: 6, menu: 'fit' },
sleeveBend: { deg: 10, min: 0, max: 20, menu: 'fit' },
sleeveLengthBonus: { pct: 7, min: 0, max: 20, menu: 'fit' },
s3Collar: { pct: 0, min: -100, max: 100, menu: 'style' },
s3Armhole: { pct: 0, min: -100, max: 100, menu: 'style' },
draftForHighBust: { bool: false, menu: 'fit' },
backNeckCutout: { pct: 5, min: 2, max: 8, menu: 'advanced' },
frontArmholeDeeper: { pct: 0.5, min: 0, max: 1.5, menu: 'advanced' },
shoulderSlopeReduction: { pct: 12, min: 0, max: 80, menu: 'advanced' },
sleevecapHeight: { pct: 45, min: 40, max: 60, menu: 'advanced' },
sleevecapEase: { pct: 1, min: 0, max: 10, menu: 'advanced' },
},
draft: draftCarltonUnderSleeve,
}