diff --git a/README.md b/README.md index 39509bc37..6866f6f91 100644 --- a/README.md +++ b/README.md @@ -78,13 +78,35 @@ Since version 2.0, Iosevka would no longer support building via `makefile`. To i - [buildPlans.iosevka-custom] # is your plan name - family = "Iosevka Custom" # Font menu family name - design = ["v-i-hooky", "v-l-hooky"] # Customize styles - # upright = ["upright-styles"] # Uncomment this line to set styles for upright only - # italic = ["italic-styles"] # Uncomment this line to set styles for italic only - # oblique = ["oblique-styles"] # Uncomment this line to set styles for oblique only - # hintParams = ["-a", "sss"] # Optional custom parameters for ttfautohint + [buildPlans.iosevka-custom] # is your plan name + family = "Iosevka Custom" # Font menu family name + spacing = "normal" # Optional; Values: `normal`, `term`, `fontconfig-mono`, or `fixed` + serifs = "sans" # Optional; Values: `sans` or `slab` + digit-form = "lining" # Optional; Values `lining` or `olt-style` + + ################################################################################################### + # Configure variants + + # Optional; Whether to inherit a `ss##` variant + [buildPlans.iosevka-custom.variants] + inherits = ["ss01"] + + # Optional; Configure single character's variant + [buildPlans.iosevka-custom.variants.design] + g = 'singlestorey' + + # Optional; Configure single character's variant for Upright and Oblique; Overrides [design] + [buildPlans.iosevka-custom.variants.upright] + i = 'zshaped' + l = 'zshaped' + + # Optional; Configure single character's variant for Italic only; Overrides [design] + [buildPlans.iosevka-custom.variants.italic] + i = 'italic' + l = 'italic' + + # End variant section + ################################################################################################### ################################################################################################### # Override default building weights @@ -194,7 +216,7 @@ Since version 2.0, Iosevka would no longer support building via `makefile`. To i - + 3. Run `npm run build -- contents::` and the built fonts would be avaliable in `dist/`. Aside from `contents::`, other options are: @@ -317,294 +339,292 @@ The current available styles for `design`/`upright`/`italic`/`oblique` options a * Styles for individual characters. They are easy-to-understand names of the `cv##` styles, including: - * Styles for `a`: - * `v-a-doublestorey`, `cv01`: Double-storey `a` (default for Upright). - * `v-a-singlestorey`, `cv02`: Single-storey `a`. - * `v-a-singlestorey-tailed`, `VXBS`: Single-storey `a` with curly tail (default for Italic). - * `v-a-doublestorey-tailed`, `VXBU`: Double-storey `a` with curly tail. - * `v-a-singlestorey-earless-corner`, `VXCL`: Earless (cornered top-right) single-storey `a`. - * `v-a-singlestorey-earless-corner-tailed`, `VXCM`: Earless (cornered top-right) single-storey `a` with curly tail. - * `v-a-singlestorey-earless-rounded`, `VXCN`: Earless (rounded top-right) single-storey `a`. - * `v-a-singlestorey-earless-rounded-tailed`, `VXCO`: Earless (rounded top-right) single-storey `a` with curly tail. - * `v-a-doublestorey-toothless-corner`, `VXDM`: Toothless (cornered bottom-right) double-storey `a`. - * `v-a-doublestorey-toothless-rounded`, `VXDN`: Toothless (rounded bottom-right) double-storey `a`. - * Styles for `b`: - * `v-b-toothed`, `VXBK`: `b` with bottom-left tooth (default). - * `v-b-toothless-corner`, `VXBL`: `b` without bottom-left tooth, with a corner transition. - * `v-b-toothless-rounded`, `VXBM`: `b` without bottom-left tooth, with a rounded transition. - * Styles for `d`: - * `v-d-toothed`, `VXBN`: `d` with bottom-right tooth (default for Upright). - * `v-d-toothless-corner`, `VXBO`: `d` without bottom-right tooth, with a corner transition. - * `v-d-toothless-rounded`, `VXBP`: `d` without bottom-right tooth, with a rounded transition. - * `v-d-tailed`, `VXBQ`: `d` with a slightly tail bottom-right tail (default for Italic). - * Styles for `f`: - * `v-f-straight`, `cv52`: `f` without bottom hook (default for Sans Upright). - * `v-f-tailed`, `cv53`: `f` with a leftward bottom hook (default for Italic). - * `v-f-serifed`, `cv84`: `f` with bottom serif (default for Slab Upright). - * `v-f-straight-tailed`, `VXAD`: `f` with straight tail. - * `v-f-flat-hook`, `VXDD`: `f` with flat hook. - * `v-f-flat-hook-crossbar-at-x-height`, `VXEG`: `f` with flat hook and crossbar placed right at X-height. - * `v-f-flat-hook-serifed`, `VXEV`: `f` with flat hook and bottom serif. - * `v-f-flat-hook-serifed-crossbar-at-x-height`, `VXEW`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. - * `v-f-flat-hook-round-tailed`, `VXEX`: `f` with flat hook. - * `v-f-flat-hook-round-tailed-crossbar-at-x-height`, `VXEY`: `f` with flat hook and crossbar placed right at X-height. - * `v-f-flat-hook-flat-tailed`, `VXEZ`: `f` with flat hook and bottom serif. - * `v-f-flat-hook-flat-tailed-crossbar-at-x-height`, `VXFA`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. - * Styles for `g`: - * `v-g-doublestorey`, `cv11`: Double-storey `g`. - * `v-g-singlestorey`, `cv12`: Single-storey `g` (default). - * `v-g-opendoublestorey`, `cv24`: Open Double-storey `g`, like Trebuchet MS or Fira Code. - * `v-g-earless-corner`, `VXCW`: Earless (cornered top-right) single-storey `g`. - * `v-g-earless-rounded`, `VXCX`: Earless (rounded top-right) single-storey `g`. - * Styles for `h`: - * `v-h-straight`, `VXCB`: `h` with straight ending (default). - * `v-h-tailed`, `VXCC`: `h` with curly tailed ending. - * `v-h-motion-serifed-straight`, `VXEK`: `h` with straight ending. - * `v-h-motion-serifed-tailed`, `VXEL`: `h` with curly tailed ending. - * Styles for `i`: - * `v-i-serifed`, `cv03`: Serifed `i` (default for Upright). - * `v-i-italic`, `cv04`: Italic `i` (default for Italic). - * `v-i-hooky`, `cv05`: Hooky `i`. - * `v-i-zshaped`, `cv06`: Z-shaped `i`. - * `v-i-line`, `cv56`: `i` like a straight line. - * `v-i-tailed`, `cv88`: Tailed `i`. - * `v-i-hookybottom`, `VXAA`: `i` with a straight tail. - * `v-i-serifed-asymmetric`, `VXDK`: `i` with shorter top serif and full bottom serif. - * Styles for `j`: - * `v-j-line`, `cv57`: `j` like a straight line. - * `v-j-serifed`, `cv58`: `j` with top serif (default). - * `v-j-straight`, `cv98`: `j` without serif. - * `v-j-flat-hook-serifed`, `VXDE`: undefined. - * `v-j-flat-hook-serifless`, `VXDF`: undefined. - * Styles for `k`: - * `v-k-straight`, `cv68`: `k` with standard shape (default for Upright). - * `v-k-curly`, `cv69`: Slightly curly `k`, like Iosevka 2.x. - * `v-k-cursive`, `cv70`: `k` with a cursive loop (default for Italic). - * Styles for `l`: - * `v-l-serifed`, `cv07`: Serifed `l` (default for Upright). - * `v-l-italic`, `cv08`: Italic, cursive `l` (default for Italic). - * `v-l-hooky`, `cv09`: Hooky `l`. - * `v-l-zshaped`, `cv10`: Z-shaped `l`. - * `v-l-tailed`, `cv27`: `l` with a curved tail. - * `v-l-hookybottom`, `cv28`: `l` with a straight tail. - * `v-l-line`, `cv59`: `l` like a straight line. - * `v-l-serifed-asymmetric`, `VXDL`: `l` with shorter top serif and full bottom serif. - * Styles for `m`: - * `v-m-normal`, `cv25`: `m` with normal middle leg, touching the baseline (default). - * `v-m-shortleg`, `cv26`: `m` with shorter middle leg, like Ubuntu Mono. - * `v-m-tailed`, `VXCD`: `m` with normal middle leg, touching the baseline, and a curly tail. - * `v-m-shortleg-tailed`, `VXCE`: `m` with shorter middle leg, like Ubuntu Mono, and a curly tail. - * `v-m-earless-corner-double-arch`, `VXDU`: Earless (corner top-left) `m` with normal middle leg touching baseline. - * `v-m-earless-corner-double-arch-shortleg`, `VXDV`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono. - * `v-m-earless-corner-double-arch-tailed`, `VXDW`: Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail. - * `v-m-earless-corner-double-arch-shortleg-tailed`, `VXDX`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `v-m-earless-rounded-double-arch`, `VXDY`: Earless (rounded top-left) `m` with normal middle leg touching baseline. - * `v-m-earless-rounded-double-arch-shortleg`, `VXDZ`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono. - * `v-m-earless-rounded-double-arch-tailed`, `VXEA`: Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail. - * `v-m-earless-rounded-double-arch-shortleg-tailed`, `VXEB`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `v-m-earless-single-arch`, `VXEC`: Earless (single-arch) `m` with normal middle leg touching baseline. - * `v-m-earless-single-arch-shortleg`, `VXED`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono. - * `v-m-earless-single-arch-tailed`, `VXEE`: Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail. - * `v-m-earless-single-arch-shortleg-tailed`, `VXEF`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `v-m-motion-serifed`, `VXEM`: `m` with motion serifs, normal middle leg touching baseline. - * `v-m-motion-serifed-shortleg`, `VXEN`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono. - * `v-m-motion-serifed-tailed`, `VXEO`: `m` with motion serifs, normal middle leg touching baseline, and a curly tail. - * `v-m-motion-serifed-shortleg-tailed`, `VXEP`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail. - * Styles for `n`: - * `v-n-straight`, `VXCF`: `n` with straight ending (default). - * `v-n-tailed`, `VXCG`: `n` with a curly tail. - * `v-n-earless-corner-straight`, `VXDO`: Earless (corner top-left) `n` with straight ending. - * `v-n-earless-corner-tailed`, `VXDP`: Earless (corner top-left) `n` with a curly tail. - * `v-n-earless-rounded-straight`, `VXDQ`: Earless (rounded top-left) `n` with straight ending. - * `v-n-earless-rounded-tailed`, `VXDR`: Earless (rounded top-left) `n` with a curly tail. - * `v-n-motion-serifed-straight`, `VXEQ`: `n` with motion serifs and straight ending. - * `v-n-motion-serifed-tailed`, `VXER`: `n` with motion serifs and a curly tail. - * Styles for `p`: - * `v-p-eared`, `VXCP`: `p` with top-left ear (default). - * `v-p-earless-corner`, `VXCQ`: `p` without top-left ear (corner). - * `v-p-earless-rounded`, `VXCR`: `p` without top-left ear (rounded). - * `v-p-motion-serifed`, `VXES`: `p` with motion serifs. - * Styles for `q`: - * `v-q-straight`, `VXAZ`: `q` with straight bar (default). - * `v-q-tailed`, `VXBA`: `q` with tail. - * `v-q-earless-corner`, `VXCS`: Earless (cornered top-left) single-storey `q`. - * `v-q-earless-corner-tailed`, `VXCT`: Earless (cornered top-left) single-storey `q` with curly tail. - * `v-q-earless-rounded`, `VXCU`: Earless (rounded top-left) single-storey `q`. - * `v-q-earless-rounded-tailed`, `VXCV`: Earless (rounded top-left) single-storey `q` with curly tail. - * Styles for `r`: - * `v-r-straight`, `cv85`: Straight, serif-less `r` (default for Sans). - * `v-r-serifed`, `cv86`: `r` with serif at both top and bottom (default for Slab Upright). - * `v-r-top-serifed`, `cv87`: `r` with serifs at top-left only (default for Slab Italic). - * `v-r-earless-corner`, `VXDS`: Earless (corner top-left), serif-less `r`. - * `v-r-earless-rounded`, `VXDT`: Earless (rounded top-left), serif-less `r`. - * Styles for `t`: - * `v-t-standard`, `cv40`: Standard `t` shape (default). - * `v-t-cross`, `cv41`: Futura-like `t` shape. - * `v-t-flat-hook`, `VXDC`: `t` with flat hook. - * `v-t-hookless-asymmetric`, `VXEH`: `t` without hook and ony half the cross bar. - * `v-t-flat-hook-short-neck`, `VXEI`: `t` with flat hook and a slightly shorter neck. - * `v-t-flat-hook-short-neck2`, `VXEJ`: `t` with flat hook and a more shorter neck. - * Styles for `u`: - * `v-u-with-bar`, `cv89`: Normal `u` with right bar (default for Upright). - * `v-u-without-bar`, `cv90`: Normal `u` without right bar, like a smaller uppercase `U`. - * `v-u-tailed`, `VXBT`: `u` with right bar and a slightly curly tail (default for Italic). - * `v-u-motion-serifed`, `VXET`: Normal `u` with right bar and motion serifs. - * `v-u-motion-serifed-tailed`, `VXEU`: `u` with right bar, motion serifs and a slightly curly tail. - * Styles for `v`, `V`: - * `v-v-straight`, `cv71`: Standard, straight `V` and `v` (default). - * `v-v-curly`, `cv72`:  Slightly curly `V` and `v`, like Iosevka 2.x. - * Styles for `w`, `W`: - * `v-w-straight`, `cv75`: Standard, straight `W` and `w` (default). - * `v-w-curly`, `cv76`: Slightly curly `W` and `w`, like Iosevka 2.x. - * `v-w-straight-flat-top`, `VXCH`: Standard, straight `W` and `w`, and the middle is forced to be aligned the top. - * Styles for `x`, `X`: - * `v-x-straight`, `cv77`: Standard, straight `X` and `x` (default). - * `v-x-curly`, `cv78`: Slightly curly `X` and `x`, like Iosevka 2.x. - * Styles for `y`: - * `v-y-straight`, `cv48`: Letter `y` that is fully straight (default for Sans Upright). - * `v-y-cursive`, `cv49`: Cursive-like `y` (default for Italic). - * `v-y-curly`, `cv79`: More curly letter `y`, like Iosevka 2.x. - * `v-y-straight-turn`, `VXBF`: Letter `y` with straight upper and a tail turns leftward (default for Slab Upright). - * Styles for `z`: - * `v-z-standard`, `VXBD`: Standard `Z` and `z` (default). - * `v-z-with-crossbar`, `VXBE`: `Z` and `z` with a diagonal cross bar for better dsitinction with `2`. - * `v-z-with-horizontal-crossbar`, `VXBX`: `Z` and `z` with a horizontal cross bar for better dsitinction with `2`. * Styles for `A`, `Λ`, `Δ`: - * `v-turn-v-straight`, `cv73`: Standard, straight `A`, `Λ`, `Δ` (default). - * `v-turn-v-curly`, `cv74`: Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x. + * `turn-v = straight`, `cv01 = 1`: Standard, straight `A`, `Λ`, `Δ` (default). + * `turn-v = curly`, `cv01 = 2`: Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x. * Styles for `B`: - * `v-capital-b-standard`, `VXAP`: Standard `B` (default). - * `v-capital-b-more-asymmetric`, `VXAQ`: More asymmetric `B` to differentiate with `8`. + * `capital-b = standard`, `cv02 = 1`: Standard `B` (default). + * `capital-b = more-asymmetric`, `cv02 = 2`: More asymmetric `B` to differentiate with `8`. * Styles for `D`: - * `v-capital-d-standard`, `VXBG`: Standard `D` (default). - * `v-capital-d-more-rounded`, `VXBH`: More rounded `D` to differentiate with `O`. + * `capital-d = standard`, `cv03 = 1`: Standard `D` (default). + * `capital-d = more-rounded`, `cv03 = 2`: More rounded `D` to differentiate with `O`. * Styles for `G`: - * `v-capital-g-tooth`, `cv91`: Toothed G (default). - * `v-capital-g-toothless`, `cv92`: Toothless G. + * `capital-g = toothed`, `cv04 = 1`: Toothed G (default). + * `capital-g = toothless`, `cv04 = 2`: Toothless G. * Styles for `J`: - * `v-capital-j-serifless`, `VXBY`: J without top serif. - * `v-capital-j-serifed`, `VXBZ`: J with top serif at left side (default). - * `v-capital-j-serifed-both-sides`, `VXDA`: J with symmetric at both sides. - * `v-capital-j-serifed-symmetric`, `VXDB`: J with symmetric at both sides and is symmetric. + * `capital-j = serifless`, `cv05 = 1`: J without top serif. + * `capital-j = serifed`, `cv05 = 2`: J with top serif at left side (default). + * `capital-j = serifed-both-sides`, `cv05 = 3`: J with symmetric at both sides. + * `capital-j = serifed-symmetric`, `cv05 = 4`: J with symmetric at both sides and is symmetric. * Styles for `K`: - * `v-capital-k-straight`, `VXBR`: `K` with standard shape (default). - * `v-capital-k-curly`, `VXFB`: Slightly curly `K`, like Iosevka 2.x. + * `capital-k = straight`, `cv06 = 1`: `K` with standard shape (default). + * `capital-k = curly`, `cv06 = 2`: Slightly curly `K`, like Iosevka 2.x. * Styles for `M`: - * `v-capital-m-hanging`, `VXCI`: `M` with middle being hanging off baseline (default). - * `v-capital-m-flat-bottom`, `VXCJ`: `M` with middle aligned to baseline. + * `capital-m = hanging`, `cv07 = 1`: `M` with middle being hanging off baseline (default). + * `capital-m = flat-bottom`, `cv07 = 2`: `M` with middle aligned to baseline. * Styles for `Q`: - * `v-capital-q-taily`, `cv42`: `Q` with a curly tail (default). - * `v-capital-q-straight`, `cv43`: `Q` with a straight tail like in the old versions. - * `v-capital-q-crossing`, `VXCA`: `Q` with a tail crossing the ring. + * `capital-q = taily`, `cv08 = 1`: `Q` with a curly tail (default). + * `capital-q = straight`, `cv08 = 2`: `Q` with a straight tail like in the old versions. + * `capital-q = crossing`, `cv08 = 3`: `Q` with a tail crossing the ring. * Styles for `R`: - * `v-capital-r-straight`, `cv82`: Standard, straight-leg `R` (default). - * `v-capital-r-curly`, `cv83`:  Slightly curly-legged `R`, like Iosevka 2.x. + * `capital-r = straight`, `cv09 = 1`: Standard, straight-leg `R` (default). + * `capital-r = curly`, `cv09 = 2`:  Slightly curly-legged `R`, like Iosevka 2.x. * Styles for `Y`: - * `v-capital-y-straight`, `cv80`: Standard, straight `Y` (default). - * `v-capital-y-curly`, `cv81`: Slightly curly `Y`, like Iosevka 2.x. - * Styles for `0`: - * `v-zero-slashed`, `cv13`: Slashed Zero `0` (default). - * `v-zero-dotted`, `cv14`: Dotted Zero `0`. - * `v-zero-unslashed`, `cv15`: O-like `0`. - * `v-zero-reverse-slashed`, `cv93`: Reverse-slashed `0`. - * `v-zero-long-dotted`, `VXAB`: Long-dotted Zero `0` like Hack. - * Styles for `1`: - * `v-one-nobase`, `cv50`: `1` with bottom serif (default for Sans). - * `v-one-base`, `cv51`: `1` without bottom serif (default for Slab). - * `v-one-line`, `VXAM`: `1` drawn just like a straight line. - * Styles for `3`: - * `v-three-flattop`, `cv46`: Flat top `3` (Like Museo Sans / Montserrat). - * `v-three-twoarcs`, `cv47`: Arched top `3` (default). - * Styles for `4`: - * `v-four-closed`, `VXAR`: `4` with closed contour (default). - * `v-four-closed-non-crossing`, `VXAS`: `4` with closed contour but the horizontal bar does not overflow the vertical bar. - * `v-four-semi-open`, `VXAT`: `4` with semi-open contour. - * `v-four-semi-open-non-crossing`, `VXAU`: `4` with semi-open contour but the horizontal bar does not overflow the vertical bar. - * `v-four-open`, `VXAV`: `4` with open contour. - * `v-four-open-non-crossing`, `VXAW`: `4` with open contour but the horizontal bar does not overflow the vertical bar. - * Styles for `6`: - * `v-six-closed-contour`, `VXAE`: `6` with a more closed contour. - * `v-six-open-contour`, `VXAF`: `6` with a more open contour. - * `v-six-straight-bar`, `VXBB`: `6` with a straight bar (default). - * Styles for `7`: - * `v-seven-noserif`, `cv64`: `7` without serif (default for Sans). - * `v-seven-serifed`, `cv65`: `7` with initial serif (default for Slab). - * `v-seven-crossbar`, `VXAX`: `7` with crossbar. - * `v-seven-crossbar-serifed`, `VXAY`: `7` with crossbar and initial serif. - * Styles for `9`: - * `v-nine-closed-contour`, `cv96`: `9` with a more closed contour. - * `v-nine-open-contour`, `cv97`: `9` with a more open contour. - * `v-nine-straight-bar`, `VXBC`: `9` with a straight bar (default). + * `capital-y = straight`, `cv10 = 1`: Standard, straight `Y` (default). + * `capital-y = curly`, `cv10 = 2`: Slightly curly `Y`, like Iosevka 2.x. + * Styles for `a`: + * `a = doublestorey`, `cv11 = 1`: Double-storey `a` (default for Upright). + * `a = singlestorey`, `cv11 = 2`: Single-storey `a`. + * `a = singlestorey-tailed`, `cv11 = 3`: Single-storey `a` with curly tail (default for Italic). + * `a = doublestorey-tailed`, `cv11 = 4`: Double-storey `a` with curly tail. + * `a = singlestorey-earless-corner`, `cv11 = 5`: Earless (cornered top-right) single-storey `a`. + * `a = singlestorey-earless-corner-tailed`, `cv11 = 6`: Earless (cornered top-right) single-storey `a` with curly tail. + * `a = singlestorey-earless-rounded`, `cv11 = 7`: Earless (rounded top-right) single-storey `a`. + * `a = singlestorey-earless-rounded-tailed`, `cv11 = 8`: Earless (rounded top-right) single-storey `a` with curly tail. + * `a = doublestorey-toothless-corner`, `cv11 = 9`: Toothless (cornered bottom-right) double-storey `a`. + * `a = doublestorey-toothless-rounded`, `cv11 = 10`: Toothless (rounded bottom-right) double-storey `a`. + * Styles for `b`: + * `b = toothed`, `cv12 = 1`: `b` with bottom-left tooth (default). + * `b = toothless-corner`, `cv12 = 2`: `b` without bottom-left tooth, with a corner transition. + * `b = toothless-rounded`, `cv12 = 3`: `b` without bottom-left tooth, with a rounded transition. + * Styles for `d`: + * `d = toothed`, `cv13 = 1`: `d` with bottom-right tooth (default for Upright). + * `d = toothless-corner`, `cv13 = 2`: `d` without bottom-right tooth, with a corner transition. + * `d = toothless-rounded`, `cv13 = 3`: `d` without bottom-right tooth, with a rounded transition. + * `d = tailed`, `cv13 = 4`: `d` with a slightly tail bottom-right tail (default for Italic). + * Styles for `f`: + * `f = straight`, `cv14 = 1`: `f` without bottom hook (default for Sans Upright). + * `f = tailed`, `cv14 = 2`: `f` with a leftward bottom hook (default for Italic). + * `f = serifed`, `cv14 = 3`: `f` with bottom serif (default for Slab Upright). + * `f = straight-tailed`, `cv14 = 4`: `f` with straight tail. + * `f = flat-hook`, `cv14 = 5`: `f` with flat hook. + * `f = flat-hook-crossbar-at-x-height`, `cv14 = 6`: `f` with flat hook and crossbar placed right at X-height. + * `f = flat-hook-serifed`, `cv14 = 7`: `f` with flat hook and bottom serif. + * `f = flat-hook-serifed-crossbar-at-x-height`, `cv14 = 8`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. + * `f = flat-hook-round-tailed`, `cv14 = 9`: `f` with flat hook. + * `f = flat-hook-round-tailed-crossbar-at-x-height`, `cv14 = 10`: `f` with flat hook and crossbar placed right at X-height. + * `f = flat-hook-flat-tailed`, `cv14 = 11`: `f` with flat hook and bottom serif. + * `f = flat-hook-flat-tailed-crossbar-at-x-height`, `cv14 = 12`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. + * Styles for `g`: + * `g = singlestorey`, `cv15 = 1`: Single-storey `g` (default). + * `g = doublestorey`, `cv15 = 2`: Double-storey `g`. + * `g = opendoublestorey`, `cv15 = 3`: Open Double-storey `g`, like Trebuchet MS or Fira Code. + * `g = earless-corner`, `cv15 = 4`: Earless (cornered top-right) single-storey `g`. + * `g = earless-rounded`, `cv15 = 5`: Earless (rounded top-right) single-storey `g`. + * Styles for `h`: + * `h = straight`, `cv16 = 1`: `h` with straight ending (default). + * `h = tailed`, `cv16 = 2`: `h` with curly tailed ending. + * `h = motion-serifed-straight`, `cv16 = 3`: `h` with straight ending. + * `h = motion-serifed-tailed`, `cv16 = 4`: `h` with curly tailed ending. + * Styles for `i`: + * `i = serifed`, `cv17 = 1`: Serifed `i` (default for Upright). + * `i = italic`, `cv17 = 2`: Italic `i` (default for Italic). + * `i = hooky`, `cv17 = 3`: Hooky `i`. + * `i = line`, `cv17 = 4`: `i` like a straight line. + * `i = zshaped`, `cv17 = 5`: Z-shaped `i`. + * `i = tailed`, `cv17 = 6`: Tailed `i`. + * `i = hookybottom`, `cv17 = 7`: `i` with a straight tail. + * `i = serifed-asymmetric`, `cv17 = 8`: `i` with shorter top serif and full bottom serif. + * Styles for `j`: + * `j = line`, `cv18 = 1`: `j` like a straight line. + * `j = serifed`, `cv18 = 2`: `j` with top serif (default). + * `j = straight`, `cv18 = 3`: `j` without serif. + * `j = flat-hook-serifed`, `cv18 = 4`: undefined. + * `j = flat-hook-serifless`, `cv18 = 5`: undefined. + * Styles for `k`: + * `k = straight`, `cv19 = 1`: `k` with standard shape (default for Upright). + * `k = curly`, `cv19 = 2`: Slightly curly `k`, like Iosevka 2.x. + * `k = cursive`, `cv19 = 3`: `k` with a cursive loop (default for Italic). + * Styles for `l`: + * `l = hooky`, `cv20 = 1`: Hooky `l`. + * `l = zshaped`, `cv20 = 2`: Z-shaped `l`. + * `l = serifed`, `cv20 = 3`: Serifed `l` (default for Upright). + * `l = italic`, `cv20 = 4`: Italic, cursive `l` (default for Italic). + * `l = line`, `cv20 = 5`: `l` like a straight line. + * `l = tailed`, `cv20 = 6`: `l` with a curved tail. + * `l = hookybottom`, `cv20 = 7`: `l` with a straight tail. + * `l = serifed-asymmetric`, `cv20 = 8`: `l` with shorter top serif and full bottom serif. + * Styles for `m`: + * `m = normal`, `cv21 = 1`: `m` with normal middle leg, touching the baseline (default). + * `m = shortleg`, `cv21 = 2`: `m` with shorter middle leg, like Ubuntu Mono. + * `m = tailed`, `cv21 = 3`: `m` with normal middle leg, touching the baseline, and a curly tail. + * `m = shortleg-tailed`, `cv21 = 4`: `m` with shorter middle leg, like Ubuntu Mono, and a curly tail. + * `m = earless-corner-double-arch`, `cv21 = 5`: Earless (corner top-left) `m` with normal middle leg touching baseline. + * `m = earless-corner-double-arch-shortleg`, `cv21 = 6`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono. + * `m = earless-corner-double-arch-tailed`, `cv21 = 7`: Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail. + * `m = earless-corner-double-arch-shortleg-tailed`, `cv21 = 8`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + * `m = earless-rounded-double-arch`, `cv21 = 9`: Earless (rounded top-left) `m` with normal middle leg touching baseline. + * `m = earless-rounded-double-arch-shortleg`, `cv21 = 10`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono. + * `m = earless-rounded-double-arch-tailed`, `cv21 = 11`: Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail. + * `m = earless-rounded-double-arch-shortleg-tailed`, `cv21 = 12`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + * `m = earless-single-arch`, `cv21 = 13`: Earless (single-arch) `m` with normal middle leg touching baseline. + * `m = earless-single-arch-shortleg`, `cv21 = 14`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono. + * `m = earless-single-arch-tailed`, `cv21 = 15`: Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail. + * `m = earless-single-arch-shortleg-tailed`, `cv21 = 16`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + * `m = motion-serifed`, `cv21 = 17`: `m` with motion serifs, normal middle leg touching baseline. + * `m = motion-serifed-shortleg`, `cv21 = 18`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono. + * `m = motion-serifed-tailed`, `cv21 = 19`: `m` with motion serifs, normal middle leg touching baseline, and a curly tail. + * `m = motion-serifed-shortleg-tailed`, `cv21 = 20`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail. + * Styles for `n`: + * `n = straight`, `cv22 = 1`: `n` with straight ending (default). + * `n = tailed`, `cv22 = 2`: `n` with a curly tail. + * `n = earless-corner-straight`, `cv22 = 3`: Earless (corner top-left) `n` with straight ending. + * `n = earless-corner-tailed`, `cv22 = 4`: Earless (corner top-left) `n` with a curly tail. + * `n = earless-rounded-straight`, `cv22 = 5`: Earless (rounded top-left) `n` with straight ending. + * `n = earless-rounded-tailed`, `cv22 = 6`: Earless (rounded top-left) `n` with a curly tail. + * `n = motion-serifed-straight`, `cv22 = 7`: `n` with motion serifs and straight ending. + * `n = motion-serifed-tailed`, `cv22 = 8`: `n` with motion serifs and a curly tail. + * Styles for `p`: + * `p = eared`, `cv23 = 1`: `p` with top-left ear (default). + * `p = earless-corner`, `cv23 = 2`: `p` without top-left ear (corner). + * `p = earless-rounded`, `cv23 = 3`: `p` without top-left ear (rounded). + * `p = motion-serifed`, `cv23 = 4`: `p` with motion serifs. + * Styles for `q`: + * `q = straight`, `cv24 = 1`: `q` with straight bar (default). + * `q = tailed`, `cv24 = 2`: `q` with tail. + * `q = earless-corner`, `cv24 = 3`: Earless (cornered top-left) single-storey `q`. + * `q = earless-corner-tailed`, `cv24 = 4`: Earless (cornered top-left) single-storey `q` with curly tail. + * `q = earless-rounded`, `cv24 = 5`: Earless (rounded top-left) single-storey `q`. + * `q = earless-rounded-tailed`, `cv24 = 6`: Earless (rounded top-left) single-storey `q` with curly tail. + * Styles for `r`: + * `r = straight`, `cv25 = 1`: Straight, serif-less `r` (default for Sans). + * `r = serifed`, `cv25 = 2`: `r` with serif at both top and bottom (default for Slab Upright). + * `r = top-serifed`, `cv25 = 3`: `r` with serifs at top-left only (default for Slab Italic). + * `r = earless-corner`, `cv25 = 4`: Earless (corner top-left), serif-less `r`. + * `r = earless-rounded`, `cv25 = 5`: Earless (rounded top-left), serif-less `r`. + * Styles for `t`: + * `t = standard`, `cv26 = 1`: Standard `t` shape (default). + * `t = cross`, `cv26 = 2`: Futura-like `t` shape. + * `t = flat-hook`, `cv26 = 3`: `t` with flat hook. + * `t = hookless-asymmetric`, `cv26 = 4`: `t` without hook and ony half the cross bar. + * `t = flat-hook-short-neck`, `cv26 = 5`: `t` with flat hook and a slightly shorter neck. + * `t = flat-hook-short-neck2`, `cv26 = 6`: `t` with flat hook and a more shorter neck. + * Styles for `u`: + * `u = with-bar`, `cv27 = 1`: Normal `u` with right bar (default for Upright). + * `u = without-bar`, `cv27 = 2`: Normal `u` without right bar, like a smaller uppercase `U`. + * `u = tailed`, `cv27 = 3`: `u` with right bar and a slightly curly tail (default for Italic). + * `u = motion-serifed`, `cv27 = 4`: Normal `u` with right bar and motion serifs. + * `u = motion-serifed-tailed`, `cv27 = 5`: `u` with right bar, motion serifs and a slightly curly tail. + * Styles for `v`, `V`: + * `v = straight`, `cv28 = 1`: Standard, straight `V` and `v` (default). + * `v = curly`, `cv28 = 2`:  Slightly curly `V` and `v`, like Iosevka 2.x. + * Styles for `w`, `W`: + * `w = straight`, `cv29 = 1`: Standard, straight `W` and `w` (default). + * `w = curly`, `cv29 = 2`: Slightly curly `W` and `w`, like Iosevka 2.x. + * `w = straight-flat-top`, `cv29 = 3`: Standard, straight `W` and `w`, and the middle is forced to be aligned the top. + * Styles for `x`, `X`: + * `x = straight`, `cv30 = 1`: Standard, straight `X` and `x` (default). + * `x = curly`, `cv30 = 2`: Slightly curly `X` and `x`, like Iosevka 2.x. + * Styles for `y`: + * `y = straight`, `cv31 = 1`: Letter `y` that is fully straight (default for Sans Upright). + * `y = straight-turn`, `cv31 = 2`: Letter `y` with straight upper and a tail turns leftward (default for Slab Upright). + * `y = curly`, `cv31 = 3`: More curly letter `y`, like Iosevka 2.x. + * `y = cursive`, `cv31 = 4`: Cursive-like `y` (default for Italic). + * Styles for `z`, `Z`: + * `z = standard`, `cv32 = 1`: Standard `Z` and `z` (default). + * `z = with-crossbar`, `cv32 = 2`: `Z` and `z` with a diagonal cross bar for better dsitinction with `2`. + * `z = with-horizontal-crossbar`, `cv32 = 3`: `Z` and `z` with a horizontal cross bar for better dsitinction with `2`. * Styles for `ß`: - * `v-eszet-traditional`, `cv34`: Traditional, Fraktur-like Eszet. - * `v-eszet-sulzbacher`, `cv35`: A more modern, beta-like Eszet (default). - * `v-eszet-longs-s-lig`, `VXAC`: An Eszet shown as a ligature of long-S (`ſ`) and `s`. + * `eszet = traditional`, `cv33 = 1`: Traditional, Fraktur-like Eszet. + * `eszet = sulzbacher`, `cv33 = 2`: A more modern, beta-like Eszet (default). + * `eszet = longs-s-lig`, `cv33 = 3`: An Eszet shown as a ligature of long-S (`ſ`) and `s`. * Styles for `λ`: - * `v-lambda-straight`, `cv94`: More-straight letter `λ` (default). - * `v-lambda-curly`, `cv95`: More curly letter `λ`, like Iosevka 2.x. + * `lambda = straight`, `cv34 = 1`: More-straight letter `λ` (default). + * `lambda = curly`, `cv34 = 2`: More curly letter `λ`, like Iosevka 2.x. + * Styles for `0`: + * `zero = slashed`, `cv35 = 1`: Slashed Zero `0` (default). + * `zero = dotted`, `cv35 = 2`: Dotted Zero `0`. + * `zero = unslashed`, `cv35 = 3`: O-like `0`. + * `zero = reverse-slashed`, `cv35 = 4`: Reverse-slashed `0`. + * `zero = long-dotted`, `cv35 = 5`: Long-dotted Zero `0` like Hack. + * Styles for `1`: + * `one = nobase`, `cv36 = 1`: `1` with bottom serif (default for Sans). + * `one = base`, `cv36 = 2`: `1` without bottom serif (default for Slab). + * `one = line`, `cv36 = 3`: `1` drawn just like a straight line. + * Styles for `3`: + * `three = flattop`, `cv37 = 1`: Flat top `3` (Like Museo Sans / Montserrat). + * `three = twoarcs`, `cv37 = 2`: Arched top `3` (default). + * Styles for `4`: + * `four = closed`, `cv38 = 1`: `4` with closed contour (default). + * `four = closed-non-crossing`, `cv38 = 2`: `4` with closed contour but the horizontal bar does not overflow the vertical bar. + * `four = semi-open`, `cv38 = 3`: `4` with semi-open contour. + * `four = semi-open-non-crossing`, `cv38 = 4`: `4` with semi-open contour but the horizontal bar does not overflow the vertical bar. + * `four = open`, `cv38 = 5`: `4` with open contour. + * `four = open-non-crossing`, `cv38 = 6`: `4` with open contour but the horizontal bar does not overflow the vertical bar. + * Styles for `6`: + * `six = closed-contour`, `cv40 = 1`: `6` with a more closed contour. + * `six = open-contour`, `cv40 = 2`: `6` with a more open contour. + * `six = straight-bar`, `cv40 = 3`: `6` with a straight bar (default). + * Styles for `7`: + * `seven = noserif`, `cv41 = 1`: `7` without serif (default for Sans). + * `seven = serifed`, `cv41 = 2`: `7` with initial serif (default for Slab). + * `seven = crossbar`, `cv41 = 3`: `7` with crossbar. + * `seven = crossbar-serifed`, `cv41 = 4`: `7` with crossbar and initial serif. + * Styles for `9`: + * `nine = closed-contour`, `cv42 = 1`: `9` with a more closed contour. + * `nine = open-contour`, `cv42 = 2`: `9` with a more open contour. + * `nine = straight-bar`, `cv42 = 3`: `9` with a straight bar (default). * Styles for `~`: - * `v-tilde-high`, `cv16`: Higher tilde `~`. - * `v-tilde-low`, `cv17`: Lower tilde `~` (default). + * `tilde = high`, `cv43 = 1`: Higher tilde `~`. + * `tilde = low`, `cv43 = 2`: Lower tilde `~` (default). * Styles for `*`: - * `v-asterisk-high`, `cv18`: Higher five-pointed asterisk `*` (default). - * `v-asterisk-low`, `cv19`: Lower five-pointed asterisk `*`. - * `v-asterisk-hexhigh`, `cv60`: Higher six-pointed asterisk `*`. - * `v-asterisk-hexlow`, `cv61`: Lower six-pointed asterisk `*`. - * `v-asterisk-flip-penta-high`, `VXBV`: Higher five-pointed and turned asterisk `*`. - * `v-asterisk-flip-penta-low`, `VXBW`: Lower five-pointed and turned asterisk `*`. + * `asterisk = high`, `cv44 = 1`: Higher five-pointed asterisk `*` (default). + * `asterisk = low`, `cv44 = 2`: Lower five-pointed asterisk `*`. + * `asterisk = hexhigh`, `cv44 = 3`: Higher six-pointed asterisk `*`. + * `asterisk = hexlow`, `cv44 = 4`: Lower six-pointed asterisk `*`. + * `asterisk = flip-penta-high`, `cv44 = 5`: Higher five-pointed and turned asterisk `*`. + * `asterisk = flip-penta-low`, `cv44 = 6`: Lower five-pointed and turned asterisk `*`. * Styles for `_`: - * `v-underscore-high`, `cv20`: Higher underscore `_`, placed right below baseline (default). - * `v-underscore-low`, `cv21`: Lower underscore `_`, placed right above descender line. - * `v-underscore-above-baseline`, `cv99`: Extra-high `_`, placed right below baseline. + * `underscore = high`, `cv45 = 1`: Higher underscore `_`, placed right below baseline (default). + * `underscore = low`, `cv45 = 2`: Lower underscore `_`, placed right above descender line. + * `underscore = above-baseline`, `cv45 = 3`: Extra-high `_`, placed right below baseline. * Styles for `¶`: - * `v-paragraph-high`, `cv22`: Higher paragraph symbol `¶` (default). - * `v-paragraph-low`, `cv23`: Lower paragraph symbol `¶`. + * `paragraph-sign = high`, `cv46 = 1`: Higher paragraph sign `¶` (default). + * `paragraph-sign = low`, `cv46 = 2`: Lower paragraph sign `¶`. * Styles for `^`: - * `v-caret-high`, `cv29`: Higher circumflex `^` (default). - * `v-caret-low`, `cv30`: Lower circumflex `^`. + * `caret = high`, `cv47 = 1`: Higher circumflex `^` (default). + * `caret = low`, `cv47 = 2`: Lower circumflex `^`. * Styles for `(`, `)`: - * `v-paren-normal`, `VXAN`: Parenthesis with normal contour (default). - * `v-paren-large-contour`, `VXAO`: Parenthesis with larger contour, like that in Monaco. + * `paren = normal`, `cv48 = 1`: Parenthesis with normal contour. + * `paren = large-contour`, `cv48 = 2`: Parenthesis with larger contour, like that in Monaco. * Styles for `{`, `}`: - * `v-brace-straight`, `cv36`: More straight braces. - * `v-brace-curly`, `cv37`: More curly braces (default). + * `brace = straight`, `cv49 = 1`: More straight braces. + * `brace = curly`, `cv49 = 2`: More curly braces. * Styles for `#`: - * `v-numbersign-upright`, `cv44`: Number sign with vertical bars (default). - * `v-numbersign-slanted`, `cv45`: Number sign with slanted bars. - * `v-numbersign-upright-open`, `VXBI`: Number sign with vertical bars and open inner. - * `v-numbersign-slanted-open`, `VXBJ`: Number sign with slanted bars and open inner. + * `number-sign = upright`, `cv50 = 1`: Number sign with vertical bars (default). + * `number-sign = slanted`, `cv50 = 2`: Number sign with slanted bars. + * `number-sign = upright-open`, `cv50 = 3`: Number sign with vertical bars and open inner. + * `number-sign = slanted-open`, `cv50 = 4`: Number sign with slanted bars and open inner. * Styles for `&`: - * `v-ampersand-closed`, `VXAG`: Ampersand (`&`) with a closed contour (default). - * `v-ampersand-upper-open`, `VXAH`: Ampersand (`&`) with an open contour at upper half. - * `v-ampersand-lower-open`, `VXAI`: Ampersand (`&`) with an open contour at lower half. - * `v-ampersand-et`, `VXAJ`: Ampersand (`&`) drawn like a ligature of Ɛ and t. - * `v-ampersand-et-toothed`, `VXAK`: Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth. - * `v-ampersand-flat-top`, `VXAL`: Ampersand (`&`) drawn with a flat top. + * `ampersand = closed`, `cv51 = 1`: Ampersand (`&`) with a closed contour (default). + * `ampersand = upper-open`, `cv51 = 2`: Ampersand (`&`) with an open contour at upper half. + * `ampersand = lower-open`, `cv51 = 3`: Ampersand (`&`) with an open contour at lower half. + * `ampersand = et`, `cv51 = 4`: Ampersand (`&`) drawn like a ligature of Ɛ and t. + * `ampersand = et-toothed`, `cv51 = 5`: Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth. + * `ampersand = flat-top`, `cv51 = 6`: Ampersand (`&`) drawn with a flat top. * Styles for `@`: - * `v-at-threefold`, `cv31`: The long, three-fold At symbol (`@`) (default). - * `v-at-fourfold`, `cv32`: The traditional, four-fold At symbol (`@`). - * `v-at-short`, `cv33`: The shorter, Fira-like At symbol (`@`). + * `at = threefold`, `cv52 = 1`: The long, three-fold At symbol (`@`) (default). + * `at = fourfold`, `cv52 = 2`: The traditional, four-fold At symbol (`@`). + * `at = short`, `cv52 = 3`: The shorter, Fira-like At symbol (`@`). * Styles for `$`: - * `v-dollar-open`, `cv38`: Dollar symbol with open contour. - * `v-dollar-through`, `cv39`: Dollar symbol with strike-through vertical bar (default). - * `v-dollar-opencap`, `cv54`: Dollar symbol with open contour, not exceeding baseline and ascender. - * `v-dollar-throughcap`, `cv55`: Dollar symbol with strike-through vertical bar, not exceeding baseline and ascender. + * `dollar = open`, `cv53 = 1`: Dollar symbol with open contour. + * `dollar = through`, `cv53 = 2`: Dollar symbol with strike-through vertical bar (default). + * `dollar = opencap`, `cv53 = 3`: Dollar symbol with open contour, not exceeding baseline and ascender. + * `dollar = throughcap`, `cv53 = 4`: Dollar symbol with strike-through vertical bar, not exceeding baseline and ascender. * Styles for `%`: - * `v-percent-dots`, `cv62`: Percent `%`, Per-mille `‰` and basis point `‱` using rectangular dots. - * `v-percent-rings`, `cv63`: Percent `%` with rings and broken bar; Per-mille `‰` and basis point `‱` with rings (default). - * `v-percent-rings-connected`, `VXCK`: Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar. + * `percent = dots`, `cv54 = 1`: Percent `%`, Per-mille `‰` and basis point `‱` using rectangular dots. + * `percent = rings`, `cv54 = 2`: Percent `%` with rings and broken bar; Per-mille `‰` and basis point `‱` with rings (default). + * `percent = rings-connected`, `cv54 = 3`: Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar. * Styles for `|`: - * `v-bar-natural-slope`, `VXCY`: Bar punctuations (`|`) has a natural slope under italics and oblique (default). - * `v-bar-force-upright`, `VXCZ`: Bar punctuations (`|`) is forced upright under italics and oblique. * Styles for `<=`, `>=`: - * `v-lig-ltgteq-flat`, `cv66`: The lower bar of `<=` and `>=` ligation is flat (default). - * `v-lig-ltgteq-slanted`, `cv67`: The lower bar of `<=` and `>=` ligation is slanted. + * `lig-ltgteq = flat`, `cv56 = 1`: The lower bar of `<=` and `>=` ligation is flat. + * `lig-ltgteq = slanted`, `cv56 = 2`: The lower bar of `<=` and `>=` ligation is slanted. * Styles for `'`: - * `v-ascii-quote-straight`, `VXDG`: Show ASCII quote (`'`) as short vertical straight bar. (default). - * `v-ascii-quote-raised-comma`, `VXDH`: Show ASCII quote (`'`) as raised comma.. - * Styles for ```: - * `v-ascii-grave-straight`, `VXDI`: Show ASCII grave (`` ` ``) as short diagonal straight bar. (default). - * `v-ascii-grave-raised-inverse-comma`, `VXDJ`: Show ASCII grave (`` ` ``) as raised comma.. + * `ascii-single-quote = straight`, `cv57 = 1`: Show ASCII quote (`'`) as short vertical straight bar. (default). + * `ascii-single-quote = raised-comma`, `cv57 = 2`: Show ASCII quote (`'`) as raised comma.. + * Styles for `` ` ``: + * `ascii-grave = straight`, `cv58 = 1`: Show ASCII grave (`` ` ``) as short diagonal straight bar. (default). + * `ascii-grave = raised-inverse-comma`, `cv58 = 2`: Show ASCII grave (`` ` ``) as raised comma.. diff --git a/build-plans.toml b/build-plans.toml index 61c9f10d0..2cf97a080 100644 --- a/build-plans.toml +++ b/build-plans.toml @@ -10,353 +10,459 @@ snapshotFamily = 'iosevka' [buildPlans.iosevka-fixed] family = "Iosevka Fixed" -design = ["sp-fixed"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on' [buildPlans.iosevka-term] family = "Iosevka Term" -design = ["sp-term"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on' # Slab [buildPlans.iosevka-slab] family = "Iosevka Slab" -design = ["slab"] +serifs = "slab" snapshotFamily = 'iosevka-slab' [buildPlans.iosevka-fixed-slab] family = "Iosevka Fixed Slab" -design = ["sp-fixed", "slab"] +serifs = "slab" +spacing = "fixed" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on' [buildPlans.iosevka-term-slab] family = "Iosevka Term Slab" -design = ["sp-term", "slab"] +serifs = "slab" +spacing = "term" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on' # Curly [buildPlans.iosevka-curly] family = "Iosevka Curly" -design = ["ss20"] snapshotFamily = 'iosevka' snapshotFeature = '"ss20" on' +[buildPlans.iosevka-curly.variants] +inherits = ["ss20"] [buildPlans.iosevka-fixed-curly] family = "Iosevka Fixed Curly" -design = ["sp-fixed", "ss20"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss20" on' +[buildPlans.iosevka-fixed-curly.variants] +inherits = ["ss20"] [buildPlans.iosevka-term-curly] family = "Iosevka Term Curly" -design = ["sp-term", "ss20"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss20" on' +[buildPlans.iosevka-term-curly.variants] +inherits = ["ss20"] # Curly Slab [buildPlans.iosevka-curly-slab] family = "Iosevka Curly Slab" -design = ["slab", "ss20"] +serifs = "slab" snapshotFamily = 'iosevka-slab' snapshotFeature = '"ss20" on' - +[buildPlans.iosevka-curly-slab.variants] +inherits = ["ss20"] [buildPlans.iosevka-fixed-curly-slab] family = "Iosevka Fixed Curly Slab" -design = ["sp-fixed", "slab", "ss20"] +serifs = "slab" +spacing = "fixed" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on, "ss20" on' - +[buildPlans.iosevka-fixed-curly-slab.variants] +inherits = ["ss20"] [buildPlans.iosevka-term-curly-slab] family = "Iosevka Term Curly Slab" -design = ["sp-term", "slab", "ss20"] +serifs = "slab" +spacing = "term" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on, "ss20" on' - +[buildPlans.iosevka-term-curly-slab.variants] +inherits = ["ss20"] ################################################################################################### # SSxx [buildPlans.iosevka-ss01] family = "Iosevka SS01" -design = ["ss01"] snapshotFamily = 'iosevka' snapshotFeature = '"ss01" on' +[buildPlans.iosevka-ss01.variants] +inherits = "ss01" [buildPlans.iosevka-fixed-ss01] family = "Iosevka Fixed SS01" -design = ["sp-fixed", "ss01"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss01" on' +[buildPlans.iosevka-fixed-ss01.variants] +inherits = ["ss01"] [buildPlans.iosevka-term-ss01] family = "Iosevka Term SS01" -design = ["sp-term", "ss01"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss01" on' +[buildPlans.iosevka-term-ss01.variants] +inherits = ["ss01"] + [buildPlans.iosevka-ss02] family = "Iosevka SS02" -design = ["ss02"] snapshotFamily = 'iosevka' snapshotFeature = '"ss02" on' +[buildPlans.iosevka-ss02.variants] +inherits = "ss02" [buildPlans.iosevka-fixed-ss02] family = "Iosevka Fixed SS02" -design = ["sp-fixed", "ss02"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss02" on' +[buildPlans.iosevka-fixed-ss02.variants] +inherits = ["ss02"] [buildPlans.iosevka-term-ss02] family = "Iosevka Term SS02" -design = ["sp-term", "ss02"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss02" on' +[buildPlans.iosevka-term-ss02.variants] +inherits = ["ss02"] [buildPlans.iosevka-ss03] family = "Iosevka SS03" -design = ["ss03"] snapshotFamily = 'iosevka' snapshotFeature = '"ss03" on' +[buildPlans.iosevka-ss03.variants] +inherits = "ss03" [buildPlans.iosevka-fixed-ss03] family = "Iosevka Fixed SS03" -design = ["sp-fixed", "ss03"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss03" on' +[buildPlans.iosevka-fixed-ss03.variants] +inherits = ["ss03"] [buildPlans.iosevka-term-ss03] family = "Iosevka Term SS03" -design = ["sp-term", "ss03"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss03" on' +[buildPlans.iosevka-term-ss03.variants] +inherits = ["ss03"] [buildPlans.iosevka-ss04] family = "Iosevka SS04" -design = ["ss04"] snapshotFamily = 'iosevka' snapshotFeature = '"ss04" on' +[buildPlans.iosevka-ss04.variants] +inherits = "ss04" [buildPlans.iosevka-fixed-ss04] family = "Iosevka Fixed SS04" -design = ["sp-fixed", "ss04"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss04" on' +[buildPlans.iosevka-fixed-ss04.variants] +inherits = ["ss04"] [buildPlans.iosevka-term-ss04] family = "Iosevka Term SS04" -design = ["sp-term", "ss04"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss04" on' +[buildPlans.iosevka-term-ss04.variants] +inherits = ["ss04"] [buildPlans.iosevka-ss05] family = "Iosevka SS05" -design = ["ss05"] snapshotFamily = 'iosevka' snapshotFeature = '"ss05" on' +[buildPlans.iosevka-ss05.variants] +inherits = "ss05" [buildPlans.iosevka-fixed-ss05] family = "Iosevka Fixed SS05" -design = ["sp-fixed", "ss05"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss05" on' +[buildPlans.iosevka-fixed-ss05.variants] +inherits = ["ss05"] [buildPlans.iosevka-term-ss05] family = "Iosevka Term SS05" -design = ["sp-term", "ss05"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss05" on' +[buildPlans.iosevka-term-ss05.variants] +inherits = ["ss05"] [buildPlans.iosevka-ss06] family = "Iosevka SS06" -design = ["ss06"] snapshotFamily = 'iosevka' snapshotFeature = '"ss06" on' +[buildPlans.iosevka-ss06.variants] +inherits = "ss06" [buildPlans.iosevka-fixed-ss06] family = "Iosevka Fixed SS06" -design = ["sp-fixed", "ss06"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss06" on' +[buildPlans.iosevka-fixed-ss06.variants] +inherits = ["ss06"] [buildPlans.iosevka-term-ss06] family = "Iosevka Term SS06" -design = ["sp-term", "ss06"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss06" on' +[buildPlans.iosevka-term-ss06.variants] +inherits = ["ss06"] [buildPlans.iosevka-ss07] family = "Iosevka SS07" -design = ["ss07"] snapshotFamily = 'iosevka' snapshotFeature = '"ss07" on' +[buildPlans.iosevka-ss07.variants] +inherits = "ss07" [buildPlans.iosevka-fixed-ss07] family = "Iosevka Fixed SS07" -design = ["sp-fixed", "ss07"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss07" on' +[buildPlans.iosevka-fixed-ss07.variants] +inherits = ["ss07"] [buildPlans.iosevka-term-ss07] family = "Iosevka Term SS07" -design = ["sp-term", "ss07"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss07" on' +[buildPlans.iosevka-term-ss07.variants] +inherits = ["ss07"] # The SS08 has curly bars, so apply ss20 first [buildPlans.iosevka-ss08] family = "Iosevka SS08" -design = ["ss08"] snapshotFamily = 'iosevka' snapshotFeature = '"ss08" on' +[buildPlans.iosevka-ss08.variants] +inherits = "ss08" [buildPlans.iosevka-fixed-ss08] family = "Iosevka Fixed SS08" -design = ["sp-fixed", "ss08"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss08" on' +[buildPlans.iosevka-fixed-ss08.variants] +inherits = ["ss08"] [buildPlans.iosevka-term-ss08] family = "Iosevka Term SS08" -design = ["sp-term", "ss08"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss08" on' +[buildPlans.iosevka-term-ss08.variants] +inherits = ["ss08"] [buildPlans.iosevka-ss09] family = "Iosevka SS09" -design = ["ss09"] snapshotFamily = 'iosevka' snapshotFeature = '"ss09" on' +[buildPlans.iosevka-ss09.variants] +inherits = "ss09" [buildPlans.iosevka-fixed-ss09] family = "Iosevka Fixed SS09" -design = ["sp-fixed", "ss09"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss09" on' +[buildPlans.iosevka-fixed-ss09.variants] +inherits = ["ss09"] [buildPlans.iosevka-term-ss09] family = "Iosevka Term SS09" -design = ["sp-term", "ss09"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss09" on' +[buildPlans.iosevka-term-ss09.variants] +inherits = ["ss09"] [buildPlans.iosevka-ss10] family = "Iosevka SS10" -design = ["ss10"] snapshotFamily = 'iosevka' snapshotFeature = '"ss10" on' +[buildPlans.iosevka-ss10.variants] +inherits = "ss10" [buildPlans.iosevka-fixed-ss10] family = "Iosevka Fixed SS10" -design = ["sp-fixed", "ss10"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss10" on' +[buildPlans.iosevka-fixed-ss10.variants] +inherits = ["ss10"] [buildPlans.iosevka-term-ss10] family = "Iosevka Term SS10" -design = ["sp-term", "ss10"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss10" on' +[buildPlans.iosevka-term-ss10.variants] +inherits = ["ss10"] [buildPlans.iosevka-ss11] family = "Iosevka SS11" -design = ["ss11"] snapshotFamily = 'iosevka' snapshotFeature = '"ss11" on' +[buildPlans.iosevka-ss11.variants] +inherits = "ss11" [buildPlans.iosevka-fixed-ss11] family = "Iosevka Fixed SS11" -design = ["sp-fixed", "ss11"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss11" on' +[buildPlans.iosevka-fixed-ss11.variants] +inherits = ["ss11"] [buildPlans.iosevka-term-ss11] family = "Iosevka Term SS11" -design = ["sp-term", "ss11"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss11" on' +[buildPlans.iosevka-term-ss11.variants] +inherits = ["ss11"] [buildPlans.iosevka-ss12] family = "Iosevka SS12" -design = ["ss12"] snapshotFamily = 'iosevka' snapshotFeature = '"ss12" on' +[buildPlans.iosevka-ss12.variants] +inherits = "ss12" [buildPlans.iosevka-fixed-ss12] family = "Iosevka Fixed SS12" -design = ["sp-fixed", "ss12"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss12" on' +[buildPlans.iosevka-fixed-ss12.variants] +inherits = ["ss12"] [buildPlans.iosevka-term-ss12] family = "Iosevka Term SS12" -design = ["sp-term", "ss12"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss12" on' +[buildPlans.iosevka-term-ss12.variants] +inherits = ["ss12"] [buildPlans.iosevka-ss13] family = "Iosevka SS13" -design = ["ss13"] snapshotFamily = 'iosevka' snapshotFeature = '"ss13" on' +[buildPlans.iosevka-ss13.variants] +inherits = "ss13" [buildPlans.iosevka-fixed-ss13] family = "Iosevka Fixed SS13" -design = ["sp-fixed", "ss13"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss13" on' +[buildPlans.iosevka-fixed-ss13.variants] +inherits = ["ss13"] [buildPlans.iosevka-term-ss13] family = "Iosevka Term SS13" -design = ["sp-term", "ss13"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss13" on' +[buildPlans.iosevka-term-ss13.variants] +inherits = ["ss13"] [buildPlans.iosevka-ss14] family = "Iosevka SS14" -design = ["ss14"] snapshotFamily = 'iosevka' snapshotFeature = '"ss14" on' +[buildPlans.iosevka-ss14.variants] +inherits = "ss14" [buildPlans.iosevka-fixed-ss14] family = "Iosevka Fixed SS14" -design = ["sp-fixed", "ss14"] +spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss14" on' +[buildPlans.iosevka-fixed-ss14.variants] +inherits = ["ss14"] [buildPlans.iosevka-term-ss14] family = "Iosevka Term SS14" -design = ["sp-term", "ss14"] +spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss14" on' +[buildPlans.iosevka-term-ss14.variants] +inherits = ["ss14"] + ################################################################################################### # Proportional families + [buildPlans.iosevka-aile] family = "Iosevka Aile" -design = ["type", "v-at-fourfold", "v-j-narrow", 'v-capital-i-straight', 'v-capital-j-serifless', 'v-g-singlestorey', 'v-r-narrow', "no-cv-ss", "no-ligation", 'v-a-doublestorey', 'v-d-toothed', 'v-u-with-bar'] -upright = ["v-i-line", "v-l-line", 'v-f-narrow', 'v-t-narrow'] -italic = ["v-i-line", "v-l-line", 'v-f-narrow', 'v-t-narrow'] -oblique = ["v-i-line", "v-l-line", 'v-f-narrow', 'v-t-narrow'] +no-cv-ss = true +no-ligation = true snapshotFamily = 'iosevka-aile' quasiProportionalDiversity = 2 +[buildPlans.iosevka-aile.variants.design] +at = 'fourfold' +j = 'narrow' +capital-i = 'straight' +capital-j = 'serifless' +g = 'singlestorey' +r = 'narrow' +a = 'doublestorey' +d = 'toothed' +u = 'with-bar' + +[buildPlans.iosevka-aile.variants.upright] +i = 'line' +l = 'line' +f = 'narrow' +t = 'narrow' + +[buildPlans.iosevka-aile.variants.italic] +i = 'line' +l = 'line' +f = 'narrow' +t = 'narrow' + [buildPlans.iosevka-aile.widths.normal] shape = 576 menu = 5 @@ -364,16 +470,26 @@ css = "normal" - [buildPlans.iosevka-etoile] family = "Iosevka Etoile" -design = ["type", "slab", "v-at-fourfold", 'v-j-serifed', 'no-cv-ss', "no-ligation"] -upright = ['v-i-serifed', 'v-l-serifed'] -italic = ['v-i-italic', 'v-l-italic'] -oblique = ['v-i-serifed', 'v-l-serifed'] +serifs = 'slab' +no-cv-ss = true +no-ligation = true snapshotFamily = 'iosevka-etoile' quasiProportionalDiversity = 1 +[buildPlans.iosevka-etoile.variants.design] +at = 'fourfold' +j = 'serifed' + +[buildPlans.iosevka-etoile.variants.upright] +i = 'serifed' +l = 'serifed' + +[buildPlans.iosevka-etoile.variants.italic] +i = 'italic' +l = 'italic' + [buildPlans.iosevka-etoile.widths.normal] shape = 576 menu = 5 @@ -381,23 +497,38 @@ css = "normal" - [buildPlans.iosevka-sparkle] family = "Iosevka Sparkle" -design = ["type", "v-at-fourfold", "v-j-narrow-serifed", "no-cv-ss", "no-ligation"] -upright = ['v-i-serifed', 'v-l-serifed', "v-f-serifed", "v-r-serifed"] -italic = ['v-i-italic', 'v-l-italic', "v-f-tailed", 'v-r-top-serifed'] -oblique = ['v-i-serifed', 'v-l-serifed', "v-f-serifed", "v-r-serifed"] +no-cv-ss = true +no-ligation = true snapshotFamily = 'iosevka-sparkle' quasiProportionalDiversity = 1 +[buildPlans.iosevka-sparkle.variants.design] +at = 'fourfold' +j = 'narrow-serifed' + +[buildPlans.iosevka-sparkle.variants.upright] +i = 'serifed' +l = 'serifed' +f = 'serifed' +r = 'serifed' + +[buildPlans.iosevka-sparkle.variants.italic] +i = 'italic' +l = 'italic' +f = 'tailed' +r = 'top-serifed' + [buildPlans.iosevka-sparkle.widths.normal] shape = 576 menu = 5 css = "normal" + ################################################################################################### # Collect plans + [collectPlans.iosevka] from = [ "iosevka", diff --git a/font-src/glyphs/common/derivatives.ptl b/font-src/glyphs/common/derivatives.ptl index 11c2c8aa6..003dc115b 100644 --- a/font-src/glyphs/common/derivatives.ptl +++ b/font-src/glyphs/common/derivatives.ptl @@ -12,19 +12,17 @@ glyph-module glyph-block Common-Derivatives : begin glyph-block-import CommonShapes : FlipAround - define [ApplyCv g follow para name transform omit] : begin - foreach [{k h} : pairs-of para.variants] : begin - local suffix h.(follow) - if (suffix && !(omit && omit.(k))) : begin - if (suffix && transform && transform.(suffix)) : set suffix transform.(suffix) - if (suffix && h.__cvmap && h.__cvmap.(follow)) : begin - local tag h.__cvmap.(follow) - [Cv tag].set g ([fallback name follow] + '.' + suffix) + define [ApplyCv g follow para name transform] : begin + foreach { kPrime prime } para.variants.primes : foreach h [prime.variants.values] : begin + local suffix : h.resolveFor para follow + if (suffix && transform && transform.(suffix)) : set suffix transform.(suffix) + if (suffix && h.tag && h.rank) : begin + [Cv h.tag h.rank].set g ([fallback name follow] + '.' + suffix) - define [select-variant] : params [name unicode [to-name name] transform omit [follow name]] : begin + define [select-variant] : params [name unicode [to-name name] transform [follow name]] : begin if [not : glyph-is-needed name] : return nothing - local variant : variantSelector.(follow) || para.defaultVariant.(follow) + local variant para.variantSelector.(follow) if [not variant] : begin throw : new Error "Variant for \(name) is not assigned." @@ -32,7 +30,7 @@ glyph-block Common-Derivatives : begin create-glyph [fallback to-name name] unicode : glyph-proc include [refer-glyph (name + '.' + variant)] AS_BASE ALSO_METRICS - ApplyCv currentGlyph follow para name transform omit + ApplyCv currentGlyph follow para name transform set this.autoRefPriority [query-glyph (name + '.' + variant)].autoRefPriority define [italic-variant name unicode] : begin diff --git a/font-src/glyphs/common/shapes.ptl b/font-src/glyphs/common/shapes.ptl index 09405ba74..3107ee919 100644 --- a/font-src/glyphs/common/shapes.ptl +++ b/font-src/glyphs/common/shapes.ptl @@ -3,7 +3,7 @@ $$include '../../meta/macros.ptl' import '../../support/transform' as Transform import [mix linreg clamp fallback] from '../../support/utils' -import [Cv AnyDerivingCv Radical] from '../../support/gr' +import [Radical] from '../../support/gr' import [designParameters] from '../../meta/aesthetics' import '../../support/point' as Point diff --git a/font-src/glyphs/index.ptl b/font-src/glyphs/index.ptl index f845e53e9..28397d433 100644 --- a/font-src/glyphs/index.ptl +++ b/font-src/glyphs/index.ptl @@ -26,7 +26,6 @@ define [tagged tag component] : begin return component export all : define [buildGlyphs para recursive recursiveCodes] : begin - define variantSelector para.variantSelector local glyphStore : new GlyphStore define metrics : calculateMetrics para @@ -112,7 +111,7 @@ export all : define [buildGlyphs para recursive recursiveCodes] : begin define booleFns : BooleKit.SetupBuilders : object GlobalTransform Glyph # IDKY, but wrapping "metrics" prevents Node.js on Arch modifying it. - define $$Capture$$ : object [metrics : Object.create metrics] $NamedParameterPair$ $donothing$ para recursive recursiveCodes variantSelector glyphStore $createAndSaveGlyphImpl$ spirofns booleFns MarkSet AS_BASE ALSO_METRICS pickHash buildGlyphs tagged DivFrame fontMetrics $assignUnicodeImpl$ + define $$Capture$$ : object [metrics : Object.create metrics] $NamedParameterPair$ $donothing$ para recursive recursiveCodes glyphStore $createAndSaveGlyphImpl$ spirofns booleFns MarkSet AS_BASE ALSO_METRICS pickHash buildGlyphs tagged DivFrame fontMetrics $assignUnicodeImpl$ ### HERE WE GO run-glyph-module './common/shapes.js' diff --git a/font-src/glyphs/symbol/punctuation.ptl b/font-src/glyphs/symbol/punctuation.ptl index 7610e3400..b9bea1230 100644 --- a/font-src/glyphs/symbol/punctuation.ptl +++ b/font-src/glyphs/symbol/punctuation.ptl @@ -959,7 +959,7 @@ glyph-block Symbol-Punctuation-Slashes-And-Number-Sign : begin create-glyph 'backslash.right' : glyph-proc include : BackslashShape 0 (Middle + backslashWidth / 2) - do "numbersign" + do "number sign" define nsTop : mix SymbolMid ParenTop 0.85 define nsBot : mix SymbolMid ParenBot 0.85 define fine : adviceBlackness 3.5 @@ -977,11 +977,11 @@ glyph-block Symbol-Punctuation-Slashes-And-Number-Sign : begin VBarRight (r - hsp - p * fine) nsBot nsTop fine - create-glyph 'numbersign.upright' : union + create-glyph 'numberSign.upright' : union UprightHBars UprightVBars 0 - create-glyph 'numbersign.uprightOpen' : union + create-glyph 'numberSign.uprightOpen' : union UprightVBars pFineOpen difference UprightHBars @@ -997,8 +997,8 @@ glyph-block Symbol-Punctuation-Slashes-And-Number-Sign : begin SlashShape (l + x - w + p * fine) (l + x + w + p * fine) nsTop nsBot fine SlashShape (r - x - w - p * fine) (r - x + w - p * fine) nsTop nsBot fine - create-glyph 'numbersign.slanted' : union [SlantedHBars] [SlantedVBars 0] - create-glyph 'numbersign.slantedOpen' : union + create-glyph 'numberSign.slanted' : union [SlantedHBars] [SlantedVBars 0] + create-glyph 'numberSign.slantedOpen' : union SlantedVBars pFineOpen difference SlantedHBars @@ -1009,7 +1009,7 @@ glyph-block Symbol-Punctuation-Slashes-And-Number-Sign : begin corner (l + x - w + pFineOpen * fine) nsBot - select-variant 'numbersign' '#' + select-variant 'numberSign' '#' glyph-block Symbol-Punctuation-Dashes : begin diff --git a/font-src/index.js b/font-src/index.js index 50246cd71..b9de868ed 100644 --- a/font-src/index.js +++ b/font-src/index.js @@ -8,8 +8,8 @@ const Toml = require("@iarna/toml"); const BuildFont = require("./gen/build-font.js"); const Parameters = require("./support/parameters"); -const FormVariantData = require("./support/variant-data"); -const FormLigationData = require("./support/ligation-data"); +const VariantData = require("./support/variant-data"); +const ApplyLigationData = require("./support/ligation-data"); const { createGrDisplaySheet } = require("./support/gr"); module.exports = async function main(argv) { @@ -38,24 +38,9 @@ async function getParameters(argv) { const rawVariantsData = await tryParseToml(VARIANTS_TOML); const rawLigationData = await tryParseToml(LIGATIONS_TOML); - let para = {}; - Parameters.apply(para, parametersData, ["iosevka"]); - Parameters.apply(para, parametersData, argv.preHives); - Parameters.apply(para, parametersData, ["shapeWeight"], { shapeWeight: argv.shape.weight }); - Parameters.apply(para, parametersData, ["shapeWidth"], { shapeWidth: argv.shape.width }); - Parameters.apply(para, parametersData, [`s-${argv.shape.slope}`]); - Parameters.apply(para, parametersData, [`diversity-${argv.shape.quasiProportionalDiversity}`]); - - const variantsData = FormVariantData(rawVariantsData, para); - para.variants = variantsData; - para.variantSelector = {}; - Parameters.apply(para.variantSelector, variantsData, ["default", ...argv.preHives]); - para.defaultVariant = variantsData.default; - - const ligationData = FormLigationData(rawLigationData, para); - para.defaultBuildup = { ...ligationData.defaultBuildup }; - para.ligation = {}; - Parameters.apply(para.ligation, ligationData.hives, ["default", ...argv.preHives]); + let para = Parameters.init(parametersData, argv); + VariantData.apply(rawVariantsData, para, argv); + ApplyLigationData(rawLigationData, para, argv); if (argv.excludedCharRanges) para.excludedCharRanges = argv.excludedCharRanges; if (argv.compatibilityLigatures) para.compLig = argv.compatibilityLigatures; diff --git a/font-src/meta/macros.ptl b/font-src/meta/macros.ptl index 4d11d60bf..425638635 100644 --- a/font-src/meta/macros.ptl +++ b/font-src/meta/macros.ptl @@ -182,7 +182,7 @@ define-macro glyph-block : syntax-rules set externEnv.$glyphBlockVariableUsage$ variableSet define captureImports `[metrics $NamedParameterPair$ $donothing$ para recursive - recursiveCodes variantSelector glyphStore $createAndSaveGlyphImpl$ + recursiveCodes glyphStore $createAndSaveGlyphImpl$ spirofns booleFns MarkSet AS_BASE ALSO_METRICS pickHash buildGlyphs tagged DivFrame fontMetrics $assignUnicodeImpl$] define metricImports `[UPM HalfUPM Width SB CAP XH Descender Contrast SymbolMid ParenTop diff --git a/font-src/otl/gsub-cv-ss.ptl b/font-src/otl/gsub-cv-ss.ptl index df2e809e3..c39357b17 100644 --- a/font-src/otl/gsub-cv-ss.ptl +++ b/font-src/otl/gsub-cv-ss.ptl @@ -1,9 +1,10 @@ import [add-lookup add-common-feature pick-feature add-feature-lookup pick-lookup BeginLookupBlock EndLookupBlock] from "./table-util" -import [AnyCv CvDecompose] from "../support/gr" +import [Cv AnyCv CvDecompose] from "../support/gr" extern Set define [FeatureName tag] : tag + '_cvss' -define [LookupName tag] : 'lookup_cvss_' + tag +define [CvLookupName tag] : 'lookup_cv_' + tag +define [SsLookupName tag] : 'lookup_ss_' + tag export : define [buildCVSS sink para glyphStore] : begin if [not para.enableCvSs] : return nothing @@ -17,34 +18,50 @@ export : define [buildCVSS sink para glyphStore] : begin local parts : CvDecompose.get g if (parts && parts.length) : set decompositions.(gid) parts - define lookupCvDecompose : add-lookup sink : object + define lookupNameCvDecompose : add-lookup sink : object .type 'gsub_multiple' .subtables : list decompositions # cvxx - foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin + foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : do foreach [gr : items-of : AnyCv.query glyph] : if gr.tag : begin - local lookupName : LookupName gr.tag + local lookupName : CvLookupName gr.tag if [not : cvLookupNameSet.has lookupName] : begin local feature : pick-feature sink [FeatureName gr.tag] add-common-feature sink feature local lookup : pick-lookup sink lookupName - begin {.type 'gsub_single' .subtables {{.}}} - add-feature-lookup feature lookupCvDecompose + begin {.type 'gsub_alternate' .subtables {{.}}} + add-feature-lookup feature lookupNameCvDecompose add-feature-lookup feature lookupName - sink.lookupDep.push { lookupCvDecompose lookupName } + sink.lookupDep.push { lookupNameCvDecompose lookupName } cvLookupNameSet.add lookupName - set [pick-lookup sink lookupName].subtables.0.(gn) [gr.get glyph] + local st [pick-lookup sink lookupName].subtables.0 + if [not st.(gn)] : set st.(gn) { } + set st.(gn).(gr.rank - 1) : gr.get glyph # ssxx - foreach [{name composition} : pairs-of para.variants] : begin - if (name.length === 4 && composition.__isComposite && [name.slice 0 2] === 'ss') : begin - local feature : pick-feature sink [FeatureName name] - add-common-feature sink feature - add-feature-lookup feature lookupCvDecompose - foreach [{ch tag} : pairs-of composition.__cvmap] - add-feature-lookup feature [LookupName tag] + foreach {name composition} para.variants.composites : if composition.tag : do + local feature : pick-feature sink [FeatureName composition.tag] + add-common-feature sink feature + add-feature-lookup feature lookupNameCvDecompose + local lookupNameSub : add-lookup sink {.type 'gsub_single' .subtables {{.}}} + sink.lookupDep.push { lookupNameCvDecompose lookupNameSub } + add-feature-lookup feature lookupNameSub + + define st [pick-lookup sink lookupNameSub].subtables.0 + local decomp : composition.decompose para para.variants.selectorTree + foreach { prime pv } [items-of decomp] : if (pv.tag && pv.rank) : begin + local gr : Cv pv.tag pv.rank + foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin + local substituted : gr.get glyph + if substituted : set st.(gn) substituted + + # If there are holes in the alternates list, fill them + foreach lutn cvLookupNameSet : begin + local st [pick-lookup sink lutn].subtables.0 + foreach { k v } [pairs-of st] : foreach idx [range 0 v.length] : if [not v.(idx)] + set v.(idx) k EndLookupBlock rec sink diff --git a/font-src/otl/gsub-ligation.ptl b/font-src/otl/gsub-ligation.ptl index 4440aec74..b394a444a 100644 --- a/font-src/otl/gsub-ligation.ptl +++ b/font-src/otl/gsub-ligation.ptl @@ -56,7 +56,7 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] : define [acops] {'less' 'greater' 'hyphen' 'equal' 'plus'} define [acskip] { 'slash' 'bar' 'at' 'ampersand' 'percent' - 'numbersign' 'numbersign.upright' 'numbersign.slanted' + 'numberSign' 'numberSign.upright' 'numberSign.slanted' } define dottyPunctuations : list * "colon" @@ -79,7 +79,7 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] : * 'plus' * 'less' * 'greater' - * 'numbersign' + * 'numberSign' * 'slash' * 'ampersand' * 'asterisk' diff --git a/font-src/otl/index.ptl b/font-src/otl/index.ptl index 075daa405..e704e4ea7 100644 --- a/font-src/otl/index.ptl +++ b/font-src/otl/index.ptl @@ -34,7 +34,7 @@ define [buildGSUB para glyphStore markGlyphs] : begin # Ligation if para.enableLigation : do - define plm : objectAssign {.} para.defaultBuildup + define plm : objectAssign {.} para.ligation.defaultBuildup if (para.ligation.caltBuildup && para.ligation.caltBuildup.length) : begin set plm.calt para.ligation.caltBuildup buildLigations gsub para plm diff --git a/font-src/support/gr.js b/font-src/support/gr.js index 46ea858cb..3c87086b9 100644 --- a/font-src/support/gr.js +++ b/font-src/support/gr.js @@ -90,25 +90,27 @@ const Radical = { }; const CvTagCache = new Map(); -function Cv(tag) { - if (CvTagCache.has(tag)) return CvTagCache.get(tag); +function Cv(tag, rank) { + const key = tag + "#" + rank; + if (CvTagCache.has(key)) return CvTagCache.get(key); const rel = { tag, + rank, get(glyph) { - if (glyph && glyph.related && glyph.related.cv) return glyph.related.cv[tag]; + if (glyph && glyph.related && glyph.related.cv) return glyph.related.cv[key]; else return null; }, set(glyph, toGid) { if (typeof toGid !== "string") throw new Error("Must supply a GID instead of a glyph"); if (!glyph.related) glyph.related = {}; if (!glyph.related.cv) glyph.related.cv = {}; - glyph.related.cv[tag] = toGid; + glyph.related.cv[key] = toGid; }, amendName(name) { - return name + "." + tag; + return name + "." + key; } }; - CvTagCache.set(tag, rel); + CvTagCache.set(key, rel); return rel; } @@ -125,8 +127,10 @@ const AnyCv = { query(glyph) { let ret = []; if (glyph && glyph.related && glyph.related.cv) { - for (const tag in glyph.related.cv) { - const rel = Cv(tag); + for (const key in glyph.related.cv) { + const [tag, rankStr] = key.split("#"); + const rank = parseInt(rankStr, 10); + const rel = Cv(tag, rank); if (rel.get(glyph)) ret.push(rel); } } @@ -139,8 +143,10 @@ const AnyDerivingCv = { query(glyph) { let ret = []; if (glyph && !DoNotDeriveVariants.get(glyph) && glyph.related && glyph.related.cv) { - for (const tag in glyph.related.cv) { - const rel = Cv(tag); + for (const key in glyph.related.cv) { + const [tag, rankStr] = key.split("#"); + const rank = parseInt(rankStr, 10); + const rel = Cv(tag, rank); if (rel.get(glyph)) ret.push(rel); } } diff --git a/font-src/support/ligation-data.js b/font-src/support/ligation-data.js index 89aa9275c..680c3a82f 100644 --- a/font-src/support/ligation-data.js +++ b/font-src/support/ligation-data.js @@ -1,6 +1,8 @@ "use strict"; -module.exports = function formVariantData(data, para) { +const Parameters = require("./parameters"); + +module.exports = function applyLigationData(data, para, argv) { const optInBuildup = {}; const optOutBuildup = {}; @@ -24,7 +26,11 @@ module.exports = function formVariantData(data, para) { } } - return { defaultBuildup: { ...optInBuildup, ...optOutBuildup }, hives }; + para.ligation = { + defaultBuildup: { ...optInBuildup, ...optOutBuildup }, + caltBuildup: [] + }; + if (argv.ligationBuildup) Parameters.apply(para.ligation, hives, [argv.ligationBuildup]); }; function createBuildup(simple, buildup) { diff --git a/font-src/support/parameters.js b/font-src/support/parameters.js index bb40e865c..ab63c9305 100644 --- a/font-src/support/parameters.js +++ b/font-src/support/parameters.js @@ -2,11 +2,27 @@ const monotonicInterpolate = require("./monotonic-interpolate"); +exports.init = initPara; +function initPara(data, argv) { + let para = {}; + apply(para, data, ["iosevka"]); + if (argv.shape.serifs) apply(para, data, ["serifs-" + argv.shape.serifs]); + if (argv.shape.spacing) apply(para, data, ["spacing-" + argv.shape.spacing]); + if (argv.shape.digitForm) apply(para, data, ["digit-form-" + argv.shape.digitForm]); + apply(para, data, ["shapeWeight"], { shapeWeight: argv.shape.weight }); + apply(para, data, ["shapeWidth"], { shapeWidth: argv.shape.width }); + apply(para, data, [`s-${argv.shape.slope}`]); + apply(para, data, [`diversity-${argv.shape.quasiProportionalDiversity}`]); + if (argv.featureControl.noCvSs) para.enableCvSs = false; + if (argv.featureControl.noLigation) para.enableLigation = false; + return para; +} + +exports.apply = apply; function apply(sink, parametersData, styles, blendArgs) { if (!styles) return; for (const item of styles) intro(parametersData, item, blendArgs, sink); } -exports.apply = apply; function intro(source, style, blendArgs, sink) { let hive = source[style]; @@ -70,6 +86,23 @@ function hiveBlend(hive, value) { return generatedHive; } +exports.applyMetricOverride = applyMetricOverride; +function applyMetricOverride(para, mo) { + const overrideObj = { metricOverride: {} }; + createMetricDataSet(overrideObj.metricOverride, mo); + apply(para, overrideObj, ["metricOverride"]); +} + +function createMetricDataSet(sink, mo) { + for (const key in mo) { + if (metricOverrideHandlers[key]) { + metricOverrideHandlers[key](sink, key, mo[key]); + } else { + console.error(`Metric override key ${key} is not supported. Skipping it.`); + } + } +} + function numericFieldHandler(sink, key, x) { if (x != null && isFinite(x)) sink[key] = x; } @@ -91,18 +124,3 @@ const metricOverrideHandlers = { multiplies: subObjectHandler, adds: subObjectHandler }; -function createMetricDataSet(sink, mo) { - for (const key in mo) { - if (metricOverrideHandlers[key]) { - metricOverrideHandlers[key](sink, key, mo[key]); - } else { - console.error(`Metric override key ${key} is not supported. Skipping it.`); - } - } -} -function applyMetricOverride(para, mo) { - const overrideObj = { metricOverride: {} }; - createMetricDataSet(overrideObj.metricOverride, mo); - apply(para, overrideObj, ["metricOverride"]); -} -exports.applyMetricOverride = applyMetricOverride; diff --git a/font-src/support/variant-data.js b/font-src/support/variant-data.js index 6491c569a..383301a3f 100644 --- a/font-src/support/variant-data.js +++ b/font-src/support/variant-data.js @@ -1,73 +1,145 @@ "use strict"; -const objectAssign = require("object-assign"); +exports.apply = applyVariantData; +function applyVariantData(data, para, argv) { + const parsed = parseVariantsData(data); + let tagSet = new Set(); + for (const prime of parsed.primes.values()) { + if (!prime.tag) continue; + if (!tagSet.has(prime.tag)) tagSet.add(prime.tag); + else throw new Error(`CV tag conflict: ${prime.tag}`); + } -function mergeVSHive(_target, source) { - if (!source) return _target; - let __cvmap = objectAssign({}, _target.__cvmap, source.__cvmap); - let target = objectAssign(_target, source); - target.__cvmap = __cvmap; - return target; + const variantSelector = {}; + parsed.defaultComposite.resolve(para, parsed.selectorTree, parsed.composites, variantSelector); + if (argv.serif === "slab") { + const slabComp = parsed.composites.get("slab"); + slabComp.resolve(para, parsed.selectorTree, parsed.composites, variantSelector); + } + if (argv.variants) { + const userComposite = new Composite("{user}", argv.variants); + userComposite.resolve(para, parsed.selectorTree, parsed.composites, variantSelector); + } + + para.variants = { + selectorTree: parsed.selectorTree, + primes: parsed.primes, + composites: parsed.composites + }; + para.variantSelector = variantSelector; } -function produceComposite(vs, para, g) { - let sel = {}; - if (g.design) - for (let h of g.design) { - sel = mergeVSHive(sel, vs[h]); - } - if (!para.isItalic && g.upright) { - for (let h of g.upright) { - sel = mergeVSHive(sel, vs[h]); - } +exports.parse = parseVariantsData; +function parseVariantsData(data) { + const primes = new Map(); + const selectorTree = new SelectorTree(); + for (const k in data.prime) { + const p = new Prime(k, data.prime[k]); + p.register(selectorTree); + primes.set(k, p); } - if (para.isItalic && g.italic) { - for (let h of g.italic) { - sel = mergeVSHive(sel, vs[h]); - } + + const defaultComposite = new Composite("{default}", data.default); + const composites = new Map(); + for (const k in data.composite) { + const comp = new Composite(k, data.composite[k]); + composites.set(k, comp); } - sel.__isComposite = true; - return sel; + + return { selectorTree: selectorTree, primes, composites, defaultComposite }; } -module.exports = function formVariantData(data, para) { - const vs = {}; - // simple selector - for (let k in data.simple) { - const varDef = data.simple[k]; - const hive = { - ...varDef.variant, - ...(para.isItalic ? varDef.variantItalic : varDef.variantUpright) - }; - vs[k] = hive; +class SelectorTree { + constructor() { + this.m_mapping = new Map(); + } + get(kPrime, kVariant) { + if (!this.m_mapping.has(kPrime)) return undefined; + return this.m_mapping.get(kPrime).get(kVariant); + } + set(kPrime, kVariant, prime, variant) { + if (!this.m_mapping.has(kPrime)) this.m_mapping.set(kPrime, new Map()); + this.m_mapping.get(kPrime).set(kVariant, [prime, variant]); + } + *[Symbol.iterator]() { + for (const m of this.m_mapping.values()) yield* m.values(); + } +} - const tag = varDef.tag; - const tagUpright = varDef.tagUpright; - const tagItalic = varDef.tagItalic; - if (tag) { - let __cvmap = {}; - for (let k in hive) __cvmap[k] = tag; - hive.__cvmap = __cvmap; - vs[tag] = hive; +class Composite { + constructor(key, cfg) { + this.key = key; + this.tag = cfg.tag; + this.description = cfg.description; + this.inherits = cfg.inherits; + this.design = cfg.design; + this.upright = cfg.upright; + this.italic = cfg.italic; + } + decompose(para, selTree) { + const ans = []; + const cfg = Object.assign({}, this.design, para.isItalic ? this.italic : this.upright); + for (const [k, v] of Object.entries(cfg)) { + const pv = selTree.get(k, v); + if (!pv) throw new Error(`Composite ${this.key} cannot be resolved: ${[k, v]}.`); + ans.push(pv); + } + return ans; + } + resolve(para, selTree, catalog, vs) { + if (this.inherits) { + for (const item of this.inherits) { + if (!catalog.has(item)) throw new Error(`Cannot find composite variant: ${item}`); + catalog.get(item).resolve(para, selTree, catalog, vs); + } + } + for (const [prime, variant] of this.decompose(para, selTree)) { + variant.resolve(para, vs); + } + } +} + +class Prime { + constructor(key, cfg) { + this.key = key; + this.sampler = cfg.sampler; + this.tag = cfg.tag; + if (!cfg.variants) throw new Error(`Missing variants in ${key}`); + this.variants = new Map(); + for (const varKey in cfg.variants) { + const variant = cfg.variants[varKey]; + this.variants.set(varKey, new PrimeVariant(varKey, cfg.tag, variant)); + } + } + register(tree) { + for (const [k, v] of this.variants) tree.set(this.key, k, this, v); + if (this.tag) { + for (const v of this.variants.values()) if (v.rank) tree.set(this.tag, v.rank, this, v); + } + } +} + +class PrimeVariant { + constructor(key, tag, cfg) { + this.key = key; + this.tag = tag; + this.description = cfg.description; + this.rank = cfg.rank; + this.selector = cfg.selector; + this.selectorUpright = cfg.selectorUpright; + this.selectorItalic = cfg.selectorItalic; + } + resolveFor(para, gn) { + let vs = {}; + this.resolve(para, vs); + return vs[gn]; + } + resolve(para, vs) { + Object.assign(vs, this.selector); + if (para.isItalic) { + Object.assign(vs, this.selectorItalic); } else { - if (tagItalic && para.isItalic) { - let __cvmap = {}; - for (let k in hive) __cvmap[k] = tagItalic; - hive.__cvmap = __cvmap; - vs[tagItalic] = hive; - } - if (tagUpright && !para.isItalic) { - let __cvmap = {}; - for (let k in hive) __cvmap[k] = tagUpright; - hive.__cvmap = __cvmap; - vs[tagUpright] = hive; - } + Object.assign(vs, this.selectorUpright); } } - // default selector - vs.default = produceComposite(vs, para, data.default); - // ss## selector - for (let k in data.composite) vs[k] = produceComposite(vs, para, data.composite[k]); - - return vs; -}; +} diff --git a/images/charvars.png b/images/charvars.png index 4d4e373a7..41d6f29ac 100644 Binary files a/images/charvars.png and b/images/charvars.png differ diff --git a/images/iosevka-aile.png b/images/iosevka-aile.png index 9634c4277..43ffa518c 100644 Binary files a/images/iosevka-aile.png and b/images/iosevka-aile.png differ diff --git a/images/iosevka-curly-slab.png b/images/iosevka-curly-slab.png index 9ca6a77f2..abd9aa0a3 100644 Binary files a/images/iosevka-curly-slab.png and b/images/iosevka-curly-slab.png differ diff --git a/images/iosevka-curly.png b/images/iosevka-curly.png index 89f96c90a..2a1bf36c5 100644 Binary files a/images/iosevka-curly.png and b/images/iosevka-curly.png differ diff --git a/images/iosevka-etoile.png b/images/iosevka-etoile.png index b2508de47..1e9f06b26 100644 Binary files a/images/iosevka-etoile.png and b/images/iosevka-etoile.png differ diff --git a/images/iosevka-fixed-curly-slab.png b/images/iosevka-fixed-curly-slab.png index 47e065b95..878f19f67 100644 Binary files a/images/iosevka-fixed-curly-slab.png and b/images/iosevka-fixed-curly-slab.png differ diff --git a/images/iosevka-fixed-curly.png b/images/iosevka-fixed-curly.png index 4b621e072..a28456195 100644 Binary files a/images/iosevka-fixed-curly.png and b/images/iosevka-fixed-curly.png differ diff --git a/images/iosevka-fixed-slab.png b/images/iosevka-fixed-slab.png index 67093d293..a790cdf3a 100644 Binary files a/images/iosevka-fixed-slab.png and b/images/iosevka-fixed-slab.png differ diff --git a/images/iosevka-fixed-ss01.png b/images/iosevka-fixed-ss01.png index 043390af8..454a52312 100644 Binary files a/images/iosevka-fixed-ss01.png and b/images/iosevka-fixed-ss01.png differ diff --git a/images/iosevka-fixed-ss02.png b/images/iosevka-fixed-ss02.png index 55c4cc2c7..112956542 100644 Binary files a/images/iosevka-fixed-ss02.png and b/images/iosevka-fixed-ss02.png differ diff --git a/images/iosevka-fixed-ss03.png b/images/iosevka-fixed-ss03.png index 682631ac6..7ffb5d650 100644 Binary files a/images/iosevka-fixed-ss03.png and b/images/iosevka-fixed-ss03.png differ diff --git a/images/iosevka-fixed-ss04.png b/images/iosevka-fixed-ss04.png index 8a05190e5..1a75f9277 100644 Binary files a/images/iosevka-fixed-ss04.png and b/images/iosevka-fixed-ss04.png differ diff --git a/images/iosevka-fixed-ss05.png b/images/iosevka-fixed-ss05.png index 57c8927bd..a00e66ff5 100644 Binary files a/images/iosevka-fixed-ss05.png and b/images/iosevka-fixed-ss05.png differ diff --git a/images/iosevka-fixed-ss06.png b/images/iosevka-fixed-ss06.png index cc34772db..4c1182d2b 100644 Binary files a/images/iosevka-fixed-ss06.png and b/images/iosevka-fixed-ss06.png differ diff --git a/images/iosevka-fixed-ss07.png b/images/iosevka-fixed-ss07.png index 7f1d94916..4c405c658 100644 Binary files a/images/iosevka-fixed-ss07.png and b/images/iosevka-fixed-ss07.png differ diff --git a/images/iosevka-fixed-ss08.png b/images/iosevka-fixed-ss08.png index ec99c848e..9f1fecd3a 100644 Binary files a/images/iosevka-fixed-ss08.png and b/images/iosevka-fixed-ss08.png differ diff --git a/images/iosevka-fixed-ss09.png b/images/iosevka-fixed-ss09.png index 44b7174ad..df3cd2712 100644 Binary files a/images/iosevka-fixed-ss09.png and b/images/iosevka-fixed-ss09.png differ diff --git a/images/iosevka-fixed-ss10.png b/images/iosevka-fixed-ss10.png index 50892bda8..6f37dbaf7 100644 Binary files a/images/iosevka-fixed-ss10.png and b/images/iosevka-fixed-ss10.png differ diff --git a/images/iosevka-fixed-ss11.png b/images/iosevka-fixed-ss11.png index 525350dab..defc8820a 100644 Binary files a/images/iosevka-fixed-ss11.png and b/images/iosevka-fixed-ss11.png differ diff --git a/images/iosevka-fixed-ss12.png b/images/iosevka-fixed-ss12.png index 105f9dfbd..df824aef2 100644 Binary files a/images/iosevka-fixed-ss12.png and b/images/iosevka-fixed-ss12.png differ diff --git a/images/iosevka-fixed-ss13.png b/images/iosevka-fixed-ss13.png index 20cac3d27..0ba0e84ca 100644 Binary files a/images/iosevka-fixed-ss13.png and b/images/iosevka-fixed-ss13.png differ diff --git a/images/iosevka-fixed-ss14.png b/images/iosevka-fixed-ss14.png index e41351dcc..d6607f860 100644 Binary files a/images/iosevka-fixed-ss14.png and b/images/iosevka-fixed-ss14.png differ diff --git a/images/iosevka-fixed.png b/images/iosevka-fixed.png index e3192148d..50062d625 100644 Binary files a/images/iosevka-fixed.png and b/images/iosevka-fixed.png differ diff --git a/images/iosevka-slab.png b/images/iosevka-slab.png index bb328f073..f8e4e40db 100644 Binary files a/images/iosevka-slab.png and b/images/iosevka-slab.png differ diff --git a/images/iosevka-sparkle.png b/images/iosevka-sparkle.png index 8028fda16..fde726a7e 100644 Binary files a/images/iosevka-sparkle.png and b/images/iosevka-sparkle.png differ diff --git a/images/iosevka-ss01.png b/images/iosevka-ss01.png index bcfc9f3f2..3b4233409 100644 Binary files a/images/iosevka-ss01.png and b/images/iosevka-ss01.png differ diff --git a/images/iosevka-ss02.png b/images/iosevka-ss02.png index 090dadf06..99c580814 100644 Binary files a/images/iosevka-ss02.png and b/images/iosevka-ss02.png differ diff --git a/images/iosevka-ss03.png b/images/iosevka-ss03.png index 8aeb67780..f621ca5b6 100644 Binary files a/images/iosevka-ss03.png and b/images/iosevka-ss03.png differ diff --git a/images/iosevka-ss04.png b/images/iosevka-ss04.png index 50c08db56..e357d6b32 100644 Binary files a/images/iosevka-ss04.png and b/images/iosevka-ss04.png differ diff --git a/images/iosevka-ss05.png b/images/iosevka-ss05.png index c724497cc..1e262f22a 100644 Binary files a/images/iosevka-ss05.png and b/images/iosevka-ss05.png differ diff --git a/images/iosevka-ss06.png b/images/iosevka-ss06.png index 3406c765e..70becb930 100644 Binary files a/images/iosevka-ss06.png and b/images/iosevka-ss06.png differ diff --git a/images/iosevka-ss07.png b/images/iosevka-ss07.png index 86c1a49b3..70fc1bccc 100644 Binary files a/images/iosevka-ss07.png and b/images/iosevka-ss07.png differ diff --git a/images/iosevka-ss08.png b/images/iosevka-ss08.png index bb5f2e2eb..24bb135c2 100644 Binary files a/images/iosevka-ss08.png and b/images/iosevka-ss08.png differ diff --git a/images/iosevka-ss09.png b/images/iosevka-ss09.png index b9f2d835c..de94e3178 100644 Binary files a/images/iosevka-ss09.png and b/images/iosevka-ss09.png differ diff --git a/images/iosevka-ss10.png b/images/iosevka-ss10.png index 1337aa8de..6f624cd96 100644 Binary files a/images/iosevka-ss10.png and b/images/iosevka-ss10.png differ diff --git a/images/iosevka-ss11.png b/images/iosevka-ss11.png index 3ee0a742b..9ca68a33a 100644 Binary files a/images/iosevka-ss11.png and b/images/iosevka-ss11.png differ diff --git a/images/iosevka-ss12.png b/images/iosevka-ss12.png index 545f5ea44..6d8bbae5f 100644 Binary files a/images/iosevka-ss12.png and b/images/iosevka-ss12.png differ diff --git a/images/iosevka-ss13.png b/images/iosevka-ss13.png index f4d9da1bb..890c7a85f 100644 Binary files a/images/iosevka-ss13.png and b/images/iosevka-ss13.png differ diff --git a/images/iosevka-ss14.png b/images/iosevka-ss14.png index 1e1f74ccc..3c65789fa 100644 Binary files a/images/iosevka-ss14.png and b/images/iosevka-ss14.png differ diff --git a/images/iosevka-term-curly-slab.png b/images/iosevka-term-curly-slab.png index 60ce7d79b..835b1aced 100644 Binary files a/images/iosevka-term-curly-slab.png and b/images/iosevka-term-curly-slab.png differ diff --git a/images/iosevka-term-curly.png b/images/iosevka-term-curly.png index 5a0ca8f48..7b722fe5e 100644 Binary files a/images/iosevka-term-curly.png and b/images/iosevka-term-curly.png differ diff --git a/images/iosevka-term-slab.png b/images/iosevka-term-slab.png index 9bea7a43b..8a916c428 100644 Binary files a/images/iosevka-term-slab.png and b/images/iosevka-term-slab.png differ diff --git a/images/iosevka-term-ss01.png b/images/iosevka-term-ss01.png index 045856edd..385ef571d 100644 Binary files a/images/iosevka-term-ss01.png and b/images/iosevka-term-ss01.png differ diff --git a/images/iosevka-term-ss02.png b/images/iosevka-term-ss02.png index 6067d822e..28817a21d 100644 Binary files a/images/iosevka-term-ss02.png and b/images/iosevka-term-ss02.png differ diff --git a/images/iosevka-term-ss03.png b/images/iosevka-term-ss03.png index a61d6c48f..2d106413b 100644 Binary files a/images/iosevka-term-ss03.png and b/images/iosevka-term-ss03.png differ diff --git a/images/iosevka-term-ss04.png b/images/iosevka-term-ss04.png index aff5d2f13..6ec0e094b 100644 Binary files a/images/iosevka-term-ss04.png and b/images/iosevka-term-ss04.png differ diff --git a/images/iosevka-term-ss05.png b/images/iosevka-term-ss05.png index f387a4e76..b3bc0c2df 100644 Binary files a/images/iosevka-term-ss05.png and b/images/iosevka-term-ss05.png differ diff --git a/images/iosevka-term-ss06.png b/images/iosevka-term-ss06.png index e8b3e199a..f2a7c9d05 100644 Binary files a/images/iosevka-term-ss06.png and b/images/iosevka-term-ss06.png differ diff --git a/images/iosevka-term-ss07.png b/images/iosevka-term-ss07.png index e84481235..178981ee6 100644 Binary files a/images/iosevka-term-ss07.png and b/images/iosevka-term-ss07.png differ diff --git a/images/iosevka-term-ss08.png b/images/iosevka-term-ss08.png index 60e3a3c62..42ec6bc58 100644 Binary files a/images/iosevka-term-ss08.png and b/images/iosevka-term-ss08.png differ diff --git a/images/iosevka-term-ss09.png b/images/iosevka-term-ss09.png index 995837a77..d32195119 100644 Binary files a/images/iosevka-term-ss09.png and b/images/iosevka-term-ss09.png differ diff --git a/images/iosevka-term-ss10.png b/images/iosevka-term-ss10.png index 271768123..4c15cc66d 100644 Binary files a/images/iosevka-term-ss10.png and b/images/iosevka-term-ss10.png differ diff --git a/images/iosevka-term-ss11.png b/images/iosevka-term-ss11.png index ff54167e4..725621d9a 100644 Binary files a/images/iosevka-term-ss11.png and b/images/iosevka-term-ss11.png differ diff --git a/images/iosevka-term-ss12.png b/images/iosevka-term-ss12.png index 14440424d..df3aef89b 100644 Binary files a/images/iosevka-term-ss12.png and b/images/iosevka-term-ss12.png differ diff --git a/images/iosevka-term-ss13.png b/images/iosevka-term-ss13.png index 13eff8816..0bca2222e 100644 Binary files a/images/iosevka-term-ss13.png and b/images/iosevka-term-ss13.png differ diff --git a/images/iosevka-term-ss14.png b/images/iosevka-term-ss14.png index c0f47cf25..f847ef3c0 100644 Binary files a/images/iosevka-term-ss14.png and b/images/iosevka-term-ss14.png differ diff --git a/images/iosevka-term.png b/images/iosevka-term.png index f2fcdb61e..1e35b6a7b 100644 Binary files a/images/iosevka-term.png and b/images/iosevka-term.png differ diff --git a/images/iosevka.png b/images/iosevka.png index 7d8e8c45f..af9430b6b 100644 Binary files a/images/iosevka.png and b/images/iosevka.png differ diff --git a/images/languages.png b/images/languages.png index e415d6c57..6b8b4c6b7 100644 Binary files a/images/languages.png and b/images/languages.png differ diff --git a/images/ligations.png b/images/ligations.png index fae2bc524..995c8c51b 100644 Binary files a/images/ligations.png and b/images/ligations.png differ diff --git a/images/matrix.png b/images/matrix.png index 4c334ea57..bf9d2979b 100644 Binary files a/images/matrix.png and b/images/matrix.png differ diff --git a/images/preview-all.png b/images/preview-all.png index c67245efc..61b2693ee 100644 Binary files a/images/preview-all.png and b/images/preview-all.png differ diff --git a/images/stylesets.png b/images/stylesets.png index e0f13314d..a6bdafcda 100644 Binary files a/images/stylesets.png and b/images/stylesets.png differ diff --git a/images/weights.png b/images/weights.png index 04580f279..5e131b565 100644 Binary files a/images/weights.png and b/images/weights.png differ diff --git a/package.json b/package.json index 483667845..c4a08d381 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iosevka", - "version": "3.7.1", + "version": "4.0.0-alpha.0", "main": "./font-src/index.js", "scripts": { "build": "verda -f verdafile.js", diff --git a/params/parameters.toml b/params/parameters.toml index 22c7dc89d..9c0701322 100644 --- a/params/parameters.toml +++ b/params/parameters.toml @@ -66,39 +66,32 @@ excludedCharRanges = [] # - 2+ : Full (3.x) slab = 0 +# Enable old-style digits by default? +defaultToOldStyleFigures = false + [verbose] verbose = true ###### Slab variant -[slab] +[serifs-slab] slab = 2 ###### Spacings # Terminal variant -[sp-term] +[spacing-term] spacing = 0 # "FontFonfig Monospace" -[sp-force-monospace] +[spacing-fontconfig-mono] spacing = 0 forceMonospace = true # Fixed variant -[sp-fixed] +[spacing-fixed] spacing = 0 enableLigation = false forceMonospace = true -###### Disabling Ligation -[no-ligation] -enableLigation = false -[nolig] # For compatibility -enableLigation = false - -###### Disabling CV/SS -[no-cv-ss] -enableCvSs = false - ###### Slopes [s-italic] isItalic = true @@ -130,180 +123,8 @@ diversityI = 0.75 diversityII = 0.5 ###### Old-style figures -[default-to-old-style-figures] +[digit-form-old-style] defaultToOldStyleFigures = true -[default-to-old-style-digits] -defaultToOldStyleFigures = true - -[default-to-lining-figures] +[digit-form-lining] defaultToOldStyleFigures = false - -[default-to-lining-digits] -defaultToOldStyleFigures = false - -################################################################################################### -### Metric-override hives -### These hives are now discouraged in favor of 'metric-override' in build plans but they are -### still supported in version 3.x. - -###### Leading -[leading-750] -leading = 750 -[leading-1000] -leading = 1000 -[leading-1250] -leading = 1250 -[leading-1500] -leading = 1500 -[leading-1750] -leading = 1750 -[leading-2000] -leading = 2000 - -###### Win metric pad -[win-metric-pad-0] -winMetricAscenderPad = 0 -winMetricDescenderPad = 0 -[win-metric-pad-50] -winMetricAscenderPad = 50 -winMetricDescenderPad = 50 -[win-metric-pad-100] -winMetricAscenderPad = 100 -winMetricDescenderPad = 100 -[win-metric-pad-150] -winMetricAscenderPad = 150 -winMetricDescenderPad = 150 -[win-metric-pad-200] -winMetricAscenderPad = 200 -winMetricDescenderPad = 200 -[win-metric-pad-250] -winMetricAscenderPad = 250 -winMetricDescenderPad = 250 -[win-metric-pad-300] -winMetricAscenderPad = 300 -winMetricDescenderPad = 300 - -###### Powerline -[powerline-scale-y-750] -powerlineScaleY = 0.75 -[powerline-scale-y-875] -powerlineScaleY = 0.875 -[powerline-scale-y-1000] -powerlineScaleY = 1 -[powerline-scale-y-1125] -powerlineScaleY = 1.125 -[powerline-scale-y-1250] -powerlineScaleY = 1.25 -[powerline-scale-y-1375] -powerlineScaleY = 1.375 -[powerline-scale-y-1500] -powerlineScaleY = 1.5 -[powerline-scale-x-750] -powerlineScaleX = 0.75 -[powerline-scale-x-875] -powerlineScaleX = 0.875 -[powerline-scale-x-1000] -powerlineScaleX = 1 -[powerline-scale-x-1125] -powerlineScaleX = 1.125 -[powerline-scale-x-1250] -powerlineScaleX = 1.25 -[powerline-scale-x-1375] -powerlineScaleX = 1.375 -[powerline-scale-x-1500] -powerlineScaleX = 1.5 -[powerline-shift-y-n500] -powerlineShiftY = -500 -[powerline-shift-y-n450] -powerlineShiftY = -450 -[powerline-shift-y-n400] -powerlineShiftY = -400 -[powerline-shift-y-n350] -powerlineShiftY = -350 -[powerline-shift-y-n300] -powerlineShiftY = -300 -[powerline-shift-y-n250] -powerlineShiftY = -250 -[powerline-shift-y-n200] -powerlineShiftY = -200 -[powerline-shift-y-n150] -powerlineShiftY = -150 -[powerline-shift-y-n100] -powerlineShiftY = -100 -[powerline-shift-y-n50] -powerlineShiftY = -50 -[powerline-shift-y-0] -powerlineShiftY = 0 -[powerline-shift-y-p50] -powerlineShiftY = 50 -[powerline-shift-y-p100] -powerlineShiftY = 100 -[powerline-shift-y-p150] -powerlineShiftY = 150 -[powerline-shift-y-p200] -powerlineShiftY = 200 -[powerline-shift-y-p250] -powerlineShiftY = 250 -[powerline-shift-y-p300] -powerlineShiftY = 300 -[powerline-shift-y-p350] -powerlineShiftY = 350 -[powerline-shift-y-p400] -powerlineShiftY = 400 -[powerline-shift-y-p450] -powerlineShiftY = 450 -[powerline-shift-y-p500] -powerlineShiftY = 500 -[powerline-shift-x-n500] -powerlineShiftX = -500 -[powerline-shift-x-n450] -powerlineShiftX = -450 -[powerline-shift-x-n400] -powerlineShiftX = -400 -[powerline-shift-x-n350] -powerlineShiftX = -350 -[powerline-shift-x-n300] -powerlineShiftX = -300 -[powerline-shift-x-n250] -powerlineShiftX = -250 -[powerline-shift-x-n200] -powerlineShiftX = -200 -[powerline-shift-x-n150] -powerlineShiftX = -150 -[powerline-shift-x-n100] -powerlineShiftX = -100 -[powerline-shift-x-n50] -powerlineShiftX = -50 -[powerline-shift-x-0] -powerlineShiftX = 0 -[powerline-shift-x-p50] -powerlineShiftX = 50 -[powerline-shift-x-p100] -powerlineShiftX = 100 -[powerline-shift-x-p150] -powerlineShiftX = 150 -[powerline-shift-x-p200] -powerlineShiftX = 200 -[powerline-shift-x-p250] -powerlineShiftX = 250 -[powerline-shift-x-p300] -powerlineShiftX = 300 -[powerline-shift-x-p350] -powerlineShiftX = 350 -[powerline-shift-x-p400] -powerlineShiftX = 400 -[powerline-shift-x-p450] -powerlineShiftX = 450 -[powerline-shift-x-p500] -powerlineShiftX = 500 - -# Compatibility PUA ligature sample -# [[iosevka.compLig]] -# unicode = 57600 # 0xE100 -# featureTag = 'XV00' -# sequence = '<*>' - -# Exclude code points -[exclude-check-and-cross-symbol.appends] -excludedCharRanges = [[10003, 10008]] diff --git a/params/variants.toml b/params/variants.toml index 6cf549f6c..93e7ccc0e 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -1,1707 +1,2099 @@ # Variants -[simple.v-turn-v-straight] -tag = "cv73" +[prime.turn-v] sampler = 'AΛΔ' -description = 'Standard, straight `A`, `Λ`, `Δ`' -variant.A = "straight" -variant."grek/Lambda" = "straight" -variant."grek/Delta" = "straight" - -[simple.v-turn-v-curly] -tag = "cv74" -sampler = 'AΛΔ' -description = 'Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x' -variant.A = "curly" -variant."grek/Lambda" = "curly" -variant."grek/Delta" = "curly" - -[simple.v-capital-b-standard] -tag = "VXAP" -sampler = 'B' -description = 'Standard `B`' -variant.B = 'standard' - -[simple.v-capital-b-more-asymmetric] -tag = "VXAQ" -sampler = 'B' -description = 'More asymmetric `B` to differentiate with `8`' -variant.B = 'moreAsymmetric' - -[simple.v-capital-d-standard] -tag = "VXBG" -sampler = 'D' -description = 'Standard `D`' -variant.D = 'standard' - -[simple.v-capital-d-more-rounded] -tag = "VXBH" -sampler = 'D' -description = 'More rounded `D` to differentiate with `O`' -variant.D = 'moreRounded' - -[simple.v-capital-g-tooth] -tag = "cv91" -sampler = "G" -description = "Toothed G" -variant.G = "toothed" - -[simple.v-capital-g-toothless] -tag = "cv92" -sampler = "G" -description = "Toothless G" -variant.G = "toothless" - -[simple.v-capital-j-serifless] -tag = 'VXBY' -sampler = 'J' -description = 'J without top serif' -variant.J = "serifless" - -[simple.v-capital-j-serifed] -tag = 'VXBZ' -sampler = 'J' -description = 'J with top serif at left side' -variant.J = 'serifed' - -[simple.v-capital-j-serifed-both-sides] -tag = 'VXDA' -sampler = 'J' -description = 'J with symmetric at both sides' -variant.J = 'serifedBothSides' - -[simple.v-capital-j-serifed-symmetric] -tag = 'VXDB' -sampler = 'J' -description = 'J with symmetric at both sides and is symmetric' -variant.J = 'serifedSymmetric' - -[simple.v-capital-k-straight] -tag = "VXBR" -sampler = 'K' -description = '`K` with standard shape' -variant.K = 'straight' - -[simple.v-capital-k-curly] -tag = "VXFB" -sampler = 'K' -description = 'Slightly curly `K`, like Iosevka 2.x' -variant.K = 'curly' - -[simple.v-capital-m-hanging] -tag = 'VXCI' -sampler = 'M' -description = '`M` with middle being hanging off baseline' -variant.M = 'hanging' - -[simple.v-capital-m-flat-bottom] -tag = 'VXCJ' -sampler = 'M' -description = '`M` with middle aligned to baseline' -variant.M = 'flatBottom' - -[simple.v-capital-q-taily] -tag = 'cv42' -sampler = 'Q' -description = '`Q` with a curly tail' -variant.Q = 'taily' - -[simple.v-capital-q-straight] -tag = 'cv43' -sampler = 'Q' -description = '`Q` with a straight tail like in the old versions' -variant.Q = 'straight' - -[simple.v-capital-q-crossing] -tag = 'VXCA' -sampler = 'Q' -description = '`Q` with a tail crossing the ring' -variant.Q = 'crossing' - -[simple.v-capital-r-straight] -tag = "cv82" -sampler = 'R' -description = 'Standard, straight-leg `R`' -variant.R = "straight" - -[simple.v-capital-r-curly] -tag = "cv83" -sampler = 'R' -description = ' Slightly curly-legged `R`, like Iosevka 2.x' -variant.R = "curly" - -[simple.v-capital-y-straight] -tag = "cv80" -sampler = 'Y' -description = 'Standard, straight `Y`' -variant.Y = "straight" - -[simple.v-capital-y-curly] -tag = "cv81" -sampler = 'Y' -description = 'Slightly curly `Y`, like Iosevka 2.x' -variant.Y = "curly" - -[simple.v-a-doublestorey] tag = 'cv01' -sampler = 'a' -description = 'Double-storey `a`' -variant.a = 'doubleStorey' -[simple.v-a-singlestorey] +[prime.turn-v.variants.straight] +rank = 1 +description = 'Standard, straight `A`, `Λ`, `Δ`' +selector.A = "straight" +selector."grek/Lambda" = "straight" +selector."grek/Delta" = "straight" + +[prime.turn-v.variants.curly] +rank = 2 +description = 'Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x' +selector.A = "curly" +selector."grek/Lambda" = "curly" +selector."grek/Delta" = "curly" + + + +[prime.capital-b] +sampler = 'B' tag = 'cv02' -sampler = 'a' -description = 'Single-storey `a`' -variant.a = 'singleStorey' -[simple.v-a-singlestorey-tailed] -tag = 'VXBS' -sampler = 'a' -description = 'Single-storey `a` with curly tail' -variant.a = 'singleStoreyTailed' +[prime.capital-b.variants.standard] +rank = 1 +description = 'Standard `B`' +selector.B = 'standard' -[simple.v-a-doublestorey-tailed] -tag = 'VXBU' -sampler = 'a' -description = 'Double-storey `a` with curly tail' -variant.a = 'doubleStoreyTailed' +[prime.capital-b.variants.more-asymmetric] +rank = 2 +description = 'More asymmetric `B` to differentiate with `8`' +selector.B = 'moreAsymmetric' -[simple.v-a-singlestorey-earless-corner] -tag = 'VXCL' -sampler = 'a' -description = 'Earless (cornered top-right) single-storey `a`' -variant.a = 'singleStoreyEarlessCorner' -[simple.v-a-singlestorey-earless-corner-tailed] -tag = 'VXCM' -sampler = 'a' -description = 'Earless (cornered top-right) single-storey `a` with curly tail' -variant.a = 'singleStoreyEarlessCornerTailed' -[simple.v-a-singlestorey-earless-rounded] -tag = 'VXCN' -sampler = 'a' -description = 'Earless (rounded top-right) single-storey `a`' -variant.a = 'singleStoreyEarlessRounded' - -[simple.v-a-singlestorey-earless-rounded-tailed] -tag = 'VXCO' -sampler = 'a' -description = 'Earless (rounded top-right) single-storey `a` with curly tail' -variant.a = 'singleStoreyEarlessRoundedTailed' - -[simple.v-a-doublestorey-toothless-corner] -tag = 'VXDM' -sampler = 'a' -description = 'Toothless (cornered bottom-right) double-storey `a`' -variant.a = 'doubleStoreyToothlessCorner' - -[simple.v-a-doublestorey-toothless-rounded] -tag = 'VXDN' -sampler = 'a' -description = 'Toothless (rounded bottom-right) double-storey `a`' -variant.a = 'doubleStoreyToothlessRounded' - -[simple.v-b-toothed] -tag = "VXBK" -sampler = 'b' -description = '`b` with bottom-left tooth' -variant.b = "toothed" - -[simple.v-b-toothless-corner] -tag = "VXBL" -sampler = 'b' -description = '`b` without bottom-left tooth, with a corner transition' -variant.b = "toothlessCorner" - -[simple.v-b-toothless-rounded] -tag = "VXBM" -sampler = 'b' -description = '`b` without bottom-left tooth, with a rounded transition' -variant.b = "toothlessRounded" - -[simple.v-d-toothed] -tag = "VXBN" -sampler = 'd' -description = '`d` with bottom-right tooth' -variant.d = "toothed" - -[simple.v-d-toothless-corner] -tag = "VXBO" -sampler = 'd' -description = '`d` without bottom-right tooth, with a corner transition' -variant.d = "toothlessCorner" - -[simple.v-d-toothless-rounded] -tag = "VXBP" -sampler = 'd' -description = '`d` without bottom-right tooth, with a rounded transition' -variant.d = "toothlessRounded" - -[simple.v-d-tailed] -tag = "VXBQ" -sampler = 'd' -description = '`d` with a slightly tail bottom-right tail' -variant.d = "tailed" - -[simple.v-f-straight] -tag = "cv52" -sampler = 'f' -description = '`f` without bottom hook' -variant.f = "straight" - -[simple.v-f-tailed] -tag = "cv53" -sampler = 'f' -description = '`f` with a leftward bottom hook' -variant.f = "tailed" - -[simple.v-f-serifed] -tag = "cv84" -sampler = 'f' -description = '`f` with bottom serif' -variant.f = "serifed" - -[simple.v-f-straight-tailed] -tag = "VXAD" -sampler = 'f' -description = '`f` with straight tail' -variant.f = "straightTailed" - -[simple.v-f-flat-hook] -tag = "VXDD" -sampler = "f" -description = '`f` with flat hook' -variant.f = 'flatHook' - -[simple.v-f-flat-hook-crossbar-at-x-height] -tag = "VXEG" -sampler = "f" -description = '`f` with flat hook and crossbar placed right at X-height' -variant.f = 'flatHookCrossbarAtXHeight' - -[simple.v-f-flat-hook-serifed] -tag = "VXEV" -sampler = "f" -description = '`f` with flat hook and bottom serif' -variant.f = 'flatHookSerifed' - -[simple.v-f-flat-hook-serifed-crossbar-at-x-height] -tag = "VXEW" -sampler = "f" -description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' -variant.f = 'flatHookSerifedCrossbarAtXHeight' - -[simple.v-f-flat-hook-round-tailed] -tag = "VXEX" -sampler = "f" -description = '`f` with flat hook' -variant.f = 'flatHookRoundTailed' - -[simple.v-f-flat-hook-round-tailed-crossbar-at-x-height] -tag = "VXEY" -sampler = "f" -description = '`f` with flat hook and crossbar placed right at X-height' -variant.f = 'flatHookRoundTailedCrossbarAtXHeight' - -[simple.v-f-flat-hook-flat-tailed] -tag = "VXEZ" -sampler = "f" -description = '`f` with flat hook and bottom serif' -variant.f = 'flatHookFlatTailed' - -[simple.v-f-flat-hook-flat-tailed-crossbar-at-x-height] -tag = "VXFA" -sampler = "f" -description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' -variant.f = 'flatHookFlatTailedCrossbarAtXHeight' - -[simple.v-g-singlestorey] -tag = 'cv12' -sampler = 'g' -description = 'Single-storey `g`' -variant.g = 'singleStorey' - -[simple.v-g-doublestorey] -tag = 'cv11' -sampler = 'g' -description = 'Double-storey `g`' -variant.g = 'doubleStorey' - -[simple.v-g-opendoublestorey] -tag = 'cv24' -sampler = 'g' -description = 'Open Double-storey `g`, like Trebuchet MS or Fira Code' -variant.g = 'openDoubleStorey' - -[simple.v-g-earless-corner] -tag = 'VXCW' -sampler = 'g' -description = 'Earless (cornered top-right) single-storey `g`' -variant.g = 'singleStoreyEarlessCorner' - -[simple.v-g-earless-rounded] -tag = 'VXCX' -sampler = 'g' -description = 'Earless (rounded top-right) single-storey `g`' -variant.g = 'singleStoreyEarlessRounded' - -[simple.v-h-straight] -tag = 'VXCB' -sampler = 'h' -description = '`h` with straight ending' -variant.h = 'straight' -variant.hhooktop = 'straight' - -[simple.v-h-tailed] -tag = 'VXCC' -sampler = 'h' -description = '`h` with curly tailed ending' -variant.h = 'tailed' -variant.hhooktop = 'tailed' - -[simple.v-h-motion-serifed-straight] -tag = 'VXEK' -sampler = 'h' -description = '`h` with straight ending' -variant.h = 'motionSerifedStraight' -variant.hhooktop = 'straight' - -[simple.v-h-motion-serifed-tailed] -tag = 'VXEL' -sampler = 'h' -description = '`h` with curly tailed ending' -variant.h = 'motionSerifedTailed' -variant.hhooktop = 'tailed' - -[simple.v-i-serifed] +[prime.capital-d] +sampler = 'D' tag = 'cv03' -sampler = 'i' -description = 'Serifed `i`' -variant.dotlessi = 'serifed' -[simple.v-i-italic] +[prime.capital-d.variants.standard] +rank = 1 +description = 'Standard `D`' +selector.D = 'standard' + +[prime.capital-d.variants.more-rounded] +rank = 2 +description = 'More rounded `D` to differentiate with `O`' +selector.D = 'moreRounded' + + + +[prime.capital-g] +sampler = 'G' tag = 'cv04' -sampler = 'i' -description = 'Italic `i`' -variant.dotlessi = 'italic' -[simple.v-i-hooky] +[prime.capital-g.variants.toothed] +rank = 1 +description = "Toothed G" +selector.G = "toothed" + +[prime.capital-g.variants.toothless] +rank = 2 +description = "Toothless G" +selector.G = "toothless" + + + +[prime.capital-j] +sampler = 'J' tag = 'cv05' -sampler = 'i' -description = 'Hooky `i`' -variant.dotlessi = 'hooky' -[simple.v-i-line] -tag = "cv56" -sampler = 'i' -description = '`i` like a straight line' -variant.dotlessi = "line" +[prime.capital-j.variants.serifless] +rank = 1 +description = 'J without top serif' +selector.J = "serifless" -[simple.v-i-zshaped] +[prime.capital-j.variants.serifed] +rank = 2 +description = 'J with top serif at left side' +selector.J = 'serifed' + +[prime.capital-j.variants.serifed-both-sides] +rank = 3 +description = 'J with symmetric at both sides' +selector.J = 'serifedBothSides' + +[prime.capital-j.variants.serifed-symmetric] +rank = 4 +description = 'J with symmetric at both sides and is symmetric' +selector.J = 'serifedSymmetric' + + + +[prime.capital-k] +sampler = 'K' tag = 'cv06' -sampler = 'i' -description = 'Z-shaped `i`' -variant.dotlessi = 'zshaped' -[simple.v-i-tailed] -tag = "cv88" -sampler = 'i' -description = "Tailed `i`" -variant.dotlessi = 'tailed' +[prime.capital-k.variants.straight] +rank = 1 +description = '`K` with standard shape' +selector.K = 'straight' -[simple.v-i-hookybottom] -tag = "VXAA" -sampler = 'i' -description = "`i` with a straight tail" -variant.dotlessi = 'hookybottom' +[prime.capital-k.variants.curly] +rank = 2 +description = 'Slightly curly `K`, like Iosevka 2.x' +selector.K = 'curly' -[simple.v-i-serifed-asymmetric] -tag = "VXDK" -sampler = 'i' -description = "`i` with shorter top serif and full bottom serif" -variant.dotlessi = 'serifedAsymmetric' -[simple.v-j-line] -tag = "cv57" -sampler = 'j' -description = '`j` like a straight line' -variant.dotlessj = "line" -[simple.v-j-serifed] -tag = "cv58" -sampler = 'j' -description = '`j` with top serif' -variant.dotlessj = "serifed" - -[simple.v-j-straight] -tag = "cv98" -sampler = 'j' -description = '`j` without serif' -variant.dotlessj = "straight" - -[simple.v-j-flat-hook-serifed] -tag = 'VXDE' -sampler = 'j' -descender = '`j` with flat temrinal hook' -variant.dotlessj = "flatHookSerifed" - -[simple.v-j-flat-hook-serifless] -tag = 'VXDF' -sampler = 'j' -descender = '`j` with flat temrinal hook and top serif' -variant.dotlessj = "flatHookSerifless" - -[simple.v-k-straight] -tag = "cv68" -sampler = 'k' -description = '`k` with standard shape' -variant.k = 'straight' - -[simple.v-k-curly] -tag = "cv69" -sampler = 'k' -description = 'Slightly curly `k`, like Iosevka 2.x' -variant.k = 'curly' - -[simple.v-k-cursive] -tag = "cv70" -sampler = 'k' -description = '`k` with a cursive loop' -variant.k = 'cursive' - -[simple.v-l-hooky] -tag = 'cv09' -sampler = 'l' -description = 'Hooky `l`' -variant.l = 'hooky' - -[simple.v-l-zshaped] -tag = 'cv10' -sampler = 'l' -description = 'Z-shaped `l`' -variant.l = 'zshaped' - -[simple.v-l-serifed] +[prime.capital-m] +sampler = 'M' tag = 'cv07' -sampler = 'l' -description = 'Serifed `l`' -variant.l = 'serifed' -[simple.v-l-italic] +[prime.capital-m.variants.hanging] +rank = 1 +description = '`M` with middle being hanging off baseline' +selector.M = 'hanging' + +[prime.capital-m.variants.flat-bottom] +rank = 2 +description = '`M` with middle aligned to baseline' +selector.M = 'flatBottom' + + + +[prime.capital-q] +sampler = 'Q' tag = 'cv08' -sampler = 'l' -description = 'Italic, cursive `l`' -variant.l = 'italic' - -[simple.v-l-line] -tag = "cv59" -sampler = 'l' -description = '`l` like a straight line' -variant.l = "line" - -[simple.v-l-tailed] -tag = 'cv27' -sampler = 'l' -description = '`l` with a curved tail' -variant.l = 'tailed' - -[simple.v-l-hookybottom] -tag = 'cv28' -sampler = 'l' -description = '`l` with a straight tail' -variant.l = 'hookybottom' - -[simple.v-l-serifed-asymmetric] -tag = 'VXDL' -sampler = 'l' -description = '`l` with shorter top serif and full bottom serif' -variant.l = 'serifedAsymmetric' - -[simple.v-m-normal] -tag = 'cv25' -sampler = 'm' -description = '`m` with normal middle leg, touching the baseline' -variant.m = 'normal' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-shortleg] -tag = 'cv26' -sampler = 'm' -description = '`m` with shorter middle leg, like Ubuntu Mono' -variant.m = 'shortleg' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-tailed] -tag = 'VXCD' -sampler = 'm' -description = '`m` with normal middle leg, touching the baseline, and a curly tail' -variant.m = 'tailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicTailed" - -[simple.v-m-shortleg-tailed] -tag = 'VXCE' -sampler = 'm' -description = '`m` with shorter middle leg, like Ubuntu Mono, and a curly tail' -variant.m = 'shortlegTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicTailed" - -[simple.v-m-earless-corner-double-arch] -tag = "VXDU" -sampler = "m" -description = "Earless (corner top-left) `m` with normal middle leg touching baseline" -variant.m = 'earlessCornerDoubleArch' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-corner-double-arch-shortleg] -tag = "VXDV" -sampler = "m" -description = "Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono" -variant.m = 'earlessCornerDoubleArchShortleg' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-corner-double-arch-tailed] -tag = "VXDW" -sampler = "m" -description = "Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail" -variant.m = 'earlessCornerDoubleArchTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-corner-double-arch-shortleg-tailed] -tag = "VXDX" -sampler = "m" -description = "Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" -variant.m = 'earlessCornerDoubleArchShortlegTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-rounded-double-arch] -tag = "VXDY" -sampler = "m" -description = "Earless (rounded top-left) `m` with normal middle leg touching baseline" -variant.m = 'earlessRoundedDoubleArch' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-rounded-double-arch-shortleg] -tag = "VXDZ" -sampler = "m" -description = "Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono" -variant.m = 'earlessRoundedDoubleArchShortleg' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-rounded-double-arch-tailed] -tag = "VXEA" -sampler = "m" -description = "Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail" -variant.m = 'earlessRoundedDoubleArchTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-rounded-double-arch-shortleg-tailed] -tag = "VXEB" -sampler = "m" -description = "Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" -variant.m = 'earlessRoundedDoubleArchShortlegTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-single-arch] -tag = "VXEC" -sampler = "m" -description = "Earless (single-arch) `m` with normal middle leg touching baseline" -variant.m = 'earlessSingleArch' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-single-arch-shortleg] -tag = "VXED" -sampler = "m" -description = "Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono" -variant.m = 'earlessSingleArchShortleg' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-single-arch-tailed] -tag = "VXEE" -sampler = "m" -description = "Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail" -variant.m = 'earlessSingleArchTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-earless-single-arch-shortleg-tailed] -tag = "VXEF" -sampler = "m" -description = "Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" -variant.m = 'earlessSingleArchShortlegTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicNormal" - -[simple.v-m-motion-serifed] -tag = "VXEM" -sampler = "m" -description = "`m` with motion serifs, normal middle leg touching baseline" -variant.m = 'motionSerifed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicMotionSerifed" - -[simple.v-m-motion-serifed-shortleg] -tag = "VXEN" -sampler = "m" -description = "`m` with motion serifs, a shorter middle leg like Ubuntu Mono" -variant.m = 'motionSerifedShortleg' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicMotionSerifed" - -[simple.v-m-motion-serifed-tailed] -tag = "VXEO" -sampler = "m" -description = "`m` with motion serifs, normal middle leg touching baseline, and a curly tail" -variant.m = 'motionSerifedTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicMotionSerifed" - -[simple.v-m-motion-serifed-shortleg-tailed] -tag = "VXEP" -sampler = "m" -description = "`m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail" -variant.m = 'motionSerifedShortlegTailed' -variantUpright."cyrl/te" = "upright" -variantItalic."cyrl/te" = "italicMotionSerifed" - -[simple.v-n-straight] -tag = 'VXCF' -sampler = 'n' -description = '`n` with straight ending' -variant.n = 'straight' -variant.eng = 'straight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicStraight" - -[simple.v-n-tailed] -tag = 'VXCG' -sampler = 'n' -description = '`n` with a curly tail' -variant.n = 'tailed' -variant.eng = 'straight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicTailed" - -[simple.v-n-earless-corner-straight] -tag = 'VXDO' -sampler = 'n' -description = 'Earless (corner top-left) `n` with straight ending' -variant.n = 'earlessCornerStraight' -variant.eng = 'earlessCornerStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicEarlessCornerStraight" - -[simple.v-n-earless-corner-tailed] -tag = 'VXDP' -sampler = 'n' -description = 'Earless (corner top-left) `n` with a curly tail' -variant.n = 'earlessCornerTailed' -variant.eng = 'earlessCornerStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicEarlessCornerTailed" - -[simple.v-n-earless-rounded-straight] -tag = 'VXDQ' -sampler = 'n' -description = 'Earless (rounded top-left) `n` with straight ending' -variant.n = 'earlessRoundedStraight' -variant.eng = 'earlessRoundedStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicEarlessRoundedStraight" - -[simple.v-n-earless-rounded-tailed] -tag = 'VXDR' -sampler = 'n' -description = 'Earless (rounded top-left) `n` with a curly tail' -variant.n = 'earlessRoundedTailed' -variant.eng = 'earlessRoundedStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicEarlessRoundedTailed" - -[simple.v-n-motion-serifed-straight] -tag = 'VXEQ' -sampler = 'n' -description = '`n` with motion serifs and straight ending' -variant.n = 'motionSerifedStraight' -variant.eng = 'motionSerifedStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicMotionSerifedStraight" - -[simple.v-n-motion-serifed-tailed] -tag = 'VXER' -sampler = 'n' -description = '`n` with motion serifs and a curly tail' -variant.n = 'motionSerifedTailed' -variant.eng = 'motionSerifedStraight' -variantUpright."cyrl/pe" = "upright" -variantItalic."cyrl/pe" = "italicMotionSerifedTailed" - -[simple.v-p-eared] -tag = 'VXCP' -sampler = 'p' -description = '`p` with top-left ear' -variant.p = 'eared' - -[simple.v-p-earless-corner] -tag = 'VXCQ' -sampler = 'p' -description = '`p` without top-left ear (corner)' -variant.p = 'earlessCorner' - -[simple.v-p-earless-rounded] -tag = 'VXCR' -sampler = 'p' -description = '`p` without top-left ear (rounded)' -variant.p = 'earlessRounded' - -[simple.v-p-motion-serifed] -tag = 'VXES' -sampler = 'p' -description = '`p` with motion serifs' -variant.p = 'motionSerifed' - -[simple.v-q-straight] -tag = 'VXAZ' -sampler = 'q' -description = '`q` with straight bar' -variant.q = 'straight' - -[simple.v-q-tailed] -tag = 'VXBA' -sampler = 'q' -description = '`q` with tail' -variant.q = 'tailed' - -[simple.v-q-earless-corner] -tag = 'VXCS' -sampler = 'q' -description = 'Earless (cornered top-left) single-storey `q`' -variant.q = 'earlessCorner' - -[simple.v-q-earless-corner-tailed] -tag = 'VXCT' -sampler = 'q' -description = 'Earless (cornered top-left) single-storey `q` with curly tail' -variant.q = 'earlessCornerTailed' - -[simple.v-q-earless-rounded] -tag = 'VXCU' -sampler = 'q' -description = 'Earless (rounded top-left) single-storey `q`' -variant.q = 'earlessRounded' - -[simple.v-q-earless-rounded-tailed] -tag = 'VXCV' -sampler = 'q' -description = 'Earless (rounded top-left) single-storey `q` with curly tail' -variant.q = 'earlessRoundedTailed' - -[simple.v-r-straight] -tag = "cv85" -sampler = 'r' -description = 'Straight, serif-less `r`' -variant.r = "straight" -variant."turnrrtail" = "straight" -variant."rflap" = "straight" - -[simple.v-r-serifed] -tag = "cv86" -sampler = 'r' -description = '`r` with serif at both top and bottom' -variant.r = "serifed" -variant."turnrrtail" = "serifed" -variant."rflap" = "serifed" - -[simple.v-r-top-serifed] -tag = "cv87" -sampler = 'r' -description = '`r` with serifs at top-left only' -variant.r = "top-serifed" -variant."turnrrtail" = "top-serifed" -variant."rflap" = "straight" - -[simple.v-r-earless-corner] -tag = "VXDS" -sampler = 'r' -description = 'Earless (corner top-left), serif-less `r`' -variant.r = "earlessCorner" -variant."turnrrtail" = "straight" -variant."rflap" = "straight" - -[simple.v-r-earless-rounded] -tag = "VXDT" -sampler = 'r' -description = 'Earless (rounded top-left), serif-less `r`' -variant.r = "earlessRounded" -variant."turnrrtail" = "straight" -variant."rflap" = "straight" - -[simple.v-t-standard] -tag = 'cv40' -sampler = 't' -description = 'Standard `t` shape' -variant.t = 'standard' - -[simple.v-t-cross] -tag = 'cv41' -sampler = 't' -description = 'Futura-like `t` shape' -variant.t = 'cross' - -[simple.v-t-flat-hook] -tag = "VXDC" -sampler = "t" -description = "`t` with flat hook" -variant.t = 'flatHook' - -[simple.v-t-hookless-asymmetric] -tag = "VXEH" -sampler = "t" -description = "`t` without hook and ony half the cross bar" -variant.t = 'hooklessAsymmetric' - -[simple.v-t-flat-hook-short-neck] -tag = "VXEI" -sampler = "t" -description = "`t` with flat hook and a slightly shorter neck" -variant.t = 'flatHookShortNeck' - -[simple.v-t-flat-hook-short-neck2] -tag = "VXEJ" -sampler = "t" -description = "`t` with flat hook and a more shorter neck" -variant.t = 'flatHookShortNeck2' - -[simple.v-u-with-bar] -tag = "cv89" -sampler = "u" -description = "Normal `u` with right bar" -variant.u = "withBar" -variantUpright."cyrl/i" = "upright" -variantItalic."cyrl/i" = "italicWithBar" -variantUpright."cyrl/sha" = "upright" -variantItalic."cyrl/sha" = "italicStraight" -variantUpright."cyrl/dzhe" = "upright" -variantItalic."cyrl/dzhe" = "italicStraight" - -[simple.v-u-without-bar] -tag = "cv90" -sampler = "u" -description = "Normal `u` without right bar, like a smaller uppercase `U`" -variant.u = "withoutBar" -variantUpright."cyrl/i" = "upright" -variantItalic."cyrl/i" = "italicWithBar" -variantUpright."cyrl/sha" = "upright" -variantItalic."cyrl/sha" = "italicStraight" -variantUpright."cyrl/dzhe" = "upright" -variantItalic."cyrl/dzhe" = "italicStraight" - -[simple.v-u-tailed] -tag = "VXBT" -sampler = "u" -description = "`u` with right bar and a slightly curly tail" -variant.u = "tailed" -variantUpright."cyrl/i" = "upright" -variantItalic."cyrl/i" = "italicTailed" -variantUpright."cyrl/sha" = "upright" -variantItalic."cyrl/sha" = "italicTailed" -variantUpright."cyrl/dzhe" = "upright" -variantItalic."cyrl/dzhe" = "italicTailed" - -[simple.v-u-motion-serifed] -tag = "VXET" -sampler = "u" -description = "Normal `u` with right bar and motion serifs" -variant.u = "motionSerifed" -variantUpright."cyrl/i" = "upright" -variantItalic."cyrl/i" = "italicMotionSerifed" -variantUpright."cyrl/sha" = "upright" -variantItalic."cyrl/sha" = "italicMotionSerifed" -variantUpright."cyrl/dzhe" = "upright" -variantItalic."cyrl/dzhe" = "italicMotionSerifed" - -[simple.v-u-motion-serifed-tailed] -tag = "VXEU" -sampler = "u" -description = "`u` with right bar, motion serifs and a slightly curly tail" -variant.u = "motionSerifedTailed" -variantUpright."cyrl/i" = "upright" -variantItalic."cyrl/i" = "italicMotionSerifedTailed" -variantUpright."cyrl/sha" = "upright" -variantItalic."cyrl/sha" = "italicMotionSerifedTailed" -variantUpright."cyrl/dzhe" = "upright" -variantItalic."cyrl/dzhe" = "italicMotionSerifedTailed" - -[simple.v-v-straight] -tag = "cv71" -sampler = 'vV' -description = 'Standard, straight `V` and `v`' -variant.v = "straight" -variant.V = "straight" - -[simple.v-v-curly] -tag = "cv72" -sampler = 'vV' -description = ' Slightly curly `V` and `v`, like Iosevka 2.x' -variant.v = "curly" -variant.V = "curly" - -[simple.v-w-straight] -tag = "cv75" -sampler = 'wW' -description = 'Standard, straight `W` and `w`' -variant.W = "straight" -variant.w = "straight" - -[simple.v-w-curly] -tag = "cv76" -sampler = 'wW' -description = 'Slightly curly `W` and `w`, like Iosevka 2.x' -variant.W = "curly" -variant.w = "curly" - -[simple.v-w-straight-flat-top] -tag = "VXCH" -sampler = 'wW' -description = 'Standard, straight `W` and `w`, and the middle is forced to be aligned the top' -variant.W = "straightFlatTop" -variant.w = "straightFlatTop" - -[simple.v-x-straight] -tag = "cv77" -sampler = 'xX' -description = 'Standard, straight `X` and `x`' -variant.X = "straight" -variant.x = "straight" - -[simple.v-x-curly] -tag = "cv78" -sampler = 'xX' -description = 'Slightly curly `X` and `x`, like Iosevka 2.x' -variant.X = "curly" -variant.x = "curly" - -[simple.v-y-straight] -tag = "cv48" -sampler = 'y' -description = 'Letter `y` that is fully straight' -variant.y = "straight" -variant."cyrl/U" = "straight" - -[simple.v-y-straight-turn] -tag = "VXBF" -sampler = 'y' -description = 'Letter `y` with straight upper and a tail turns leftward' -variant.y = "straightTurn" -variant."cyrl/U" = "straightTurn" - -[simple.v-y-curly] -tag = "cv79" -sampler = 'y' -description = 'More curly letter `y`, like Iosevka 2.x' -variant.y = "curly" -variant."cyrl/U" = "curly" - -[simple.v-y-cursive] -tag = "cv49" -sampler = 'y' -description = 'Cursive-like `y`' -variant.y = "cursive" -variant."cyrl/U" = "straight" - -[simple.v-z-standard] -tag = "VXBD" -sampler = 'z' -description = 'Standard `Z` and `z`' -variant.z = 'standard' -variant.Z = 'standard' - -[simple.v-z-with-crossbar] -tag = "VXBE" -sampler = 'z' -description = '`Z` and `z` with a diagonal cross bar for better dsitinction with `2`' -variant.z = 'withCrossBar' -variant.Z = 'withCrossBar' - -[simple.v-z-with-horizontal-crossbar] -tag = "VXBX" -sampler = 'z' -description = '`Z` and `z` with a horizontal cross bar for better dsitinction with `2`' -variant.z = 'withHorizontalCrossBar' -variant.Z = 'withHorizontalCrossBar' - -[simple.v-eszet-traditional] -tag = 'cv34' -sampler = 'ß' -description = 'Traditional, Fraktur-like Eszet' -variant.eszet = 'traditional' - -[simple.v-eszet-sulzbacher] -tag = 'cv35' -sampler = 'ß' -description = 'A more modern, beta-like Eszet' -variant.eszet = 'sulzbacher' - -[simple.v-eszet-longs-s-lig] -tag = 'VXAC' -sampler = 'ß' -description = 'An Eszet shown as a ligature of long-S (`ſ`) and `s`' -variant.eszet = 'longsslig' - -[simple.v-lambda-straight] -tag = "cv94" -sampler = 'λ' -description = 'More-straight letter `λ`' -variant."grek/lambda" = "straight" - -[simple.v-lambda-curly] -tag = "cv95" -sampler = 'λ' -description = 'More curly letter `λ`, like Iosevka 2.x' -variant."grek/lambda" = "curly" - -[simple.v-zero-slashed] + +[prime.capital-q.variants.taily] +rank = 1 +description = '`Q` with a curly tail' +selector.Q = 'taily' + +[prime.capital-q.variants.straight] +rank = 2 +description = '`Q` with a straight tail like in the old versions' +selector.Q = 'straight' + +[prime.capital-q.variants.crossing] +rank = 3 +description = '`Q` with a tail crossing the ring' +selector.Q = 'crossing' + + + +[prime.capital-r] +sampler = 'R' +tag = 'cv09' + +[prime.capital-r.variants.straight] +rank = 1 +description = 'Standard, straight-leg `R`' +selector.R = "straight" + +[prime.capital-r.variants.curly] +rank = 2 +description = ' Slightly curly-legged `R`, like Iosevka 2.x' +selector.R = "curly" + + + +[prime.capital-y] +sampler = 'Y' +tag = 'cv10' + +[prime.capital-y.variants.straight] +rank = 1 +description = 'Standard, straight `Y`' +selector.Y = "straight" + +[prime.capital-y.variants.curly] +rank = 2 +description = 'Slightly curly `Y`, like Iosevka 2.x' +selector.Y = "curly" + + + +[prime.a] +sampler = 'a' +tag = 'cv11' + +[prime.a.variants.doublestorey] +rank = 1 +description = 'Double-storey `a`' +selector.a = 'doubleStorey' + +[prime.a.variants.singlestorey] +rank = 2 +description = 'Single-storey `a`' +selector.a = 'singleStorey' + +[prime.a.variants.singlestorey-tailed] +rank = 3 +description = 'Single-storey `a` with curly tail' +selector.a = 'singleStoreyTailed' + +[prime.a.variants.doublestorey-tailed] +rank = 4 +description = 'Double-storey `a` with curly tail' +selector.a = 'doubleStoreyTailed' + +[prime.a.variants.singlestorey-earless-corner] +rank = 5 +description = 'Earless (cornered top-right) single-storey `a`' +selector.a = 'singleStoreyEarlessCorner' + +[prime.a.variants.singlestorey-earless-corner-tailed] +rank = 6 +description = 'Earless (cornered top-right) single-storey `a` with curly tail' +selector.a = 'singleStoreyEarlessCornerTailed' + +[prime.a.variants.singlestorey-earless-rounded] +rank = 7 +description = 'Earless (rounded top-right) single-storey `a`' +selector.a = 'singleStoreyEarlessRounded' + +[prime.a.variants.singlestorey-earless-rounded-tailed] +rank = 8 +description = 'Earless (rounded top-right) single-storey `a` with curly tail' +selector.a = 'singleStoreyEarlessRoundedTailed' + +[prime.a.variants.doublestorey-toothless-corner] +rank = 9 +description = 'Toothless (cornered bottom-right) double-storey `a`' +selector.a = 'doubleStoreyToothlessCorner' + +[prime.a.variants.doublestorey-toothless-rounded] +rank = 10 +description = 'Toothless (rounded bottom-right) double-storey `a`' +selector.a = 'doubleStoreyToothlessRounded' + + + +[prime.b] +sampler = 'b' +tag = 'cv12' + +[prime.b.variants.toothed] +rank = 1 +description = '`b` with bottom-left tooth' +selector.b = "toothed" + +[prime.b.variants.toothless-corner] +rank = 2 +description = '`b` without bottom-left tooth, with a corner transition' +selector.b = "toothlessCorner" + +[prime.b.variants.toothless-rounded] +rank = 3 +description = '`b` without bottom-left tooth, with a rounded transition' +selector.b = "toothlessRounded" + + + +[prime.d] +sampler = 'd' tag = 'cv13' -sampler = '0' -description = 'Slashed Zero `0`' -variant.zero = 'slashed' -[simple.v-zero-dotted] +[prime.d.variants.toothed] +rank = 1 +description = '`d` with bottom-right tooth' +selector.d = "toothed" + +[prime.d.variants.toothless-corner] +rank = 2 +description = '`d` without bottom-right tooth, with a corner transition' +selector.d = "toothlessCorner" + +[prime.d.variants.toothless-rounded] +rank = 3 +description = '`d` without bottom-right tooth, with a rounded transition' +selector.d = "toothlessRounded" + +[prime.d.variants.tailed] +rank = 4 +description = '`d` with a slightly tail bottom-right tail' +selector.d = "tailed" + + + +[prime.f] +sampler = 'f' tag = 'cv14' -sampler = '0' -description = 'Dotted Zero `0`' -variant.zero = 'dotted' -[simple.v-zero-unslashed] +[prime.f.variants.straight] +rank = 1 +description = '`f` without bottom hook' +selector.f = "straight" + +[prime.f.variants.tailed] +rank = 2 +description = '`f` with a leftward bottom hook' +selector.f = "tailed" + +[prime.f.variants.serifed] +rank = 3 +description = '`f` with bottom serif' +selector.f = "serifed" + +[prime.f.variants.straight-tailed] +rank = 4 +description = '`f` with straight tail' +selector.f = "straightTailed" + +[prime.f.variants.flat-hook] +rank = 5 +description = '`f` with flat hook' +selector.f = 'flatHook' + +[prime.f.variants.flat-hook-crossbar-at-x-height] +rank = 6 +description = '`f` with flat hook and crossbar placed right at X-height' +selector.f = 'flatHookCrossbarAtXHeight' + +[prime.f.variants.flat-hook-serifed] +rank = 7 +description = '`f` with flat hook and bottom serif' +selector.f = 'flatHookSerifed' + +[prime.f.variants.flat-hook-serifed-crossbar-at-x-height] +rank = 8 +description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' +selector.f = 'flatHookSerifedCrossbarAtXHeight' + +[prime.f.variants.flat-hook-round-tailed] +rank = 9 +description = '`f` with flat hook' +selector.f = 'flatHookRoundTailed' + +[prime.f.variants.flat-hook-round-tailed-crossbar-at-x-height] +rank = 10 +description = '`f` with flat hook and crossbar placed right at X-height' +selector.f = 'flatHookRoundTailedCrossbarAtXHeight' + +[prime.f.variants.flat-hook-flat-tailed] +rank = 11 +description = '`f` with flat hook and bottom serif' +selector.f = 'flatHookFlatTailed' + +[prime.f.variants.flat-hook-flat-tailed-crossbar-at-x-height] +rank = 12 +description = '`f` with flat hook, bottom serif, and crossbar placed right at X-height' +selector.f = 'flatHookFlatTailedCrossbarAtXHeight' + + + +[prime.g] +sampler = 'g' tag = 'cv15' -sampler = '0' -description = 'O-like `0`' -variant.zero = 'unslashed' -[simple.v-zero-reverse-slashed] -tag = 'cv93' -sampler = '0' -description = 'Reverse-slashed `0`' -variant.zero = 'reverse-slashed' +[prime.g.variants.singlestorey] +rank = 1 +description = 'Single-storey `g`' +selector.g = 'singleStorey' -[simple.v-zero-long-dotted] -tag = 'VXAB' -sampler = '0' -description = 'Long-dotted Zero `0` like Hack' -variant.zero = 'longDotted' +[prime.g.variants.doublestorey] +rank = 2 +description = 'Double-storey `g`' +selector.g = 'doubleStorey' -[simple.v-one-nobase] -tag = "cv50" -sampler = '1' -description = '`1` with bottom serif' -variant.one = "nobase" +[prime.g.variants.opendoublestorey] +rank = 3 +description = 'Open Double-storey `g`, like Trebuchet MS or Fira Code' +selector.g = 'openDoubleStorey' -[simple.v-one-base] -tag = "cv51" -sampler = '1' -description = '`1` without bottom serif' -variant.one = "base" +[prime.g.variants.earless-corner] +rank = 4 +description = 'Earless (cornered top-right) single-storey `g`' +selector.g = 'singleStoreyEarlessCorner' -[simple.v-one-line] -tag = "VXAM" -sampler = '1' -description = '`1` drawn just like a straight line' -variant.one = "line" +[prime.g.variants.earless-rounded] +rank = 5 +description = 'Earless (rounded top-right) single-storey `g`' +selector.g = 'singleStoreyEarlessRounded' -[simple.v-three-flattop] -tag = 'cv46' -sampler = '3' -description = 'Flat top `3` (Like Museo Sans / Montserrat)' -variant.three = 'flattop' -[simple.v-three-twoarcs] -tag = 'cv47' -sampler = '3' -description = 'Arched top `3`' -variant.three = 'twoarcs' -[simple.v-four-closed] -tag = 'VXAR' -sampler = '4' -description = '`4` with closed contour' -variant.four = 'closed' - -[simple.v-four-closed-non-crossing] -tag = 'VXAS' -sampler = '4' -description = '`4` with closed contour but the horizontal bar does not overflow the vertical bar' -variant.four = 'closedNonCrossing' - -[simple.v-four-semi-open] -tag = 'VXAT' -sampler = '4' -description = '`4` with semi-open contour' -variant.four = 'semiOpen' - -[simple.v-four-semi-open-non-crossing] -tag = 'VXAU' -sampler = '4' -description = '`4` with semi-open contour but the horizontal bar does not overflow the vertical bar' -variant.four = 'semiOpenNonCrossing' - -[simple.v-four-open] -tag = 'VXAV' -sampler = '4' -description = '`4` with open contour' -variant.four = 'open' - -[simple.v-four-open-non-crossing] -tag = 'VXAW' -sampler = '4' -description = '`4` with open contour but the horizontal bar does not overflow the vertical bar' -variant.four = 'openNonCrossing' - -[simple.v-six-closed-contour] -tag = "VXAE" -sampler = '6' -description = '`6` with a more closed contour' -variant.six = "closedContour" - -[simple.v-six-open-contour] -tag = "VXAF" -sampler = '6' -description = '`6` with a more open contour' -variant.six = "openContour" - -[simple.v-six-straight-bar] -tag = "VXBB" -sampler = '6' -description = '`6` with a straight bar' -variant.six = "straightBar" - -[simple.v-seven-noserif] -tag = "cv64" -sampler = '7' -description = '`7` without serif' -variant.seven = "noserif" - -[simple.v-seven-serifed] -tag = "cv65" -sampler = '7' -description = '`7` with initial serif' -variant.seven = "serifed" - -[simple.v-seven-crossbar] -tag = "VXAX" -sampler = '7' -description = '`7` with crossbar' -variant.seven = "crossbar" - -[simple.v-seven-crossbar-serifed] -tag = "VXAY" -sampler = '7' -description = '`7` with crossbar and initial serif' -variant.seven = "crossbarSerifed" - -[simple.v-nine-closed-contour] -tag = "cv96" -sampler = '9' -description = '`9` with a more closed contour' -variant.nine = "closedContour" - -[simple.v-nine-open-contour] -tag = "cv97" -sampler = '9' -description = '`9` with a more open contour' -variant.nine = "openContour" - -[simple.v-nine-straight-bar] -tag = "VXBC" -sampler = '9' -description = '`9` with a straight bar' -variant.nine = "straightBar" - -[simple.v-tilde-high] +[prime.h] +sampler = 'h' tag = 'cv16' -sampler = '~' -description = 'Higher tilde `~`' -variant.asciiTilde = 'high' -[simple.v-tilde-low] +[prime.h.variants.straight] +rank = 1 +description = '`h` with straight ending' +selector.h = 'straight' +selector.hhooktop = 'straight' + +[prime.h.variants.tailed] +rank = 2 +description = '`h` with curly tailed ending' +selector.h = 'tailed' +selector.hhooktop = 'tailed' + +[prime.h.variants.motion-serifed-straight] +rank = 3 +description = '`h` with straight ending' +selector.h = 'motionSerifedStraight' +selector.hhooktop = 'straight' + +[prime.h.variants.motion-serifed-tailed] +rank = 4 +description = '`h` with curly tailed ending' +selector.h = 'motionSerifedTailed' +selector.hhooktop = 'tailed' + + + +[prime.i] +sampler = 'i' tag = 'cv17' -sampler = '~' -description = 'Lower tilde `~`' -variant.asciiTilde = 'low' -[simple.v-asterisk-high] +[prime.i.variants.serifed] +rank = 1 +description = 'Serifed `i`' +selector.dotlessi = 'serifed' + +[prime.i.variants.italic] +rank = 2 +description = 'Italic `i`' +selector.dotlessi = 'italic' + +[prime.i.variants.hooky] +rank = 3 +description = 'Hooky `i`' +selector.dotlessi = 'hooky' + +[prime.i.variants.line] +rank = 4 +description = '`i` like a straight line' +selector.dotlessi = "line" + +[prime.i.variants.zshaped] +rank = 5 +description = 'Z-shaped `i`' +selector.dotlessi = 'zshaped' + +[prime.i.variants.tailed] +rank = 6 +description = "Tailed `i`" +selector.dotlessi = 'tailed' + +[prime.i.variants.hookybottom] +rank = 7 +description = "`i` with a straight tail" +selector.dotlessi = 'hookybottom' + +[prime.i.variants.serifed-asymmetric] +rank = 8 +description = "`i` with shorter top serif and full bottom serif" +selector.dotlessi = 'serifedAsymmetric' + + + +[prime.j] +sampler = 'j' tag = 'cv18' -sampler = '*' -description = 'Higher five-pointed asterisk `*`' -variant.asterisk = 'high' -[simple.v-asterisk-low] +[prime.j.variants.line] +rank = 1 +description = '`j` like a straight line' +selector.dotlessj = "line" + +[prime.j.variants.serifed] +rank = 2 +description = '`j` with top serif' +selector.dotlessj = "serifed" + +[prime.j.variants.straight] +rank = 3 +description = '`j` without serif' +selector.dotlessj = "straight" + +[prime.j.variants.flat-hook-serifed] +rank = 4 +descender = '`j` with flat temrinal hook' +selector.dotlessj = "flatHookSerifed" + +[prime.j.variants.flat-hook-serifless] +rank = 5 +descender = '`j` with flat temrinal hook and top serif' +selector.dotlessj = "flatHookSerifless" + + + +[prime.k] +sampler = 'k' tag = 'cv19' -sampler = '*' -description = 'Lower five-pointed asterisk `*`' -variant.asterisk = 'low' -[simple.v-asterisk-hexhigh] -tag = "cv60" -sampler = "*" -description = 'Higher six-pointed asterisk `*`' -variant.asterisk = "hexhigh" +[prime.k.variants.straight] +rank = 1 +description = '`k` with standard shape' +selector.k = 'straight' -[simple.v-asterisk-hexlow] -tag = "cv61" -sampler = "*" -description = 'Lower six-pointed asterisk `*`' -variant.asterisk = "hexlow" +[prime.k.variants.curly] +rank = 2 +description = 'Slightly curly `k`, like Iosevka 2.x' +selector.k = 'curly' -[simple.v-asterisk-flip-penta-high] -tag = 'VXBV' -sampler = '*' -description = 'Higher five-pointed and turned asterisk `*`' -variant.asterisk = 'turnPentaHigh' +[prime.k.variants.cursive] +rank = 3 +description = '`k` with a cursive loop' +selector.k = 'cursive' -[simple.v-asterisk-flip-penta-low] -tag = 'VXBW' -sampler = '*' -description = 'Lower five-pointed and turned asterisk `*`' -variant.asterisk = 'turnPentaLow' -[simple.v-underscore-high] + +[prime.l] +sampler = 'l' tag = 'cv20' -sampler = '_' -description = 'Higher underscore `_`, placed right below baseline' -variant.underscore = 'high' -[simple.v-underscore-low] +[prime.l.variants.hooky] +rank = 1 +description = 'Hooky `l`' +selector.l = 'hooky' + +[prime.l.variants.zshaped] +rank = 2 +description = 'Z-shaped `l`' +selector.l = 'zshaped' + +[prime.l.variants.serifed] +rank = 3 +description = 'Serifed `l`' +selector.l = 'serifed' + +[prime.l.variants.italic] +rank = 4 +description = 'Italic, cursive `l`' +selector.l = 'italic' + +[prime.l.variants.line] +rank = 5 +description = '`l` like a straight line' +selector.l = "line" + +[prime.l.variants.tailed] +rank = 6 +description = '`l` with a curved tail' +selector.l = 'tailed' + +[prime.l.variants.hookybottom] +rank = 7 +description = '`l` with a straight tail' +selector.l = 'hookybottom' + +[prime.l.variants.serifed-asymmetric] +rank = 8 +description = '`l` with shorter top serif and full bottom serif' +selector.l = 'serifedAsymmetric' + + + +[prime.m] +sampler = 'm' tag = 'cv21' -sampler = '_' -description = 'Lower underscore `_`, placed right above descender line' -variant.underscore = 'low' -[simple.v-underscore-above-baseline] -tag = 'cv99' -sampler = '_' -description = 'Extra-high `_`, placed right below baseline' -variant.underscore = 'aboveBaseline' +[prime.m.variants.normal] +rank = 1 +description = '`m` with normal middle leg, touching the baseline' +selector.m = 'normal' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" -[simple.v-paragraph-high] +[prime.m.variants.shortleg] +rank = 2 +description = '`m` with shorter middle leg, like Ubuntu Mono' +selector.m = 'shortleg' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.tailed] +rank = 3 +description = '`m` with normal middle leg, touching the baseline, and a curly tail' +selector.m = 'tailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicTailed" + +[prime.m.variants.shortleg-tailed] +rank = 4 +description = '`m` with shorter middle leg, like Ubuntu Mono, and a curly tail' +selector.m = 'shortlegTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicTailed" + +[prime.m.variants.earless-corner-double-arch] +rank = 5 +description = "Earless (corner top-left) `m` with normal middle leg touching baseline" +selector.m = 'earlessCornerDoubleArch' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-corner-double-arch-shortleg] +rank = 6 +description = "Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono" +selector.m = 'earlessCornerDoubleArchShortleg' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-corner-double-arch-tailed] +rank = 7 +description = "Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail" +selector.m = 'earlessCornerDoubleArchTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-corner-double-arch-shortleg-tailed] +rank = 8 +description = "Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" +selector.m = 'earlessCornerDoubleArchShortlegTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-rounded-double-arch] +rank = 9 +description = "Earless (rounded top-left) `m` with normal middle leg touching baseline" +selector.m = 'earlessRoundedDoubleArch' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-rounded-double-arch-shortleg] +rank = 10 +description = "Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono" +selector.m = 'earlessRoundedDoubleArchShortleg' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-rounded-double-arch-tailed] +rank = 11 +description = "Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail" +selector.m = 'earlessRoundedDoubleArchTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-rounded-double-arch-shortleg-tailed] +rank = 12 +description = "Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" +selector.m = 'earlessRoundedDoubleArchShortlegTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-single-arch] +rank = 13 +description = "Earless (single-arch) `m` with normal middle leg touching baseline" +selector.m = 'earlessSingleArch' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-single-arch-shortleg] +rank = 14 +description = "Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono" +selector.m = 'earlessSingleArchShortleg' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-single-arch-tailed] +rank = 15 +description = "Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail" +selector.m = 'earlessSingleArchTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.earless-single-arch-shortleg-tailed] +rank = 16 +description = "Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail" +selector.m = 'earlessSingleArchShortlegTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicNormal" + +[prime.m.variants.motion-serifed] +rank = 17 +description = "`m` with motion serifs, normal middle leg touching baseline" +selector.m = 'motionSerifed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicMotionSerifed" + +[prime.m.variants.motion-serifed-shortleg] +rank = 18 +description = "`m` with motion serifs, a shorter middle leg like Ubuntu Mono" +selector.m = 'motionSerifedShortleg' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicMotionSerifed" + +[prime.m.variants.motion-serifed-tailed] +rank = 19 +description = "`m` with motion serifs, normal middle leg touching baseline, and a curly tail" +selector.m = 'motionSerifedTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicMotionSerifed" + +[prime.m.variants.motion-serifed-shortleg-tailed] +rank = 20 +description = "`m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail" +selector.m = 'motionSerifedShortlegTailed' +selectorUpright."cyrl/te" = "upright" +selectorItalic."cyrl/te" = "italicMotionSerifed" + + + +[prime.n] +sampler = 'n' tag = 'cv22' -sampler = '¶' -description = 'Higher paragraph symbol `¶`' -variant.paragraph = 'high' -variant.revertParagraph = 'high' -[simple.v-paragraph-low] +[prime.n.variants.straight] +rank = 1 +description = '`n` with straight ending' +selector.n = 'straight' +selector.eng = 'straight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicStraight" + +[prime.n.variants.tailed] +rank = 2 +description = '`n` with a curly tail' +selector.n = 'tailed' +selector.eng = 'straight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicTailed" + +[prime.n.variants.earless-corner-straight] +rank = 3 +description = 'Earless (corner top-left) `n` with straight ending' +selector.n = 'earlessCornerStraight' +selector.eng = 'earlessCornerStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicEarlessCornerStraight" + +[prime.n.variants.earless-corner-tailed] +rank = 4 +description = 'Earless (corner top-left) `n` with a curly tail' +selector.n = 'earlessCornerTailed' +selector.eng = 'earlessCornerStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicEarlessCornerTailed" + +[prime.n.variants.earless-rounded-straight] +rank = 5 +description = 'Earless (rounded top-left) `n` with straight ending' +selector.n = 'earlessRoundedStraight' +selector.eng = 'earlessRoundedStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicEarlessRoundedStraight" + +[prime.n.variants.earless-rounded-tailed] +rank = 6 +description = 'Earless (rounded top-left) `n` with a curly tail' +selector.n = 'earlessRoundedTailed' +selector.eng = 'earlessRoundedStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicEarlessRoundedTailed" + +[prime.n.variants.motion-serifed-straight] +rank = 7 +description = '`n` with motion serifs and straight ending' +selector.n = 'motionSerifedStraight' +selector.eng = 'motionSerifedStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicMotionSerifedStraight" + +[prime.n.variants.motion-serifed-tailed] +rank = 8 +description = '`n` with motion serifs and a curly tail' +selector.n = 'motionSerifedTailed' +selector.eng = 'motionSerifedStraight' +selectorUpright."cyrl/pe" = "upright" +selectorItalic."cyrl/pe" = "italicMotionSerifedTailed" + + + +[prime.p] +sampler = 'p' tag = 'cv23' -sampler = '¶' -description = 'Lower paragraph symbol `¶`' -variant.paragraph = 'low' -variant.revertParagraph = 'low' -[simple.v-caret-high] +[prime.p.variants.eared] +rank = 1 +description = '`p` with top-left ear' +selector.p = 'eared' + +[prime.p.variants.earless-corner] +rank = 2 +description = '`p` without top-left ear (corner)' +selector.p = 'earlessCorner' + +[prime.p.variants.earless-rounded] +rank = 3 +description = '`p` without top-left ear (rounded)' +selector.p = 'earlessRounded' + +[prime.p.variants.motion-serifed] +rank = 4 +description = '`p` with motion serifs' +selector.p = 'motionSerifed' + + + +[prime.q] +sampler = 'q' +tag = 'cv24' + +[prime.q.variants.straight] +rank = 1 +description = '`q` with straight bar' +selector.q = 'straight' + +[prime.q.variants.tailed] +rank = 2 +description = '`q` with tail' +selector.q = 'tailed' + +[prime.q.variants.earless-corner] +rank = 3 +description = 'Earless (cornered top-left) single-storey `q`' +selector.q = 'earlessCorner' + +[prime.q.variants.earless-corner-tailed] +rank = 4 +description = 'Earless (cornered top-left) single-storey `q` with curly tail' +selector.q = 'earlessCornerTailed' + +[prime.q.variants.earless-rounded] +rank = 5 +description = 'Earless (rounded top-left) single-storey `q`' +selector.q = 'earlessRounded' + +[prime.q.variants.earless-rounded-tailed] +rank = 6 +description = 'Earless (rounded top-left) single-storey `q` with curly tail' +selector.q = 'earlessRoundedTailed' + + + +[prime.r] +sampler = 'r' +tag = 'cv25' + +[prime.r.variants.straight] +rank = 1 +description = 'Straight, serif-less `r`' +selector.r = "straight" +selector."turnrrtail" = "straight" +selector."rflap" = "straight" + +[prime.r.variants.serifed] +rank = 2 +description = '`r` with serif at both top and bottom' +selector.r = "serifed" +selector."turnrrtail" = "serifed" +selector."rflap" = "serifed" + +[prime.r.variants.top-serifed] +rank = 3 +description = '`r` with serifs at top-left only' +selector.r = "top-serifed" +selector."turnrrtail" = "top-serifed" +selector."rflap" = "straight" + +[prime.r.variants.earless-corner] +rank = 4 +description = 'Earless (corner top-left), serif-less `r`' +selector.r = "earlessCorner" +selector."turnrrtail" = "straight" +selector."rflap" = "straight" + +[prime.r.variants.earless-rounded] +rank = 5 +description = 'Earless (rounded top-left), serif-less `r`' +selector.r = "earlessRounded" +selector."turnrrtail" = "straight" +selector."rflap" = "straight" + + + +[prime.t] +sampler = 't' +tag = 'cv26' + +[prime.t.variants.standard] +rank = 1 +description = 'Standard `t` shape' +selector.t = 'standard' + +[prime.t.variants.cross] +rank = 2 +description = 'Futura-like `t` shape' +selector.t = 'cross' + +[prime.t.variants.flat-hook] +rank = 3 +description = "`t` with flat hook" +selector.t = 'flatHook' + +[prime.t.variants.hookless-asymmetric] +rank = 4 +description = "`t` without hook and ony half the cross bar" +selector.t = 'hooklessAsymmetric' + +[prime.t.variants.flat-hook-short-neck] +rank = 5 +description = "`t` with flat hook and a slightly shorter neck" +selector.t = 'flatHookShortNeck' + +[prime.t.variants.flat-hook-short-neck2] +rank = 6 +description = "`t` with flat hook and a more shorter neck" +selector.t = 'flatHookShortNeck2' + + + +[prime.u] +sampler = 'u' +tag = 'cv27' + +[prime.u.variants.with-bar] +rank = 1 +description = "Normal `u` with right bar" +selector.u = "withBar" +selectorUpright."cyrl/i" = "upright" +selectorItalic."cyrl/i" = "italicWithBar" +selectorUpright."cyrl/sha" = "upright" +selectorItalic."cyrl/sha" = "italicStraight" +selectorUpright."cyrl/dzhe" = "upright" +selectorItalic."cyrl/dzhe" = "italicStraight" + +[prime.u.variants.without-bar] +rank = 2 +description = "Normal `u` without right bar, like a smaller uppercase `U`" +selector.u = "withoutBar" +selectorUpright."cyrl/i" = "upright" +selectorItalic."cyrl/i" = "italicWithBar" +selectorUpright."cyrl/sha" = "upright" +selectorItalic."cyrl/sha" = "italicStraight" +selectorUpright."cyrl/dzhe" = "upright" +selectorItalic."cyrl/dzhe" = "italicStraight" + +[prime.u.variants.tailed] +rank = 3 +description = "`u` with right bar and a slightly curly tail" +selector.u = "tailed" +selectorUpright."cyrl/i" = "upright" +selectorItalic."cyrl/i" = "italicTailed" +selectorUpright."cyrl/sha" = "upright" +selectorItalic."cyrl/sha" = "italicTailed" +selectorUpright."cyrl/dzhe" = "upright" +selectorItalic."cyrl/dzhe" = "italicTailed" + +[prime.u.variants.motion-serifed] +rank = 4 +description = "Normal `u` with right bar and motion serifs" +selector.u = "motionSerifed" +selectorUpright."cyrl/i" = "upright" +selectorItalic."cyrl/i" = "italicMotionSerifed" +selectorUpright."cyrl/sha" = "upright" +selectorItalic."cyrl/sha" = "italicMotionSerifed" +selectorUpright."cyrl/dzhe" = "upright" +selectorItalic."cyrl/dzhe" = "italicMotionSerifed" + +[prime.u.variants.motion-serifed-tailed] +rank = 5 +description = "`u` with right bar, motion serifs and a slightly curly tail" +selector.u = "motionSerifedTailed" +selectorUpright."cyrl/i" = "upright" +selectorItalic."cyrl/i" = "italicMotionSerifedTailed" +selectorUpright."cyrl/sha" = "upright" +selectorItalic."cyrl/sha" = "italicMotionSerifedTailed" +selectorUpright."cyrl/dzhe" = "upright" +selectorItalic."cyrl/dzhe" = "italicMotionSerifedTailed" + + + +[prime.v] +sampler = 'vV' +tag = 'cv28' + +[prime.v.variants.straight] +rank = 1 +description = 'Standard, straight `V` and `v`' +selector.v = "straight" +selector.V = "straight" + +[prime.v.variants.curly] +rank = 2 +description = ' Slightly curly `V` and `v`, like Iosevka 2.x' +selector.v = "curly" +selector.V = "curly" + + + +[prime.w] +sampler = 'wW' tag = 'cv29' -sampler = '^' -description = 'Higher circumflex `^`' -variant.asciiCaret = 'high' -[simple.v-caret-low] +[prime.w.variants.straight] +rank = 1 +description = 'Standard, straight `W` and `w`' +selector.W = "straight" +selector.w = "straight" + +[prime.w.variants.curly] +rank = 2 +description = 'Slightly curly `W` and `w`, like Iosevka 2.x' +selector.W = "curly" +selector.w = "curly" + +[prime.w.variants.straight-flat-top] +rank = 3 +description = 'Standard, straight `W` and `w`, and the middle is forced to be aligned the top' +selector.W = "straightFlatTop" +selector.w = "straightFlatTop" + + + +[prime.x] +sampler = 'xX' tag = 'cv30' -sampler = '^' -description = 'Lower circumflex `^`' -variant.asciiCaret = 'low' -[simple.v-paren-normal] -tag = 'VXAN' -sampler = '( )' -description = 'Parenthesis with normal contour' -variant.parenLeft = 'normal' -variant.parenRight = 'normal' +[prime.x.variants.straight] +rank = 1 +description = 'Standard, straight `X` and `x`' +selector.X = "straight" +selector.x = "straight" -[simple.v-paren-large-contour] -tag = 'VXAO' -sampler = '( )' -description = 'Parenthesis with larger contour, like that in Monaco' -variant.parenLeft = 'largeContour' -variant.parenRight = 'largeContour' +[prime.x.variants.curly] +rank = 2 +description = 'Slightly curly `X` and `x`, like Iosevka 2.x' +selector.X = "curly" +selector.x = "curly" -[simple.v-brace-straight] -tag = 'cv36' -sampler = '{ }' -description = 'More straight braces' -variant.braceLeft = 'straight' -variant.braceRight = 'straight' -[simple.v-brace-curly] -tag = 'cv37' -sampler = '{ }' -description = 'More curly braces' -variant.braceLeft = 'curly' -variant.braceRight = 'curly' -[simple.v-numbersign-upright] -tag = 'cv44' -sampler = '#' -description = 'Number sign with vertical bars' -variant.numbersign = 'upright' - -[simple.v-numbersign-slanted] -tag = 'cv45' -sampler = '#' -description = 'Number sign with slanted bars' -variant.numbersign = 'slanted' - -[simple.v-numbersign-upright-open] -tag = 'VXBI' -sampler = '#' -description = 'Number sign with vertical bars and open inner' -variant.numbersign = 'uprightOpen' - -[simple.v-numbersign-slanted-open] -tag = 'VXBJ' -sampler = '#' -description = 'Number sign with slanted bars and open inner' -variant.numbersign = 'slantedOpen' - -[simple.v-ampersand-closed] -tag = 'VXAG' -sampler = '&' -description = 'Ampersand (`&`) with a closed contour' -variant.ampersand = 'closed' - -[simple.v-ampersand-upper-open] -tag = 'VXAH' -sampler = '&' -description = 'Ampersand (`&`) with an open contour at upper half' -variant.ampersand = 'upperOpen' - -[simple.v-ampersand-lower-open] -tag = 'VXAI' -sampler = '&' -description = 'Ampersand (`&`) with an open contour at lower half' -variant.ampersand = 'lowerOpen' - -[simple.v-ampersand-et] -tag = 'VXAJ' -sampler = '&' -description = 'Ampersand (`&`) drawn like a ligature of Ɛ and t' -variant.ampersand = 'et' - -[simple.v-ampersand-et-toothed] -tag = 'VXAK' -sampler = '&' -description = 'Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth' -variant.ampersand = 'etToothed' - -[simple.v-ampersand-flat-top] -tag = 'VXAL' -sampler = '&' -description = 'Ampersand (`&`) drawn with a flat top' -variant.ampersand = 'flatTop' - -[simple.v-at-threefold] +[prime.y] +sampler = 'y' tag = 'cv31' -sampler = '@' -description = 'The long, three-fold At symbol (`@`)' -variant.at = 'threefold' -[simple.v-at-fourfold] +[prime.y.variants.straight] +rank = 1 +description = 'Letter `y` that is fully straight' +selector.y = "straight" +selector."cyrl/U" = "straight" + +[prime.y.variants.straight-turn] +rank = 2 +description = 'Letter `y` with straight upper and a tail turns leftward' +selector.y = "straightTurn" +selector."cyrl/U" = "straightTurn" + +[prime.y.variants.curly] +rank = 3 +description = 'More curly letter `y`, like Iosevka 2.x' +selector.y = "curly" +selector."cyrl/U" = "curly" + +[prime.y.variants.cursive] +rank = 4 +description = 'Cursive-like `y`' +selector.y = "cursive" +selector."cyrl/U" = "straight" + + + +[prime.z] +sampler = 'zZ' tag = 'cv32' -sampler = '@' -description = 'The traditional, four-fold At symbol (`@`)' -variant.at = 'fourfold' -[simple.v-at-short] +[prime.z.variants.standard] +rank = 1 +description = 'Standard `Z` and `z`' +selector.z = 'standard' +selector.Z = 'standard' + +[prime.z.variants.with-crossbar] +rank = 2 +description = '`Z` and `z` with a diagonal cross bar for better dsitinction with `2`' +selector.z = 'withCrossBar' +selector.Z = 'withCrossBar' + +[prime.z.variants.with-horizontal-crossbar] +rank = 3 +description = '`Z` and `z` with a horizontal cross bar for better dsitinction with `2`' +selector.z = 'withHorizontalCrossBar' +selector.Z = 'withHorizontalCrossBar' + + + +[prime.eszet] +sampler = 'ß' tag = 'cv33' -sampler = '@' -description = 'The shorter, Fira-like At symbol (`@`)' -variant.at = 'short' -[simple.v-dollar-open] +[prime.eszet.variants.traditional] +rank = 1 +description = 'Traditional, Fraktur-like Eszet' +selector.eszet = 'traditional' + +[prime.eszet.variants.sulzbacher] +rank = 2 +description = 'A more modern, beta-like Eszet' +selector.eszet = 'sulzbacher' + +[prime.eszet.variants.longs-s-lig] +rank = 3 +description = 'An Eszet shown as a ligature of long-S (`ſ`) and `s`' +selector.eszet = 'longsslig' + + + +[prime.lambda] +sampler = 'λ' +tag = 'cv34' + +[prime.lambda.variants.straight] +rank = 1 +description = 'More-straight letter `λ`' +selector."grek/lambda" = "straight" + +[prime.lambda.variants.curly] +rank = 2 +description = 'More curly letter `λ`, like Iosevka 2.x' +selector."grek/lambda" = "curly" + + + +[prime.zero] +sampler = '0' +tag = 'cv35' + +[prime.zero.variants.slashed] +rank = 1 +description = 'Slashed Zero `0`' +selector.zero = 'slashed' + +[prime.zero.variants.dotted] +rank = 2 +description = 'Dotted Zero `0`' +selector.zero = 'dotted' + +[prime.zero.variants.unslashed] +rank = 3 +description = 'O-like `0`' +selector.zero = 'unslashed' + +[prime.zero.variants.reverse-slashed] +rank = 4 +description = 'Reverse-slashed `0`' +selector.zero = 'reverse-slashed' + +[prime.zero.variants.long-dotted] +rank = 5 +description = 'Long-dotted Zero `0` like Hack' +selector.zero = 'longDotted' + + + +[prime.one] +sampler = '1' +tag = 'cv36' + +[prime.one.variants.nobase] +rank = 1 +description = '`1` with bottom serif' +selector.one = "nobase" + +[prime.one.variants.base] +rank = 2 +description = '`1` without bottom serif' +selector.one = "base" + +[prime.one.variants.line] +rank = 3 +description = '`1` drawn just like a straight line' +selector.one = "line" + + + +[prime.three] +sampler = '3' +tag = 'cv37' + +[prime.three.variants.flattop] +rank = 1 +description = 'Flat top `3` (Like Museo Sans / Montserrat)' +selector.three = 'flattop' + +[prime.three.variants.twoarcs] +rank = 2 +description = 'Arched top `3`' +selector.three = 'twoarcs' + + + +[prime.four] +sampler = '4' tag = 'cv38' + +[prime.four.variants.closed] +rank = 1 +description = '`4` with closed contour' +selector.four = 'closed' + +[prime.four.variants.closed-non-crossing] +rank = 2 +description = '`4` with closed contour but the horizontal bar does not overflow the vertical bar' +selector.four = 'closedNonCrossing' + +[prime.four.variants.semi-open] +rank = 3 +description = '`4` with semi-open contour' +selector.four = 'semiOpen' + +[prime.four.variants.semi-open-non-crossing] +rank = 4 +description = '`4` with semi-open contour but the horizontal bar does not overflow the vertical bar' +selector.four = 'semiOpenNonCrossing' + +[prime.four.variants.open] +rank = 5 +description = '`4` with open contour' +selector.four = 'open' + +[prime.four.variants.open-non-crossing] +rank = 6 +description = '`4` with open contour but the horizontal bar does not overflow the vertical bar' +selector.four = 'openNonCrossing' + + + +[prime.six] +sampler = '6' +tag = 'cv40' + +[prime.six.variants.closed-contour] +rank = 1 +description = '`6` with a more closed contour' +selector.six = "closedContour" + +[prime.six.variants.open-contour] +rank = 2 +description = '`6` with a more open contour' +selector.six = "openContour" + +[prime.six.variants.straight-bar] +rank = 3 +description = '`6` with a straight bar' +selector.six = "straightBar" + + + +[prime.seven] +sampler = '7' +tag = 'cv41' + +[prime.seven.variants.noserif] +rank = 1 +description = '`7` without serif' +selector.seven = "noserif" + +[prime.seven.variants.serifed] +rank = 2 +description = '`7` with initial serif' +selector.seven = "serifed" + +[prime.seven.variants.crossbar] +rank = 3 +description = '`7` with crossbar' +selector.seven = "crossbar" + +[prime.seven.variants.crossbar-serifed] +rank = 4 +description = '`7` with crossbar and initial serif' +selector.seven = "crossbarSerifed" + + + +[prime.nine] +sampler = '9' +tag = 'cv42' + +[prime.nine.variants.closed-contour] +rank = 1 +description = '`9` with a more closed contour' +selector.nine = "closedContour" + +[prime.nine.variants.open-contour] +rank = 2 +description = '`9` with a more open contour' +selector.nine = "openContour" + +[prime.nine.variants.straight-bar] +rank = 3 +description = '`9` with a straight bar' +selector.nine = "straightBar" + + + +[prime.tilde] +sampler = '~' +tag = 'cv43' + +[prime.tilde.variants.high] +rank = 1 +description = 'Higher tilde `~`' +selector.asciiTilde = 'high' + +[prime.tilde.variants.low] +rank = 2 +description = 'Lower tilde `~`' +selector.asciiTilde = 'low' + + + +[prime.asterisk] +sampler = '*' +tag = 'cv44' + +[prime.asterisk.variants.high] +rank = 1 +description = 'Higher five-pointed asterisk `*`' +selector.asterisk = 'high' + +[prime.asterisk.variants.low] +rank = 2 +description = 'Lower five-pointed asterisk `*`' +selector.asterisk = 'low' + +[prime.asterisk.variants.hexhigh] +rank = 3 +description = 'Higher six-pointed asterisk `*`' +selector.asterisk = "hexhigh" + +[prime.asterisk.variants.hexlow] +rank = 4 +description = 'Lower six-pointed asterisk `*`' +selector.asterisk = "hexlow" + +[prime.asterisk.variants.flip-penta-high] +rank = 5 +description = 'Higher five-pointed and turned asterisk `*`' +selector.asterisk = 'turnPentaHigh' + +[prime.asterisk.variants.flip-penta-low] +rank = 6 +description = 'Lower five-pointed and turned asterisk `*`' +selector.asterisk = 'turnPentaLow' + + + +[prime.underscore] +sampler = '_' +tag = 'cv45' + +[prime.underscore.variants.high] +rank = 1 +description = 'Higher underscore `_`, placed right below baseline' +selector.underscore = 'high' + +[prime.underscore.variants.low] +rank = 2 +description = 'Lower underscore `_`, placed right above descender line' +selector.underscore = 'low' + +[prime.underscore.variants.above-baseline] +rank = 3 +description = 'Extra-high `_`, placed right below baseline' +selector.underscore = 'aboveBaseline' + + + +[prime.paragraph-sign] +sampler = '¶' +tag = 'cv46' + +[prime.paragraph-sign.variants.high] +rank = 1 +description = 'Higher paragraph sign `¶`' +selector.paragraph = 'high' +selector.revertParagraph = 'high' + +[prime.paragraph-sign.variants.low] +rank = 2 +description = 'Lower paragraph sign `¶`' +selector.paragraph = 'low' +selector.revertParagraph = 'low' + + + +[prime.caret] +sampler = '^' +tag = 'cv47' + +[prime.caret.variants.high] +rank = 1 +description = 'Higher circumflex `^`' +selector.asciiCaret = 'high' + +[prime.caret.variants.low] +rank = 2 +description = 'Lower circumflex `^`' +selector.asciiCaret = 'low' + + + +[prime.paren] +sampler = '( )' +tag = 'cv48' + +[prime.paren.variants.normal] +rank = 1 +description = 'Parenthesis with normal contour' +selector.parenLeft = 'normal' +selector.parenRight = 'normal' + +[prime.paren.variants.large-contour] +rank = 2 +description = 'Parenthesis with larger contour, like that in Monaco' +selector.parenLeft = 'largeContour' +selector.parenRight = 'largeContour' + + + +[prime.brace] +sampler = '{ }' +tag = 'cv49' + +[prime.brace.variants.straight] +rank = 1 +description = 'More straight braces' +selector.braceLeft = 'straight' +selector.braceRight = 'straight' + +[prime.brace.variants.curly] +rank = 2 +description = 'More curly braces' +selector.braceLeft = 'curly' +selector.braceRight = 'curly' + + + +[prime.number-sign] +sampler = '#' +tag = 'cv50' + +[prime.number-sign.variants.upright] +rank = 1 +description = 'Number sign with vertical bars' +selector.numberSign = 'upright' + +[prime.number-sign.variants.slanted] +rank = 2 +description = 'Number sign with slanted bars' +selector.numberSign = 'slanted' + +[prime.number-sign.variants.upright-open] +rank = 3 +description = 'Number sign with vertical bars and open inner' +selector.numberSign = 'uprightOpen' + +[prime.number-sign.variants.slanted-open] +rank = 4 +description = 'Number sign with slanted bars and open inner' +selector.numberSign = 'slantedOpen' + + + +[prime.ampersand] +sampler = '&' +tag = 'cv51' + +[prime.ampersand.variants.closed] +rank = 1 +description = 'Ampersand (`&`) with a closed contour' +selector.ampersand = 'closed' + +[prime.ampersand.variants.upper-open] +rank = 2 +description = 'Ampersand (`&`) with an open contour at upper half' +selector.ampersand = 'upperOpen' + +[prime.ampersand.variants.lower-open] +rank = 3 +description = 'Ampersand (`&`) with an open contour at lower half' +selector.ampersand = 'lowerOpen' + +[prime.ampersand.variants.et] +rank = 4 +description = 'Ampersand (`&`) drawn like a ligature of Ɛ and t' +selector.ampersand = 'et' + +[prime.ampersand.variants.et-toothed] +rank = 5 +description = 'Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth' +selector.ampersand = 'etToothed' + +[prime.ampersand.variants.flat-top] +rank = 6 +description = 'Ampersand (`&`) drawn with a flat top' +selector.ampersand = 'flatTop' + + + +[prime.at] +sampler = '@' +tag = 'cv52' + +[prime.at.variants.threefold] +rank = 1 +description = 'The long, three-fold At symbol (`@`)' +selector.at = 'threefold' + +[prime.at.variants.fourfold] +rank = 2 +description = 'The traditional, four-fold At symbol (`@`)' +selector.at = 'fourfold' + +[prime.at.variants.short] +rank = 3 +description = 'The shorter, Fira-like At symbol (`@`)' +selector.at = 'short' + + + +[prime.dollar] sampler = '$' +tag = 'cv53' + +[prime.dollar.variants.open] +rank = 1 description = 'Dollar symbol with open contour' -variant.dollar = 'open' +selector.dollar = 'open' -[simple.v-dollar-through] -tag = 'cv39' -sampler = '$' +[prime.dollar.variants.through] +rank = 2 description = 'Dollar symbol with strike-through vertical bar' -variant.dollar = 'through' +selector.dollar = 'through' -[simple.v-dollar-opencap] -tag = "cv54" -sampler = '$' +[prime.dollar.variants.opencap] +rank = 3 description = 'Dollar symbol with open contour, not exceeding baseline and ascender' -variant.dollar = "opencap" +selector.dollar = "opencap" -[simple.v-dollar-throughcap] -tag = "cv55" -sampler = '$' +[prime.dollar.variants.throughcap] +rank = 4 description = 'Dollar symbol with strike-through vertical bar, not exceeding baseline and ascender' -variant.dollar = "throughcap" +selector.dollar = "throughcap" -[simple.v-percent-dots] -tag = "cv62" + + +[prime.percent] sampler = '%' +tag = 'cv54' + +[prime.percent.variants.dots] +rank = 1 description = 'Percent `%`, Per-mille `‰` and basis point `‱` using rectangular dots' -variant.percent = "dots" +selector.percent = "dots" -[simple.v-percent-rings] -tag = "cv63" -sampler = '%' +[prime.percent.variants.rings] +rank = 2 description = 'Percent `%` with rings and broken bar; Per-mille `‰` and basis point `‱` with rings' -variant.percent = "rings" +selector.percent = "rings" -[simple.v-bar-natural-slope] +[prime.percent.variants.rings-connected] +rank = 3 +description = 'Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar' +selector.percent = "ringsConnected" + + + +[prime.bar] +sampler = '|' +tag = 'cv55' + +[prime.bar.variants.natural-slope] tag = "VXCY" sampler = '|' description = 'Bar punctuations (`|`) has a natural slope under italics and oblique' -variantUpright.bar = "naturalSlope" -variantItalic.bar = "naturalSlope" +selectorUpright.bar = "naturalSlope" +selectorItalic.bar = "naturalSlope" -[simple.v-bar-force-upright] +[prime.bar.variants.force-upright] tag = "VXCZ" sampler = '|' description = 'Bar punctuations (`|`) is forced upright under italics and oblique' -variantUpright.bar = "naturalSlope" -variantItalic.bar = "forceUpright" +selectorUpright.bar = "naturalSlope" +selectorItalic.bar = "forceUpright" -[simple.v-percent-rings-connected] -tag = "VXCK" -sampler = '%' -description = 'Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar' -variant.percent = "ringsConnected" -[simple.v-lig-ltgteq-flat] -tag = "cv66" + +[prime.lig-ltgteq] sampler = '<= >=' +tag = 'cv56' + +[prime.lig-ltgteq.variants.flat] +rank = 1 description = 'The lower bar of `<=` and `>=` ligation is flat' -variant."eq.at-lteq.lig2" = "flat" -variant."eq.at-gteq.lig2" = "flat" +selector."eq.at-lteq.lig2" = "flat" +selector."eq.at-gteq.lig2" = "flat" -[simple.v-lig-ltgteq-slanted] -tag = "cv67" -sampler = '<= >=' +[prime.lig-ltgteq.variants.slanted] +rank = 2 description = 'The lower bar of `<=` and `>=` ligation is slanted' -variant."eq.at-lteq.lig2" = "slanted" -variant."eq.at-gteq.lig2" = "slanted" +selector."eq.at-lteq.lig2" = "slanted" +selector."eq.at-gteq.lig2" = "slanted" -[simple.v-ascii-quote-straight] -tag = 'VXDG' + + +[prime.ascii-single-quote] sampler = "'" +tag = 'cv57' + +[prime.ascii-single-quote.variants.straight] +rank = 1 description = "Show ASCII quote (`'`) as short vertical straight bar." -variant.asciiSingleQuote = 'straight' +selector.asciiSingleQuote = 'straight' -[simple.v-ascii-quote-raised-comma] -tag = 'VXDH' -sampler = "'" +[prime.ascii-single-quote.variants.raised-comma] +rank = 2 description = "Show ASCII quote (`'`) as raised comma." -variant.asciiSingleQuote = 'raisedComma' +selector.asciiSingleQuote = 'raisedComma' -[simple.v-ascii-grave-straight] -tag = 'VXDI' -sampler = "`" + + +[prime.ascii-grave] +sampler = '`' +tag = 'cv58' + +[prime.ascii-grave.variants.straight] +rank = 1 description = "Show ASCII grave (`` ` ``) as short diagonal straight bar." -variant.asciiGrave = 'straight' +selector.asciiGrave = 'straight' -[simple.v-ascii-grave-raised-inverse-comma] -tag = 'VXDJ' -sampler = "`" +[prime.ascii-grave.variants.raised-inverse-comma] +rank = 2 description = "Show ASCII grave (`` ` ``) as raised comma." -variant.asciiGrave = 'raisedInverseComma' +selector.asciiGrave = 'raisedInverseComma' ########## "Untagged" variants, used for Aile, etc. -[simple.v-capital-i-straight] -variant.I = "line" # set on purpose to use II diversity +[prime.capital-i.variants.straight] +selector.I = "line" # set on purpose to use II diversity -[simple.v-capital-i-serifed] -variant.I = "serifed" +[prime.capital-i.variants.serifed] +selector.I = "serifed" -[simple.v-f-narrow] -variant.f = 'narrow' +[prime.f.variants.narrow] +selector.f = 'narrow' -[simple.v-t-narrow] -variant.t = 'narrow' +[prime.t.variants.narrow] +selector.t = 'narrow' -[simple.v-j-narrow] -variant.dotlessj = "narrow" +[prime.j.variants.narrow] +selector.dotlessj = "narrow" -[simple.v-j-narrow-serifed] -variant.dotlessj = "narrowSerifed" +[prime.j.variants.narrow-serifed] +selector.dotlessj = "narrowSerifed" -[simple.v-r-narrow] -variant.r = "narrow" -variant."turnrrtail" = "narrow" -variant."rflap" = "narrow" +[prime.r.variants.narrow] +selector.r = "narrow" +selector."turnrrtail" = "narrow" +selector."rflap" = "narrow" ################################################################################################### -[default] -design = [ - # Capitals - 'v-capital-b-standard', - 'v-capital-d-standard', - 'v-capital-g-tooth', - 'v-capital-i-serifed', - 'v-capital-j-serifed', - 'v-capital-k-straight', - 'v-capital-m-hanging', - 'v-capital-q-taily', - 'v-capital-r-straight', - 'v-capital-y-straight', - # Lowers - 'v-b-toothed', - 'v-g-singlestorey', - 'v-p-eared', - 'v-q-straight', - 'v-r-straight', - 'v-t-standard', - 'v-v-straight', - 'v-w-straight', - 'v-x-straight', - 'v-z-standard', - # Non-latin - 'v-turn-v-straight', - 'v-eszet-sulzbacher', - 'v-lambda-straight', - # Digits - 'v-zero-slashed', - 'v-one-nobase', - 'v-three-twoarcs', - 'v-four-closed', - 'v-six-straight-bar', - 'v-seven-noserif', - 'v-nine-straight-bar', - # Symbols - 'v-tilde-low', - 'v-asterisk-high', - 'v-paragraph-high', - 'v-caret-high', - 'v-underscore-high', - 'v-at-threefold', - 'v-paren-normal', - 'v-brace-curly', - 'v-dollar-through', - 'v-numbersign-upright', - 'v-percent-rings', - 'v-lig-ltgteq-flat', - 'v-ampersand-closed', - 'v-bar-natural-slope', - 'v-ascii-quote-straight', - 'v-ascii-grave-straight', - # m, n, h has tailed variant, but not very ideal - # Do not make them default - 'v-h-straight', - 'v-m-normal', - 'v-n-straight', - # Others - 'others', -] -upright = [ - 'v-a-doublestorey', - 'v-d-toothed', - 'v-f-straight', - 'v-i-serifed', - 'v-j-serifed', - 'v-k-straight', - 'v-l-serifed', - 'v-u-with-bar', - 'v-y-straight', -] -italic = [ - 'v-a-singlestorey-tailed', - 'v-d-tailed', - 'v-f-tailed', - 'v-i-italic', - 'v-j-serifed', - 'v-k-cursive', - 'v-l-italic', - 'v-u-tailed', - 'v-y-cursive', -] +[default.design] +# Capitals +capital-b = 'standard' +capital-d = 'standard' +capital-g = 'toothed' +capital-i = 'serifed' +capital-j = 'serifed' +capital-k = 'straight' +capital-m = 'hanging' +capital-q = 'taily' +capital-r = 'straight' +capital-y = 'straight' +# Lowers +b = 'toothed' +g = 'singlestorey' +p = 'eared' +q = 'straight' +r = 'straight' +t = 'standard' +v = 'straight' +w = 'straight' +x = 'straight' +z = 'standard' +# Non-latin +turn-v = 'straight' +eszet = 'sulzbacher' +lambda = 'straight' +# Digits +zero = 'slashed' +one = 'nobase' +three = 'twoarcs' +four = 'closed' +six = 'straight-bar' +seven = 'noserif' +nine = 'straight-bar' +# Symbols +tilde = 'low' +asterisk = 'high' +paragraph-sign = 'high' +caret = 'high' +underscore = 'high' +at = 'threefold' +paren = 'normal' +brace = 'curly' +dollar = 'through' +number-sign = 'upright' +percent = 'rings' +lig-ltgteq = 'flat' +ampersand = 'closed' +bar = 'natural-slope' +ascii-single-quote = 'straight' +ascii-grave = 'straight' +# m, n, h has tailed variant, but not very ideal +# Do not make them default +h = 'straight' +m = 'normal' +n = 'straight' + +[default.upright] +a = 'doublestorey' +d = 'toothed' +f = 'straight' +i = 'serifed' +j = 'serifed' +k = 'straight' +l = 'serifed' +u = 'with-bar' +y = 'straight' + +[default.italic] +a = 'singlestorey-tailed' +d = 'tailed' +f = 'tailed' +i = 'italic' +j = 'serifed' +k = 'cursive' +l = 'italic' +u = 'tailed' +y = 'cursive' + +################################################################################################### + +[composite.slab.design] +one = 'base' +seven = 'serifed' + +[composite.slab.upright] +f = 'serifed' +r = 'serifed' +y = 'straight-turn' + +[composite.slab.italic] +f = 'tailed' +r = 'top-serifed' +y = 'cursive' + -[composite.slab] -design = ['v-one-base', 'v-seven-serifed'] -upright = ['v-f-serifed', 'v-r-serifed', 'v-y-straight-turn'] -italic = ['v-f-tailed', 'v-r-top-serifed', 'v-y-cursive'] -# Composite character options, overrides default settings above. [composite.ss01] +tag = 'ss01' description = "Andale Mono Style" -design = ['v-i-hooky', 'v-a-doublestorey', 'v-g-doublestorey', 'v-k-straight', 'v-l-zshaped', 'v-y-straight-turn', 'v-at-fourfold', 'v-zero-dotted', 'v-g-doublestorey', 'v-brace-straight', 'v-underscore-low', 'v-numbersign-slanted', 'v-asterisk-hexhigh', 'v-one-base', 'v-six-open-contour', 'v-nine-open-contour'] + +[composite.ss01.design] +i = 'hooky' +a = 'doublestorey' +g = 'doublestorey' +k = 'straight' +l = 'zshaped' +y = 'straight-turn' +at = 'fourfold' +zero = 'dotted' +brace = 'straight' +underscore = 'low' +number-sign = 'slanted' +asterisk = 'hexhigh' +one = 'base' +six = 'open-contour' +nine = 'open-contour' + + [composite.ss02] +tag = 'ss02' description = "Anonymous Pro Style" -design = ['v-at-fourfold', 'v-a-doublestorey', 'v-brace-straight', 'v-k-straight', 'v-l-serifed', 'v-i-serifed', 'v-y-straight-turn', 'v-asterisk-hexlow', 'v-one-base', 'v-seven-serifed', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss02.design] +at = 'fourfold' +a = 'doublestorey' +brace = 'straight' +k = 'straight' +l = 'serifed' +i = 'serifed' +y = 'straight-turn' +asterisk = 'hexlow' +one = 'base' +seven = 'serifed' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss03] +tag = 'ss03' description = 'Consolas Style' -design = ['v-at-fourfold', 'v-underscore-low', 'v-brace-straight', 'v-numbersign-slanted', 'v-asterisk-hexhigh', 'v-one-base', 'v-six-open-contour', 'v-nine-open-contour'] -upright = ['v-g-doublestorey', 'v-y-straight-turn'] -italic = ['v-g-singlestorey', 'v-y-cursive'] + +[composite.ss03.design] +at = 'fourfold' +underscore = 'low' +brace = 'straight' +number-sign = 'slanted' +asterisk = 'hexhigh' +one = 'base' +six = 'open-contour' +nine = 'open-contour' + +[composite.ss03.upright] +g = 'doublestorey' +y = 'straight-turn' + +[composite.ss03.italic] +g = 'singlestorey' +y = 'cursive' + + [composite.ss04] +tag = 'ss04' description = 'Menlo Style' -design = ['v-at-threefold', 'v-a-doublestorey', 'v-underscore-low', 'v-i-serifed', 'v-k-straight', 'v-l-italic', 'v-y-straight-turn', 'v-brace-straight', 'v-numbersign-slanted', 'v-asterisk-hexlow', 'v-one-base', 'v-ampersand-upper-open', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss04.design] +at = 'threefold' +a = 'doublestorey' +underscore = 'low' +i = 'serifed' +k = 'straight' +l = 'italic' +y = 'straight-turn' +brace = 'straight' +number-sign = 'slanted' +asterisk = 'hexlow' +one = 'base' +ampersand = 'upper-open' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss05] +tag = 'ss05' description = 'Fira Mono Style' -design = ['v-at-short', 'v-underscore-low', 'v-a-doublestorey', 'v-g-opendoublestorey', 'v-i-serifed', 'v-k-straight', 'v-l-italic', 'v-y-straight-turn', 'v-numbersign-slanted', 'v-zero-dotted', 'v-one-base', 'v-ampersand-et', 'v-four-semi-open', 'v-six-closed-contour', 'v-nine-open-contour'] + +[composite.ss05.design] +at = 'short' +underscore = 'low' +a = 'doublestorey' +g = 'opendoublestorey' +i = 'serifed' +k = 'straight' +l = 'italic' +y = 'straight-turn' +number-sign = 'slanted' +zero = 'dotted' +one = 'base' +ampersand = 'et' +four = 'semi-open' +six = 'closed-contour' +nine = 'open-contour' + + [composite.ss06] +tag = 'ss06' description = 'Liberation Mono Style' -design = ['v-at-fourfold', 'v-a-doublestorey', 'v-i-serifed', 'v-k-straight', 'v-l-serifed', 'v-y-straight-turn', 'v-brace-straight', 'v-zero-dotted', 'v-numbersign-slanted', 'v-one-base', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss06.design] +at = 'fourfold' +a = 'doublestorey' +i = 'serifed' +k = 'straight' +l = 'serifed' +y = 'straight-turn' +brace = 'straight' +zero = 'dotted' +number-sign = 'slanted' +one = 'base' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss07] +tag = 'ss07' description = 'Monaco Style' -design = ['v-at-fourfold', 'v-a-singlestorey', 'v-i-zshaped', 'v-k-straight', 'v-l-zshaped', 'v-y-straight-turn', 'v-brace-straight', 'v-numbersign-slanted', 'v-asterisk-hexhigh', 'v-one-base', 'v-paren-large-contour', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss07.design] +at = 'fourfold' +a = 'singlestorey' +i = 'zshaped' +k = 'straight' +l = 'zshaped' +y = 'straight-turn' +brace = 'straight' +number-sign = 'slanted' +asterisk = 'hexhigh' +one = 'base' +paren = 'large-contour' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss08] +tag = 'ss08' description = 'Pragmata Pro Style' -design = ['v-at-threefold', 'v-a-doublestorey', 'v-l-serifed', 'v-i-serifed', 'v-asterisk-low', 'v-zero-dotted', 'v-brace-straight', 'v-dollar-open', 'v-underscore-low', 'v-numbersign-slanted', 'v-percent-dots', 'v-v-curly', 'v-turn-v-curly', 'v-w-curly', 'v-x-curly', 'v-capital-y-curly', 'v-capital-r-curly', 'v-capital-k-curly', 'v-k-curly', 'v-y-curly', 'v-lambda-curly', 'v-ampersand-upper-open', 'v-six-closed-contour', 'v-nine-closed-contour'] -upright = ['v-g-doublestorey'] -italic = ['v-g-singlestorey'] + +[composite.ss08.design] +at = 'threefold' +a = 'doublestorey' +l = 'serifed' +i = 'serifed' +asterisk = 'low' +zero = 'dotted' +brace = 'straight' +dollar = 'open' +underscore = 'low' +number-sign = 'slanted' +percent = 'dots' +v = 'curly' +turn-v = 'curly' +w = 'curly' +x = 'curly' +capital-y = 'curly' +capital-r = 'curly' +capital-k = 'curly' +k = 'curly' +y = 'curly' +lambda = 'curly' +ampersand = 'upper-open' +six = 'closed-contour' +nine = 'closed-contour' + +[composite.ss08.upright] +g = 'doublestorey' + +[composite.ss08.italic] +g = 'singlestorey' + + [composite.ss09] +tag = 'ss09' description = 'Source Code Pro Style' -design = ['v-at-threefold', 'v-k-straight', 'v-l-italic', 'v-y-straight-turn', 'v-asterisk-low', 'v-zero-dotted', 'v-dollar-open', 'v-numbersign-slanted', 'v-one-base', 'v-six-closed-contour', 'v-nine-closed-contour'] -upright = ['v-i-hooky', 'v-g-doublestorey'] -italic = ['v-g-singlestorey'] + +[composite.ss09.design] +at = 'threefold' +k = 'straight' +l = 'italic' +y = 'straight-turn' +asterisk = 'low' +zero = 'dotted' +dollar = 'open' +number-sign = 'slanted' +one = 'base' +six = 'closed-contour' +nine = 'closed-contour' + +[composite.ss09.upright] +i = 'hooky' +g = 'doublestorey' + +[composite.ss09.italic] +g = 'singlestorey' + + [composite.ss10] +tag = 'ss10' description = 'Envy Code R Style' -design = ['v-at-threefold', 'v-a-doublestorey', 'v-underscore-low', 'v-i-hooky', 'v-k-straight', 'v-l-hooky', 'v-y-cursive', 'v-asterisk-low', 'v-one-base', 'v-nine-straight-bar', 'v-six-straight-bar'] + +[composite.ss10.design] +at = 'threefold' +a = 'doublestorey' +underscore = 'low' +i = 'hooky' +k = 'straight' +l = 'hooky' +y = 'cursive' +asterisk = 'low' +one = 'base' +nine = 'straight-bar' +six = 'straight-bar' + + [composite.ss11] +tag = 'ss11' description = 'X Window Style' -design = ['v-zero-unslashed', 'v-tilde-high', 'v-brace-straight', 'v-dollar-through', 'v-three-flattop', 'v-at-threefold', 'v-one-base', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss11.design] +zero = 'unslashed' +tilde = 'high' +brace = 'straight' +dollar = 'through' +three = 'flattop' +at = 'threefold' +one = 'base' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss12] +tag = 'ss12' description = 'Ubuntu Mono Style' -design = ['v-at-threefold', 'v-a-doublestorey', 'v-f-straight', 'v-underscore-low', 'v-i-italic', 'v-k-straight', 'v-l-italic', 'v-m-shortleg', 'v-y-straight-turn', 'v-brace-straight', 'v-zero-dotted', 'v-one-base', 'v-numbersign-slanted', 'v-six-open-contour', 'v-nine-open-contour'] + +[composite.ss12.design] +at = 'threefold' +a = 'doublestorey' +f = 'straight' +underscore = 'low' +i = 'italic' +k = 'straight' +l = 'italic' +m = 'shortleg' +y = 'straight-turn' +brace = 'straight' +zero = 'dotted' +one = 'base' +number-sign = 'slanted' +six = 'open-contour' +nine = 'open-contour' + + [composite.ss13] +tag = 'ss13' description = 'Lucida Style' -design = ['v-i-hooky', 'v-k-straight', 'v-l-hooky', 'v-y-straight-turn', 'v-zero-dotted', 'v-underscore-low', 'v-caret-low', 'v-numbersign-slanted', 'v-one-base', 'v-six-closed-contour', 'v-nine-closed-contour'] + +[composite.ss13.design] +i = 'hooky' +k = 'straight' +l = 'hooky' +y = 'straight-turn' +zero = 'dotted' +underscore = 'low' +caret = 'low' +number-sign = 'slanted' +one = 'base' +six = 'closed-contour' +nine = 'closed-contour' + + [composite.ss14] +tag = 'ss14' description = 'JetBrains Mono Style' -design = ['v-i-serifed', 'v-k-straight', 'v-l-italic', 'v-u-without-bar', 'v-zero-long-dotted', 'v-three-flattop', 'v-capital-q-straight', 'v-asterisk-low', 'v-one-base', 'v-seven-serifed', 'v-ampersand-upper-open', 'v-four-semi-open-non-crossing', 'v-nine-straight-bar', 'v-six-straight-bar'] + +[composite.ss14.design] +i = 'serifed' +k = 'straight' +l = 'italic' +u = 'without-bar' +zero = 'long-dotted' +three = 'flattop' +capital-q = 'straight' +asterisk = 'low' +one = 'base' +seven = 'serifed' +ampersand = 'upper-open' +four = 'semi-open-non-crossing' +nine = 'straight-bar' +six = 'straight-bar' + + [composite.ss20] +tag = 'ss20' description = 'Curly Style' -design = ['v-v-curly', 'v-turn-v-curly', 'v-w-curly', 'v-x-curly', 'v-capital-y-curly', 'v-capital-r-curly', 'v-lambda-curly', 'v-six-open-contour', 'v-nine-open-contour', 'v-capital-k-curly'] -upright = ['v-k-curly', 'v-y-curly'] -italic = ['v-k-cursive', 'v-y-cursive'] + +[composite.ss20.design] +v = 'curly' +turn-v = 'curly' +w = 'curly' +x = 'curly' +capital-y = 'curly' +capital-r = 'curly' +capital-k = 'curly' +lambda = 'curly' +six = 'open-contour' +nine = 'open-contour' + +[composite.ss20.upright] +k = 'curly' +y = 'curly' + +[composite.ss20.italic] +k = 'cursive' +y = 'cursive' diff --git a/private-build-plans.sample.toml b/private-build-plans.sample.toml index 94ac32863..3b670fb18 100644 --- a/private-build-plans.sample.toml +++ b/private-build-plans.sample.toml @@ -1,10 +1,32 @@ -[buildPlans.iosevka-custom] # is your plan name -family = "Iosevka Custom" # Font menu family name -design = ["v-i-hooky", "v-l-hooky"] # Customize styles -# upright = ["upright-styles"] # Uncomment this line to set styles for upright only -# italic = ["italic-styles"] # Uncomment this line to set styles for italic only -# oblique = ["oblique-styles"] # Uncomment this line to set styles for oblique only -# hintParams = ["-a", "sss"] # Optional custom parameters for ttfautohint +[buildPlans.iosevka-custom] # is your plan name +family = "Iosevka Custom" # Font menu family name +spacing = "normal" # Optional; Values: `normal`, `term`, `fontconfig-mono`, or `fixed` +serifs = "sans" # Optional; Values: `sans` or `slab` +digit-form = "lining" # Optional; Values `lining` or `olt-style` + +################################################################################################### +# Configure variants + +# Optional; Whether to inherit a `ss##` variant +[buildPlans.iosevka-custom.variants] +inherits = ["ss01"] + +# Optional; Configure single character's variant +[buildPlans.iosevka-custom.variants.design] +g = 'singlestorey' + +# Optional; Configure single character's variant for Upright and Oblique; Overrides [design] +[buildPlans.iosevka-custom.variants.upright] +i = 'zshaped' +l = 'zshaped' + +# Optional; Configure single character's variant for Italic only; Overrides [design] +[buildPlans.iosevka-custom.variants.italic] +i = 'italic' +l = 'italic' + +# End variant section +################################################################################################### ################################################################################################### # Override default building weights diff --git a/snapshot-src/index.styl b/snapshot-src/index.styl index 550d7d6aa..b7a1773c1 100644 --- a/snapshot-src/index.styl +++ b/snapshot-src/index.styl @@ -203,42 +203,34 @@ section.char-vars box-sizing: border-box; -webkit-column-break-inside: avoid; - > div.desc-group + > .triangle + display: block; flex: none; - width: 5em; - padding: 0 1em 0 0; - justify-content: flex-end; position: relative; + right: -0.025em; + width: 0.5em; + font-feature-settings: 'NWID' on; + font-weight: 200; + font-size: 2em; + margin-top: 0.5em; + width: 0.5em; + text-align: center; + margin-right: -0.0625em; - > .triangle - display: block; + &::before, &::after + content: ''; position: absolute; + right: calc(0.275em - 0.5px); + width: 1px; + background: #ddd; + + &::before top: 0; + height: 0.42em; + + &::after + top: 0.85em; bottom: 0; - right: -0.025em; - width: 0.5em; - font-feature-settings: 'NWID' on; - font-weight: 200; - font-size: 2em; - margin-top: 0.5em; - width: 0.5em; - text-align: center; - margin-right: -0.0625em; - - &::before, &::after - content: ''; - position: absolute; - right: calc(0.275em - 0.5px); - width: 1px; - background: #ddd; - - &::before - top: 0; - height: 0.42em; - - &::after - top: 0.85em; - bottom: 0; > ol.group list-style: none; @@ -248,6 +240,11 @@ section.char-vars display: flex; flex-wrap: wrap; + &.header + width: 5em; + justify-content: flex-end; + flex: none; + .desc-group border: none; margin: 0; @@ -266,12 +263,14 @@ section.char-vars font-size: 0.75em; display: block; position: absolute; - width: auto; + width: 2em; left: 50%; top: 0.4375em; margin-left: -1em; + margin-right: -1em; font-weight: 400; opacity: 0.75; + text-align: center; &.ligature > .label.tag &:before, &:after diff --git a/snapshot-src/templates/partial/cv-sample.ejs b/snapshot-src/templates/partial/cv-sample.ejs index 153fb4ccc..4ccb95960 100644 --- a/snapshot-src/templates/partial/cv-sample.ejs +++ b/snapshot-src/templates/partial/cv-sample.ejs @@ -1,31 +1,34 @@
Character Variants
    - <%_ for(const group of cvData) { _%> + <%_ for(const group of cvData) if(group.tag) { _%>
  1. -
    - <%_ if(group.ligatureSampler) { _%> - <%_ for(const text of group.descSampleText) { _%> -
    <%= text %>
    +
      +
      +
      <%= group.tag %>
      + <%_ if(group.ligatureSampler) { _%> + <%_ for(const text of group.descSampleText) { _%> +
      <%= text %>
      + <%_ } _%> + <%_ } else { _%> +
      <%= group.descSampleText[0] %>
      <%_ } _%> - <%_ } else { _%> -
      <%= group.descSampleText[0] %>
      - <%_ } _%> -
      -
      +
    +
+
    - <%_ for(const config of group.configs) if(config.tag) { _%> + <%_ for(const config of group.variants) if(config.rank) { _%>
  1. -
    <%= config.tag || config.tagItalic %>
    +
    <%= config.rank %>
    <%_ if(group.ligatureSampler) { _%> <%_ for(const text of group.descSampleText) { _%> -
    <%= text %>
    +
    <%= text %>
    <%_ } _%> <%_ } else if(config.slopeHetero) { _%> -
    <%= group.descSampleText[0] %>
    -
    <%= group.descSampleText[0] %>
    +
    <%= group.descSampleText[0] %>
    +
    <%= group.descSampleText[0] %>
    <%_ } else { _%> -
    <%= group.descSampleText[0] %>
    +
    <%= group.descSampleText[0] %>
    <%_ } _%>
  2. <%_ } _%> diff --git a/utility/amend-readme/index.js b/utility/amend-readme/index.js index 7cc57fbf2..e84f52dbf 100644 --- a/utility/amend-readme/index.js +++ b/utility/amend-readme/index.js @@ -43,12 +43,19 @@ async function processCv() { `* Styles for individual characters. They are easy-to-understand names of the \`cv##\` styles, including:\n` ); for (const gr of variantsData.cvData) { - md.log(` * Styles for ${gr.descSampleText.map(c => `\`${c}\``).join(", ")}:`); + const sampleText = gr.descSampleText + .map(c => (c === "`" ? "`` ` ``" : `\`${c}\``)) + .join(", "); + md.log(` * Styles for ${sampleText}:`); const defaults = figureOutDefaults(variantsData, gr); - for (const config of gr.configs) { - const tag = config.tag || config.tagItalic; + for (const config of gr.variants) { + if (!config.rank) continue; + let selectorText = `\`${gr.key} = ${config.selector}\``; + if (gr.tag && config.rank) { + selectorText += `, \`${gr.tag} = ${config.rank}\``; + } md.log( - ` * \`${config.selector}\`, \`${tag}\`: ` + + ` * ${selectorText}: ` + `${config.description}${formatDefaults(config.selector, defaults)}.` ); } @@ -111,42 +118,32 @@ function figureOutDefaults(variantsData, gr) { desc: "Sans Upright", mask: 1, result: null, - selector: [...variantsData.default.design, ...variantsData.default.upright] + selector: [...variantsData.defaults.sansUpright.composition] }, { desc: "Sans Italic", mask: 2, result: null, - selector: [...variantsData.default.design, ...variantsData.default.italic] + selector: [...variantsData.defaults.sansItalic.composition] }, { desc: "Slab Upright", mask: 4, result: null, - selector: [ - ...variantsData.default.design, - ...variantsData.default.upright, - ...variantsData.slabDefaultOverride.design, - ...variantsData.slabDefaultOverride.upright - ] + selector: [...variantsData.defaults.slabUpright.composition] }, { desc: "Slab Italic", mask: 8, result: null, - selector: [ - ...variantsData.default.design, - ...variantsData.default.italic, - ...variantsData.slabDefaultOverride.design, - ...variantsData.slabDefaultOverride.italic - ] + selector: [...variantsData.defaults.slabItalic.composition] } ]; - for (const config of gr.configs) { + for (const variant of gr.variants) { for (const dc of defaultConfigs) for (const selector of dc.selector) - if (config.selector === selector) dc.result = config.selector; + if (variant.fullSelector === selector) dc.result = variant.selector; } return defaultConfigs; } diff --git a/utility/export-data/parse-variants-data.js b/utility/export-data/parse-variants-data.js index 041fbe361..01f978cbd 100644 --- a/utility/export-data/parse-variants-data.js +++ b/utility/export-data/parse-variants-data.js @@ -1,78 +1,66 @@ +"use strict"; + const fs = require("fs-extra"); const path = require("path"); const toml = require("@iarna/toml"); +const VariantDataParser = require("../../font-src/support/variant-data"); + module.exports = async function () { const variantsToml = await fs.readFile( path.join(__dirname, "../../params/variants.toml"), "utf8" ); - const variants = toml.parse(variantsToml); + const varDatRaw = toml.parse(variantsToml); + const varDatParsed = VariantDataParser.parse(varDatRaw); - const cvData = getCvData(variants); - const ssData = getSsData(variants, cvData); + const cvData = getCvData(varDatParsed); + const ssData = getSsData(varDatParsed); + const defaultCompData = getDefaultCompData(varDatParsed); return { cvData, ssData, - default: variants.default, - slabDefaultOverride: variants.composite.slab + defaults: defaultCompData }; }; -function getCvData(variants) { +function getCvData(parsed) { const samplerGroups = new Map(); - for (const selector in variants.simple) { - let config = variants.simple[selector]; - if (!config.sampler) continue; - config = { selector, ...config }; - let gr = samplerGroups.get(config.sampler); + for (const [_keyPrime, prime] of parsed.primes) { + if (!prime.sampler) continue; + let gr = samplerGroups.get(prime.key); if (!gr) { - gr = { configs: [] }; - samplerGroups.set(config.sampler, gr); + gr = { + key: prime.key, + sampler: prime.sampler, + tag: prime.tag, + ligatureSampler: isLigatureSampler(prime), + descSampleText: isLigatureSampler(prime) + ? prime.sampler.split(" ") + : [...prime.sampler], + variants: [] + }; + samplerGroups.set(prime.key, gr); } - gr.configs.push({ - selector, - tag: config.tag || null, - tagUpright: config.tagUpright || null, - tagItalic: config.tagItalic || null, - slopeHetero: !config.variant, - sampler: config.sampler, - description: config.description - }); + for (const variant of prime.variants.values()) { + gr.variants.push({ + selector: variant.key, + fullSelector: getSelectorKey(prime, variant), + rank: variant.rank, + description: variant.description + }); + } + gr.variants.sort((a, b) => (a.rank || 0x7fffffff) - (b.rank || 0x7fffffff)); } - for (const [sampler, gr] of samplerGroups) { - gr.ligatureSampler = / /.test(sampler); - gr.descSampleText = gr.ligatureSampler ? sampler.split(" ") : [...sampler]; - gr.configs.sort((a, b) => { - const ta = (a.tag || a.tagUpright || a.tagItalic || "").toLowerCase(); - const tb = (b.tag || b.tagUpright || b.tagItalic || "").toLowerCase(); - if (ta < tb) return -1; - if (ta > tb) return 1; - return 0; - }); - gr.rank = rankOf(gr.descSampleText[0][0]); - } - return [...samplerGroups.values()].sort(compareSamplerGr); + return Array.from(samplerGroups.values()); } -function rankOf(initialChar) { - if ("a" <= initialChar && initialChar <= "z") return 3; - if ("A" <= initialChar && initialChar <= "Z") return 2; - if ("0" <= initialChar && initialChar <= "9") return 1; - return 0; -} -function compareSamplerGr(a, b) { - if (b.rank !== a.rank) return b.rank - a.rank; - if (a.rank) { - if (a.descSampleText[0][0] < b.descSampleText[0][0]) return -1; - if (a.descSampleText[0][0] > b.descSampleText[0][0]) return +1; - } - return 0; -} +const UPRIGHT = { isItalic: false }; +const ITALIC = { isItalic: true }; -function getSsData(variants, cvData) { +function getSsData(variants) { const result = [ { tag: "off", @@ -84,56 +72,66 @@ function getSsData(variants, cvData) { hotCharSetItalic: [] } ]; - const defaultUpright = buildupComposite( - cvData, - ...variants.default.design, - ...variants.default.upright - ); - const defaultItalic = buildupComposite( - cvData, - ...variants.default.design, - ...variants.default.italic - ); - for (const tag in variants.composite) { - if (!/^ss\d\d$/.test(tag)) continue; - const composition = variants.composite[tag]; - const upright = buildupComposite( - cvData, - ...(composition.design || []), - ...(composition.upright || []) - ); - const italic = buildupComposite( - cvData, - ...(composition.design || []), - ...(composition.italic || []) - ); + const defaultUpright = buildupComposite(variants, UPRIGHT, variants.defaultComposite); + const defaultItalic = buildupComposite(variants, ITALIC, variants.defaultComposite); + + for (const [key, composite] of variants.composites) { + if (!composite.tag) continue; + const upright = buildupComposite(variants, UPRIGHT, composite); + const italic = buildupComposite(variants, ITALIC, composite); + result.push({ - tag, + tag: composite.tag, effective: true, - description: composition.description, - uprightComposition: Array.from(upright.composition), - italicComposition: Array.from(italic.composition), + description: composite.description, + uprightComposition: upright.composition, + italicComposition: italic.composition, hotCharSetUpright: Array.from(uniqueHotChars(defaultUpright, upright.hotChars)), hotCharSetItalic: Array.from(uniqueHotChars(defaultItalic, italic.hotChars)) }); } return result; } -function buildupComposite(cvData, ..._cfg) { - const hch = new Map(); - const cfg = new Set(_cfg); - for (const gr of cvData) { - if (gr.ligatureSampler) continue; - for (const config of gr.configs) { - if (cfg.has(config.selector)) { - for (const ch of gr.descSampleText) hch.set(ch, config.selector); - } + +function getDefaultCompData(variants) { + return { + sansUpright: buildupComposite(variants, UPRIGHT, variants.defaultComposite), + sansItalic: buildupComposite(variants, ITALIC, variants.defaultComposite), + slabUpright: buildupComposite( + variants, + UPRIGHT, + variants.defaultComposite, + variants.composites.get("slab") + ), + slabItalic: buildupComposite( + variants, + ITALIC, + variants.defaultComposite, + variants.composites.get("slab") + ) + }; +} + +function getSelectorKey(prime, variant) { + return prime.key + "#" + variant.key; +} + +function isLigatureSampler(prime) { + return / /.test(prime.sampler); +} + +function buildupComposite(variants, para, ...composites) { + let compositionMap = new Map(); + let hotChars = new Map(); + for (const composite of composites) { + for (const [prime, variant] of composite.decompose(para, variants.selectorTree)) { + if (!prime.sampler || isLigatureSampler(prime)) continue; + const key = getSelectorKey(prime, variant); + for (const ch of prime.sampler) hotChars.set(ch, key); + compositionMap.set(prime.key, key); } } - return { - composition: [...cfg], - hotChars: hch - }; + return { composition: Array.from(compositionMap.values()), hotChars }; } function* uniqueHotChars(cfgDefault, cfgSS) { for (const [hc, v] of cfgSS) { diff --git a/verdafile.js b/verdafile.js index f98b91fec..ae1501101 100644 --- a/verdafile.js +++ b/verdafile.js @@ -194,14 +194,19 @@ const FontInfoOf = computed.group("metadata:font-info-of", async (target, fileNa if (!bp) fail(`Build plan for '${fileName}' not found.` + whyBuildPlanIsnNotThere(fileName)); const sfi = getSuffixMapping(bp.weights, bp.slopes, bp.widths)[fi0.suffix]; - const preHives = [...bp.pre.design, ...bp.pre[sfi.slope]]; return { name: fileName, - // Hives - preHives, + variants: bp.variants || null, + featureControl: { + noCvSs: bp["no-cv-ss"] || false, + noLigation: bp["no-ligation"] || false + }, // Shape shape: { + digitForm: bp["digit-form"] || "lining", + serifs: bp.serifs || null, + spacing: bp.spacing || null, weight: sfi.shapeWeight, slope: sfi.slope, width: sfi.shapeWidth,