diff --git a/font-src/glyphs/letter/latin/lower-a.ptl b/font-src/glyphs/letter/latin/lower-a.ptl index 60e78ffdd..19e71ad37 100644 --- a/font-src/glyphs/letter/latin/lower-a.ptl +++ b/font-src/glyphs/letter/latin/lower-a.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix linreg fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif] from"../../../support/gr.mjs" glyph-module @@ -179,16 +179,16 @@ glyph-block Letter-Latin-Lower-A : begin corner (RightSB - Stroke * HVContrast) 0 corner (RightSB - Stroke * HVContrast) (0 + Stroke / 2) - define SingleStoreyConfig : object - singleStoreySerifless { SingleStorey.FullBarBody SingleStorey.SeriflessBar } - singleStoreySerifed { SingleStorey.FullBarBody SingleStorey.SerifedBar } - singleStoreyTailed { SingleStorey.FullBarBody SingleStorey.TailedBar } - singleStoreyEarlessCornerSerifless { SingleStorey.EarlessCornerBody SingleStorey.SeriflessBar } - singleStoreyEarlessCornerSerifed { SingleStorey.EarlessCornerBody SingleStorey.SerifedBar } - singleStoreyEarlessCornerTailed { SingleStorey.EarlessCornerBody SingleStorey.TailedBar } - singleStoreyEarlessRoundedSerifless { SingleStorey.EarlessRoundedBody SingleStorey.SeriflessBar } - singleStoreyEarlessRoundedSerifed { SingleStorey.EarlessRoundedBody SingleStorey.SerifedBar } - singleStoreyEarlessRoundedTailed { SingleStorey.EarlessRoundedBody SingleStorey.TailedBar } + define SingleStoreyConfig : SuffixCfg.weave + object # body + singleStorey SingleStorey.FullBarBody + singleStoreyEarlessCorner SingleStorey.EarlessCornerBody + singleStoreyEarlessRounded SingleStorey.EarlessRoundedBody + + object # bar + serifless SingleStorey.SeriflessBar + serifed SingleStorey.SerifedBar + tailed SingleStorey.TailedBar foreach { suffix { body bar } } [Object.entries SingleStoreyConfig] : do create-glyph "a.\(suffix)" : glyph-proc diff --git a/font-src/glyphs/letter/latin/lower-d.ptl b/font-src/glyphs/letter/latin/lower-d.ptl index bd5510b48..a1504f23d 100644 --- a/font-src/glyphs/letter/latin/lower-d.ptl +++ b/font-src/glyphs/letter/latin/lower-d.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix clamp fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif] from"../../../support/gr.mjs" glyph-module @@ -71,25 +71,22 @@ glyph-block Letter-Latin-Lower-D : begin define [BaseSerif df yTop] : tagged 'serifRB' HSerif.rb df.rightSB 0 SideJut - define DConfig : object - toothedSerifless { ToothedBody null null } - toothedTopSerifed { ToothedBody TopSerif null } - toothedSerifed { ToothedBody TopSerif BaseSerif } - toothedBottomSerifed { ToothedBody null BaseSerif } - tailedSerifless { TailedBody null null } - tailedSerifed { TailedBody TopSerif null } - toothlessCornerSerifless { ToothlessCornerBody null null } - toothlessCornerSerifed { ToothlessCornerBody TopSerif null } - toothlessCornerSeriflessHBB { ToothlessCornerHBBBody null null } - toothlessCornerSerifedHBB { ToothlessCornerHBBBody TopSerif null } - toothlessRoundedSerifless { ToothlessRoundedBody null null } - toothlessRoundedSerifed { ToothlessRoundedBody TopSerif null } - toothlessRoundedSeriflessHBB { ToothlessRoundedHBBBody null null } - toothlessRoundedSerifedHBB { ToothlessRoundedHBBBody TopSerif null } - toothlessRoundedBottomSerifed { ToothlessRoundedHBBBody null BaseSerif } - toothlessRoundedBilateralSerifed{ ToothlessRoundedHBBBody TopSerif BaseSerif } + define DConfig : SuffixCfg.weave + object # body + toothed ToothedBody + toothlessCorner ToothlessCornerBody + toothlessCornerHBB ToothlessCornerHBBBody + toothlessRounded ToothlessRoundedBody + toothlessRoundedHBB ToothlessRoundedHBBBody + tailed TailedBody - foreach { suffix { Body topSerif bottomSerif } } [Object.entries DConfig] : do + function [body] : object # serifs + serifless { null null } + topSerifed { TopSerif null } + bottomSerifed { null [if (body === 'toothed') BaseSerif null] } + serifed { TopSerif [if (body === 'toothed') BaseSerif null] } + + foreach { suffix { Body {topSerif bottomSerif} } } [Object.entries DConfig] : do local yOverlay : mix XH (Ascender - [if topSerif Stroke 0]) 0.5 create-glyph "d.\(suffix)" : glyph-proc diff --git a/font-src/glyphs/letter/latin/lower-f.ptl b/font-src/glyphs/letter/latin/lower-f.ptl index e2eccfc80..f8ad9bb39 100644 --- a/font-src/glyphs/letter/latin/lower-f.ptl +++ b/font-src/glyphs/letter/latin/lower-f.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif] from"../../../support/gr.mjs" glyph-module @@ -135,47 +135,24 @@ glyph-block Letter-Latin-Lower-F : begin define dfNarrowF : DivFrame para.diversityF define pNarrowSide : mix 1 para.diversityF 1.5 - define SmallFConfig : object - 'serifless' { { StandardSmallFShape [DivFrame 1] } { 0.95 fbar CH-NONE } 'b' } - 'serifed' { { StandardSmallFShape [DivFrame 1] } { 0.95 fbar CH-SERIF } 'b' } - 'extended' { { StandardSmallFShape [DivFrame 1] } { 0.95 fbar CH-EXTENSION } 'if' } - 'tailed' { { StandardSmallFShape [DivFrame 1] } { 1 fbar CH-HOOK } 'if' } - 'diagonalTailed' { { StandardSmallFShape [DivFrame 1] } { 1 fbar CH-DIAGONAL-HOOK } 'if' } - 'seriflessCrossbarAtXHeight' { { StandardSmallFShape [DivFrame 1] } { 0.95 XH CH-NONE } 'b' } - 'serifedCrossbarAtXHeight' { { StandardSmallFShape [DivFrame 1] } { 0.95 XH CH-SERIF } 'b' } - 'extendedCrossbarAtXHeight' { { StandardSmallFShape [DivFrame 1] } { 0.95 XH CH-EXTENSION } 'if' } - 'tailedCrossbarAtXHeight' { { StandardSmallFShape [DivFrame 1] } { 1 XH CH-HOOK } 'if' } - 'diagonalTailedCrossbarAtXHeight' { { StandardSmallFShape [DivFrame 1] } { 1 XH CH-DIAGONAL-HOOK } 'if' } - 'flatHook' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide fbar CH-NONE } 'b' } - 'flatHookSerifed' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide fbar CH-SERIF } 'b' } - 'flatHookExtended' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide fbar CH-EXTENSION } 'if' } - 'flatHookTailed' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide fbar CH-HOOK } 'if' } - 'flatHookDiagonalTailed' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide fbar CH-DIAGONAL-HOOK } 'if' } - 'flatHookCrossbarAtXHeight' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide XH CH-NONE } 'b' } - 'flatHookSerifedCrossbarAtXHeight' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide XH CH-SERIF } 'b' } - 'flatHookExtendedCrossbarAtXHeight' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide XH CH-EXTENSION } 'if' } - 'flatHookTailedCrossbarAtXHeight' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide XH CH-HOOK } 'if' } - 'flatHookDiagonalTailedCrossbarAtXHeight' { { [NarrowFShape 0] dfNarrowF } { pNarrowSide XH CH-DIAGONAL-HOOK } 'if' } + define SmallFConfig : SuffixCfg.weave + object # body + "" { StandardSmallFShape [DivFrame 1] } + flatHook { [NarrowFShape 0] dfNarrowF } + flatHookCLC1 { [NarrowFShape 1] dfNarrowF } + flatHookCLC2 { [NarrowFShape 2] dfNarrowF } + flatHookCLC3 { [NarrowFShape 3] dfNarrowF } + function [body] : object # hooks + serifless { [if body pNarrowSide 0.95] CH-NONE 'b' } + serifed { [if body pNarrowSide 0.95] CH-SERIF 'b' } + extended { [if body pNarrowSide 0.95] CH-EXTENSION 'if' } + tailed { [if body pNarrowSide 1] CH-HOOK 'if' } + diagonalTailed { [if body pNarrowSide 1] CH-DIAGONAL-HOOK 'if' } + object # crossbar + "" fbar + crossbarAtXHeight XH - 'flatHookCLC1' { { [NarrowFShape 1] dfNarrowF } { pNarrowSide XH CH-NONE } 'b' } - 'flatHookSerifedCLC1' { { [NarrowFShape 1] dfNarrowF } { pNarrowSide XH CH-SERIF } 'b' } - 'flatHookExtendedCLC1' { { [NarrowFShape 1] dfNarrowF } { pNarrowSide XH CH-EXTENSION } 'if' } - 'flatHookTailedCLC1' { { [NarrowFShape 1] dfNarrowF } { pNarrowSide XH CH-HOOK } 'if' } - 'flatHookDiagonalTailedCLC1' { { [NarrowFShape 1] dfNarrowF } { pNarrowSide XH CH-DIAGONAL-HOOK } 'if' } - - 'flatHookCLC2' { { [NarrowFShape 2] dfNarrowF } { pNarrowSide fbar CH-NONE } 'b' } - 'flatHookSerifedCLC2' { { [NarrowFShape 2] dfNarrowF } { pNarrowSide fbar CH-SERIF } 'b' } - 'flatHookExtendedCLC2' { { [NarrowFShape 2] dfNarrowF } { pNarrowSide fbar CH-EXTENSION } 'if' } - 'flatHookTailedCLC2' { { [NarrowFShape 2] dfNarrowF } { pNarrowSide fbar CH-HOOK } 'if' } - 'flatHookDiagonalTailedCLC2' { { [NarrowFShape 2] dfNarrowF } { pNarrowSide fbar CH-DIAGONAL-HOOK } 'if' } - - 'flatHookCLC3' { { [NarrowFShape 3] dfNarrowF } { pNarrowSide fbar CH-NONE } 'b' } - 'flatHookSerifedCLC3' { { [NarrowFShape 3] dfNarrowF } { pNarrowSide fbar CH-SERIF } 'b' } - 'flatHookExtendedCLC3' { { [NarrowFShape 3] dfNarrowF } { pNarrowSide fbar CH-EXTENSION } 'if' } - 'flatHookTailedCLC3' { { [NarrowFShape 3] dfNarrowF } { pNarrowSide fbar CH-HOOK } 'if' } - 'flatHookDiagonalTailedCLC3' { { [NarrowFShape 3] dfNarrowF } { pNarrowSide fbar CH-DIAGONAL-HOOK } 'if' } - - foreach { suffix {{Body df} {pBar yBar ch} mk}} [Object.entries SmallFConfig] : do + foreach { suffix {{Body df} {pBar ch mk} yBar}} [Object.entries SmallFConfig] : do create-glyph "f.\(suffix)" : glyph-proc set-width df.width include : df.markSet.(mk) diff --git a/font-src/glyphs/letter/latin/lower-g.ptl b/font-src/glyphs/letter/latin/lower-g.ptl index cb5803004..11a0e9fc3 100644 --- a/font-src/glyphs/letter/latin/lower-g.ptl +++ b/font-src/glyphs/letter/latin/lower-g.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif] from"../../../support/gr.mjs" glyph-module @@ -11,6 +11,14 @@ glyph-block Letter-Latin-Lower-G : begin glyph-block-import Letter-Shared-Shapes : OBarLeft OBarRight DToothlessRise DMBlend glyph-block-import Letter-Shared-Shapes : FlatHookDepth PalatalHook VerticalHook + define [OverlayW bw] : glyph-proc + define l : mix 0 SB 0.3 + define r : mix Width RightSB 0.3 + include : HBar.m l r currentGlyph.baseAnchors.overlay.y bw + + # overlay bar width for double-storey g + define obwDoubleStorey : Math.min [AdviceStroke 5] (0.5 / 3 * (CAP - Stroke * 4)) + create-glyph 'g.doubleStorey' : glyph-proc include : MarkSet.p local obot : XH * DesignParameters.gBarPos - O - Stroke * 0.4 @@ -42,6 +50,8 @@ glyph-block Letter-Latin-Lower-G : begin set-base-anchor 'overlay' Middle [mix (Descender + O) groundy 0.5] + create-forked-glyph 'gBar.doubleStorey' : OverlayW obwDoubleStorey + create-glyph 'g.openDoubleStorey' : glyph-proc include : MarkSet.p local obot : XH * DesignParameters.gBarPos - O - Stroke * 0.4 @@ -69,6 +79,8 @@ glyph-block Letter-Latin-Lower-G : begin set-base-anchor 'overlay' Middle [mix (Descender + O) groundy 0.5] + create-forked-glyph 'gBar.openDoubleStorey' : OverlayW obwDoubleStorey + define SingleStorey : namespace export : define [RoundHookT sink df yTop offset sw] : sink widths.rhs sw @@ -116,21 +128,19 @@ glyph-block Letter-Latin-Lower-G : begin sw -- df.mvs include : FlipAround df.middle (top / 2) - define SingleStoreyConfig : object - singleStoreySerifless { SingleStorey.SeriflessBody SingleStorey.RoundHook 0 } - singleStoreySerifed { SingleStorey.SerifedBody SingleStorey.RoundHook 0 } - singleStoreyEarlessCorner { SingleStorey.EarlessCornerBody SingleStorey.RoundHook DToothlessRise } - singleStoreyEarlessCornerHTB { SingleStorey.EarlessCornerBody SingleStorey.RoundHook 0 } - singleStoreyEarlessRounded { SingleStorey.EarlessRoundedBody SingleStorey.RoundHook SmallArchDepthB } - singleStoreyEarlessRoundedHTB { SingleStorey.EarlessRoundedBody SingleStorey.RoundHook 0 } - singleStoreyFlatHookSerifless { SingleStorey.SeriflessBody SingleStorey.FlatHook 0 } - singleStoreyFlatHookSerifed { SingleStorey.SerifedBody SingleStorey.FlatHook 0 } - singleStoreyEarlessCornerFlatHook { SingleStorey.EarlessCornerBody SingleStorey.FlatHook DToothlessRise } - singleStoreyEarlessCornerFlatHookHTB { SingleStorey.EarlessCornerBody SingleStorey.FlatHook 0 } - singleStoreyEarlessRoundedFlatHook { SingleStorey.EarlessRoundedBody SingleStorey.FlatHook SmallArchDepthB } - singleStoreyEarlessRoundedFlatHookHTB { SingleStorey.EarlessRoundedBody SingleStorey.FlatHook 0 } + define SingleStoreyConfig : SuffixCfg.weave + object # hook + singleStorey SingleStorey.RoundHook + singleStoreyFlatHook SingleStorey.FlatHook + object # ear/serif + serifless { SingleStorey.SeriflessBody 0 } + serifed { SingleStorey.SerifedBody 0 } + earlessCorner { SingleStorey.EarlessCornerBody DToothlessRise } + earlessCornerHTB { SingleStorey.EarlessCornerBody 0 } + earlessRounded { SingleStorey.EarlessRoundedBody SmallArchDepthB } + earlessRoundedHTB { SingleStorey.EarlessRoundedBody 0 } - foreach { suffix { bodyShape hookShape hookStart } } [Object.entries SingleStoreyConfig] : do + foreach { suffix { hookShape {bodyShape hookStart} } } [Object.entries SingleStoreyConfig] : do create-glyph "g.\(suffix)" : glyph-proc include : MarkSet.p set-base-anchor 'overlay' Middle (XH / 2) @@ -158,17 +168,20 @@ glyph-block Letter-Latin-Lower-G : begin refSw -- dfSub.mvs maskOut -- [intersection [MaskBelow 0] [MaskLeft dfSub.rightSB]] + create-glyph "gBar.\(suffix)" : glyph-proc + include [refer-glyph "g.\(suffix)"] AS_BASE ALSO_METRICS + include : OverlayW [AdviceStroke2 2 4 XH] + + select-variant 'g' 'g' link-reduced-variant 'g/sansSerif' 'g' MathSansSerif turned 'turng' 0x1D77 'g' Middle [mix Descender XH 0.5] + select-variant "gBar" 0x1E5 (follow -- 'g') select-variant 'gScript/hookTopBase' null (shapeFrom -- 'g') - select-variant 'gScript' 0x261 (shapeFrom -- 'g') - follow -- [if SLAB 'gScript/slabSerif' 'gScript/sansSerif'] - select-variant 'GScript' 0xA7AC - follow -- [if SLAB 'gScript/slabSerif' 'gScript/sansSerif'] - select-variant 'gPalatalHook' 0x1D83 - follow -- [if SLAB 'gScript/slabSerif' 'gScript/sansSerif'] + select-variant 'gScript' 0x261 (shapeFrom -- 'g') (follow -- 'gScript') + select-variant 'GScript' 0xA7AC (follow -- 'gScript') + select-variant 'gPalatalHook' 0x1D83 (follow -- 'gScript') alias 'cyrl/de.SRB' null 'gScript' @@ -192,25 +205,3 @@ glyph-block Letter-Latin-Lower-G : begin include : intersection VBar.r (RightSB - BBD) Descender XH BBS SingleStorey.RoundHookT spiro-outline [DivFrame 1] XH 1 BBS - - do - define l : mix 0 SB 0.3 - define r : mix Width RightSB 0.3 - define bwDoubleStorey : Math.min [AdviceStroke 5] (0.5 / 3 * (CAP - Stroke * 4)) - define bwSingleStorey : AdviceStroke2 2 4 XH - define [derive suffix bw] : create-glyph "gbar.\(suffix)" : glyph-proc - include [refer-glyph "g.\(suffix)"] AS_BASE - include : HBar.m l r [query-glyph "g.\(suffix)"].baseAnchors.overlay.y bw - - derive 'doubleStorey' bwDoubleStorey - derive 'openDoubleStorey' bwDoubleStorey - derive 'singleStoreySerifless' bwSingleStorey - derive 'singleStoreySerifed' bwSingleStorey - derive 'singleStoreyEarlessCorner' bwSingleStorey - derive 'singleStoreyEarlessRounded' bwSingleStorey - derive 'singleStoreyFlatHookSerifless' bwSingleStorey - derive 'singleStoreyFlatHookSerifed' bwSingleStorey - derive 'singleStoreyEarlessCornerFlatHook' bwSingleStorey - derive 'singleStoreyEarlessRoundedFlatHook' bwSingleStorey - - select-variant "gbar" 0x1E5 (follow -- 'g') \ No newline at end of file diff --git a/font-src/glyphs/letter/latin/lower-h.ptl b/font-src/glyphs/letter/latin/lower-h.ptl index fdb7fc72b..c220ae97c 100644 --- a/font-src/glyphs/letter/latin/lower-h.ptl +++ b/font-src/glyphs/letter/latin/lower-h.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif] from"../../../support/gr.mjs" glyph-module @@ -44,18 +44,17 @@ glyph-block Letter-Latin-Lower-H : begin corner (SB + HalfStroke * HVContrast) yOverlay corner xOverlayEnd yOverlay - define HConfig : object - straightSerifless { 0 false no-shape } - tailedSerifless { 1 false no-shape } - straightMotionSerifed { 0 true SmallHMotionSerifs } - tailedMotionSerifed { 1 true SmallHMotionSerifs } - straightTopLeftSerifed { 0 true SmallHTopLeftSerifs } - straightLeftSerifed { 0 true SmallHSerifs } - tailedLeftSerifed { 1 true SmallHSerifs } - straightSerifed { 0 true SmallHSerifs } - tailedSerifed { 1 true SmallHSerifs } + define HConfig : SuffixCfg.weave + object # tail + straight false + tailed true + object # serifs + serifless { false no-shape } + serifed { true SmallHSerifs } + motionSerifed { true SmallHMotionSerifs } + topLeftSerifed { true SmallHTopLeftSerifs } - foreach { suffix { fTailed fHasTopSerif Serifs } } [Object.entries HConfig] : do + foreach { suffix { fTailed {fHasTopSerif Serifs} } } [Object.entries HConfig] : do create-glyph "h.\(suffix)" : glyph-proc include : MarkSet.b include : VBar.l SB 0 Ascender diff --git a/font-src/glyphs/letter/latin/lower-m.ptl b/font-src/glyphs/letter/latin/lower-m.ptl index 9d394b3c5..a1672e106 100644 --- a/font-src/glyphs/letter/latin/lower-m.ptl +++ b/font-src/glyphs/letter/latin/lower-m.ptl @@ -186,7 +186,7 @@ glyph-block Letter-Latin-Lower-M : begin "topLeftSerifed" { LtSerifs } "topLeftAndBottomRightSerifed" { LtRbSerifs } - foreach { suffix { {Body earless} {tailed} {shortLeg} {Serifs} } } [pairs-of SmallMConfig] : do + foreach { suffix { {Body earless} {shortLeg} {tailed} {Serifs} } } [pairs-of SmallMConfig] : do define [mShapeBody df height] : glyph-proc include : Body height 0 [if shortLeg [SmallMShortLegHeight height df] 0] [if tailed ([SmallMSmoothHeight height df] + O) 0] df if tailed : include : RightwardTailedBar df.rightSB 0 [SmallMSmoothHeight height df] (sw -- df.mvs) diff --git a/font-src/glyphs/letter/latin/lower-n.ptl b/font-src/glyphs/letter/latin/lower-n.ptl index 870a6cab6..293988b4e 100644 --- a/font-src/glyphs/letter/latin/lower-n.ptl +++ b/font-src/glyphs/letter/latin/lower-n.ptl @@ -1,6 +1,6 @@ $$include '../../../meta/macros.ptl' -import [mix linreg clamp fallback] from"../../../support/utils.mjs" +import [mix clamp fallback SuffixCfg] from"../../../support/utils.mjs" import [Dotless CvDecompose MathSansSerif Joining] from"../../../support/gr.mjs" glyph-module @@ -65,35 +65,28 @@ glyph-block Letter-Latin-Lower-N : begin include : RightwardTailedBar right yBot yBR sw include : AdjustTrailingAnchor - define NConfig : object - 'straightSerifless' { EaredBody 0 nothing nothing nothing } - 'straightMotionSerifed' { EaredBody 0 NTopLeftSerif nothing NBottomRightSerifItalic } - 'straightTopLeftSerifed' { EaredBody 0 NTopLeftSerif nothing nothing } - 'straightSerifed' { EaredBody 0 NTopLeftSerif NBottomLeftSerif NBottomRightSerifUpright } + define NConfig : SuffixCfg.weave + object # body + "" EaredBody + earlessCorner EarlessCornerBody + earlessRounded EarlessRoundedBody + earlessCornerHTB EarlessCornerBody + earlessRoundedHTB EarlessRoundedBody + object # terminal + straight 0 + tailed 1 + function [body tail] : object # serifs + serifless { nothing nothing nothing } + topLeftSerifed { NTopLeftSerif nothing nothing } + motionSerifed { NTopLeftSerif nothing [if (tail != 'tailed') NBottomRightSerifItalic] } + serifed : list + match body + ([Just "earlessCorner"] || [Just "earlessRounded"]) nothing + ([Just "earlessCornerHTB"] || [Just "earlessRoundedHTB"]) NHTB + begin NBottomLeftSerif + if (tail != 'tailed') NBottomRightSerifUpright - 'tailedSerifless' { EaredBody 1 nothing nothing nothing } - 'tailedMotionSerifed' { EaredBody 1 NTopLeftSerif nothing nothing } - 'tailedSerifed' { EaredBody 1 NTopLeftSerif NBottomLeftSerif nothing } - - 'earlessCornerStraightSerifless' { EarlessCornerBody 0 nothing nothing nothing } - 'earlessCornerStraightSerifed' { EarlessCornerBody 0 nothing NBottomLeftSerif NBottomRightSerifUpright } - 'earlessCornerTailedSerifless' { EarlessCornerBody 1 nothing nothing nothing } - 'earlessCornerTailedSerifed' { EarlessCornerBody 1 nothing NBottomLeftSerif nothing } - 'earlessRoundedStraightSerifless' { EarlessRoundedBody 0 nothing nothing nothing } - 'earlessRoundedStraightSerifed' { EarlessRoundedBody 0 nothing NBottomLeftSerif NBottomRightSerifUpright } - 'earlessRoundedTailedSerifless' { EarlessRoundedBody 1 nothing nothing nothing } - 'earlessRoundedTailedSerifed' { EarlessRoundedBody 1 nothing NBottomLeftSerif nothing } - - 'earlessCornerStraightHTBSerifless' { EarlessCornerBody 0 NHTB nothing nothing } - 'earlessCornerStraightHTBSerifed' { EarlessCornerBody 0 NHTB NBottomLeftSerif NBottomRightSerifUpright } - 'earlessCornerTailedHTBSerifless' { EarlessCornerBody 1 NHTB nothing nothing } - 'earlessCornerTailedHTBSerifed' { EarlessCornerBody 1 NHTB NBottomLeftSerif nothing } - 'earlessRoundedStraightHTBSerifless' { EarlessRoundedBody 0 NHTB nothing nothing } - 'earlessRoundedStraightHTBSerifed' { EarlessRoundedBody 0 NHTB NBottomLeftSerif NBottomRightSerifUpright } - 'earlessRoundedTailedHTBSerifless' { EarlessRoundedBody 1 NHTB nothing nothing } - 'earlessRoundedTailedHTBSerifed' { EarlessRoundedBody 1 NHTB NBottomLeftSerif nothing } - - foreach { suffix { Body tailed sLT sLB sRB } } [Object.entries NConfig] : do + foreach { suffix { Body tailed {sLT sLB sRB} } } [Object.entries NConfig] : do create-glyph "n.\(suffix)" : glyph-proc include : MarkSet.e set-base-anchor 'trailing' RightSB 0 diff --git a/font-src/support/variant-data.mjs b/font-src/support/variant-data.mjs index 36c370262..57b39dc3b 100644 --- a/font-src/support/variant-data.mjs +++ b/font-src/support/variant-data.mjs @@ -281,19 +281,26 @@ class VbStageAlternative { tryAccept(globalState, localState) { // Reject if disable conditions match - if (this.shouldReject(localState)) return null; + if (this.evalCondition(this.disableIf, localState)) return null; // Accept this alternative. const ans = localState.clone(); ans.stage = this.next; ans.assignments.set(this.stage, this.key); if (this.stage === globalState.entry) ans.rankGroup = this.rank; - if (this.keyAffix) ans.addKeyAffix(this.mode, this.keyAffix); - if (this.descriptionJoiner && this.descriptionAffix) - ans.addDescription(this.mode, this.descriptionJoiner, this.descriptionAffix); - if (this.selectorAffix) + + if (this.keyAffix) ans.addKeyAffix(this.mode, this.evalValue(this.keyAffix, localState)); + if (this.descriptionJoiner && this.descriptionAffix) { + ans.addDescription( + this.mode, + this.evalValue(this.descriptionJoiner, localState), + this.evalValue(this.descriptionAffix, localState) + ); + } + if (this.selectorAffix) { for (const [selector, suffix] of Object.entries(this.selectorAffix)) - ans.addSelectorAffix(this.mode, selector, suffix); + ans.addSelectorAffix(this.mode, selector, this.evalValue(suffix, localState)); + } if (!this.next || this.next === "END") { ans.rank = ++globalState.rank; @@ -304,10 +311,22 @@ class VbStageAlternative { } } - shouldReject(localState) { - if (!this.disableIf) return false; + evalValue(expr, localState) { + if (typeof expr === "string") return expr; + if (expr.if) { + const condition = this.evalCondition(expr.if, localState); + if (condition) { + return this.evalCondition(expr.then, localState); + } else { + return this.evalCondition(expr.else, localState); + } + } + } - for (const branch of this.disableIf) { + evalCondition(expr, localState) { + if (!expr) return false; + + for (const branch of expr) { let statementMatches = true; for (let [k, v] of Object.entries(branch)) { v = v.trim(); diff --git a/params/variants.toml b/params/variants.toml index b459299f3..87276e0cd 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -1416,192 +1416,163 @@ selectorAffix."ZDesc/reduced" = "" sampler = "a" tag = "cv26" -[prime.a.variants.double-storey-serifless] +[prime.a.variants-buildup] +entry = "storey" +descriptionLeader = "`a`" + +[prime.a.variants-buildup.stages.storey.double-storey] rank = 1 -description = "Double-storey `a` without serifs" -selector.a = "doubleStoreySerifless" -selector."a/sansSerif" = "doubleStoreySerifless" -selector."a/rtailBase" = "doubleStoreySerifless" -selector."a/turnABase" = "doubleStoreySerifless" -selector.scripta = "singleStoreySerifless" +next = "terminal" +descriptionAffix = "double-storey body" +selectorAffix.a = "doubleStorey" +selectorAffix."a/sansSerif" = "doubleStorey" +selectorAffix."a/rtailBase" = "doubleStorey" +selectorAffix."a/turnABase" = "doubleStorey" +selectorAffix.scripta = "singleStorey" -[prime.a.variants.double-storey-tailed] +[prime.a.variants-buildup.stages.storey.single-storey] rank = 2 -description = "Double-storey `a` with curly tail" -selector.a = "doubleStoreyTailed" -selector."a/sansSerif" = "doubleStoreyTailed" -selector."a/rtailBase" = "doubleStoreySerifless" -selector."a/turnABase" = "doubleStoreyTailed" -selector.scripta = "singleStoreyTailed" +next = "ear" +descriptionAffix = "single-storey body" +selectorAffix.a = "singleStorey" +selectorAffix."a/sansSerif" = "singleStorey" +selectorAffix."a/rtailBase" = "singleStorey" +selectorAffix."a/turnABase" = "doubleStorey" +selectorAffix.scripta = "singleStorey" -[prime.a.variants.double-storey-toothless-corner] +[prime.a.variants-buildup.stages.ear."*"] +next = "terminal" + +[prime.a.variants-buildup.stages.ear.eared] +rank = 1 +keyAffix = "" +selectorAffix.a = "" +selectorAffix."a/sansSerif" = "" +selectorAffix."a/rtailBase" = "" +selectorAffix."a/turnABase" = "" +selectorAffix.scripta = "" + +[prime.a.variants-buildup.stages.ear.earless-corner] +rank = 2 +descriptionAffix = "earless (cornered top-right)" +selectorAffix.a = "earlessCorner" +selectorAffix."a/sansSerif" = "earlessCorner" +selectorAffix."a/rtailBase" = "earlessCorner" +selectorAffix."a/turnABase" = "" +selectorAffix.scripta = "" + +[prime.a.variants-buildup.stages.ear.earless-rounded] rank = 3 -description = "Toothless (cornered bottom-right) double-storey `a`" -selector.a = "doubleStoreyToothlessCorner" -selector."a/sansSerif" = "doubleStoreyToothlessCorner" -selector."a/rtailBase" = "doubleStoreySerifless" -selector."a/turnABase" = "doubleStoreyToothlessCorner" -selector.scripta = "singleStoreySerifless" +descriptionAffix = "earless (rounded top-right)" +selectorAffix.a = "earlessRounded" +selectorAffix."a/sansSerif" = "earlessRounded" +selectorAffix."a/rtailBase" = "earlessRounded" +selectorAffix."a/turnABase" = "" +selectorAffix.scripta = "" -[prime.a.variants.double-storey-toothless-rounded] +[prime.a.variants-buildup.stages.terminal.serifless] +rank = 1 +descriptionAffix = "serif at terminal" +descriptionJoiner = "without" +selectorAffix.a = "serifless" +selectorAffix."a/sansSerif" = "serifless" +selectorAffix."a/rtailBase" = "serifless" +selectorAffix."a/turnABase" = "serifless" +selectorAffix.scripta = "serifless" + +[prime.a.variants-buildup.stages.terminal.tailed] +rank = 2 +descriptionAffix = "curly tail" +selectorAffix.a = "tailed" +selectorAffix."a/sansSerif" = "tailed" +selectorAffix."a/rtailBase" = "serifless" +selectorAffix."a/turnABase" = "tailed" +selectorAffix.scripta = "tailed" + +[prime.a.variants-buildup.stages.terminal.toothless-corner] +rank = 3 +disableIf = [{ storey = "single-storey" }] +descriptionAffix = "toothless (cornered bottom-right)" +selectorAffix.a = "toothlessCorner" +selectorAffix."a/sansSerif" = "toothlessCorner" +selectorAffix."a/rtailBase" = "serifless" +selectorAffix."a/turnABase" = "toothlessCorner" +selectorAffix.scripta = "serifless" + +[prime.a.variants-buildup.stages.terminal.toothless-rounded] rank = 4 -description = "Toothless (rounded bottom-right) double-storey `a`" -selector.a = "doubleStoreyToothlessRounded" -selector."a/sansSerif" = "doubleStoreyToothlessRounded" -selector."a/rtailBase" = "doubleStoreySerifless" -selector."a/turnABase" = "doubleStoreyToothlessRounded" -selector.scripta = "singleStoreySerifless" +disableIf = [{ storey = "single-storey" }] +descriptionAffix = "toothless (rounded bottom-right)" +selectorAffix.a = "toothlessRounded" +selectorAffix."a/sansSerif" = "toothlessRounded" +selectorAffix."a/rtailBase" = "serifless" +selectorAffix."a/turnABase" = "toothlessRounded" +selectorAffix.scripta = "serifless" -[prime.a.variants.double-storey-serifed] +[prime.a.variants-buildup.stages.terminal.serifed] rank = 5 -description = "Double-storey `a` with serif at bottom right" -selector.a = "doubleStoreySerifed" -selector."a/sansSerif" = "doubleStoreySerifless" -selector."a/rtailBase" = "doubleStoreySerifless" -selector."a/turnABase" = "doubleStoreySerifed" -selector.scripta = "singleStoreySerifed" - -[prime.a.variants.single-storey-serifless] -rank = 6 -description = "Single-storey `a` without serifs" -selector.a = "singleStoreySerifless" -selector."a/sansSerif" = "singleStoreySerifless" -selector."a/rtailBase" = "singleStoreySerifless" -selector."a/turnABase" = "doubleStoreySerifless" -selector.scripta = "singleStoreySerifless" - -[prime.a.variants.single-storey-earless-corner-serifless] -rank = 7 -description = "Earless (cornered top-right) single-storey `a` without serifs" -selector.a = "singleStoreyEarlessCornerSerifless" -selector."a/sansSerif" = "singleStoreyEarlessCornerSerifless" -selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless" -selector."a/turnABase" = "doubleStoreySerifless" -selector.scripta = "singleStoreySerifless" - -[prime.a.variants.single-storey-earless-rounded-serifless] -rank = 8 -description = "Earless (rounded top-right) single-storey `a` without serifs" -selector.a = "singleStoreyEarlessRoundedSerifless" -selector."a/sansSerif" = "singleStoreyEarlessRoundedSerifless" -selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless" -selector."a/turnABase" = "doubleStoreySerifless" -selector.scripta = "singleStoreySerifless" - -[prime.a.variants.single-storey-tailed] -rank = 9 -description = "Single-storey `a` with curly tail" -selector.a = "singleStoreyTailed" -selector."a/sansSerif" = "singleStoreyTailed" -selector."a/rtailBase" = "singleStoreySerifless" -selector."a/turnABase" = "doubleStoreyTailed" -selector.scripta = "singleStoreyTailed" - -[prime.a.variants.single-storey-earless-corner-tailed] -rank = 10 -description = "Earless (cornered top-right) single-storey `a` with curly tail" -selector.a = "singleStoreyEarlessCornerTailed" -selector."a/sansSerif" = "singleStoreyEarlessCornerTailed" -selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless" -selector."a/turnABase" = "doubleStoreyTailed" -selector.scripta = "singleStoreyTailed" - -[prime.a.variants.single-storey-earless-rounded-tailed] -rank = 11 -description = "Earless (rounded top-right) single-storey `a` with curly tail" -selector.a = "singleStoreyEarlessRoundedTailed" -selector."a/sansSerif" = "singleStoreyEarlessRoundedTailed" -selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless" -selector."a/turnABase" = "doubleStoreyTailed" -selector.scripta = "singleStoreyTailed" - -[prime.a.variants.single-storey-serifed] -rank = 12 -description = "Single-storey `a` with serif at bottom right" -selector.a = "singleStoreySerifed" -selector."a/sansSerif" = "singleStoreySerifless" -selector."a/rtailBase" = "singleStoreySerifless" -selector."a/turnABase" = "doubleStoreySerifed" -selector.scripta = "singleStoreySerifed" - -[prime.a.variants.single-storey-earless-corner-serifed] -rank = 13 -description = "Earless (cornered top-right) single-storey `a` with serif at bottom right" -selector.a = "singleStoreyEarlessCornerSerifed" -selector."a/sansSerif" = "singleStoreyEarlessCornerSerifless" -selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless" -selector."a/turnABase" = "doubleStoreySerifed" -selector.scripta = "singleStoreySerifed" - -[prime.a.variants.single-storey-earless-rounded-serifed] -rank = 14 -description = "Earless (rounded top-right) single-storey `a` with serif at bottom right" -selector.a = "singleStoreyEarlessRoundedSerifed" -selector."a/sansSerif" = "singleStoreyEarlessRoundedSerifless" -selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless" -selector."a/turnABase" = "doubleStoreySerifed" -selector.scripta = "singleStoreySerifed" +descriptionAffix = "serif at terminal" +selectorAffix.a = "serifed" +selectorAffix."a/sansSerif" = "serifless" +selectorAffix."a/rtailBase" = "serifless" +selectorAffix."a/turnABase" = "serifed" +selectorAffix.scripta = "serifed" [prime.b] sampler = "b" tag = "cv27" -[prime.b.variants.toothed-serifless] +[prime.b.variants-buildup] +entry = "body" +descriptionLeader = "`b`" + +[prime.b.variants-buildup.stages.body."*"] +next = "serifs" + +[prime.b.variants-buildup.stages.body.toothed] rank = 1 -description = "`b` with bottom-left tooth" -selector.b = "toothedSerifless" -selector."b/sansSerif" = "toothedSerifless" -selector."b/zhuangToneSixBase" = "toothedSerifless" -selector.bHookTop = "toothedSerifless" +descriptionAffix = "toothed shape" +selectorAffix.b = "toothed" +selectorAffix."b/sansSerif" = "toothed" +selectorAffix.bHookTop = "toothed" -[prime.b.variants.toothed-motion-serifed] +[prime.b.variants-buildup.stages.body.toothless-corner] rank = 2 -description = "`b` with motion serif, and with bottom-left tooth" -selector.b = "toothedMotionSerifed" -selector."b/sansSerif" = "toothedSerifless" -selector."b/zhuangToneSixBase" = "toothedSerifless" -selector.bHookTop = "toothedSerifless" +descriptionAffix = "toothless (cornered) shape" +selectorAffix.b = "toothlessCorner" +selectorAffix."b/sansSerif" = "toothlessCorner" +selectorAffix.bHookTop = "toothlessCorner" -[prime.b.variants.toothed-serifed] +[prime.b.variants-buildup.stages.body.toothless-rounded] rank = 3 -description = "`b` with motion serif, and with bottom-left tooth" -selector.b = "toothedSerifed" -selector."b/sansSerif" = "toothedSerifless" -selector."b/zhuangToneSixBase" = "toothedSerifless" -selector.bHookTop = "toothedSerifed" +descriptionAffix = "toothless (rounded) shape" +selectorAffix.b = "toothlessRounded" +selectorAffix."b/sansSerif" = "toothlessRounded" +selectorAffix.bHookTop = "toothlessRounded" -[prime.b.variants.toothless-corner-serifless] -rank = 4 -description = "`b` without bottom-left tooth, with a corner transition" -selector.b = "toothlessCornerSerifless" -selector."b/sansSerif" = "toothlessCornerSerifless" -selector."b/zhuangToneSixBase" = "toothlessCornerSerifless" -selector.bHookTop = "toothlessCornerSerifless" +[prime.b.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionAffix = "serifs" +descriptionJoiner = "without" +selectorAffix.b = "serifless" +selectorAffix."b/sansSerif" = "serifless" +selectorAffix.bHookTop = "serifless" -[prime.b.variants.toothless-corner-serifed] -rank = 5 -description = "`b` with motion serif, and without bottom-left tooth, with a corner transition" -selector.b = "toothlessCornerSerifed" -selector."b/sansSerif" = "toothlessCornerSerifless" -selector."b/zhuangToneSixBase" = "toothlessCornerSerifless" -selector.bHookTop = "toothlessCornerSerifless" +[prime.b.variants-buildup.stages.serifs.motion-serifed] +rank = 2 +disableIf = [{ body = "NOT toothed" }] +descriptionAffix = "motion serifs" +selectorAffix.b = "motionSerifed" +selectorAffix."b/sansSerif" = "serifless" +selectorAffix.bHookTop = "serifless" -[prime.b.variants.toothless-rounded-serifless] -rank = 6 -description = "`b` without bottom-left tooth, with a rounded transition" -selector.b = "toothlessRoundedSerifless" -selector."b/sansSerif" = "toothlessRoundedSerifless" -selector."b/zhuangToneSixBase" = "toothlessRoundedSerifless" -selector.bHookTop = "toothlessRoundedSerifless" - -[prime.b.variants.toothless-rounded-serifed] -rank = 7 -description = "`b` with motion serif, and without bottom-left tooth, with a rounded transition" -selector.b = "toothlessRoundedSerifed" -selector."b/sansSerif" = "toothlessRoundedSerifless" -selector."b/zhuangToneSixBase" = "toothlessRoundedSerifless" -selector.bHookTop = "toothlessRoundedSerifless" +[prime.b.variants-buildup.stages.serifs.serifed] +rank = 3 +descriptionAffix = "serifs" +selectorAffix.b = "serifed" +selectorAffix."b/sansSerif" = "serifless" +selectorAffix.bHookTop = "serifed" @@ -1675,113 +1646,98 @@ selector.cBottomSerifOnly = "bilateralInwardSerifed" sampler = "d" tag = "cv29" -[prime.d.variants.toothed-serifless] +[prime.d.variants-buildup] +entry = "body" +descriptionLeader = "`d`" + +[prime.d.variants-buildup.stages.body."*"] +next = "serifs" + +[prime.d.variants-buildup.stages.body.toothed] rank = 1 -description = "`d` with bottom-right tooth, and without serifs" -selector.d = "toothedSerifless" -selector."d/sansSerif" = "toothedSerifless" -selector."d/phoneticLeft" = "toothedSerifless" -selector."d/hookBottomBase" = "toothedSerifless" -selector.dCurlyTail = "toothedSerifless" -selector.dHookTop = "toothedSerifless" -selector."dHookTop/hookBottomBase" = "toothedSerifless" -selector."cyrl/djeKomi" = "toothedSerifless" +descriptionAffix = "toothed shape" +selectorAffix.d = "toothed" +selectorAffix."d/sansSerif" = "toothed" +selectorAffix."d/phoneticLeft" = "toothed" +selectorAffix."d/hookBottomBase" = "toothed" +selectorAffix.dCurlyTail = "toothed" +selectorAffix.dHookTop = "toothed" +selectorAffix."dHookTop/hookBottomBase" = "toothed" +selectorAffix."cyrl/djeKomi" = "toothed" -[prime.d.variants.toothed-top-serifed] +[prime.d.variants-buildup.stages.body.toothless-corner] rank = 2 -description = "`d` with bottom-right tooth and top serif" -selector.d = "toothedTopSerifed" -selector."d/sansSerif" = "toothedSerifless" -selector."d/phoneticLeft" = "toothedTopSerifed" -selector."d/hookBottomBase" = "toothedTopSerifed" -selector.dCurlyTail = "toothedTopSerifed" -selector.dHookTop = "toothedSerifless" -selector."dHookTop/hookBottomBase" = "toothedSerifless" -selector."cyrl/djeKomi" = "toothedTopSerifed" +descriptionAffix = "toothless (cornered) shape" +selectorAffix.d = "toothlessCorner" +selectorAffix."d/sansSerif" = "toothlessCorner" +selectorAffix."d/phoneticLeft" = "toothed" +selectorAffix."d/hookBottomBase" = "toothlessCornerHBB" +selectorAffix.dCurlyTail = "toothed" +selectorAffix.dHookTop = "toothlessCorner" +selectorAffix."dHookTop/hookBottomBase" = "toothlessCornerHBB" +selectorAffix."cyrl/djeKomi" = "toothlessRounded" -[prime.d.variants.toothed-serifed] +[prime.d.variants-buildup.stages.body.toothless-rounded] rank = 3 -description = "`d` with serifs" -selector.d = "toothedSerifed" -selector."d/sansSerif" = "toothedSerifless" -selector."d/phoneticLeft" = "toothedTopSerifed" -selector."d/hookBottomBase" = "toothedTopSerifed" -selector.dCurlyTail = "toothedTopSerifed" -selector.dHookTop = "toothedBottomSerifed" -selector."dHookTop/hookBottomBase" = "toothedSerifless" -selector."cyrl/djeKomi" = "toothedSerifed" +descriptionAffix = "toothless (rounded) shape" +selectorAffix.d = "toothlessRounded" +selectorAffix."d/sansSerif" = "toothlessRounded" +selectorAffix."d/phoneticLeft" = "toothed" +selectorAffix."d/hookBottomBase" = "toothlessRoundedHBB" +selectorAffix.dCurlyTail = "toothed" +selectorAffix.dHookTop = "toothlessRounded" +selectorAffix."dHookTop/hookBottomBase" = "toothlessRoundedHBB" +selectorAffix."cyrl/djeKomi" = "toothlessRounded" -[prime.d.variants.toothless-corner-serifless] +[prime.d.variants-buildup.stages.body.tailed] rank = 4 -description = "`d` without bottom-right tooth, with a corner transition, and without serif" -selector.d = "toothlessCornerSerifless" -selector."d/sansSerif" = "toothlessCornerSerifless" -selector."d/phoneticLeft" = "toothedSerifless" -selector."d/hookBottomBase" = "toothlessCornerSeriflessHBB" -selector.dCurlyTail = "toothedSerifless" -selector.dHookTop = "toothlessCornerSerifless" -selector."dHookTop/hookBottomBase" = "toothlessCornerSeriflessHBB" -selector."cyrl/djeKomi" = "toothlessRoundedSerifless" +descriptionAffix = "tailed shape" +selectorAffix.d = "tailed" +selectorAffix."d/sansSerif" = "tailed" +selectorAffix."d/phoneticLeft" = "toothed" +selectorAffix."d/hookBottomBase" = "toothed" +selectorAffix.dCurlyTail = "toothed" +selectorAffix.dHookTop = "tailed" +selectorAffix."dHookTop/hookBottomBase" = "toothed" +selectorAffix."cyrl/djeKomi" = "toothed" -[prime.d.variants.toothless-corner-serifed] -rank = 5 -description = "`d` without bottom-right tooth, with a corner transition and top serif" -selector.d = "toothlessCornerSerifed" -selector."d/sansSerif" = "toothlessCornerSerifless" -selector."d/phoneticLeft" = "toothedTopSerifed" -selector."d/hookBottomBase" = "toothlessCornerSerifedHBB" -selector.dCurlyTail = "toothedTopSerifed" -selector.dHookTop = "toothlessCornerSerifless" -selector."dHookTop/hookBottomBase" = "toothlessCornerSeriflessHBB" -selector."cyrl/djeKomi" = "toothlessRoundedSerifed" +[prime.d.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionAffix = "serifs" +descriptionJoiner = "without" +selectorAffix.d = "serifless" +selectorAffix."d/sansSerif" = "serifless" +selectorAffix."d/phoneticLeft" = "serifless" +selectorAffix."d/hookBottomBase" = "serifless" +selectorAffix.dCurlyTail = "serifless" +selectorAffix.dHookTop = "serifless" +selectorAffix."dHookTop/hookBottomBase" = "serifless" +selectorAffix."cyrl/djeKomi" = "serifless" -[prime.d.variants.toothless-rounded-serifless] -rank = 6 -description = "`d` without bottom-right tooth, with a rounded transition, and without serif" -selector.d = "toothlessRoundedSerifless" -selector."d/sansSerif" = "toothlessRoundedSerifless" -selector."d/phoneticLeft" = "toothedSerifless" -selector."d/hookBottomBase" = "toothlessRoundedSeriflessHBB" -selector.dCurlyTail = "toothedSerifless" -selector.dHookTop = "toothlessRoundedSerifless" -selector."dHookTop/hookBottomBase" = "toothlessRoundedSeriflessHBB" -selector."cyrl/djeKomi" = "toothlessRoundedSerifless" +[prime.d.variants-buildup.stages.serifs.top-serifed] +rank = 2 +disableIf = [{ body = "NOT toothed" }] +descriptionAffix = "serif at top" +selectorAffix.d = "topSerifed" +selectorAffix."d/sansSerif" = "serifless" +selectorAffix."d/phoneticLeft" = "topSerifed" +selectorAffix."d/hookBottomBase" = "topSerifed" +selectorAffix.dCurlyTail = "topSerifed" +selectorAffix.dHookTop = "serifless" +selectorAffix."dHookTop/hookBottomBase" = "serifless" +selectorAffix."cyrl/djeKomi" = "topSerifed" -[prime.d.variants.toothless-rounded-serifed] -rank = 7 -description = "`d` without bottom-right tooth, with a rounded transition and top serif" -selector.d = "toothlessRoundedSerifed" -selector."d/sansSerif" = "toothlessRoundedSerifless" -selector."d/phoneticLeft" = "toothedTopSerifed" -selector."d/hookBottomBase" = "toothlessRoundedSerifedHBB" -selector.dCurlyTail = "toothedTopSerifed" -selector.dHookTop = "toothlessRoundedSerifless" -selector."dHookTop/hookBottomBase" = "toothlessRoundedSeriflessHBB" -selector."cyrl/djeKomi" = "toothlessRoundedSerifed" - -[prime.d.variants.tailed-serifless] -rank = 8 -description = "`d` with a bottom-right tail, and without serif" -selector.d = "tailedSerifless" -selector."d/sansSerif" = "tailedSerifless" -selector."d/phoneticLeft" = "toothedSerifless" -selector."d/hookBottomBase" = "toothedSerifless" -selector.dCurlyTail = "toothedSerifless" -selector.dHookTop = "tailedSerifless" -selector."dHookTop/hookBottomBase" = "toothedSerifless" -selector."cyrl/djeKomi" = "toothedSerifless" - -[prime.d.variants.tailed-serifed] -rank = 9 -description = "`d` with a bottom-right tail and top serif" -selector.d = "tailedSerifed" -selector."d/sansSerif" = "tailedSerifless" -selector."d/phoneticLeft" = "toothedTopSerifed" -selector."d/hookBottomBase" = "toothedTopSerifed" -selector.dCurlyTail = "toothedTopSerifed" -selector.dHookTop = "tailedSerifless" -selector."dHookTop/hookBottomBase" = "toothedSerifless" -selector."cyrl/djeKomi" = "toothedSerifed" +[prime.d.variants-buildup.stages.serifs.serifed] +rank = 3 +descriptionAffix = "serif at top" +selectorAffix.d = "serifed" +selectorAffix."d/sansSerif" = "serifless" +selectorAffix."d/phoneticLeft" = "topSerifed" +selectorAffix."d/hookBottomBase" = "topSerifed" +selectorAffix.dCurlyTail = "topSerifed" +selectorAffix.dHookTop = "bottomSerifed" +selectorAffix."dHookTop/hookBottomBase" = "serifless" +selectorAffix."cyrl/djeKomi" = "serifed" @@ -1809,285 +1765,142 @@ selector.schwa = "rounded" sampler = "f" tag = "cv31" -[prime.f.variants.serifless] +[prime.f.variants-buildup] +entry = "hook" +descriptionLeader = "`f`" + +[prime.f.variants-buildup.stages.hook."*"] +next = "tail" + +[prime.f.variants-buildup.stages.hook.full] rank = 1 -description = "`f` without bottom serif, hook or extension" -selector.f = "serifless" -selector."f/sansSerif" = "serifless" -selector."f/compLigLeft1" = "flatHookCLC1" -selector."f/compLigLeft2" = "flatHookCLC2" -selector."f/compLigLeft3" = "flatHookCLC3" -selector."f/phoneticLeft" = "seriflessCrossbarAtXHeight" -selector."f/tailless" = "serifless" -selector.fLenis = "serifless" -selector.fLTail = "tailed" -selector.dotlessjWithStrokeAndHook = "tailed" +keyAffix = "" +selectorAffix.f = "" +selectorAffix."f/sansSerif" = "" +selectorAffix."f/compLigLeft1" = "flatHookCLC1" +selectorAffix."f/compLigLeft2" = "flatHookCLC2" +selectorAffix."f/compLigLeft3" = "flatHookCLC3" +selectorAffix."f/phoneticLeft" = "" +selectorAffix."f/tailless" = "" +selectorAffix.fLenis = "" +selectorAffix.fLTail = "" +selectorAffix.dotlessjWithStrokeAndHook = "" -[prime.f.variants.serifed] +[prime.f.variants-buildup.stages.hook.flat-hook] rank = 2 -description = "`f` with bottom serif" -selector.f = "serifed" -selector."f/sansSerif" = "serifless" -selector."f/compLigLeft1" = "flatHookSerifedCLC1" -selector."f/compLigLeft2" = "flatHookSerifedCLC2" -selector."f/compLigLeft3" = "flatHookSerifedCLC3" -selector."f/phoneticLeft" = "serifedCrossbarAtXHeight" -selector."f/tailless" = "serifed" -selector.fLenis = "serifless" -selector.fLTail = "tailed" -selector.dotlessjWithStrokeAndHook = "tailed" +descriptionAffix = "flat top hook" +selectorAffix.f = "flatHook" +selectorAffix."f/sansSerif" = "flatHook" +selectorAffix."f/compLigLeft1" = "flatHookCLC1" +selectorAffix."f/compLigLeft2" = "flatHookCLC2" +selectorAffix."f/compLigLeft3" = "flatHookCLC3" +selectorAffix."f/phoneticLeft" = "flatHook" +selectorAffix."f/tailless" = "flatHook" +selectorAffix.fLenis = "flatHook" +selectorAffix.fLTail = "flatHook" +selectorAffix.dotlessjWithStrokeAndHook = "flatHook" -[prime.f.variants.tailed] +[prime.f.variants-buildup.stages.tail."*"] +next = "crossbar" + +[prime.f.variants-buildup.stages.tail.serifless] +rank = 1 +descriptionAffix = "bottom serif, hook or extension" +descriptionJoiner = "without" +selectorAffix.f = "serifless" +selectorAffix."f/sansSerif" = "serifless" +selectorAffix."f/compLigLeft1" = "serifless" +selectorAffix."f/compLigLeft2" = "serifless" +selectorAffix."f/compLigLeft3" = "serifless" +selectorAffix."f/phoneticLeft" = "serifless" +selectorAffix."f/tailless" = "serifless" +selectorAffix.fLenis = "serifless" +selectorAffix.fLTail = "tailed" +selectorAffix.dotlessjWithStrokeAndHook = "tailed" + +[prime.f.variants-buildup.stages.tail.serifed] +rank = 2 +descriptionAffix = "bottom serif" +selectorAffix.f = "serifed" +selectorAffix."f/sansSerif" = "serifless" +selectorAffix."f/compLigLeft1" = "serifed" +selectorAffix."f/compLigLeft2" = "serifed" +selectorAffix."f/compLigLeft3" = "serifed" +selectorAffix."f/phoneticLeft" = "serifed" +selectorAffix."f/tailless" = "serifed" +selectorAffix.fLenis = "serifless" +selectorAffix.fLTail = "tailed" +selectorAffix.dotlessjWithStrokeAndHook = "tailed" + +[prime.f.variants-buildup.stages.tail.extended] rank = 3 -description = "`f` with bottom hook" -selector.f = "tailed" -selector."f/sansSerif" = "tailed" -selector."f/compLigLeft1" = "flatHookTailedCLC1" -selector."f/compLigLeft2" = "flatHookTailedCLC2" -selector."f/compLigLeft3" = "flatHookTailedCLC3" -selector."f/phoneticLeft" = "tailedCrossbarAtXHeight" -selector."f/tailless" = "serifless" -selector.fLenis = "serifless" -selector.fLTail = "tailed" -selector.dotlessjWithStrokeAndHook = "tailed" +descriptionAffix = "descending extension" +selectorAffix.f = "extended" +selectorAffix."f/sansSerif" = "extended" +selectorAffix."f/compLigLeft1" = "extended" +selectorAffix."f/compLigLeft2" = "extended" +selectorAffix."f/compLigLeft3" = "extended" +selectorAffix."f/phoneticLeft" = "extended" +selectorAffix."f/tailless" = "serifless" +selectorAffix.fLenis = "serifless" +selectorAffix.fLTail = "tailed" +selectorAffix.dotlessjWithStrokeAndHook = "tailed" -[prime.f.variants.extended] +[prime.f.variants-buildup.stages.tail.tailed] rank = 4 -description = "`f` with bar extended to descender" -selector.f = "extended" -selector."f/sansSerif" = "extended" -selector."f/compLigLeft1" = "flatHookExtendedCLC1" -selector."f/compLigLeft2" = "flatHookExtendedCLC2" -selector."f/compLigLeft3" = "flatHookExtendedCLC3" -selector."f/phoneticLeft" = "extendedCrossbarAtXHeight" -selector."f/tailless" = "serifless" -selector.fLenis = "serifless" -selector.fLTail = "tailed" -selector.dotlessjWithStrokeAndHook = "tailed" +descriptionAffix = "descending bottom hook" +selectorAffix.f = "tailed" +selectorAffix."f/sansSerif" = "tailed" +selectorAffix."f/compLigLeft1" = "tailed" +selectorAffix."f/compLigLeft2" = "tailed" +selectorAffix."f/compLigLeft3" = "tailed" +selectorAffix."f/phoneticLeft" = "tailed" +selectorAffix."f/tailless" = "serifless" +selectorAffix.fLenis = "serifless" +selectorAffix.fLTail = "tailed" +selectorAffix.dotlessjWithStrokeAndHook = "tailed" -[prime.f.variants.diagonal-tailed] +[prime.f.variants-buildup.stages.tail.diagonal-tailed] rank = 5 -description = "`f` with bottom diagonal tail" -selector.f = "diagonalTailed" -selector."f/sansSerif" = "diagonalTailed" -selector."f/compLigLeft1" = "flatHookDiagonalTailedCLC1" -selector."f/compLigLeft2" = "flatHookDiagonalTailedCLC2" -selector."f/compLigLeft3" = "flatHookDiagonalTailedCLC3" -selector."f/phoneticLeft" = "diagonalTailedCrossbarAtXHeight" -selector."f/tailless" = "serifless" -selector.fLenis = "serifless" -selector.fLTail = "tailed" -selector.dotlessjWithStrokeAndHook = "tailed" +descriptionAffix = "diagonal tail" +selectorAffix.f = "diagonalTailed" +selectorAffix."f/sansSerif" = "diagonalTailed" +selectorAffix."f/compLigLeft1" = "diagonalTailed" +selectorAffix."f/compLigLeft2" = "diagonalTailed" +selectorAffix."f/compLigLeft3" = "diagonalTailed" +selectorAffix."f/phoneticLeft" = "diagonalTailed" +selectorAffix."f/tailless" = "serifless" +selectorAffix.fLenis = "serifless" +selectorAffix.fLTail = "tailed" +selectorAffix.dotlessjWithStrokeAndHook = "tailed" -[prime.f.variants.serifless-crossbar-at-x-height] -rank = 6 -description = "`f` without bottom serif, hook or extension; crossbar is placed right at X-height" -selector.f = "seriflessCrossbarAtXHeight" -selector."f/sansSerif" = "seriflessCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookCLC1" -selector."f/compLigLeft2" = "flatHookCLC2" -selector."f/compLigLeft3" = "flatHookCLC3" -selector."f/phoneticLeft" = "seriflessCrossbarAtXHeight" -selector."f/tailless" = "seriflessCrossbarAtXHeight" -selector.fLenis = "seriflessCrossbarAtXHeight" -selector.fLTail = "tailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "tailedCrossbarAtXHeight" +[prime.f.variants-buildup.stages.crossbar.standard] +rank = 1 +keyAffix = "" +selectorAffix.f = "" +selectorAffix."f/sansSerif" = "" +selectorAffix."f/compLigLeft1" = "crossbarAtXHeight" +selectorAffix."f/compLigLeft2" = "" +selectorAffix."f/compLigLeft3" = "" +selectorAffix."f/phoneticLeft" = "crossbarAtXHeight" +selectorAffix."f/tailless" = "" +selectorAffix.fLenis = "" +selectorAffix.fLTail = "" +selectorAffix.dotlessjWithStrokeAndHook = "" -[prime.f.variants.serifed-crossbar-at-x-height] -rank = 7 -description = "`f` with bottom serif; crossbar is placed right at X-height" -selector.f = "serifedCrossbarAtXHeight" -selector."f/sansSerif" = "seriflessCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookSerifedCLC1" -selector."f/compLigLeft2" = "flatHookSerifedCLC2" -selector."f/compLigLeft3" = "flatHookSerifedCLC3" -selector."f/phoneticLeft" = "serifedCrossbarAtXHeight" -selector."f/tailless" = "serifedCrossbarAtXHeight" -selector.fLenis = "seriflessCrossbarAtXHeight" -selector.fLTail = "tailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "tailedCrossbarAtXHeight" - -[prime.f.variants.tailed-crossbar-at-x-height] -rank = 8 -description = "`f` with bottom hook; crossbar is placed right at X-height" -selector.f = "tailedCrossbarAtXHeight" -selector."f/sansSerif" = "tailedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookTailedCLC1" -selector."f/compLigLeft2" = "flatHookTailedCLC2" -selector."f/compLigLeft3" = "flatHookTailedCLC3" -selector."f/phoneticLeft" = "tailedCrossbarAtXHeight" -selector."f/tailless" = "seriflessCrossbarAtXHeight" -selector.fLenis = "seriflessCrossbarAtXHeight" -selector.fLTail = "tailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "tailedCrossbarAtXHeight" - -[prime.f.variants.extended-crossbar-at-x-height] -rank = 9 -description = "`f` with bar extended to descender; crossbar is placed right at X-height" -selector.f = "extendedCrossbarAtXHeight" -selector."f/sansSerif" = "extendedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookExtendedCLC1" -selector."f/compLigLeft2" = "flatHookExtendedCLC2" -selector."f/compLigLeft3" = "flatHookExtendedCLC3" -selector."f/phoneticLeft" = "extendedCrossbarAtXHeight" -selector."f/tailless" = "seriflessCrossbarAtXHeight" -selector.fLenis = "seriflessCrossbarAtXHeight" -selector.fLTail = "tailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "tailedCrossbarAtXHeight" - -[prime.f.variants.diagonal-tailed-crossbar-at-x-height] -rank = 10 -description = "`f` with bottom diagonal tail; crossbar is placed right at X-height" -selector.f = "diagonalTailedCrossbarAtXHeight" -selector."f/sansSerif" = "diagonalTailedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookDiagonalTailedCLC1" -selector."f/compLigLeft2" = "flatHookDiagonalTailedCLC2" -selector."f/compLigLeft3" = "flatHookDiagonalTailedCLC3" -selector."f/phoneticLeft" = "diagonalTailedCrossbarAtXHeight" -selector."f/tailless" = "seriflessCrossbarAtXHeight" -selector.fLenis = "seriflessCrossbarAtXHeight" -selector.fLTail = "tailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "tailedCrossbarAtXHeight" - -[prime.f.variants.flat-hook] -rank = 11 -description = "`f` with flat top hook, without bottom serif, hook or extension" -selector.f = "flatHook" -selector."f/sansSerif" = "flatHook" -selector."f/compLigLeft1" = "flatHookCLC1" -selector."f/compLigLeft2" = "flatHookCLC2" -selector."f/compLigLeft3" = "flatHookCLC3" -selector."f/phoneticLeft" = "flatHookCrossbarAtXHeight" -selector."f/tailless" = "flatHook" -selector.fLenis = "flatHook" -selector.fLTail = "flatHookTailed" -selector.dotlessjWithStrokeAndHook = "flatHookTailed" - -[prime.f.variants.flat-hook-serifed] -rank = 12 -description = "`f` with flat top hook and bottom serif" -selector.f = "flatHookSerifed" -selector."f/sansSerif" = "flatHook" -selector."f/compLigLeft1" = "flatHookSerifedCLC1" -selector."f/compLigLeft2" = "flatHookSerifedCLC2" -selector."f/compLigLeft3" = "flatHookSerifedCLC3" -selector."f/phoneticLeft" = "flatHookSerifedCrossbarAtXHeight" -selector."f/tailless" = "flatHookSerifed" -selector.fLenis = "flatHook" -selector.fLTail = "flatHookTailed" -selector.dotlessjWithStrokeAndHook = "flatHookTailed" - -[prime.f.variants.flat-hook-tailed] -rank = 13 -description = "`f` with flat top hook and bottom hook" -selector.f = "flatHookTailed" -selector."f/sansSerif" = "flatHookTailed" -selector."f/compLigLeft1" = "flatHookTailedCLC1" -selector."f/compLigLeft2" = "flatHookTailedCLC2" -selector."f/compLigLeft3" = "flatHookTailedCLC3" -selector."f/phoneticLeft" = "flatHookTailedCrossbarAtXHeight" -selector."f/tailless" = "flatHook" -selector.fLenis = "flatHook" -selector.fLTail = "flatHookTailed" -selector.dotlessjWithStrokeAndHook = "flatHookTailed" - -[prime.f.variants.flat-hook-extended] -rank = 14 -description = "`f` with flat top hook and bar extended to descender" -selector.f = "flatHookExtended" -selector."f/sansSerif" = "flatHookExtended" -selector."f/compLigLeft1" = "flatHookExtendedCLC1" -selector."f/compLigLeft2" = "flatHookExtendedCLC2" -selector."f/compLigLeft3" = "flatHookExtendedCLC3" -selector."f/phoneticLeft" = "flatHookExtendedCrossbarAtXHeight" -selector."f/tailless" = "flatHook" -selector.fLenis = "flatHook" -selector.fLTail = "flatHookTailed" -selector.dotlessjWithStrokeAndHook = "flatHookTailed" - -[prime.f.variants.flat-hook-diagonal-tailed] -rank = 15 -description = "`f` with flat hook and bottom diagonal tail" -selector.f = "flatHookDiagonalTailed" -selector."f/sansSerif" = "flatHookDiagonalTailed" -selector."f/compLigLeft1" = "flatHookDiagonalTailedCLC1" -selector."f/compLigLeft2" = "flatHookDiagonalTailedCLC2" -selector."f/compLigLeft3" = "flatHookDiagonalTailedCLC3" -selector."f/phoneticLeft" = "flatHookDiagonalTailedCrossbarAtXHeight" -selector."f/tailless" = "flatHook" -selector.fLenis = "flatHook" -selector.fLTail = "flatHookTailed" -selector.dotlessjWithStrokeAndHook = "flatHookTailed" - -[prime.f.variants.flat-hook-crossbar-at-x-height] -rank = 16 -description = "`f` with flat top hook, without bottom serif, hook or extension; crossbar is placed right at X-height" -selector.f = "flatHookCrossbarAtXHeight" -selector."f/sansSerif" = "flatHookCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookCLC1" -selector."f/compLigLeft2" = "flatHookCLC2" -selector."f/compLigLeft3" = "flatHookCLC3" -selector."f/phoneticLeft" = "flatHookCrossbarAtXHeight" -selector."f/tailless" = "flatHookCrossbarAtXHeight" -selector.fLenis = "flatHookCrossbarAtXHeight" -selector.fLTail = "flatHookTailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" - -[prime.f.variants.flat-hook-serifed-crossbar-at-x-height] -rank = 17 -description = "`f` with flat top hook, bottom serif; crossbar is placed right at X-height" -selector.f = "flatHookSerifedCrossbarAtXHeight" -selector."f/sansSerif" = "flatHookCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookSerifedCLC1" -selector."f/compLigLeft2" = "flatHookSerifedCLC2" -selector."f/compLigLeft3" = "flatHookSerifedCLC3" -selector."f/phoneticLeft" = "flatHookSerifedCrossbarAtXHeight" -selector."f/tailless" = "flatHookSerifedCrossbarAtXHeight" -selector.fLenis = "flatHookCrossbarAtXHeight" -selector.fLTail = "flatHookTailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" - -[prime.f.variants.flat-hook-tailed-crossbar-at-x-height] -rank = 18 -description = "`f` with flat top hook, bottom hook; crossbar is placed right at X-height" -selector.f = "flatHookTailedCrossbarAtXHeight" -selector."f/sansSerif" = "flatHookTailedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookTailedCLC1" -selector."f/compLigLeft2" = "flatHookTailedCLC2" -selector."f/compLigLeft3" = "flatHookTailedCLC3" -selector."f/phoneticLeft" = "flatHookTailedCrossbarAtXHeight" -selector."f/tailless" = "flatHookCrossbarAtXHeight" -selector.fLenis = "flatHookCrossbarAtXHeight" -selector.fLTail = "flatHookTailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" - -[prime.f.variants.flat-hook-extended-crossbar-at-x-height] -rank = 19 -description = "`f` with flat top hook, bar extended to descender; crossbar is placed right at X-height" -selector.f = "flatHookExtendedCrossbarAtXHeight" -selector."f/sansSerif" = "flatHookExtendedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookExtendedCLC1" -selector."f/compLigLeft2" = "flatHookExtendedCLC2" -selector."f/compLigLeft3" = "flatHookExtendedCLC3" -selector."f/phoneticLeft" = "flatHookExtendedCrossbarAtXHeight" -selector."f/tailless" = "flatHookCrossbarAtXHeight" -selector.fLenis = "flatHookCrossbarAtXHeight" -selector.fLTail = "flatHookTailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" - -[prime.f.variants.flat-hook-diagonal-tailed-crossbar-at-x-height] -rank = 20 -description = "`f` with flat hook and bottom diagonal tail; crossbar is placed right at X-height" -selector.f = "flatHookDiagonalTailedCrossbarAtXHeight" -selector."f/sansSerif" = "flatHookDiagonalTailedCrossbarAtXHeight" -selector."f/compLigLeft1" = "flatHookDiagonalTailedCLC1" -selector."f/compLigLeft2" = "flatHookDiagonalTailedCLC2" -selector."f/compLigLeft3" = "flatHookDiagonalTailedCLC3" -selector."f/phoneticLeft" = "flatHookDiagonalTailedCrossbarAtXHeight" -selector."f/tailless" = "flatHookCrossbarAtXHeight" -selector.fLenis = "flatHookCrossbarAtXHeight" -selector.fLTail = "flatHookTailedCrossbarAtXHeight" -selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" +[prime.f.variants-buildup.stages.crossbar.crossbar-at-x-height] +rank = 1 +descriptionAffix = "crossbar at X-height" +selectorAffix.f = "crossbarAtXHeight" +selectorAffix."f/sansSerif" = "crossbarAtXHeight" +selectorAffix."f/compLigLeft1" = "crossbarAtXHeight" +selectorAffix."f/compLigLeft2" = "" +selectorAffix."f/compLigLeft3" = "" +selectorAffix."f/phoneticLeft" = "crossbarAtXHeight" +selectorAffix."f/tailless" = "crossbarAtXHeight" +selectorAffix.fLenis = "crossbarAtXHeight" +selectorAffix.fLTail = "crossbarAtXHeight" +selectorAffix.dotlessjWithStrokeAndHook = "crossbarAtXHeight" @@ -2095,95 +1908,96 @@ selector.dotlessjWithStrokeAndHook = "flatHookTailedCrossbarAtXHeight" sampler = "g" tag = "cv32" -[prime.g.variants.double-storey] +[prime.g.variants-buildup] +entry = "stroey" +descriptionLeader = "`g`" + +[prime.g.variants-buildup.stages.stroey.double-storey] +next = "openness" rank = 1 -description = "Double-storey `g`" -selector.g = "doubleStorey" -selector."g/sansSerif" = "doubleStorey" -selector."gScript/sansSerif" = "singleStoreySerifless" -selector."gScript/slabSerif" = "singleStoreySerifed" -selector."gScript/hookTopBase" = "singleStoreySerifless" +descriptionAffix = "double-storey shape" +selectorAffix.g = "" +selectorAffix."g/sansSerif" = "" +selectorAffix."gScript" = "" +selectorAffix."gScript/hookTopBase" = "" -[prime.g.variants.double-storey-open] +[prime.g.variants-buildup.stages.openness."*"] +next = "END" + +[prime.g.variants-buildup.stages.openness.closed] +rank = 1 +keyAffix = "" +selectorAffix.g = "doubleStorey" +selectorAffix."g/sansSerif" = "doubleStorey" +selectorAffix."gScript" = "singleStoreySerifless" +selectorAffix."gScript/hookTopBase" = "singleStoreySerifless" + +[prime.g.variants-buildup.stages.openness.open] +rank = 1 +descriptionAffix = "open contour" +selectorAffix.g = "openDoubleStorey" +selectorAffix."g/sansSerif" = "openDoubleStorey" +selectorAffix."gScript" = "singleStoreySerifless" +selectorAffix."gScript/hookTopBase" = "singleStoreySerifless" + +[prime.g.variants-buildup.stages.stroey.single-storey] +next = "hook" rank = 2 -description = "Open Double-storey `g`, like Trebuchet MS or Fira Code" -selector.g = "openDoubleStorey" -selector."g/sansSerif" = "openDoubleStorey" -selector."gScript/sansSerif" = "singleStoreySerifless" -selector."gScript/slabSerif" = "singleStoreySerifed" -selector."gScript/hookTopBase" = "singleStoreySerifless" +descriptionAffix = "single-storey shape" +selectorAffix.g = "singleStorey" +selectorAffix."g/sansSerif" = "singleStorey" +selectorAffix."gScript" = "singleStorey" +selectorAffix."gScript/hookTopBase" = "singleStorey" -[prime.g.variants.single-storey-serifless] +[prime.g.variants-buildup.stages.hook."*"] +next = "ear" + +[prime.g.variants-buildup.stages.hook.standard] +rank = 1 +keyAffix = "" +selectorAffix.g = "" +selectorAffix."g/sansSerif" = "" +selectorAffix."gScript" = "" +selectorAffix."gScript/hookTopBase" = "" + +[prime.g.variants-buildup.stages.hook.flat-hook] +rank = 2 +descriptionAffix = "flat bottom hook" +selectorAffix.g = "flatHook" +selectorAffix."g/sansSerif" = "flatHook" +selectorAffix."gScript" = "flatHook" +selectorAffix."gScript/hookTopBase" = "flatHook" + +[prime.g.variants-buildup.stages.ear.serifless] +rank = 1 +selectorAffix.g = "serifless" +selectorAffix."g/sansSerif" = "serifless" +selectorAffix."gScript" = "serifless" +selectorAffix."gScript/hookTopBase" = "serifless" + +[prime.g.variants-buildup.stages.ear.serifed] +rank = 2 +descriptionAffix = "top-right serif" +selectorAffix.g = "serifed" +selectorAffix."g/sansSerif" = "serifless" +selectorAffix."gScript" = "serifed" +selectorAffix."gScript/hookTopBase" = "serifless" + +[prime.g.variants-buildup.stages.ear.earless-corner] rank = 3 -description = "Single-storey `g` without serifs" -selector.g = "singleStoreySerifless" -selector."g/sansSerif" = "singleStoreySerifless" -selector."gScript/sansSerif" = "singleStoreySerifless" -selector."gScript/slabSerif" = "singleStoreySerifless" -selector."gScript/hookTopBase" = "singleStoreySerifless" +descriptionAffix = "earless (cornered top-right)" +selectorAffix.g = "earlessCorner" +selectorAffix."g/sansSerif" = "earlessCorner" +selectorAffix."gScript" = "earlessCorner" +selectorAffix."gScript/hookTopBase" = "earlessCornerHTB" -[prime.g.variants.single-storey-serifed] +[prime.g.variants-buildup.stages.ear.earless-rounded] rank = 4 -description = "Single-storey `g` with serif at top right" -selector.g = "singleStoreySerifed" -selector."g/sansSerif" = "singleStoreySerifless" -selector."gScript/sansSerif" = "singleStoreySerifed" -selector."gScript/slabSerif" = "singleStoreySerifed" -selector."gScript/hookTopBase" = "singleStoreySerifless" - -[prime.g.variants.earless-corner] -rank = 5 -description = "Earless (cornered top-right) single-storey `g`" -selector.g = "singleStoreyEarlessCorner" -selector."g/sansSerif" = "singleStoreyEarlessCorner" -selector."gScript/sansSerif" = "singleStoreyEarlessCorner" -selector."gScript/slabSerif" = "singleStoreyEarlessCorner" -selector."gScript/hookTopBase" = "singleStoreyEarlessCornerHTB" - -[prime.g.variants.earless-rounded] -rank = 6 -description = "Earless (rounded top-right) single-storey `g`" -selector.g = "singleStoreyEarlessRounded" -selector."g/sansSerif" = "singleStoreyEarlessRounded" -selector."gScript/sansSerif" = "singleStoreyEarlessRounded" -selector."gScript/slabSerif" = "singleStoreyEarlessRounded" -selector."gScript/hookTopBase" = "singleStoreyEarlessRoundedHTB" - -[prime.g.variants.single-storey-flat-hook-serifless] -rank = 7 -description = "Single-storey `g` with flat terminal hook and without serifs" -selector.g = "singleStoreyFlatHookSerifless" -selector."g/sansSerif" = "singleStoreyFlatHookSerifless" -selector."gScript/sansSerif" = "singleStoreyFlatHookSerifless" -selector."gScript/slabSerif" = "singleStoreyFlatHookSerifless" -selector."gScript/hookTopBase" = "singleStoreyFlatHookSerifless" - -[prime.g.variants.single-storey-flat-hook-serifed] -rank = 8 -description = "Single-storey `g` with top-right serif and flat terminal hook" -selector.g = "singleStoreyFlatHookSerifed" -selector."g/sansSerif" = "singleStoreyFlatHookSerifless" -selector."gScript/sansSerif" = "singleStoreyFlatHookSerifed" -selector."gScript/slabSerif" = "singleStoreyFlatHookSerifed" -selector."gScript/hookTopBase" = "singleStoreyFlatHookSerifless" - -[prime.g.variants.single-storey-earless-corner-flat-hook] -rank = 9 -description = "Earless (cornered top-right) single-storey `g` with flat terminal hook" -selector.g = "singleStoreyEarlessCornerFlatHook" -selector."g/sansSerif" = "singleStoreyEarlessCornerFlatHook" -selector."gScript/sansSerif" = "singleStoreyEarlessCornerFlatHook" -selector."gScript/slabSerif" = "singleStoreyEarlessCornerFlatHook" -selector."gScript/hookTopBase" = "singleStoreyEarlessCornerFlatHookHTB" - -[prime.g.variants.single-storey-earless-rounded-flat-hook] -rank = 10 -description = "Earless (rounded top-right) single-storey `g` with flat terminal hook" -selector.g = "singleStoreyEarlessRoundedFlatHook" -selector."g/sansSerif" = "singleStoreyEarlessRoundedFlatHook" -selector."gScript/sansSerif" = "singleStoreyEarlessRoundedFlatHook" -selector."gScript/slabSerif" = "singleStoreyEarlessRoundedFlatHook" -selector."gScript/hookTopBase" = "singleStoreyEarlessRoundedFlatHookHTB" +descriptionAffix = "earless (rounded top-right)" +selectorAffix.g = "earlessRounded" +selectorAffix."g/sansSerif" = "earlessRounded" +selectorAffix."gScript" = "earlessRounded" +selectorAffix."gScript/hookTopBase" = "earlessRoundedHTB" @@ -2191,83 +2005,80 @@ selector."gScript/hookTopBase" = "singleStoreyEarlessRoundedFlatHookHTB" sampler = "h" tag = "cv33" -[prime.h.variants.straight-serifless] +[prime.h.variants-buildup] +entry = "tail" +descriptionLeader = "`h`" + +[prime.h.variants-buildup.stages.tail."*"] +next = "serifs" + +[prime.h.variants-buildup.stages.tail.straight] rank = 1 -description = "`h` with straight ending" -selector.h = "straightSerifless" -selector."h/descBase" = "straightSerifless" -selector."h/sansSerif" = "straightSerifless" -selector.hHookTop = "straightSerifless" -selector.hHookTopLTail = "straightSerifless" -selector.heng = "straightSerifless" -selector."cyrl/shha" = "straightSerifless" +descriptionAffix = "straight terminal" +selectorAffix.h = "straight" +selectorAffix."h/descBase" = "straight" +selectorAffix."h/sansSerif" = "straight" +selectorAffix.hHookTop = "straight" +selectorAffix.hHookTopLTail = "straight" +selectorAffix.heng = "straight" +selectorAffix."cyrl/shha" = "straight" -[prime.h.variants.straight-top-left-serifed] +[prime.h.variants-buildup.stages.tail.tailed] rank = 2 -description = "`h` with straight ending and serif at top left" -selector.h = "straightTopLeftSerifed" -selector."h/descBase" = "straightTopLeftSerifed" -selector."h/sansSerif" = "straightSerifless" -selector.hHookTop = "straightTopLeftSerifed" -selector.hHookTopLTail = "straightTopLeftSerifed" -selector.heng = "straightTopLeftSerifed" -selector."cyrl/shha" = "straightTopLeftSerifed" +descriptionAffix = "curly tailed terminal" +selectorAffix.h = "tailed" +selectorAffix."h/descBase" = "straight" +selectorAffix."h/sansSerif" = "tailed" +selectorAffix.hHookTop = "tailed" +selectorAffix.hHookTopLTail = "straight" +selectorAffix.heng = "straight" +selectorAffix."cyrl/shha" = "tailed" -[prime.h.variants.straight-motion-serifed] +[prime.h.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionAffix = "serifs" +descriptionJoiner = "without" +selectorAffix.h = "serifless" +selectorAffix."h/descBase" = "serifless" +selectorAffix."h/sansSerif" = "serifless" +selectorAffix.hHookTop = "serifless" +selectorAffix.hHookTopLTail = "serifless" +selectorAffix.heng = "serifless" +selectorAffix."cyrl/shha" = "serifless" + +[prime.h.variants-buildup.stages.serifs.top-left-serifed] +rank = 2 +disableIf = [{ tail = "NOT straight" }] +descriptionAffix = "serif at top left" +selectorAffix.h = "topLeftSerifed" +selectorAffix."h/descBase" = "topLeftSerifed" +selectorAffix."h/sansSerif" = "serifless" +selectorAffix.hHookTop = "topLeftSerifed" +selectorAffix.hHookTopLTail = "topLeftSerifed" +selectorAffix.heng = "topLeftSerifed" +selectorAffix."cyrl/shha" = "topLeftSerifed" + +[prime.h.variants-buildup.stages.serifs.motion-serifed] rank = 3 -description = "`h` with straight ending and motion serifs" -selector.h = "straightMotionSerifed" -selector."h/descBase" = "straightTopLeftSerifed" -selector."h/sansSerif" = "straightSerifless" -selector.hHookTop = "straightMotionSerifed" -selector.hHookTopLTail = "straightMotionSerifed" -selector.heng = "straightTopLeftSerifed" -selector."cyrl/shha" = "straightMotionSerifed" +descriptionAffix = "serifs at top left and bottom right" +selectorAffix.h = "motionSerifed" +selectorAffix."h/descBase" = "topLeftSerifed" +selectorAffix."h/sansSerif" = "serifless" +selectorAffix.hHookTop = "motionSerifed" +selectorAffix.hHookTopLTail = "motionSerifed" +selectorAffix.heng = "topLeftSerifed" +selectorAffix."cyrl/shha" = "motionSerifed" -[prime.h.variants.straight-serifed] +[prime.h.variants-buildup.stages.serifs.serifed] rank = 4 -description = "`h` with straight ending and motion serifs" -selector.h = "straightSerifed" -selector."h/descBase" = "straightSerifed" -selector."h/sansSerif" = "straightSerifless" -selector.hHookTop = "straightSerifed" -selector.hHookTopLTail = "straightSerifed" -selector.heng = "straightSerifed" -selector."cyrl/shha" = "straightSerifed" - -[prime.h.variants.tailed-serifless] -rank = 5 -description = "`h` with curly tailed ending" -selector.h = "tailedSerifless" -selector."h/descBase" = "straightSerifless" -selector."h/sansSerif" = "tailedSerifless" -selector.hHookTop = "tailedSerifless" -selector.hHookTopLTail = "straightSerifless" -selector.heng = "straightSerifless" -selector."cyrl/shha" = "tailedSerifless" - -[prime.h.variants.tailed-motion-serifed] -rank = 6 -description = "`h` with curly tailed ending and motion serifs" -selector.h = "tailedMotionSerifed" -selector."h/descBase" = "straightTopLeftSerifed" -selector."h/sansSerif" = "tailedSerifless" -selector.hHookTop = "tailedMotionSerifed" -selector.heng = "straightTopLeftSerifed" -selector.hengLTail = "straightTopLeftSerifed" -selector."cyrl/shha" = "tailedMotionSerifed" - -[prime.h.variants.tailed-serifed] -rank = 7 -description = "`h` with curly tailed ending and motion serifs" -selector.h = "tailedSerifed" -selector."h/descBase" = "straightSerifed" -selector."h/sansSerif" = "tailedSerifless" -selector.hHookTop = "tailedSerifed" -selector.heng = "straightSerifed" -selector.hengLTail = "straightSerifed" -selector."cyrl/shha" = "tailedSerifed" - +descriptionAffix = "serifs" +selectorAffix.h = "serifed" +selectorAffix."h/descBase" = "serifed" +selectorAffix."h/sansSerif" = "serifless" +selectorAffix.hHookTop = "serifed" +selectorAffix.hHookTopLTail = "serifed" +selectorAffix.heng = "serifed" +selectorAffix."cyrl/shha" = "serifed" [prime.i] @@ -2836,170 +2647,117 @@ selectorAffix.mLTail = "serifed" sampler = "n" tag = "cv39" -[prime.n.variants.straight-serifless] +[prime.n.variants-buildup] +entry = "body" +descriptionLeader = "`n`" + +[prime.n.variants-buildup.stages.body."*"] +next = "terminal" + +[prime.n.variants-buildup.stages.body.normal] rank = 1 -description = "`n` with straight ending" -selector.n = "straightSerifless" -selector."n/sansSerif" = "straightSerifless" -selector."n/descBase" = "straightSerifless" -selector.eng = "straightSerifless" -selector."eng/phoneticRight" = "straightSerifless" -selector."cyrl/pe.italic" = "straightSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" +keyAffix = "" +selectorAffix.n = "" +selectorAffix."n/sansSerif" = "" +selectorAffix."n/descBase" = "" +selectorAffix.eng = "" +selectorAffix."eng/phoneticRight" = "" +selectorAffix."cyrl/pe.italic" = "" +selectorAffix."cyrl/peItalicDescBase" = "" -[prime.n.variants.straight-motion-serifed] +[prime.n.variants-buildup.stages.body.earless-corner] rank = 2 -description = "`n` with motion serifs and straight ending" -selector.n = "straightMotionSerifed" -selector."n/sansSerif" = "straightSerifless" -selector."n/descBase" = "straightTopLeftSerifed" -selector.eng = "straightTopLeftSerifed" -selector."eng/phoneticRight" = "straightTopLeftSerifed" -selector."cyrl/pe.italic" = "straightMotionSerifed" -selector."cyrl/peItalicDescBase" = "straightMotionSerifed" +descriptionAffix = "earless (corner top-left) body shape" +selectorAffix.n = "earlessCorner" +selectorAffix."n/sansSerif" = "earlessCorner" +selectorAffix."n/descBase" = "earlessCorner" +selectorAffix.eng = "earlessCorner" +selectorAffix."eng/phoneticRight" = "earlessCornerHTB" +selectorAffix."cyrl/pe.italic" = "" +selectorAffix."cyrl/peItalicDescBase" = "" -[prime.n.variants.straight-top-left-serifed] +[prime.n.variants-buildup.stages.body.earless-rounded] rank = 3 -description = "`n` with motion serifs at top left and straight ending" -selector.n = "straightTopLeftSerifed" -selector."n/sansSerif" = "straightSerifless" -selector."n/descBase" = "straightTopLeftSerifed" -selector.eng = "straightTopLeftSerifed" -selector."eng/phoneticRight" = "straightTopLeftSerifed" -selector."cyrl/pe.italic" = "straightTopLeftSerifed" -selector."cyrl/peItalicDescBase" = "straightMotionSerifed" +descriptionAffix = "earless (rounded top-left) body shape" +selectorAffix.n = "earlessRounded" +selectorAffix."n/sansSerif" = "earlessRounded" +selectorAffix."n/descBase" = "earlessRounded" +selectorAffix.eng = "earlessRounded" +selectorAffix."eng/phoneticRight" = "earlessRoundedHTB" +selectorAffix."cyrl/pe.italic" = "" +selectorAffix."cyrl/peItalicDescBase" = "" -[prime.n.variants.straight-serifed] +[prime.n.variants-buildup.stages.terminal."*"] +next = "serifs" + +[prime.n.variants-buildup.stages.terminal.straight] +rank = 1 +descriptionAffix = "straight terminal" +selectorAffix.n = "straight" +selectorAffix."n/sansSerif" = "straight" +selectorAffix."n/descBase" = "straight" +selectorAffix.eng = "straight" +selectorAffix."eng/phoneticRight" = "straight" +selectorAffix."cyrl/pe.italic" = "straight" +selectorAffix."cyrl/peItalicDescBase" = "straight" + +[prime.n.variants-buildup.stages.terminal.tailed] +rank = 2 +descriptionAffix = "tailed terminal" +selectorAffix.n = "tailed" +selectorAffix."n/sansSerif" = "tailed" +selectorAffix."n/descBase" = "straight" +selectorAffix.eng = "straight" +selectorAffix."eng/phoneticRight" = "straight" +selectorAffix."cyrl/pe.italic" = "tailed" +selectorAffix."cyrl/peItalicDescBase" = "straight" + +[prime.n.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionJoiner = "without" +descriptionAffix = "serifs" +selectorAffix.n = "serifless" +selectorAffix."n/sansSerif" = "serifless" +selectorAffix."n/descBase" = "serifless" +selectorAffix.eng = "serifless" +selectorAffix."eng/phoneticRight" = "serifless" +selectorAffix."cyrl/pe.italic" = "serifless" +selectorAffix."cyrl/peItalicDescBase" = "serifless" + +[prime.n.variants-buildup.stages.serifs.top-left-serifed] +rank = 2 +descriptionAffix = "serif at top left" +disableIf = [ { body = "NOT normal" } ] +selectorAffix.n = "topLeftSerifed" +selectorAffix."n/sansSerif" = "serifless" +selectorAffix."n/descBase" = "topLeftSerifed" +selectorAffix.eng = "topLeftSerifed" +selectorAffix."eng/phoneticRight" = "topLeftSerifed" +selectorAffix."cyrl/pe.italic" = "topLeftSerifed" +selectorAffix."cyrl/peItalicDescBase" = "motionSerifed" + +[prime.n.variants-buildup.stages.serifs.motion-serifed] +rank = 3 +descriptionAffix = "serif at top left and bottom right" +disableIf = [ { body = "NOT normal" } ] +selectorAffix.n = "motionSerifed" +selectorAffix."n/sansSerif" = "serifless" +selectorAffix."n/descBase" = "topLeftSerifed" +selectorAffix.eng = "topLeftSerifed" +selectorAffix."eng/phoneticRight" = "topLeftSerifed" +selectorAffix."cyrl/pe.italic" = "motionSerifed" +selectorAffix."cyrl/peItalicDescBase" = "motionSerifed" + +[prime.n.variants-buildup.stages.serifs.serifed] rank = 4 -description = "`n` with motion serifs and straight ending" -selector.n = "straightSerifed" -selector."n/sansSerif" = "straightSerifless" -selector."n/descBase" = "straightSerifed" -selector.eng = "straightSerifed" -selector."eng/phoneticRight" = "straightSerifed" -selector."cyrl/pe.italic" = "straightSerifed" -selector."cyrl/peItalicDescBase" = "straightSerifed" - -[prime.n.variants.tailed-serifless] -rank = 5 -description = "`n` with a curly tail" -selector.n = "tailedSerifless" -selector."n/sansSerif" = "tailedSerifless" -selector."n/descBase" = "straightSerifless" -selector.eng = "straightSerifless" -selector."eng/phoneticRight" = "straightSerifless" -selector."cyrl/pe.italic" = "tailedSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.tailed-motion-serifed] -rank = 6 -description = "`n` with motion serifs and a curly tail" -selector.n = "tailedMotionSerifed" -selector."n/sansSerif" = "tailedSerifless" -selector."n/descBase" = "straightTopLeftSerifed" -selector.eng = "straightTopLeftSerifed" -selector."eng/phoneticRight" = "straightTopLeftSerifed" -selector."cyrl/pe.italic" = "tailedMotionSerifed" -selector."cyrl/peItalicDescBase" = "straightMotionSerifed" - -[prime.n.variants.tailed-serifed] -rank = 7 -description = "`n` with motion serifs and a curly tail" -selector.n = "tailedSerifed" -selector."n/sansSerif" = "tailedSerifless" -selector."n/descBase" = "straightSerifed" -selector.eng = "straightSerifed" -selector."eng/phoneticRight" = "straightSerifed" -selector."cyrl/pe.italic" = "tailedSerifed" -selector."cyrl/peItalicDescBase" = "straightSerifed" - -[prime.n.variants.earless-corner-straight-serifless] -rank = 8 -description = "Earless (corner top-left) `n` with straight ending" -selector.n = "earlessCornerStraightSerifless" -selector."n/sansSerif" = "earlessCornerStraightSerifless" -selector."n/descBase" = "earlessCornerStraightSerifless" -selector.eng = "earlessCornerStraightSerifless" -selector."eng/phoneticRight" = "earlessCornerStraightHTBSerifless" -selector."cyrl/pe.italic" = "straightSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-corner-straight-serifed] -rank = 9 -description = "Earless (corner top-left) `n` with straight ending" -selector.n = "earlessCornerStraightSerifed" -selector."n/sansSerif" = "earlessCornerStraightSerifless" -selector."n/descBase" = "earlessCornerStraightSerifless" -selector.eng = "earlessCornerStraightSerifed" -selector."eng/phoneticRight" = "earlessCornerStraightHTBSerifed" -selector."cyrl/pe.italic" = "straightSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-corner-tailed-serifless] -rank = 10 -description = "Earless (corner top-left) `n` with a curly tail" -selector.n = "earlessCornerTailedSerifless" -selector."n/sansSerif" = "earlessCornerTailedSerifless" -selector."n/descBase" = "earlessCornerStraightSerifless" -selector.eng = "earlessCornerStraightSerifless" -selector."eng/phoneticRight" = "earlessCornerStraightHTBSerifless" -selector."cyrl/pe.italic" = "tailedSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-corner-tailed-serifed] -rank = 11 -description = "Earless (corner top-left) `n` with a curly tail" -selector.n = "earlessCornerTailedSerifed" -selector."n/sansSerif" = "earlessCornerTailedSerifless" -selector."n/descBase" = "earlessCornerStraightSerifless" -selector.eng = "earlessCornerStraightSerifed" -selector."eng/phoneticRight" = "earlessCornerStraightHTBSerifed" -selector."cyrl/pe.italic" = "tailedSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-rounded-straight-serifless] -rank = 12 -description = "Earless (rounded top-left) `n` with straight ending" -selector.n = "earlessRoundedStraightSerifless" -selector."n/sansSerif" = "earlessRoundedStraightSerifless" -selector."n/descBase" = "earlessRoundedStraightSerifless" -selector.eng = "earlessRoundedStraightSerifless" -selector."eng/phoneticRight" = "earlessRoundedStraightHTBSerifless" -selector."cyrl/pe.italic" = "straightSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-rounded-straight-serifed] -rank = 13 -description = "Earless (rounded top-left) `n` with straight ending" -selector.n = "earlessRoundedStraightSerifed" -selector."n/sansSerif" = "earlessRoundedStraightSerifless" -selector."n/descBase" = "earlessRoundedStraightSerifless" -selector.eng = "earlessRoundedStraightSerifed" -selector."eng/phoneticRight" = "earlessRoundedStraightHTBSerifed" -selector."cyrl/pe.italic" = "straightSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-rounded-tailed-serifless] -rank = 14 -description = "Earless (rounded top-left) `n` with a curly tail" -selector.n = "earlessRoundedTailedSerifless" -selector."n/sansSerif" = "earlessRoundedTailedSerifless" -selector."n/descBase" = "earlessRoundedStraightSerifless" -selector.eng = "earlessRoundedStraightSerifless" -selector."eng/phoneticRight" = "earlessRoundedStraightHTBSerifless" -selector."cyrl/pe.italic" = "tailedSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" - -[prime.n.variants.earless-rounded-tailed-serifed] -rank = 15 -description = "Earless (rounded top-left) `n` with a curly tail" -selector.n = "earlessRoundedTailedSerifed" -selector."n/sansSerif" = "earlessRoundedTailedSerifless" -selector."n/descBase" = "earlessRoundedStraightSerifless" -selector.eng = "earlessRoundedStraightSerifed" -selector."eng/phoneticRight" = "earlessRoundedStraightHTBSerifed" -selector."cyrl/pe.italic" = "tailedSerifless" -selector."cyrl/peItalicDescBase" = "straightSerifless" +descriptionAffix = "serifs" +selectorAffix.n = "serifed" +selectorAffix."n/sansSerif" = "serifless" +selectorAffix."n/descBase" = "serifed" +selectorAffix.eng = "serifed" +selectorAffix."eng/phoneticRight" = "serifed" +selectorAffix."cyrl/pe.italic" = "serifed" +selectorAffix."cyrl/peItalicDescBase" = "serifed" @@ -6656,7 +6414,7 @@ capital-k = "straight-serifless" a = "double-storey-serifless" d = "toothed-serifless" e = "flat-crossbar" -f = "flat-hook" +f = "flat-hook-serifless" g = "double-storey" i = "hooky" j = "serifed" @@ -6777,7 +6535,7 @@ capital-m = "slanted-sides-hanging-serifless" a = "double-storey-serifless" b = "toothless-corner-serifless" d = "toothed-serifless" -f = "flat-hook" +f = "flat-hook-serifless" g = "double-storey" i = "serifed" j = "serifed" @@ -6850,7 +6608,7 @@ capital-k = "straight-serifless" capital-q = "straight" a = "double-storey-serifless" d = "toothed-serifless" -f = "flat-hook" +f = "flat-hook-serifless" i = "serifed" j = "flat-hook-serifed" k = "straight-serifless" @@ -6964,7 +6722,7 @@ capital-d = "more-rounded-serifless" capital-g = "toothless-corner-serifless-hooked" a = "double-storey-tailed" e = "flat-crossbar" -f = "flat-hook" +f = "flat-hook-serifless" i = "serifed" j = "serifed" k = "straight-serifless" @@ -7016,7 +6774,7 @@ capital-k = "symmetric-touching-serifless" a = "single-storey-earless-corner-tailed" b = "toothless-corner-serifless" e = "flat-crossbar" -g = "earless-corner" +g = "single-storey-earless-corner" i = "zshaped" j = "serifed" k = "symmetric-touching-serifless" @@ -7224,7 +6982,7 @@ capital-j = "serifless" capital-k = "symmetric-touching-serifless" capital-q = "crossing" capital-w = "straight-vertical-sides-serifless" -f = "flat-hook" +f = "flat-hook-serifless" g = "single-storey-flat-hook-serifless" i = "hooky" j = "flat-hook-serifed" @@ -7294,7 +7052,7 @@ capital-m = "slanted-sides-hanging-serifless" a = "double-storey-toothless-corner" b = "toothless-corner-serifless" d = "toothless-corner-serifless" -g = "earless-corner" +g = "single-storey-earless-corner" i = "tailed-serifed" k = "symmetric-touching-serifless" l = "tailed-serifed" @@ -7425,7 +7183,7 @@ capital-w = "straight-flat-top-serifless" a = "double-storey-serifless" d = "toothed-serifless" e = "flat-crossbar" -f = "flat-hook" +f = "flat-hook-serifless" g = "single-storey-flat-hook-serifless" i = "serifed" j = "flat-hook-serifed" @@ -7578,7 +7336,7 @@ c = "unilateral-inward-serifed" d = "toothed-serifed" e = "flat-crossbar" f = "serifed" -g = "earless-corner" +g = "single-storey-earless-corner" h = "straight-top-left-serifed" i = "serifed" j = "serifed"