diff --git a/CHANGELOG.md b/CHANGELOG.md index e88215af6..0764b38d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ ## Modifications since last major version +### 31.4.0 + +* Add characters: + - OCR HOOK (`U+2440`) .. OCR BOW TIE (`U+2445`) (#2465). +* Add slanted dollar and cent sign (#2408). +* Add round-top capital A (#2472). +* Fix `cv41` application to `ss01`, `ss02`, `ss04`, `ss06`, and `ss15`. +* Fix `cv54` application to `ss01`, `ss03`, `ss04`, `ss06`, `ss07`, `ss09`, `ss12`, `ss14`, `ss15`, `ss17`, and `ss18`. +* Fix `cv62` application to `ss01`, `ss02`, `ss04`, `ss07`, `ss09`, `ss13`, `ss15`, `ss16`, and `ss18`. + + ### 31.3.0 * Add `diagonal-tailed-cursive` variants for Cyrillic Lower Ef (`cv93`). diff --git a/changes/31.4.0.md b/changes/31.4.0.md new file mode 100644 index 000000000..bf3b5f0b6 --- /dev/null +++ b/changes/31.4.0.md @@ -0,0 +1,7 @@ +* Add characters: + - OCR HOOK (`U+2440`) .. OCR BOW TIE (`U+2445`) (#2465). +* Add slanted dollar and cent sign (#2408). +* Add round-top capital A (#2472). +* Fix `cv41` application to `ss01`, `ss02`, `ss04`, `ss06`, and `ss15`. +* Fix `cv54` application to `ss01`, `ss03`, `ss04`, `ss06`, `ss07`, `ss09`, `ss12`, `ss14`, `ss15`, `ss17`, and `ss18`. +* Fix `cv62` application to `ss01`, `ss02`, `ss04`, `ss07`, `ss09`, `ss13`, `ss15`, `ss16`, and `ss18`. diff --git a/doc/PACKAGE-LIST.md b/doc/PACKAGE-LIST.md index 44adc8cc7..86ba8874f 100644 --- a/doc/PACKAGE-LIST.md +++ b/doc/PACKAGE-LIST.md @@ -1,7 +1,7 @@ -# Package list of Release 31.3.0 +# Package list of Release 31.4.0 ## Prebuilt Packages Iosevka provides a large variety of variants. Prebuilt variants are listed below. For all Monospace variants' packages, it will contain three _spacing variants_. You can either download the package containing all the spacing variants (recommended), or cherry-pick the variant with specific spacing. @@ -22,146 +22,146 @@ Iosevka provides various packaging formats, here is the list of them: - + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - - + + - - + +
📦 IosevkaMonospace, DefaultSuper TTCTTC 
📦 IosevkaMonospace, DefaultSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ IosevkaDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka TermTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka FixedFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SlabMonospace, Slab-serifSuper TTCTTC 
    ├ IosevkaDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka TermTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka FixedFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SlabMonospace, Slab-serifSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka CurlyMonospace, Curly StyleSuper TTCTTC 
    ├ Iosevka SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka CurlyMonospace, Curly StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka CurlyDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term CurlyTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed CurlyFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka Curly SlabMonospace, Curly Style, Slab-serifSuper TTCTTC 
    ├ Iosevka CurlyDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term CurlyTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed CurlyFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka Curly SlabMonospace, Curly Style, Slab-serifSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka Curly SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term Curly SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed Curly SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS01Monospace, Andale Mono StyleSuper TTCTTC 
    ├ Iosevka Curly SlabDefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term Curly SlabTerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed Curly SlabFixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS01Monospace, Andale Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS01DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS01TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS01FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS02Monospace, Anonymous Pro StyleSuper TTCTTC 
    ├ Iosevka SS01DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS01TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS01FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS02Monospace, Anonymous Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS02DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS02TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS02FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS03Monospace, Consolas StyleSuper TTCTTC 
    ├ Iosevka SS02DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS02TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS02FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS03Monospace, Consolas StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS03DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS03TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS03FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS04Monospace, Menlo StyleSuper TTCTTC 
    ├ Iosevka SS03DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS03TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS03FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS04Monospace, Menlo StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS04DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS04TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS04FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS05Monospace, Fira Mono StyleSuper TTCTTC 
    ├ Iosevka SS04DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS04TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS04FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS05Monospace, Fira Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS05DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS05TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS05FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS06Monospace, Liberation Mono StyleSuper TTCTTC 
    ├ Iosevka SS05DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS05TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS05FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS06Monospace, Liberation Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS06DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS06TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS06FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS07Monospace, Monaco StyleSuper TTCTTC 
    ├ Iosevka SS06DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS06TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS06FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS07Monospace, Monaco StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS07DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS07TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS07FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS08Monospace, Pragmata Pro StyleSuper TTCTTC 
    ├ Iosevka SS07DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS07TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS07FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS08Monospace, Pragmata Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS08DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS08TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS08FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS09Monospace, Source Code Pro StyleSuper TTCTTC 
    ├ Iosevka SS08DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS08TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS08FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS09Monospace, Source Code Pro StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS09DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS09TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS09FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS10Monospace, Envy Code R StyleSuper TTCTTC 
    ├ Iosevka SS09DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS09TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS09FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS10Monospace, Envy Code R StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS10DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS10TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS10FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS11Monospace, X Windows Fixed StyleSuper TTCTTC 
    ├ Iosevka SS10DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS10TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS10FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS11Monospace, X Windows Fixed StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS11DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS11TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS11FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS12Monospace, Ubuntu Mono StyleSuper TTCTTC 
    ├ Iosevka SS11DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS11TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS11FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS12Monospace, Ubuntu Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS12DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS12TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS12FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS13Monospace, Lucida StyleSuper TTCTTC 
    ├ Iosevka SS12DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS12TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS12FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS13Monospace, Lucida StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS13DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS13TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS13FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS14Monospace, JetBrains Mono StyleSuper TTCTTC 
    ├ Iosevka SS13DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS13TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS13FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS14Monospace, JetBrains Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS14DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS14TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS14FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS15Monospace, IBM Plex Mono StyleSuper TTCTTC 
    ├ Iosevka SS14DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS14TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS14FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS15Monospace, IBM Plex Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS15DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS15TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS15FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS16Monospace, PT Mono StyleSuper TTCTTC 
    ├ Iosevka SS15DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS15TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS15FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS16Monospace, PT Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS16DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS16TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS16FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS17Monospace, Recursive Mono StyleSuper TTCTTC 
    ├ Iosevka SS16DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS16TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS16FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS17Monospace, Recursive Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS17DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS17TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS17FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS18Monospace, Input Mono StyleSuper TTCTTC 
    ├ Iosevka SS17DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS17TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS17FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka SS18Monospace, Input Mono StyleSuper TTCTTC 
  └ Sub-packagesSpacingLigaturesDownloads
    ├ Iosevka SS18DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS18TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS18FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka SS18DefaultYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    ├ Iosevka Term SS18TerminalYesSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka Fixed SS18FixedNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka AileQuasi-proportional, Sans-serif 
  └ Sub-packagesSpacingLigaturesDownloads
    └ Iosevka AileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka AileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
📦 Iosevka EtoileQuasi-proportional, Slab-serif 
  └ Sub-packagesSpacingLigaturesDownloads
    └ Iosevka EtoileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
    └ Iosevka EtoileDefaultNoSuper TTCTTCTTF (Unhinted)WebFont (Unhinted)
diff --git a/doc/character-variants.md b/doc/character-variants.md index d546c910e..adca46479 100644 --- a/doc/character-variants.md +++ b/doc/character-variants.md @@ -318,7 +318,9 @@ - + + + 1 @@ -329,7 +331,9 @@ 6 7 8 - +9 +10 + cv12 @@ -3588,7 +3592,12 @@ - + + + + + + 1 @@ -3597,7 +3606,12 @@ 4 5 6 - +7 +8 +9 +10 +11 +12 VSAN @@ -3607,7 +3621,12 @@ - + + + + + + 1 @@ -3616,7 +3635,12 @@ 4 5 6 - +7 +8 +9 +10 +11 +12 VSAO diff --git a/doc/custom-build.md b/doc/custom-build.md index f7a86530d..7ddf91044 100644 --- a/doc/custom-build.md +++ b/doc/custom-build.md @@ -511,7 +511,7 @@ Subsection `variants` is used to configure character variants in the font. Prope Zero (0) with diamond body shape, and the top-right bit cutout - Styles for `A` -
8 variants +
10 variants @@ -529,6 +529,10 @@ Subsection `variants` is used to configure character variants in the font. Prope + + + +
capital-a = 'straight-serifless', cv11 = 1
A with straight shape; without serifs (default for Sans)
A with curly shape, and serifs at base
capital-a = 'curly-tri-serifed', cv11 = 8
A with curly shape, and serifs at both top and base
capital-a = 'round-top-serifless', cv11 = 9
A with round top; without serifs
capital-a = 'round-top-base-serifed', cv11 = 10
A with round top, and serifs at base
- Styles for `B`
12 variants @@ -3110,7 +3114,7 @@ Subsection `variants` is used to configure character variants in the font. Prope punctuation-dot = 'square', VDAC = 2 Small punctuations (like ., ,) use square dots
- - Styles for `⠭⠽` (Dot shape in braille) + - Styles for `⣝⣑` (Dot shape in braille)
2 variants @@ -3283,36 +3287,60 @@ Subsection `variants` is used to configure character variants in the font. Prope
braille-dot = 'round', VDAD = 1
At symbol (@) with compact body
- Styles for `$` -
6 variants +
12 variants - + - + - + - + - + - + + + + + + + + + + + + +
dollar = 'open', VSAM = 1
Dollar symbol with open contour
Dollar symbol ($) with vertical bar, open contour, and normal height
dollar = 'through', VSAM = 2
Dollar symbol with strike-through vertical bar (default)
Dollar symbol ($) with vertical bar, strike-through vertical bar, and normal height (default)
dollar = 'interrupted', VSAM = 3
Dollar symbol with interrupted strike-through vertical bar
Dollar symbol ($) with vertical bar, interrupted strike-through vertical bar, and normal height
dollar = 'open-cap', VSAM = 4
Dollar symbol with open contour, sized not exceeding baseline and ascender
Dollar symbol ($) with vertical bar, open contour, and cap height
dollar = 'through-cap', VSAM = 5
Dollar symbol with strike-through vertical bar, sized not exceeding baseline and ascender
Dollar symbol ($) with vertical bar, strike-through vertical bar, and cap height
dollar = 'interrupted-cap', VSAM = 6
Dollar symbol with interrupted strike-through vertical bar, sized not exceeding baseline and ascender
Dollar symbol ($) with vertical bar, interrupted strike-through vertical bar, and cap height
dollar = 'slanted-open', VSAM = 7
Dollar symbol ($) with slanted bar, open contour, and normal height
dollar = 'slanted-through', VSAM = 8
Dollar symbol ($) with slanted bar, strike-through vertical bar, and normal height
dollar = 'slanted-interrupted', VSAM = 9
Dollar symbol ($) with slanted bar, interrupted strike-through vertical bar, and normal height
dollar = 'slanted-open-cap', VSAM = 10
Dollar symbol ($) with slanted bar, open contour, and cap height
dollar = 'slanted-through-cap', VSAM = 11
Dollar symbol ($) with slanted bar, strike-through vertical bar, and cap height
dollar = 'slanted-interrupted-cap', VSAM = 12
Dollar symbol ($) with slanted bar, interrupted strike-through vertical bar, and cap height
- Styles for `¢` -
6 variants +
12 variants - + - + - + - + - + - + + + + + + + + + + + + +
cent = 'open', VSAN = 1
Cent sign (¢) with open contour
Cent sign (¢) with vertical bar, open contour, and normal height
cent = 'through', VSAN = 2
Cent sign (¢) with vertical bar all through the c part (default)
Cent sign (¢) with vertical bar, vertical bar all through the c part, and normal height (default)
cent = 'bar-interrupted', VSAN = 3
Cent sign (¢) with vertical bar breaks at center
Cent sign (¢) with vertical bar, vertical bar breaks at center, and normal height
cent = 'open-cap', VSAN = 4
Cent sign (¢) with open contour, sized not exceeding baseline and ascender
Cent sign (¢) with vertical bar, open contour, and cap height
cent = 'through-cap', VSAN = 5
Cent sign (¢) with vertical bar all through the c part, sized not exceeding baseline and ascender
Cent sign (¢) with vertical bar, vertical bar all through the c part, and cap height
cent = 'bar-interrupted-cap', VSAN = 6
Cent sign (¢) with vertical bar breaks at center, sized not exceeding baseline and ascender
Cent sign (¢) with vertical bar, vertical bar breaks at center, and cap height
cent = 'slanted-open', VSAN = 7
Cent sign (¢) with slanted bar, open contour, and normal height
cent = 'slanted-through', VSAN = 8
Cent sign (¢) with slanted bar, vertical bar all through the c part, and normal height
cent = 'slanted-bar-interrupted', VSAN = 9
Cent sign (¢) with slanted bar, vertical bar breaks at center, and normal height
cent = 'slanted-open-cap', VSAN = 10
Cent sign (¢) with slanted bar, open contour, and cap height
cent = 'slanted-through-cap', VSAN = 11
Cent sign (¢) with slanted bar, vertical bar all through the c part, and cap height
cent = 'slanted-bar-interrupted-cap', VSAN = 12
Cent sign (¢) with slanted bar, vertical bar breaks at center, and cap height
- Styles for `%`
4 variants diff --git a/images/button-release.dark.svg b/images/button-release.dark.svg index 54c2265c9..b61615606 100644 --- a/images/button-release.dark.svg +++ b/images/button-release.dark.svg @@ -9,7 +9,8 @@ - + + @@ -21,13 +22,13 @@ - + - + - + \ No newline at end of file diff --git a/images/button-release.light.svg b/images/button-release.light.svg index 3e7484a98..ed7a589f8 100644 --- a/images/button-release.light.svg +++ b/images/button-release.light.svg @@ -9,7 +9,8 @@ - + + @@ -21,13 +22,13 @@ - + - + - + \ No newline at end of file diff --git a/images/cs-block-basic-latin.dark.svg b/images/cs-block-basic-latin.dark.svg index 648bc216b..7b9a02960 100644 --- a/images/cs-block-basic-latin.dark.svg +++ b/images/cs-block-basic-latin.dark.svg @@ -22,7 +22,7 @@ - + diff --git a/images/cs-block-basic-latin.light.svg b/images/cs-block-basic-latin.light.svg index 051915e0a..d74a9ddcc 100644 --- a/images/cs-block-basic-latin.light.svg +++ b/images/cs-block-basic-latin.light.svg @@ -22,7 +22,7 @@ - + diff --git a/images/cs-block-cyrillic-extended-b.dark.svg b/images/cs-block-cyrillic-extended-b.dark.svg index 10b34f81d..9b39d28e8 100644 --- a/images/cs-block-cyrillic-extended-b.dark.svg +++ b/images/cs-block-cyrillic-extended-b.dark.svg @@ -41,7 +41,7 @@ - + diff --git a/images/cs-block-cyrillic-extended-b.light.svg b/images/cs-block-cyrillic-extended-b.light.svg index b1f3c4167..02bf940c7 100644 --- a/images/cs-block-cyrillic-extended-b.light.svg +++ b/images/cs-block-cyrillic-extended-b.light.svg @@ -41,7 +41,7 @@ - + diff --git a/images/cs-block-latin-extended-d.dark.svg b/images/cs-block-latin-extended-d.dark.svg index 15055b8f8..e424075e4 100644 --- a/images/cs-block-latin-extended-d.dark.svg +++ b/images/cs-block-latin-extended-d.dark.svg @@ -30,9 +30,9 @@ - + - + diff --git a/images/cs-block-latin-extended-d.light.svg b/images/cs-block-latin-extended-d.light.svg index 5f47243ba..82eabd108 100644 --- a/images/cs-block-latin-extended-d.light.svg +++ b/images/cs-block-latin-extended-d.light.svg @@ -30,9 +30,9 @@ - + - + diff --git a/images/cs-block-latin-extended-f.dark.svg b/images/cs-block-latin-extended-f.dark.svg index 4ee004701..9a3e45dc0 100644 --- a/images/cs-block-latin-extended-f.dark.svg +++ b/images/cs-block-latin-extended-f.dark.svg @@ -19,7 +19,7 @@ - + diff --git a/images/cs-block-latin-extended-f.light.svg b/images/cs-block-latin-extended-f.light.svg index 13533c387..19b57dacb 100644 --- a/images/cs-block-latin-extended-f.light.svg +++ b/images/cs-block-latin-extended-f.light.svg @@ -19,7 +19,7 @@ - + diff --git a/images/cs-block-optical-character-recognition.dark.svg b/images/cs-block-optical-character-recognition.dark.svg new file mode 100644 index 000000000..bce2751f7 --- /dev/null +++ b/images/cs-block-optical-character-recognition.dark.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/cs-block-optical-character-recognition.light.svg b/images/cs-block-optical-character-recognition.light.svg new file mode 100644 index 000000000..0aaaf0e5d --- /dev/null +++ b/images/cs-block-optical-character-recognition.light.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-braille-dot-round.dark.svg b/images/cv-braille-dot-round.dark.svg index 6ba5b427a..1e8b4c9a4 100644 --- a/images/cv-braille-dot-round.dark.svg +++ b/images/cv-braille-dot-round.dark.svg @@ -1,16 +1,16 @@ - - + + - + - + diff --git a/images/cv-braille-dot-round.light.svg b/images/cv-braille-dot-round.light.svg index 8136436bd..23c41e7d4 100644 --- a/images/cv-braille-dot-round.light.svg +++ b/images/cv-braille-dot-round.light.svg @@ -1,16 +1,16 @@ - - + + - + - + diff --git a/images/cv-braille-dot-square.dark.svg b/images/cv-braille-dot-square.dark.svg index ac82686d9..18d88c4f5 100644 --- a/images/cv-braille-dot-square.dark.svg +++ b/images/cv-braille-dot-square.dark.svg @@ -1,16 +1,16 @@ - - + + - + - + diff --git a/images/cv-braille-dot-square.light.svg b/images/cv-braille-dot-square.light.svg index b0e696138..8a382d118 100644 --- a/images/cv-braille-dot-square.light.svg +++ b/images/cv-braille-dot-square.light.svg @@ -1,16 +1,16 @@ - - + + - + - + diff --git a/images/cv-capital-a-round-top-base-serifed.dark.svg b/images/cv-capital-a-round-top-base-serifed.dark.svg new file mode 100644 index 000000000..75a4d4419 --- /dev/null +++ b/images/cv-capital-a-round-top-base-serifed.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-capital-a-round-top-base-serifed.light.svg b/images/cv-capital-a-round-top-base-serifed.light.svg new file mode 100644 index 000000000..f8f956e24 --- /dev/null +++ b/images/cv-capital-a-round-top-base-serifed.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-capital-a-round-top-serifless.dark.svg b/images/cv-capital-a-round-top-serifless.dark.svg new file mode 100644 index 000000000..695e8b120 --- /dev/null +++ b/images/cv-capital-a-round-top-serifless.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-capital-a-round-top-serifless.light.svg b/images/cv-capital-a-round-top-serifless.light.svg new file mode 100644 index 000000000..6c19f9f94 --- /dev/null +++ b/images/cv-capital-a-round-top-serifless.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-capital-x-curly-motion-serifed.dark.svg b/images/cv-capital-x-curly-motion-serifed.dark.svg deleted file mode 100644 index 68efe56cb..000000000 --- a/images/cv-capital-x-curly-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-capital-x-curly-motion-serifed.light.svg b/images/cv-capital-x-curly-motion-serifed.light.svg deleted file mode 100644 index e1b74bb14..000000000 --- a/images/cv-capital-x-curly-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-capital-x-straight-motion-serifed.dark.svg b/images/cv-capital-x-straight-motion-serifed.dark.svg deleted file mode 100644 index bc15e3085..000000000 --- a/images/cv-capital-x-straight-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-capital-x-straight-motion-serifed.light.svg b/images/cv-capital-x-straight-motion-serifed.light.svg deleted file mode 100644 index e6a829c60..000000000 --- a/images/cv-capital-x-straight-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-cent-bar-interrupted-cap.dark.svg b/images/cv-cent-bar-interrupted-cap.dark.svg index 1fb40e78b..f52e3dc5c 100644 --- a/images/cv-cent-bar-interrupted-cap.dark.svg +++ b/images/cv-cent-bar-interrupted-cap.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-cent-bar-interrupted-cap.light.svg b/images/cv-cent-bar-interrupted-cap.light.svg index 3fe05b155..420bae8f9 100644 --- a/images/cv-cent-bar-interrupted-cap.light.svg +++ b/images/cv-cent-bar-interrupted-cap.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-cent-bar-interrupted.dark.svg b/images/cv-cent-bar-interrupted.dark.svg index ec8160f83..27c2d6f0d 100644 --- a/images/cv-cent-bar-interrupted.dark.svg +++ b/images/cv-cent-bar-interrupted.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-cent-bar-interrupted.light.svg b/images/cv-cent-bar-interrupted.light.svg index 7833cb047..c61d4bb91 100644 --- a/images/cv-cent-bar-interrupted.light.svg +++ b/images/cv-cent-bar-interrupted.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-cent-slanted-bar-interrupted-cap.dark.svg b/images/cv-cent-slanted-bar-interrupted-cap.dark.svg new file mode 100644 index 000000000..7e738d7de --- /dev/null +++ b/images/cv-cent-slanted-bar-interrupted-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-bar-interrupted-cap.light.svg b/images/cv-cent-slanted-bar-interrupted-cap.light.svg new file mode 100644 index 000000000..6db3c9f8e --- /dev/null +++ b/images/cv-cent-slanted-bar-interrupted-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-bar-interrupted.dark.svg b/images/cv-cent-slanted-bar-interrupted.dark.svg new file mode 100644 index 000000000..10b9561b3 --- /dev/null +++ b/images/cv-cent-slanted-bar-interrupted.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-bar-interrupted.light.svg b/images/cv-cent-slanted-bar-interrupted.light.svg new file mode 100644 index 000000000..a6ad2e2b0 --- /dev/null +++ b/images/cv-cent-slanted-bar-interrupted.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-open-cap.dark.svg b/images/cv-cent-slanted-open-cap.dark.svg new file mode 100644 index 000000000..535795cde --- /dev/null +++ b/images/cv-cent-slanted-open-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-open-cap.light.svg b/images/cv-cent-slanted-open-cap.light.svg new file mode 100644 index 000000000..0a7589c34 --- /dev/null +++ b/images/cv-cent-slanted-open-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-open.dark.svg b/images/cv-cent-slanted-open.dark.svg new file mode 100644 index 000000000..b60edcdb6 --- /dev/null +++ b/images/cv-cent-slanted-open.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-open.light.svg b/images/cv-cent-slanted-open.light.svg new file mode 100644 index 000000000..77d3fff91 --- /dev/null +++ b/images/cv-cent-slanted-open.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-through-cap.dark.svg b/images/cv-cent-slanted-through-cap.dark.svg new file mode 100644 index 000000000..f8f818e0b --- /dev/null +++ b/images/cv-cent-slanted-through-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-through-cap.light.svg b/images/cv-cent-slanted-through-cap.light.svg new file mode 100644 index 000000000..616de90e9 --- /dev/null +++ b/images/cv-cent-slanted-through-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-through.dark.svg b/images/cv-cent-slanted-through.dark.svg new file mode 100644 index 000000000..412319235 --- /dev/null +++ b/images/cv-cent-slanted-through.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-cent-slanted-through.light.svg b/images/cv-cent-slanted-through.light.svg new file mode 100644 index 000000000..1443ec275 --- /dev/null +++ b/images/cv-cent-slanted-through.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-interrupted-cap.dark.svg b/images/cv-dollar-interrupted-cap.dark.svg index e055eb157..fc3405dd1 100644 --- a/images/cv-dollar-interrupted-cap.dark.svg +++ b/images/cv-dollar-interrupted-cap.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-interrupted-cap.light.svg b/images/cv-dollar-interrupted-cap.light.svg index 0a22cbe19..375352d3e 100644 --- a/images/cv-dollar-interrupted-cap.light.svg +++ b/images/cv-dollar-interrupted-cap.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-interrupted.dark.svg b/images/cv-dollar-interrupted.dark.svg index 9870cfb29..f077835ea 100644 --- a/images/cv-dollar-interrupted.dark.svg +++ b/images/cv-dollar-interrupted.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-interrupted.light.svg b/images/cv-dollar-interrupted.light.svg index ae7237261..a76d13021 100644 --- a/images/cv-dollar-interrupted.light.svg +++ b/images/cv-dollar-interrupted.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-open.dark.svg b/images/cv-dollar-open.dark.svg index 3ea4ef94b..1f56fc8c9 100644 --- a/images/cv-dollar-open.dark.svg +++ b/images/cv-dollar-open.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-open.light.svg b/images/cv-dollar-open.light.svg index b9c29cf87..d043d9e8e 100644 --- a/images/cv-dollar-open.light.svg +++ b/images/cv-dollar-open.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-slanted-interrupted-cap.dark.svg b/images/cv-dollar-slanted-interrupted-cap.dark.svg new file mode 100644 index 000000000..f9203c7f7 --- /dev/null +++ b/images/cv-dollar-slanted-interrupted-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-interrupted-cap.light.svg b/images/cv-dollar-slanted-interrupted-cap.light.svg new file mode 100644 index 000000000..828a8aa4b --- /dev/null +++ b/images/cv-dollar-slanted-interrupted-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-interrupted.dark.svg b/images/cv-dollar-slanted-interrupted.dark.svg new file mode 100644 index 000000000..b18663f5b --- /dev/null +++ b/images/cv-dollar-slanted-interrupted.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-interrupted.light.svg b/images/cv-dollar-slanted-interrupted.light.svg new file mode 100644 index 000000000..aad3ac4f2 --- /dev/null +++ b/images/cv-dollar-slanted-interrupted.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-open-cap.dark.svg b/images/cv-dollar-slanted-open-cap.dark.svg new file mode 100644 index 000000000..59a657b99 --- /dev/null +++ b/images/cv-dollar-slanted-open-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-open-cap.light.svg b/images/cv-dollar-slanted-open-cap.light.svg new file mode 100644 index 000000000..285aefbef --- /dev/null +++ b/images/cv-dollar-slanted-open-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-open.dark.svg b/images/cv-dollar-slanted-open.dark.svg new file mode 100644 index 000000000..f72696d7b --- /dev/null +++ b/images/cv-dollar-slanted-open.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-open.light.svg b/images/cv-dollar-slanted-open.light.svg new file mode 100644 index 000000000..91d57e014 --- /dev/null +++ b/images/cv-dollar-slanted-open.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-through-cap.dark.svg b/images/cv-dollar-slanted-through-cap.dark.svg new file mode 100644 index 000000000..1d4432dc2 --- /dev/null +++ b/images/cv-dollar-slanted-through-cap.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-through-cap.light.svg b/images/cv-dollar-slanted-through-cap.light.svg new file mode 100644 index 000000000..663a88b2d --- /dev/null +++ b/images/cv-dollar-slanted-through-cap.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-through.dark.svg b/images/cv-dollar-slanted-through.dark.svg new file mode 100644 index 000000000..cf16638cd --- /dev/null +++ b/images/cv-dollar-slanted-through.dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-slanted-through.light.svg b/images/cv-dollar-slanted-through.light.svg new file mode 100644 index 000000000..5d6a43096 --- /dev/null +++ b/images/cv-dollar-slanted-through.light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/images/cv-dollar-through.dark.svg b/images/cv-dollar-through.dark.svg index e587f7d21..c286b2425 100644 --- a/images/cv-dollar-through.dark.svg +++ b/images/cv-dollar-through.dark.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-dollar-through.light.svg b/images/cv-dollar-through.light.svg index 55d36920d..1de7de02c 100644 --- a/images/cv-dollar-through.light.svg +++ b/images/cv-dollar-through.light.svg @@ -1,7 +1,7 @@ - + diff --git a/images/cv-lower-chi-curly-motion-serifed.dark.svg b/images/cv-lower-chi-curly-motion-serifed.dark.svg deleted file mode 100644 index ba501cf37..000000000 --- a/images/cv-lower-chi-curly-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-curly-motion-serifed.light.svg b/images/cv-lower-chi-curly-motion-serifed.light.svg deleted file mode 100644 index 8f53b271c..000000000 --- a/images/cv-lower-chi-curly-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-semi-chancery-curly.dark.svg b/images/cv-lower-chi-semi-chancery-curly.dark.svg deleted file mode 100644 index 62ab86714..000000000 --- a/images/cv-lower-chi-semi-chancery-curly.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-semi-chancery-curly.light.svg b/images/cv-lower-chi-semi-chancery-curly.light.svg deleted file mode 100644 index 0ae67d142..000000000 --- a/images/cv-lower-chi-semi-chancery-curly.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-semi-chancery-straight.dark.svg b/images/cv-lower-chi-semi-chancery-straight.dark.svg deleted file mode 100644 index a70e1ea8b..000000000 --- a/images/cv-lower-chi-semi-chancery-straight.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-semi-chancery-straight.light.svg b/images/cv-lower-chi-semi-chancery-straight.light.svg deleted file mode 100644 index d6db23f4d..000000000 --- a/images/cv-lower-chi-semi-chancery-straight.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-straight-motion-serifed.dark.svg b/images/cv-lower-chi-straight-motion-serifed.dark.svg deleted file mode 100644 index 765b8deb7..000000000 --- a/images/cv-lower-chi-straight-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-lower-chi-straight-motion-serifed.light.svg b/images/cv-lower-chi-straight-motion-serifed.light.svg deleted file mode 100644 index 08207e65e..000000000 --- a/images/cv-lower-chi-straight-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-x-curly-motion-serifed.dark.svg b/images/cv-x-curly-motion-serifed.dark.svg deleted file mode 100644 index 1cdf1348c..000000000 --- a/images/cv-x-curly-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-x-curly-motion-serifed.light.svg b/images/cv-x-curly-motion-serifed.light.svg deleted file mode 100644 index 3ae2f4a64..000000000 --- a/images/cv-x-curly-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-x-straight-motion-serifed.dark.svg b/images/cv-x-straight-motion-serifed.dark.svg deleted file mode 100644 index 0e4d882e7..000000000 --- a/images/cv-x-straight-motion-serifed.dark.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/cv-x-straight-motion-serifed.light.svg b/images/cv-x-straight-motion-serifed.light.svg deleted file mode 100644 index 6c95b9fe8..000000000 --- a/images/cv-x-straight-motion-serifed.light.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/images/package-sample-Iosevka.dark.svg b/images/package-sample-Iosevka.dark.svg index a73a91b18..5ce430a2d 100644 --- a/images/package-sample-Iosevka.dark.svg +++ b/images/package-sample-Iosevka.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-Iosevka.light.svg b/images/package-sample-Iosevka.light.svg index 42bbb3690..a6f020c4c 100644 --- a/images/package-sample-Iosevka.light.svg +++ b/images/package-sample-Iosevka.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaCurly.dark.svg b/images/package-sample-IosevkaCurly.dark.svg index 332066eca..4263df2f3 100644 --- a/images/package-sample-IosevkaCurly.dark.svg +++ b/images/package-sample-IosevkaCurly.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaCurly.light.svg b/images/package-sample-IosevkaCurly.light.svg index 30eb598c3..d2297985e 100644 --- a/images/package-sample-IosevkaCurly.light.svg +++ b/images/package-sample-IosevkaCurly.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixed.dark.svg b/images/package-sample-IosevkaFixed.dark.svg index a73a91b18..5ce430a2d 100644 --- a/images/package-sample-IosevkaFixed.dark.svg +++ b/images/package-sample-IosevkaFixed.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixed.light.svg b/images/package-sample-IosevkaFixed.light.svg index 42bbb3690..a6f020c4c 100644 --- a/images/package-sample-IosevkaFixed.light.svg +++ b/images/package-sample-IosevkaFixed.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedCurly.dark.svg b/images/package-sample-IosevkaFixedCurly.dark.svg index 332066eca..4263df2f3 100644 --- a/images/package-sample-IosevkaFixedCurly.dark.svg +++ b/images/package-sample-IosevkaFixedCurly.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedCurly.light.svg b/images/package-sample-IosevkaFixedCurly.light.svg index 30eb598c3..d2297985e 100644 --- a/images/package-sample-IosevkaFixedCurly.light.svg +++ b/images/package-sample-IosevkaFixedCurly.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS01.dark.svg b/images/package-sample-IosevkaFixedSS01.dark.svg index 859faedb2..c7177a45a 100644 --- a/images/package-sample-IosevkaFixedSS01.dark.svg +++ b/images/package-sample-IosevkaFixedSS01.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS01.light.svg b/images/package-sample-IosevkaFixedSS01.light.svg index 41abd2369..dadcb8706 100644 --- a/images/package-sample-IosevkaFixedSS01.light.svg +++ b/images/package-sample-IosevkaFixedSS01.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS02.dark.svg b/images/package-sample-IosevkaFixedSS02.dark.svg index b613b91a3..755d13937 100644 --- a/images/package-sample-IosevkaFixedSS02.dark.svg +++ b/images/package-sample-IosevkaFixedSS02.dark.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS02.light.svg b/images/package-sample-IosevkaFixedSS02.light.svg index e85d937d2..c11170c36 100644 --- a/images/package-sample-IosevkaFixedSS02.light.svg +++ b/images/package-sample-IosevkaFixedSS02.light.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS03.dark.svg b/images/package-sample-IosevkaFixedSS03.dark.svg index 291009039..bb675ce3c 100644 --- a/images/package-sample-IosevkaFixedSS03.dark.svg +++ b/images/package-sample-IosevkaFixedSS03.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaFixedSS03.light.svg b/images/package-sample-IosevkaFixedSS03.light.svg index b1417049c..cf7005a54 100644 --- a/images/package-sample-IosevkaFixedSS03.light.svg +++ b/images/package-sample-IosevkaFixedSS03.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaFixedSS04.dark.svg b/images/package-sample-IosevkaFixedSS04.dark.svg index 597547c82..3a89ded5d 100644 --- a/images/package-sample-IosevkaFixedSS04.dark.svg +++ b/images/package-sample-IosevkaFixedSS04.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS04.light.svg b/images/package-sample-IosevkaFixedSS04.light.svg index 228a005c0..43dbf9931 100644 --- a/images/package-sample-IosevkaFixedSS04.light.svg +++ b/images/package-sample-IosevkaFixedSS04.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS05.dark.svg b/images/package-sample-IosevkaFixedSS05.dark.svg index f8e8a1682..3a7d11480 100644 --- a/images/package-sample-IosevkaFixedSS05.dark.svg +++ b/images/package-sample-IosevkaFixedSS05.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS05.light.svg b/images/package-sample-IosevkaFixedSS05.light.svg index 2fb09e182..b0c80cb9d 100644 --- a/images/package-sample-IosevkaFixedSS05.light.svg +++ b/images/package-sample-IosevkaFixedSS05.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS06.dark.svg b/images/package-sample-IosevkaFixedSS06.dark.svg index 3b871d908..ee3a01991 100644 --- a/images/package-sample-IosevkaFixedSS06.dark.svg +++ b/images/package-sample-IosevkaFixedSS06.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS06.light.svg b/images/package-sample-IosevkaFixedSS06.light.svg index d4510b87b..4f7ca6b34 100644 --- a/images/package-sample-IosevkaFixedSS06.light.svg +++ b/images/package-sample-IosevkaFixedSS06.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS07.dark.svg b/images/package-sample-IosevkaFixedSS07.dark.svg index 5ee4934bd..d8fd23c93 100644 --- a/images/package-sample-IosevkaFixedSS07.dark.svg +++ b/images/package-sample-IosevkaFixedSS07.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS07.light.svg b/images/package-sample-IosevkaFixedSS07.light.svg index a3373d038..b601f6d74 100644 --- a/images/package-sample-IosevkaFixedSS07.light.svg +++ b/images/package-sample-IosevkaFixedSS07.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS08.dark.svg b/images/package-sample-IosevkaFixedSS08.dark.svg index 32c2e2c1e..0eebe5cee 100644 --- a/images/package-sample-IosevkaFixedSS08.dark.svg +++ b/images/package-sample-IosevkaFixedSS08.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS08.light.svg b/images/package-sample-IosevkaFixedSS08.light.svg index 91c316ad5..22094ddf1 100644 --- a/images/package-sample-IosevkaFixedSS08.light.svg +++ b/images/package-sample-IosevkaFixedSS08.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS09.dark.svg b/images/package-sample-IosevkaFixedSS09.dark.svg index 4028f1521..54c608e5c 100644 --- a/images/package-sample-IosevkaFixedSS09.dark.svg +++ b/images/package-sample-IosevkaFixedSS09.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS09.light.svg b/images/package-sample-IosevkaFixedSS09.light.svg index c35f9f36c..f987386c6 100644 --- a/images/package-sample-IosevkaFixedSS09.light.svg +++ b/images/package-sample-IosevkaFixedSS09.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS10.dark.svg b/images/package-sample-IosevkaFixedSS10.dark.svg index e89d10471..06b98f94a 100644 --- a/images/package-sample-IosevkaFixedSS10.dark.svg +++ b/images/package-sample-IosevkaFixedSS10.dark.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS10.light.svg b/images/package-sample-IosevkaFixedSS10.light.svg index 7d3d736e6..3732e3501 100644 --- a/images/package-sample-IosevkaFixedSS10.light.svg +++ b/images/package-sample-IosevkaFixedSS10.light.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS12.dark.svg b/images/package-sample-IosevkaFixedSS12.dark.svg index 76babd5e0..328281807 100644 --- a/images/package-sample-IosevkaFixedSS12.dark.svg +++ b/images/package-sample-IosevkaFixedSS12.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS12.light.svg b/images/package-sample-IosevkaFixedSS12.light.svg index 8cb4958f6..28654fd94 100644 --- a/images/package-sample-IosevkaFixedSS12.light.svg +++ b/images/package-sample-IosevkaFixedSS12.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS13.dark.svg b/images/package-sample-IosevkaFixedSS13.dark.svg index 71da8b00d..a6ca456fc 100644 --- a/images/package-sample-IosevkaFixedSS13.dark.svg +++ b/images/package-sample-IosevkaFixedSS13.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS13.light.svg b/images/package-sample-IosevkaFixedSS13.light.svg index 70cd14663..11f27559a 100644 --- a/images/package-sample-IosevkaFixedSS13.light.svg +++ b/images/package-sample-IosevkaFixedSS13.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS14.dark.svg b/images/package-sample-IosevkaFixedSS14.dark.svg index 5273516ec..1f8d78301 100644 --- a/images/package-sample-IosevkaFixedSS14.dark.svg +++ b/images/package-sample-IosevkaFixedSS14.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS14.light.svg b/images/package-sample-IosevkaFixedSS14.light.svg index bec62d97b..d25d0e30f 100644 --- a/images/package-sample-IosevkaFixedSS14.light.svg +++ b/images/package-sample-IosevkaFixedSS14.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS15.dark.svg b/images/package-sample-IosevkaFixedSS15.dark.svg index cbae00e90..a038a0cbb 100644 --- a/images/package-sample-IosevkaFixedSS15.dark.svg +++ b/images/package-sample-IosevkaFixedSS15.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS15.light.svg b/images/package-sample-IosevkaFixedSS15.light.svg index 4e598fb97..aad9909e5 100644 --- a/images/package-sample-IosevkaFixedSS15.light.svg +++ b/images/package-sample-IosevkaFixedSS15.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS16.dark.svg b/images/package-sample-IosevkaFixedSS16.dark.svg index d0e726e52..f849f8e22 100644 --- a/images/package-sample-IosevkaFixedSS16.dark.svg +++ b/images/package-sample-IosevkaFixedSS16.dark.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS16.light.svg b/images/package-sample-IosevkaFixedSS16.light.svg index 064f0eab1..6684bbb2d 100644 --- a/images/package-sample-IosevkaFixedSS16.light.svg +++ b/images/package-sample-IosevkaFixedSS16.light.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS17.dark.svg b/images/package-sample-IosevkaFixedSS17.dark.svg index 949698f90..b0c798d4f 100644 --- a/images/package-sample-IosevkaFixedSS17.dark.svg +++ b/images/package-sample-IosevkaFixedSS17.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaFixedSS17.light.svg b/images/package-sample-IosevkaFixedSS17.light.svg index af99c3610..db1070738 100644 --- a/images/package-sample-IosevkaFixedSS17.light.svg +++ b/images/package-sample-IosevkaFixedSS17.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaFixedSS18.dark.svg b/images/package-sample-IosevkaFixedSS18.dark.svg index dc5392825..c7423e783 100644 --- a/images/package-sample-IosevkaFixedSS18.dark.svg +++ b/images/package-sample-IosevkaFixedSS18.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaFixedSS18.light.svg b/images/package-sample-IosevkaFixedSS18.light.svg index e030e2ec9..0e66274a9 100644 --- a/images/package-sample-IosevkaFixedSS18.light.svg +++ b/images/package-sample-IosevkaFixedSS18.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS01.dark.svg b/images/package-sample-IosevkaSS01.dark.svg index 859faedb2..c7177a45a 100644 --- a/images/package-sample-IosevkaSS01.dark.svg +++ b/images/package-sample-IosevkaSS01.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS01.light.svg b/images/package-sample-IosevkaSS01.light.svg index 41abd2369..dadcb8706 100644 --- a/images/package-sample-IosevkaSS01.light.svg +++ b/images/package-sample-IosevkaSS01.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS02.dark.svg b/images/package-sample-IosevkaSS02.dark.svg index b613b91a3..755d13937 100644 --- a/images/package-sample-IosevkaSS02.dark.svg +++ b/images/package-sample-IosevkaSS02.dark.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS02.light.svg b/images/package-sample-IosevkaSS02.light.svg index e85d937d2..c11170c36 100644 --- a/images/package-sample-IosevkaSS02.light.svg +++ b/images/package-sample-IosevkaSS02.light.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS03.dark.svg b/images/package-sample-IosevkaSS03.dark.svg index 291009039..bb675ce3c 100644 --- a/images/package-sample-IosevkaSS03.dark.svg +++ b/images/package-sample-IosevkaSS03.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaSS03.light.svg b/images/package-sample-IosevkaSS03.light.svg index b1417049c..cf7005a54 100644 --- a/images/package-sample-IosevkaSS03.light.svg +++ b/images/package-sample-IosevkaSS03.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaSS04.dark.svg b/images/package-sample-IosevkaSS04.dark.svg index 597547c82..3a89ded5d 100644 --- a/images/package-sample-IosevkaSS04.dark.svg +++ b/images/package-sample-IosevkaSS04.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS04.light.svg b/images/package-sample-IosevkaSS04.light.svg index 228a005c0..43dbf9931 100644 --- a/images/package-sample-IosevkaSS04.light.svg +++ b/images/package-sample-IosevkaSS04.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS05.dark.svg b/images/package-sample-IosevkaSS05.dark.svg index f8e8a1682..3a7d11480 100644 --- a/images/package-sample-IosevkaSS05.dark.svg +++ b/images/package-sample-IosevkaSS05.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS05.light.svg b/images/package-sample-IosevkaSS05.light.svg index 2fb09e182..b0c80cb9d 100644 --- a/images/package-sample-IosevkaSS05.light.svg +++ b/images/package-sample-IosevkaSS05.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS06.dark.svg b/images/package-sample-IosevkaSS06.dark.svg index 3b871d908..ee3a01991 100644 --- a/images/package-sample-IosevkaSS06.dark.svg +++ b/images/package-sample-IosevkaSS06.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS06.light.svg b/images/package-sample-IosevkaSS06.light.svg index d4510b87b..4f7ca6b34 100644 --- a/images/package-sample-IosevkaSS06.light.svg +++ b/images/package-sample-IosevkaSS06.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS07.dark.svg b/images/package-sample-IosevkaSS07.dark.svg index 5ee4934bd..d8fd23c93 100644 --- a/images/package-sample-IosevkaSS07.dark.svg +++ b/images/package-sample-IosevkaSS07.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS07.light.svg b/images/package-sample-IosevkaSS07.light.svg index a3373d038..b601f6d74 100644 --- a/images/package-sample-IosevkaSS07.light.svg +++ b/images/package-sample-IosevkaSS07.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS08.dark.svg b/images/package-sample-IosevkaSS08.dark.svg index 32c2e2c1e..0eebe5cee 100644 --- a/images/package-sample-IosevkaSS08.dark.svg +++ b/images/package-sample-IosevkaSS08.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS08.light.svg b/images/package-sample-IosevkaSS08.light.svg index 91c316ad5..22094ddf1 100644 --- a/images/package-sample-IosevkaSS08.light.svg +++ b/images/package-sample-IosevkaSS08.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS09.dark.svg b/images/package-sample-IosevkaSS09.dark.svg index 4028f1521..54c608e5c 100644 --- a/images/package-sample-IosevkaSS09.dark.svg +++ b/images/package-sample-IosevkaSS09.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS09.light.svg b/images/package-sample-IosevkaSS09.light.svg index c35f9f36c..f987386c6 100644 --- a/images/package-sample-IosevkaSS09.light.svg +++ b/images/package-sample-IosevkaSS09.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS10.dark.svg b/images/package-sample-IosevkaSS10.dark.svg index e89d10471..06b98f94a 100644 --- a/images/package-sample-IosevkaSS10.dark.svg +++ b/images/package-sample-IosevkaSS10.dark.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaSS10.light.svg b/images/package-sample-IosevkaSS10.light.svg index 7d3d736e6..3732e3501 100644 --- a/images/package-sample-IosevkaSS10.light.svg +++ b/images/package-sample-IosevkaSS10.light.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaSS12.dark.svg b/images/package-sample-IosevkaSS12.dark.svg index 76babd5e0..328281807 100644 --- a/images/package-sample-IosevkaSS12.dark.svg +++ b/images/package-sample-IosevkaSS12.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS12.light.svg b/images/package-sample-IosevkaSS12.light.svg index 8cb4958f6..28654fd94 100644 --- a/images/package-sample-IosevkaSS12.light.svg +++ b/images/package-sample-IosevkaSS12.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS13.dark.svg b/images/package-sample-IosevkaSS13.dark.svg index 71da8b00d..a6ca456fc 100644 --- a/images/package-sample-IosevkaSS13.dark.svg +++ b/images/package-sample-IosevkaSS13.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS13.light.svg b/images/package-sample-IosevkaSS13.light.svg index 70cd14663..11f27559a 100644 --- a/images/package-sample-IosevkaSS13.light.svg +++ b/images/package-sample-IosevkaSS13.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS14.dark.svg b/images/package-sample-IosevkaSS14.dark.svg index 5273516ec..1f8d78301 100644 --- a/images/package-sample-IosevkaSS14.dark.svg +++ b/images/package-sample-IosevkaSS14.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS14.light.svg b/images/package-sample-IosevkaSS14.light.svg index bec62d97b..d25d0e30f 100644 --- a/images/package-sample-IosevkaSS14.light.svg +++ b/images/package-sample-IosevkaSS14.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaSS15.dark.svg b/images/package-sample-IosevkaSS15.dark.svg index cbae00e90..a038a0cbb 100644 --- a/images/package-sample-IosevkaSS15.dark.svg +++ b/images/package-sample-IosevkaSS15.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS15.light.svg b/images/package-sample-IosevkaSS15.light.svg index 4e598fb97..aad9909e5 100644 --- a/images/package-sample-IosevkaSS15.light.svg +++ b/images/package-sample-IosevkaSS15.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS16.dark.svg b/images/package-sample-IosevkaSS16.dark.svg index d0e726e52..f849f8e22 100644 --- a/images/package-sample-IosevkaSS16.dark.svg +++ b/images/package-sample-IosevkaSS16.dark.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS16.light.svg b/images/package-sample-IosevkaSS16.light.svg index 064f0eab1..6684bbb2d 100644 --- a/images/package-sample-IosevkaSS16.light.svg +++ b/images/package-sample-IosevkaSS16.light.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS17.dark.svg b/images/package-sample-IosevkaSS17.dark.svg index 949698f90..b0c798d4f 100644 --- a/images/package-sample-IosevkaSS17.dark.svg +++ b/images/package-sample-IosevkaSS17.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaSS17.light.svg b/images/package-sample-IosevkaSS17.light.svg index af99c3610..db1070738 100644 --- a/images/package-sample-IosevkaSS17.light.svg +++ b/images/package-sample-IosevkaSS17.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaSS18.dark.svg b/images/package-sample-IosevkaSS18.dark.svg index dc5392825..c7423e783 100644 --- a/images/package-sample-IosevkaSS18.dark.svg +++ b/images/package-sample-IosevkaSS18.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaSS18.light.svg b/images/package-sample-IosevkaSS18.light.svg index e030e2ec9..0e66274a9 100644 --- a/images/package-sample-IosevkaSS18.light.svg +++ b/images/package-sample-IosevkaSS18.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTerm.dark.svg b/images/package-sample-IosevkaTerm.dark.svg index a73a91b18..5ce430a2d 100644 --- a/images/package-sample-IosevkaTerm.dark.svg +++ b/images/package-sample-IosevkaTerm.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTerm.light.svg b/images/package-sample-IosevkaTerm.light.svg index 42bbb3690..a6f020c4c 100644 --- a/images/package-sample-IosevkaTerm.light.svg +++ b/images/package-sample-IosevkaTerm.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermCurly.dark.svg b/images/package-sample-IosevkaTermCurly.dark.svg index 332066eca..4263df2f3 100644 --- a/images/package-sample-IosevkaTermCurly.dark.svg +++ b/images/package-sample-IosevkaTermCurly.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermCurly.light.svg b/images/package-sample-IosevkaTermCurly.light.svg index 30eb598c3..d2297985e 100644 --- a/images/package-sample-IosevkaTermCurly.light.svg +++ b/images/package-sample-IosevkaTermCurly.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS01.dark.svg b/images/package-sample-IosevkaTermSS01.dark.svg index 859faedb2..c7177a45a 100644 --- a/images/package-sample-IosevkaTermSS01.dark.svg +++ b/images/package-sample-IosevkaTermSS01.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS01.light.svg b/images/package-sample-IosevkaTermSS01.light.svg index 41abd2369..dadcb8706 100644 --- a/images/package-sample-IosevkaTermSS01.light.svg +++ b/images/package-sample-IosevkaTermSS01.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS02.dark.svg b/images/package-sample-IosevkaTermSS02.dark.svg index b613b91a3..755d13937 100644 --- a/images/package-sample-IosevkaTermSS02.dark.svg +++ b/images/package-sample-IosevkaTermSS02.dark.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS02.light.svg b/images/package-sample-IosevkaTermSS02.light.svg index e85d937d2..c11170c36 100644 --- a/images/package-sample-IosevkaTermSS02.light.svg +++ b/images/package-sample-IosevkaTermSS02.light.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS03.dark.svg b/images/package-sample-IosevkaTermSS03.dark.svg index 291009039..bb675ce3c 100644 --- a/images/package-sample-IosevkaTermSS03.dark.svg +++ b/images/package-sample-IosevkaTermSS03.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaTermSS03.light.svg b/images/package-sample-IosevkaTermSS03.light.svg index b1417049c..cf7005a54 100644 --- a/images/package-sample-IosevkaTermSS03.light.svg +++ b/images/package-sample-IosevkaTermSS03.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaTermSS04.dark.svg b/images/package-sample-IosevkaTermSS04.dark.svg index 597547c82..3a89ded5d 100644 --- a/images/package-sample-IosevkaTermSS04.dark.svg +++ b/images/package-sample-IosevkaTermSS04.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS04.light.svg b/images/package-sample-IosevkaTermSS04.light.svg index 228a005c0..43dbf9931 100644 --- a/images/package-sample-IosevkaTermSS04.light.svg +++ b/images/package-sample-IosevkaTermSS04.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS05.dark.svg b/images/package-sample-IosevkaTermSS05.dark.svg index f8e8a1682..3a7d11480 100644 --- a/images/package-sample-IosevkaTermSS05.dark.svg +++ b/images/package-sample-IosevkaTermSS05.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS05.light.svg b/images/package-sample-IosevkaTermSS05.light.svg index 2fb09e182..b0c80cb9d 100644 --- a/images/package-sample-IosevkaTermSS05.light.svg +++ b/images/package-sample-IosevkaTermSS05.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS06.dark.svg b/images/package-sample-IosevkaTermSS06.dark.svg index 3b871d908..ee3a01991 100644 --- a/images/package-sample-IosevkaTermSS06.dark.svg +++ b/images/package-sample-IosevkaTermSS06.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS06.light.svg b/images/package-sample-IosevkaTermSS06.light.svg index d4510b87b..4f7ca6b34 100644 --- a/images/package-sample-IosevkaTermSS06.light.svg +++ b/images/package-sample-IosevkaTermSS06.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS07.dark.svg b/images/package-sample-IosevkaTermSS07.dark.svg index 5ee4934bd..d8fd23c93 100644 --- a/images/package-sample-IosevkaTermSS07.dark.svg +++ b/images/package-sample-IosevkaTermSS07.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS07.light.svg b/images/package-sample-IosevkaTermSS07.light.svg index a3373d038..b601f6d74 100644 --- a/images/package-sample-IosevkaTermSS07.light.svg +++ b/images/package-sample-IosevkaTermSS07.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS08.dark.svg b/images/package-sample-IosevkaTermSS08.dark.svg index 32c2e2c1e..0eebe5cee 100644 --- a/images/package-sample-IosevkaTermSS08.dark.svg +++ b/images/package-sample-IosevkaTermSS08.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS08.light.svg b/images/package-sample-IosevkaTermSS08.light.svg index 91c316ad5..22094ddf1 100644 --- a/images/package-sample-IosevkaTermSS08.light.svg +++ b/images/package-sample-IosevkaTermSS08.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS09.dark.svg b/images/package-sample-IosevkaTermSS09.dark.svg index 4028f1521..54c608e5c 100644 --- a/images/package-sample-IosevkaTermSS09.dark.svg +++ b/images/package-sample-IosevkaTermSS09.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS09.light.svg b/images/package-sample-IosevkaTermSS09.light.svg index c35f9f36c..f987386c6 100644 --- a/images/package-sample-IosevkaTermSS09.light.svg +++ b/images/package-sample-IosevkaTermSS09.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS10.dark.svg b/images/package-sample-IosevkaTermSS10.dark.svg index e89d10471..06b98f94a 100644 --- a/images/package-sample-IosevkaTermSS10.dark.svg +++ b/images/package-sample-IosevkaTermSS10.dark.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS10.light.svg b/images/package-sample-IosevkaTermSS10.light.svg index 7d3d736e6..3732e3501 100644 --- a/images/package-sample-IosevkaTermSS10.light.svg +++ b/images/package-sample-IosevkaTermSS10.light.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS12.dark.svg b/images/package-sample-IosevkaTermSS12.dark.svg index 76babd5e0..328281807 100644 --- a/images/package-sample-IosevkaTermSS12.dark.svg +++ b/images/package-sample-IosevkaTermSS12.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS12.light.svg b/images/package-sample-IosevkaTermSS12.light.svg index 8cb4958f6..28654fd94 100644 --- a/images/package-sample-IosevkaTermSS12.light.svg +++ b/images/package-sample-IosevkaTermSS12.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS13.dark.svg b/images/package-sample-IosevkaTermSS13.dark.svg index 71da8b00d..a6ca456fc 100644 --- a/images/package-sample-IosevkaTermSS13.dark.svg +++ b/images/package-sample-IosevkaTermSS13.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS13.light.svg b/images/package-sample-IosevkaTermSS13.light.svg index 70cd14663..11f27559a 100644 --- a/images/package-sample-IosevkaTermSS13.light.svg +++ b/images/package-sample-IosevkaTermSS13.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS14.dark.svg b/images/package-sample-IosevkaTermSS14.dark.svg index 5273516ec..1f8d78301 100644 --- a/images/package-sample-IosevkaTermSS14.dark.svg +++ b/images/package-sample-IosevkaTermSS14.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS14.light.svg b/images/package-sample-IosevkaTermSS14.light.svg index bec62d97b..d25d0e30f 100644 --- a/images/package-sample-IosevkaTermSS14.light.svg +++ b/images/package-sample-IosevkaTermSS14.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS15.dark.svg b/images/package-sample-IosevkaTermSS15.dark.svg index cbae00e90..a038a0cbb 100644 --- a/images/package-sample-IosevkaTermSS15.dark.svg +++ b/images/package-sample-IosevkaTermSS15.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS15.light.svg b/images/package-sample-IosevkaTermSS15.light.svg index 4e598fb97..aad9909e5 100644 --- a/images/package-sample-IosevkaTermSS15.light.svg +++ b/images/package-sample-IosevkaTermSS15.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS16.dark.svg b/images/package-sample-IosevkaTermSS16.dark.svg index d0e726e52..f849f8e22 100644 --- a/images/package-sample-IosevkaTermSS16.dark.svg +++ b/images/package-sample-IosevkaTermSS16.dark.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS16.light.svg b/images/package-sample-IosevkaTermSS16.light.svg index 064f0eab1..6684bbb2d 100644 --- a/images/package-sample-IosevkaTermSS16.light.svg +++ b/images/package-sample-IosevkaTermSS16.light.svg @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS17.dark.svg b/images/package-sample-IosevkaTermSS17.dark.svg index 949698f90..b0c798d4f 100644 --- a/images/package-sample-IosevkaTermSS17.dark.svg +++ b/images/package-sample-IosevkaTermSS17.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaTermSS17.light.svg b/images/package-sample-IosevkaTermSS17.light.svg index af99c3610..db1070738 100644 --- a/images/package-sample-IosevkaTermSS17.light.svg +++ b/images/package-sample-IosevkaTermSS17.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/package-sample-IosevkaTermSS18.dark.svg b/images/package-sample-IosevkaTermSS18.dark.svg index dc5392825..c7423e783 100644 --- a/images/package-sample-IosevkaTermSS18.dark.svg +++ b/images/package-sample-IosevkaTermSS18.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/package-sample-IosevkaTermSS18.light.svg b/images/package-sample-IosevkaTermSS18.light.svg index e030e2ec9..0e66274a9 100644 --- a/images/package-sample-IosevkaTermSS18.light.svg +++ b/images/package-sample-IosevkaTermSS18.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-off-0.dark.svg b/images/ss-i-off-0.dark.svg index 7eb046c6e..a579ca383 100644 --- a/images/ss-i-off-0.dark.svg +++ b/images/ss-i-off-0.dark.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-off-0.light.svg b/images/ss-i-off-0.light.svg index 567ed79c4..2394d3e1f 100644 --- a/images/ss-i-off-0.light.svg +++ b/images/ss-i-off-0.light.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss01-1.dark.svg b/images/ss-i-ss01-1.dark.svg index af0e3a8ec..0b92221fe 100644 --- a/images/ss-i-ss01-1.dark.svg +++ b/images/ss-i-ss01-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -250,7 +250,7 @@ - + @@ -261,7 +261,9 @@ - + + + @@ -356,9 +358,10 @@ - + + diff --git a/images/ss-i-ss01-1.light.svg b/images/ss-i-ss01-1.light.svg index e69ce6d76..0e183324b 100644 --- a/images/ss-i-ss01-1.light.svg +++ b/images/ss-i-ss01-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -250,7 +250,7 @@ - + @@ -261,7 +261,9 @@ - + + + @@ -356,9 +358,10 @@ - + + diff --git a/images/ss-i-ss02-1.dark.svg b/images/ss-i-ss02-1.dark.svg index 3ddb6095d..785a81e9e 100644 --- a/images/ss-i-ss02-1.dark.svg +++ b/images/ss-i-ss02-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss02-1.light.svg b/images/ss-i-ss02-1.light.svg index 7e4256d39..f7dd83589 100644 --- a/images/ss-i-ss02-1.light.svg +++ b/images/ss-i-ss02-1.light.svg @@ -33,7 +33,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss03-1.dark.svg b/images/ss-i-ss03-1.dark.svg index b84826ab5..9cd3d4237 100644 --- a/images/ss-i-ss03-1.dark.svg +++ b/images/ss-i-ss03-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + @@ -244,7 +244,7 @@ - + @@ -255,7 +255,9 @@ - + + + @@ -310,12 +312,16 @@ - + - - - - + + + + + + + + @@ -348,9 +354,10 @@ - + + @@ -486,7 +493,7 @@ - + @@ -497,8 +504,12 @@ - - + + + + + + diff --git a/images/ss-i-ss03-1.light.svg b/images/ss-i-ss03-1.light.svg index a7ef2f33b..0ab092d39 100644 --- a/images/ss-i-ss03-1.light.svg +++ b/images/ss-i-ss03-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + @@ -244,7 +244,7 @@ - + @@ -255,7 +255,9 @@ - + + + @@ -310,12 +312,16 @@ - + - - - - + + + + + + + + @@ -348,9 +354,10 @@ - + + @@ -486,7 +493,7 @@ - + @@ -497,8 +504,12 @@ - - + + + + + + diff --git a/images/ss-i-ss04-1.dark.svg b/images/ss-i-ss04-1.dark.svg index e22c234d4..4f354dcd3 100644 --- a/images/ss-i-ss04-1.dark.svg +++ b/images/ss-i-ss04-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss04-1.light.svg b/images/ss-i-ss04-1.light.svg index 85b4985d0..24a61518c 100644 --- a/images/ss-i-ss04-1.light.svg +++ b/images/ss-i-ss04-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss05-1.dark.svg b/images/ss-i-ss05-1.dark.svg index 94a59b51a..0f2c82313 100644 --- a/images/ss-i-ss05-1.dark.svg +++ b/images/ss-i-ss05-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -264,10 +264,12 @@ - + - + + + @@ -368,9 +370,10 @@ - + + diff --git a/images/ss-i-ss05-1.light.svg b/images/ss-i-ss05-1.light.svg index d603c2bb7..c42513538 100644 --- a/images/ss-i-ss05-1.light.svg +++ b/images/ss-i-ss05-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -264,10 +264,12 @@ - + - + + + @@ -368,9 +370,10 @@ - + + diff --git a/images/ss-i-ss06-1.dark.svg b/images/ss-i-ss06-1.dark.svg index acd7de396..5633ee751 100644 --- a/images/ss-i-ss06-1.dark.svg +++ b/images/ss-i-ss06-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -293,7 +293,7 @@ - + @@ -404,9 +404,10 @@ - + + diff --git a/images/ss-i-ss06-1.light.svg b/images/ss-i-ss06-1.light.svg index 8abaef610..83b08c14c 100644 --- a/images/ss-i-ss06-1.light.svg +++ b/images/ss-i-ss06-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -293,7 +293,7 @@ - + @@ -404,9 +404,10 @@ - + + diff --git a/images/ss-i-ss07-1.dark.svg b/images/ss-i-ss07-1.dark.svg index b599324d4..eed80b4d5 100644 --- a/images/ss-i-ss07-1.dark.svg +++ b/images/ss-i-ss07-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -270,10 +270,12 @@ - + - + + + @@ -370,9 +372,10 @@ - + + diff --git a/images/ss-i-ss07-1.light.svg b/images/ss-i-ss07-1.light.svg index 52c6a2191..1a0e7f42e 100644 --- a/images/ss-i-ss07-1.light.svg +++ b/images/ss-i-ss07-1.light.svg @@ -47,7 +47,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -270,10 +270,12 @@ - + - + + + @@ -370,9 +372,10 @@ - + + diff --git a/images/ss-i-ss08-1.dark.svg b/images/ss-i-ss08-1.dark.svg index 0f219648d..d94498382 100644 --- a/images/ss-i-ss08-1.dark.svg +++ b/images/ss-i-ss08-1.dark.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss08-1.light.svg b/images/ss-i-ss08-1.light.svg index 5383ee793..dfb304c94 100644 --- a/images/ss-i-ss08-1.light.svg +++ b/images/ss-i-ss08-1.light.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss09-1.dark.svg b/images/ss-i-ss09-1.dark.svg index c299ce79e..d5be0da94 100644 --- a/images/ss-i-ss09-1.dark.svg +++ b/images/ss-i-ss09-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -251,10 +251,12 @@ - + - + + + @@ -362,9 +364,10 @@ - + + diff --git a/images/ss-i-ss09-1.light.svg b/images/ss-i-ss09-1.light.svg index c65cc5008..a91854193 100644 --- a/images/ss-i-ss09-1.light.svg +++ b/images/ss-i-ss09-1.light.svg @@ -47,7 +47,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -251,10 +251,12 @@ - + - + + + @@ -362,9 +364,10 @@ - + + diff --git a/images/ss-i-ss10-1.dark.svg b/images/ss-i-ss10-1.dark.svg index ec7f85788..82e90fa2e 100644 --- a/images/ss-i-ss10-1.dark.svg +++ b/images/ss-i-ss10-1.dark.svg @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -296,15 +296,19 @@ - + - - - - - + + + + + + + + + @@ -520,15 +524,11 @@ - + - - - - - - + + diff --git a/images/ss-i-ss10-1.light.svg b/images/ss-i-ss10-1.light.svg index c0276cded..e7338bac6 100644 --- a/images/ss-i-ss10-1.light.svg +++ b/images/ss-i-ss10-1.light.svg @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -296,15 +296,19 @@ - + - - - - - + + + + + + + + + @@ -520,15 +524,11 @@ - + - - - - - - + + diff --git a/images/ss-i-ss12-1.dark.svg b/images/ss-i-ss12-1.dark.svg index 9a985be8d..88cd6829e 100644 --- a/images/ss-i-ss12-1.dark.svg +++ b/images/ss-i-ss12-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -268,15 +268,19 @@ - + - - - - - - + + + + + + + + + + @@ -366,9 +370,10 @@ - + + diff --git a/images/ss-i-ss12-1.light.svg b/images/ss-i-ss12-1.light.svg index 321f0ea58..5fd439cfd 100644 --- a/images/ss-i-ss12-1.light.svg +++ b/images/ss-i-ss12-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -268,15 +268,19 @@ - + - - - - - - + + + + + + + + + + @@ -366,9 +370,10 @@ - + + diff --git a/images/ss-i-ss13-1.dark.svg b/images/ss-i-ss13-1.dark.svg index cadede942..a3df6f19e 100644 --- a/images/ss-i-ss13-1.dark.svg +++ b/images/ss-i-ss13-1.dark.svg @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss13-1.light.svg b/images/ss-i-ss13-1.light.svg index d59898471..f5b8c9a8d 100644 --- a/images/ss-i-ss13-1.light.svg +++ b/images/ss-i-ss13-1.light.svg @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss14-1.dark.svg b/images/ss-i-ss14-1.dark.svg index e042fc5b1..145db0459 100644 --- a/images/ss-i-ss14-1.dark.svg +++ b/images/ss-i-ss14-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss14-1.light.svg b/images/ss-i-ss14-1.light.svg index 90edbe805..c72d0a45e 100644 --- a/images/ss-i-ss14-1.light.svg +++ b/images/ss-i-ss14-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss15-1.dark.svg b/images/ss-i-ss15-1.dark.svg index fb7c553b3..278f1cdaf 100644 --- a/images/ss-i-ss15-1.dark.svg +++ b/images/ss-i-ss15-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss15-1.light.svg b/images/ss-i-ss15-1.light.svg index 690cc1848..a1d362064 100644 --- a/images/ss-i-ss15-1.light.svg +++ b/images/ss-i-ss15-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss16-1.dark.svg b/images/ss-i-ss16-1.dark.svg index 8910c43af..ce63da168 100644 --- a/images/ss-i-ss16-1.dark.svg +++ b/images/ss-i-ss16-1.dark.svg @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss16-1.light.svg b/images/ss-i-ss16-1.light.svg index ca88bf4a6..908fc1587 100644 --- a/images/ss-i-ss16-1.light.svg +++ b/images/ss-i-ss16-1.light.svg @@ -59,7 +59,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss17-1.dark.svg b/images/ss-i-ss17-1.dark.svg index fbcccec2f..dff45d6de 100644 --- a/images/ss-i-ss17-1.dark.svg +++ b/images/ss-i-ss17-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/ss-i-ss17-1.light.svg b/images/ss-i-ss17-1.light.svg index 05697c1a6..ef9e6fe3a 100644 --- a/images/ss-i-ss17-1.light.svg +++ b/images/ss-i-ss17-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/ss-i-ss18-1.dark.svg b/images/ss-i-ss18-1.dark.svg index 0a8bd0d6e..eca0c112e 100644 --- a/images/ss-i-ss18-1.dark.svg +++ b/images/ss-i-ss18-1.dark.svg @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss18-1.light.svg b/images/ss-i-ss18-1.light.svg index 959844617..a75bac595 100644 --- a/images/ss-i-ss18-1.light.svg +++ b/images/ss-i-ss18-1.light.svg @@ -113,7 +113,7 @@ - + diff --git a/images/ss-i-ss20-1.dark.svg b/images/ss-i-ss20-1.dark.svg index 55f9bbc33..6120691b4 100644 --- a/images/ss-i-ss20-1.dark.svg +++ b/images/ss-i-ss20-1.dark.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-i-ss20-1.light.svg b/images/ss-i-ss20-1.light.svg index 949ae1f1f..ec51b93e4 100644 --- a/images/ss-i-ss20-1.light.svg +++ b/images/ss-i-ss20-1.light.svg @@ -59,7 +59,7 @@ - + diff --git a/images/ss-u-off-0.dark.svg b/images/ss-u-off-0.dark.svg index c2f0b7791..0f8518260 100644 --- a/images/ss-u-off-0.dark.svg +++ b/images/ss-u-off-0.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-off-0.light.svg b/images/ss-u-off-0.light.svg index 177cc57f0..4886b1d4f 100644 --- a/images/ss-u-off-0.light.svg +++ b/images/ss-u-off-0.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss01-1.dark.svg b/images/ss-u-ss01-1.dark.svg index bff6047d2..6e0cba912 100644 --- a/images/ss-u-ss01-1.dark.svg +++ b/images/ss-u-ss01-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -255,12 +255,16 @@ - - - - - - + + + + + + + + + + @@ -338,11 +342,14 @@ - + - + + + + diff --git a/images/ss-u-ss01-1.light.svg b/images/ss-u-ss01-1.light.svg index 5eecab051..ccab2bdca 100644 --- a/images/ss-u-ss01-1.light.svg +++ b/images/ss-u-ss01-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -255,12 +255,16 @@ - - - - - - + + + + + + + + + + @@ -338,11 +342,14 @@ - + - + + + + diff --git a/images/ss-u-ss02-1.dark.svg b/images/ss-u-ss02-1.dark.svg index eed6a126d..83b5a312d 100644 --- a/images/ss-u-ss02-1.dark.svg +++ b/images/ss-u-ss02-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss02-1.light.svg b/images/ss-u-ss02-1.light.svg index 3d20b5872..c495ef773 100644 --- a/images/ss-u-ss02-1.light.svg +++ b/images/ss-u-ss02-1.light.svg @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss03-1.dark.svg b/images/ss-u-ss03-1.dark.svg index d44be9af3..bfa440773 100644 --- a/images/ss-u-ss03-1.dark.svg +++ b/images/ss-u-ss03-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + @@ -246,7 +246,7 @@ - + @@ -258,12 +258,16 @@ - - - - - - + + + + + + + + + + @@ -305,12 +309,16 @@ - + - - - - + + + + + + + + @@ -336,12 +344,15 @@ - + - + + + + @@ -477,7 +488,7 @@ - + @@ -488,8 +499,12 @@ - - + + + + + + diff --git a/images/ss-u-ss03-1.light.svg b/images/ss-u-ss03-1.light.svg index 393ccd957..e9a80e8d5 100644 --- a/images/ss-u-ss03-1.light.svg +++ b/images/ss-u-ss03-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + @@ -246,7 +246,7 @@ - + @@ -258,12 +258,16 @@ - - - - - - + + + + + + + + + + @@ -305,12 +309,16 @@ - + - - - - + + + + + + + + @@ -336,12 +344,15 @@ - + - + + + + @@ -477,7 +488,7 @@ - + @@ -488,8 +499,12 @@ - - + + + + + + diff --git a/images/ss-u-ss04-1.dark.svg b/images/ss-u-ss04-1.dark.svg index fac7a90df..74b368713 100644 --- a/images/ss-u-ss04-1.dark.svg +++ b/images/ss-u-ss04-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss04-1.light.svg b/images/ss-u-ss04-1.light.svg index 31ab10cbb..f1db7410a 100644 --- a/images/ss-u-ss04-1.light.svg +++ b/images/ss-u-ss04-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss05-1.dark.svg b/images/ss-u-ss05-1.dark.svg index 918b3687a..16ec43c4a 100644 --- a/images/ss-u-ss05-1.dark.svg +++ b/images/ss-u-ss05-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -256,15 +256,19 @@ - + - - - - - - + + + + + + + + + + @@ -354,9 +358,10 @@ - + + diff --git a/images/ss-u-ss05-1.light.svg b/images/ss-u-ss05-1.light.svg index 62a801f79..1787d372e 100644 --- a/images/ss-u-ss05-1.light.svg +++ b/images/ss-u-ss05-1.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -256,15 +256,19 @@ - + - - - - - - + + + + + + + + + + @@ -354,9 +358,10 @@ - + + diff --git a/images/ss-u-ss06-1.dark.svg b/images/ss-u-ss06-1.dark.svg index 3854de544..4fd8157a3 100644 --- a/images/ss-u-ss06-1.dark.svg +++ b/images/ss-u-ss06-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -291,10 +291,12 @@ - + - - + + + + @@ -396,9 +398,10 @@ - + + diff --git a/images/ss-u-ss06-1.light.svg b/images/ss-u-ss06-1.light.svg index 3486b5e41..76e602e6d 100644 --- a/images/ss-u-ss06-1.light.svg +++ b/images/ss-u-ss06-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -291,10 +291,12 @@ - + - - + + + + @@ -396,9 +398,10 @@ - + + diff --git a/images/ss-u-ss07-1.dark.svg b/images/ss-u-ss07-1.dark.svg index 03fcad61e..3b7117325 100644 --- a/images/ss-u-ss07-1.dark.svg +++ b/images/ss-u-ss07-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -262,13 +262,17 @@ - + - - - - + + + + + + + + @@ -356,9 +360,10 @@ - + + diff --git a/images/ss-u-ss07-1.light.svg b/images/ss-u-ss07-1.light.svg index 9b1eb38a7..b135ad0f0 100644 --- a/images/ss-u-ss07-1.light.svg +++ b/images/ss-u-ss07-1.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -262,13 +262,17 @@ - + - - - - + + + + + + + + @@ -356,9 +360,10 @@ - + + diff --git a/images/ss-u-ss08-1.dark.svg b/images/ss-u-ss08-1.dark.svg index 2462e5af0..5d551e1d0 100644 --- a/images/ss-u-ss08-1.dark.svg +++ b/images/ss-u-ss08-1.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss08-1.light.svg b/images/ss-u-ss08-1.light.svg index 40447b7a7..5d2339404 100644 --- a/images/ss-u-ss08-1.light.svg +++ b/images/ss-u-ss08-1.light.svg @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss09-1.dark.svg b/images/ss-u-ss09-1.dark.svg index 26942ee60..1019ca66c 100644 --- a/images/ss-u-ss09-1.dark.svg +++ b/images/ss-u-ss09-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -246,13 +246,17 @@ - + - - - - + + + + + + + + @@ -355,11 +359,14 @@ - + - + + + + diff --git a/images/ss-u-ss09-1.light.svg b/images/ss-u-ss09-1.light.svg index dd63557bd..53a713cbc 100644 --- a/images/ss-u-ss09-1.light.svg +++ b/images/ss-u-ss09-1.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + @@ -246,13 +246,17 @@ - + - - - - + + + + + + + + @@ -355,11 +359,14 @@ - + - + + + + diff --git a/images/ss-u-ss10-1.dark.svg b/images/ss-u-ss10-1.dark.svg index 08acdb0f8..74184ca74 100644 --- a/images/ss-u-ss10-1.dark.svg +++ b/images/ss-u-ss10-1.dark.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -161,19 +161,21 @@ - + - - - - - - - - - - - + + + + + + + + + + + + + @@ -299,15 +301,19 @@ - + - - - - - + + + + + + + + + @@ -525,15 +531,11 @@ - + - - - - - - + + diff --git a/images/ss-u-ss10-1.light.svg b/images/ss-u-ss10-1.light.svg index 2a391ae4e..576b42b6d 100644 --- a/images/ss-u-ss10-1.light.svg +++ b/images/ss-u-ss10-1.light.svg @@ -1,7 +1,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -111,7 +111,7 @@ - + @@ -161,19 +161,21 @@ - + - - - - - - - - - - - + + + + + + + + + + + + + @@ -299,15 +301,19 @@ - + - - - - - + + + + + + + + + @@ -525,15 +531,11 @@ - + - - - - - - + + diff --git a/images/ss-u-ss12-1.dark.svg b/images/ss-u-ss12-1.dark.svg index 38134d25c..34f03a922 100644 --- a/images/ss-u-ss12-1.dark.svg +++ b/images/ss-u-ss12-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -272,10 +272,12 @@ - + - + + + @@ -380,9 +382,10 @@ - + + diff --git a/images/ss-u-ss12-1.light.svg b/images/ss-u-ss12-1.light.svg index 414d1b149..1894a2977 100644 --- a/images/ss-u-ss12-1.light.svg +++ b/images/ss-u-ss12-1.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -272,10 +272,12 @@ - + - + + + @@ -380,9 +382,10 @@ - + + diff --git a/images/ss-u-ss13-1.dark.svg b/images/ss-u-ss13-1.dark.svg index befb5b6ab..fca481bd9 100644 --- a/images/ss-u-ss13-1.dark.svg +++ b/images/ss-u-ss13-1.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss13-1.light.svg b/images/ss-u-ss13-1.light.svg index 54792f7be..dd60040a9 100644 --- a/images/ss-u-ss13-1.light.svg +++ b/images/ss-u-ss13-1.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss14-1.dark.svg b/images/ss-u-ss14-1.dark.svg index 027d247ba..e26dc0d3d 100644 --- a/images/ss-u-ss14-1.dark.svg +++ b/images/ss-u-ss14-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss14-1.light.svg b/images/ss-u-ss14-1.light.svg index 63ad940d2..5e47b87bd 100644 --- a/images/ss-u-ss14-1.light.svg +++ b/images/ss-u-ss14-1.light.svg @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss15-1.dark.svg b/images/ss-u-ss15-1.dark.svg index b9d7e7612..a20020efa 100644 --- a/images/ss-u-ss15-1.dark.svg +++ b/images/ss-u-ss15-1.dark.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss15-1.light.svg b/images/ss-u-ss15-1.light.svg index f15e4e84b..d0e7afa7e 100644 --- a/images/ss-u-ss15-1.light.svg +++ b/images/ss-u-ss15-1.light.svg @@ -33,7 +33,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss16-1.dark.svg b/images/ss-u-ss16-1.dark.svg index e8fdda13f..711baec9e 100644 --- a/images/ss-u-ss16-1.dark.svg +++ b/images/ss-u-ss16-1.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss16-1.light.svg b/images/ss-u-ss16-1.light.svg index bf46d8d82..cdb43b68b 100644 --- a/images/ss-u-ss16-1.light.svg +++ b/images/ss-u-ss16-1.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss17-1.dark.svg b/images/ss-u-ss17-1.dark.svg index cfb3b0d53..abf08360e 100644 --- a/images/ss-u-ss17-1.dark.svg +++ b/images/ss-u-ss17-1.dark.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/ss-u-ss17-1.light.svg b/images/ss-u-ss17-1.light.svg index 7a019724a..75d639927 100644 --- a/images/ss-u-ss17-1.light.svg +++ b/images/ss-u-ss17-1.light.svg @@ -47,7 +47,7 @@ - + @@ -59,10 +59,10 @@ - + - + diff --git a/images/ss-u-ss18-1.dark.svg b/images/ss-u-ss18-1.dark.svg index a361fbe77..fa54c6ef7 100644 --- a/images/ss-u-ss18-1.dark.svg +++ b/images/ss-u-ss18-1.dark.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss18-1.light.svg b/images/ss-u-ss18-1.light.svg index f4b4c706e..beb6d9759 100644 --- a/images/ss-u-ss18-1.light.svg +++ b/images/ss-u-ss18-1.light.svg @@ -62,7 +62,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/images/ss-u-ss20-1.dark.svg b/images/ss-u-ss20-1.dark.svg index 0c40a7a5f..d02b72e94 100644 --- a/images/ss-u-ss20-1.dark.svg +++ b/images/ss-u-ss20-1.dark.svg @@ -62,7 +62,7 @@ - + diff --git a/images/ss-u-ss20-1.light.svg b/images/ss-u-ss20-1.light.svg index e47e6723b..1069271c7 100644 --- a/images/ss-u-ss20-1.light.svg +++ b/images/ss-u-ss20-1.light.svg @@ -62,7 +62,7 @@ - + diff --git a/package-lock.json b/package-lock.json index 3a86cfc8f..0333f8276 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@iosevka/monorepo", - "version": "31.3.0", + "version": "31.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@iosevka/monorepo", - "version": "31.3.0", + "version": "31.4.0", "workspaces": [ "packages/*", "tools/*" @@ -21,7 +21,7 @@ "which": "^4.0.0" }, "devDependencies": { - "eslint": "^9.8.0", + "eslint": "^9.9.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "glob": "^11.0.0", @@ -69,9 +69,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "dependencies": { "@eslint/object-schema": "^2.1.4", @@ -106,9 +106,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", - "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", + "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1467,16 +1467,16 @@ } }, "node_modules/eslint": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", - "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", + "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", + "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.8.0", + "@eslint/js": "9.9.1", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -1515,6 +1515,14 @@ }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { @@ -1755,9 +1763,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -2015,9 +2023,9 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -3294,9 +3302,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -3663,16 +3671,16 @@ }, "packages/font": { "name": "@iosevka/font", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/font-glyphs": "31.3.0", - "@iosevka/font-otl": "31.3.0", - "@iosevka/geometry": "31.3.0", - "@iosevka/geometry-cache": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/param": "31.3.0", - "@iosevka/util": "31.3.0", + "@iosevka/font-glyphs": "31.4.0", + "@iosevka/font-otl": "31.4.0", + "@iosevka/geometry": "31.4.0", + "@iosevka/geometry-cache": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/param": "31.4.0", + "@iosevka/util": "31.4.0", "harfbuzzjs": "^0.3.6", "ot-builder": "^1.7.4", "semver": "^7.6.3" @@ -3680,100 +3688,100 @@ }, "packages/font-glyphs": { "name": "@iosevka/font-glyphs", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/font-kits": "31.3.0", - "@iosevka/geometry": "31.3.0", - "@iosevka/geometry-cache": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/util": "31.3.0", + "@iosevka/font-kits": "31.4.0", + "@iosevka/geometry": "31.4.0", + "@iosevka/geometry-cache": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/util": "31.4.0", "typo-geom": "^0.16.1" } }, "packages/font-kits": { "name": "@iosevka/font-kits", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/geometry": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/util": "31.3.0" + "@iosevka/geometry": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/util": "31.4.0" } }, "packages/font-otl": { "name": "@iosevka/font-otl", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/font-glyphs": "31.3.0", - "@iosevka/glyph": "31.3.0", + "@iosevka/font-glyphs": "31.4.0", + "@iosevka/glyph": "31.4.0", "toposort": "^2.0.2" } }, "packages/geometry": { "name": "@iosevka/geometry", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/util": "31.3.0", + "@iosevka/util": "31.4.0", "spiro": "^3.0.1", "typo-geom": "^0.16.1" } }, "packages/geometry-cache": { "name": "@iosevka/geometry-cache", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/geometry": "31.3.0", + "@iosevka/geometry": "31.4.0", "@msgpack/msgpack": "^2.8.0" } }, "packages/glyph": { "name": "@iosevka/glyph", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/geometry": "31.3.0" + "@iosevka/geometry": "31.4.0" } }, "packages/param": { "name": "@iosevka/param", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/util": "31.3.0" + "@iosevka/util": "31.4.0" } }, "packages/util": { "name": "@iosevka/util", - "version": "31.3.0" + "version": "31.4.0" }, "tools/amend-readme": { "name": "@iosevka/amend-readme", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "31.3.0", + "@iosevka/param": "31.4.0", "@unicode/unicode-15.1.0": "^1.5.2" } }, "tools/data-export": { "name": "@iosevka/data-export", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "31.3.0", + "@iosevka/param": "31.4.0", "@unicode/unicode-15.1.0": "^1.5.2", "cldr": "^7.5.0" } }, "tools/generate-samples": { "name": "@iosevka/generate-samples", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/data-export": "31.3.0" + "@iosevka/data-export": "31.4.0" } }, "tools/misc": { "name": "@iosevka/misc", - "version": "31.3.0", + "version": "31.4.0", "dependencies": { - "@iosevka/util": "31.3.0", + "@iosevka/util": "31.4.0", "semver": "^7.6.3", "wawoff2": "^2.0.1" } diff --git a/package.json b/package.json index 44fe6a579..f2519663d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/monorepo", - "version": "31.3.0", + "version": "31.4.0", "workspaces": [ "packages/*", "tools/*" @@ -11,8 +11,7 @@ "clean": "verda -f verdafile.mjs clean", "lint": "eslint", "lint:fix": "eslint --fix", - "copy-char-name-to-markdown": "node tools/misc/src/copy-char-name-to-markdown.mjs", - "generate-release-sha-file": "node tools/misc/src/generate-release-sha-file.mjs release-archives/*.zip release-archives/SHA-256.txt" + "copy-char-name-to-markdown": "node tools/misc/src/copy-char-name-to-markdown.mjs" }, "dependencies": { "@iarna/toml": "^2.2.5", @@ -24,7 +23,7 @@ "which": "^4.0.0" }, "devDependencies": { - "eslint": "^9.8.0", + "eslint": "^9.9.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "glob": "^11.0.0", diff --git a/packages/font-glyphs/package.json b/packages/font-glyphs/package.json index d23090c49..29d5d438b 100644 --- a/packages/font-glyphs/package.json +++ b/packages/font-glyphs/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/font-glyphs", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./lib/index.mjs", @@ -8,11 +8,11 @@ "./unicode-knowledge": "./lib/meta/unicode-knowledge.mjs" }, "dependencies": { - "@iosevka/font-kits": "31.3.0", - "@iosevka/geometry": "31.3.0", - "@iosevka/geometry-cache": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/util": "31.3.0", + "@iosevka/font-kits": "31.4.0", + "@iosevka/geometry": "31.4.0", + "@iosevka/geometry-cache": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/util": "31.4.0", "typo-geom": "^0.16.1" } } diff --git a/packages/font-glyphs/src/auto-build/transformed.ptl b/packages/font-glyphs/src/auto-build/transformed.ptl index f1fd7a990..2f9c9cda8 100644 --- a/packages/font-glyphs/src/auto-build/transformed.ptl +++ b/packages/font-glyphs/src/auto-build/transformed.ptl @@ -338,7 +338,6 @@ glyph-block Autobuild-Transformed : begin list 0x1E06C 'cyrl/yeryBack' list 0x1E06D 'cyrl/uShortKazakh' list 0x1FBCC 'smallBracketLeft' - list null 'S' # there is no superscript S in unicode, but is is used for the SM symbol createSuperscripts 'numerator' NumeratorForm : list list null 'zero.onum' diff --git a/packages/font-glyphs/src/common/shapes.ptl b/packages/font-glyphs/src/common/shapes.ptl index a8228fc33..fd2ac0271 100644 --- a/packages/font-glyphs/src/common/shapes.ptl +++ b/packages/font-glyphs/src/common/shapes.ptl @@ -2,7 +2,7 @@ $$include '../meta/macros.ptl' import [mix linreg clamp fallback boole boolePn] from "@iosevka/util" import [Transform] from "@iosevka/geometry/transform" -import [Interpolator WithKnotProxy] from "@iosevka/geometry/spiro-control" +import [FunctionInterpolator WithKnotProxy AfCombine] from "@iosevka/geometry/spiro-control" import [RadicalGeometry StrokeGeometry RemoveHolesGeometry] from "@iosevka/geometry" import [CMixCoord CopyBackKnotProxy] from "@iosevka/font-kits/derived-coordinates" @@ -133,7 +133,6 @@ glyph-block CommonShapes : begin local mx ((l + r) / 2) currentGlyph.gizmo = [if transformShiftOnly [Transform.Id] giz] include : dispiro - begin [lambda : set this.gizmo currentGlyph.gizmo] widths.rhs [fallback s Stroke] g4 mx d [heading Leftward] archv @@ -168,7 +167,6 @@ glyph-block CommonShapes : begin local mx ((l + r) / 2) currentGlyph.gizmo = [if transformShiftOnly [Transform.Id] giz] include : spiro-outline - begin [lambda : set this.gizmo currentGlyph.gizmo] g4 mx d archv 32 2.0 g4 l my @@ -463,22 +461,16 @@ glyph-block CommonShapes : begin local depth : v + skew0 * sw - sw local shallowLimit : sw / 2 local skew : clamp 0 (1 / 2) : skew0 + [clamp 0 shallowLimit (shallowLimit - depth)] / rad - local faf toFinish.af - if doSwash - : then : begin - set toFinish.af : lambda [] : begin - if faf : faf.apply this arguments - if this.headsTo : this.headsTo { - .x (Contrast / [Math.hypot 1 skew] * [if dtu (-1) 1]) - .y (skew / [Math.hypot 1 skew] * [if ltr 1 (-1)]) - } - : else : begin - set toFinish.af : lambda [] : begin - if faf : faf.apply this arguments - if this.headsTo : this.headsTo{ - .x (Contrast * [if dtu (-1) 1]) - .y 0 - } + + local headDirection : if doSwash + object + x (Contrast / [Math.hypot 1 skew] * [if dtu (-1) 1]) + y (skew / [Math.hypot 1 skew] * [if ltr 1 (-1)]) + object + x (Contrast * [if dtu (-1) 1]) + y 0 + + set toFinish.af : new AfCombine toFinish.af [heading headDirection] # Create the arc knots local segBefore {} @@ -487,14 +479,14 @@ glyph-block CommonShapes : begin local fraction : j / nHookSegments local mixRatioAdjust : Math.max (1 / 2) : (1 / 2) + [if doSwash 1 (1 / 8)] * (mixRatio - (1 / 2)) local fractionAfter : fraction * (1 - mixRatioAdjust) / mixRatioAdjust - local myfinal : _SuperXY ((1 - mixRatioAdjust) / mixRatioAdjust) superness + local myfinal : 1 - [archv.yFromX ((1 - mixRatioAdjust) / mixRatioAdjust) superness] segBefore.push : g4 mix mx toStraight.x fraction - mix y toStraight.y (1 - [_SuperXY fraction superness]) + mix y toStraight.y [archv.yFromX fraction superness] begin unimportant segAfter.push : g4 mix mx toFinish.x fraction - mix y toFinish.y ((1 - [_SuperXY fractionAfter superness]) / (1 - myfinal)) + mix y toFinish.y ([archv.yFromX fractionAfter superness] / (1 - myfinal)) begin unimportant if isStart @@ -525,7 +517,7 @@ glyph-block CommonShapes : begin local-parameter : noSwash -- false local-parameter : o -- O local args : object [yRef y] sw swTerminal isTail noSwash [overshoot o] - return : WithKnotProxy [hookProxy args] : Interpolator hookStartBlender args + return : WithKnotProxy [hookProxy args] : new FunctionInterpolator hookStartBlender args glyph-block-export hookend define flex-params [hookend] : begin @@ -536,7 +528,7 @@ glyph-block CommonShapes : begin local-parameter : noSwash -- false local-parameter : o -- O local args : object [yRef y] sw swTerminal isTail noSwash [overshoot o] - return : WithKnotProxy [hookProxy args] : Interpolator hookEndBlender args + return : WithKnotProxy [hookProxy args] : new FunctionInterpolator hookEndBlender args glyph-block-export arch define arch : namespace @@ -638,7 +630,8 @@ glyph-block CommonShapes : begin local-parameter : blendPre -- [if anglePre nothing [arcvh]] local-parameter : blendPost -- [if anglePost nothing [archv]] local args : object [lhs true] y p sw compact o swBefore swAfter mockPre mockPost blendPre blendPost anglePre anglePost - return : WithKnotProxy [archBlenderProxy args] : Interpolator archBlender args + return : WithKnotProxy [archBlenderProxy args] + new FunctionInterpolator archBlender args export : define flex-params [rhs] : begin local-parameter : y @@ -655,7 +648,8 @@ glyph-block CommonShapes : begin local-parameter : blendPre -- [if anglePre nothing [arcvh]] local-parameter : blendPost -- [if anglePost nothing [archv]] local args : object [lhs false] y p sw compact o swBefore swAfter mockPre mockPost blendPre blendPost anglePre anglePost - return : WithKnotProxy [archBlenderProxy args] : Interpolator archBlender args + return : WithKnotProxy [archBlenderProxy args] + new FunctionInterpolator archBlender args foreach side {lhs rhs} : begin set side.centerAt : object diff --git a/packages/font-glyphs/src/index.ptl b/packages/font-glyphs/src/index.ptl index 2582cee16..4cb9d4b83 100644 --- a/packages/font-glyphs/src/index.ptl +++ b/packages/font-glyphs/src/index.ptl @@ -1,6 +1,6 @@ import [Glyph GlyphProc ForkGlyphProc] from "@iosevka/glyph" import [GlyphStore] from "@iosevka/glyph/store" -import [GlyphBlock GlyphBuildExecutor] from "@iosevka/glyph/block" +import [GlyphBlock GlyphBuildExecutor GlyphSaveSink] from "@iosevka/glyph/block" import as Gr from "@iosevka/glyph/relation" import as SpiroKit from "@iosevka/font-kits/spiro-kit" import as BooleKit from "@iosevka/font-kits/boole-kit" @@ -15,7 +15,6 @@ $$include './meta/macros.ptl' export : define [buildGlyphs para recursive] : begin # Execution and dependency management local $Exec$ : new GlyphBuildExecutor recursive - define [glyph-is-needed name] : [not recursive] || [recursive.glyphIsNeeded name] # Initialize glyph store local glyphStore : new GlyphStore @@ -32,45 +31,8 @@ export : define [buildGlyphs para recursive] : begin # Anchor parameters define {AS_BASE ALSO_METRICS} {'AS-BASE' 'ALSO-METRICS'} - # The callback used to create and save glyphs - define [$createAndSaveGlyphImpl$ _1 _2 actions] : begin - local saveGlyphName null - local unicode null - - piecewise - ([typeof _1] === 'number' && _1) : begin - set saveGlyphName : 'uni' + [_1.toString 16 :.padStart 4 '0' :.toUpperCase] - set unicode _1 - ([typeof _1] === 'string' && _1) : begin - set saveGlyphName _1 - set unicode _2 - true : begin - set saveGlyphName null - set unicode null - - if (saveGlyphName && [not : glyph-is-needed saveGlyphName]) : return nothing - if para.verbose : console.log saveGlyphName - - local glyphObject [new Glyph saveGlyphName] - glyphObject.setWidth Metrics.Width - glyphObject.gizmo = Metrics.GlobalTransform - glyphObject._m_dependencyManager = $Exec$.dependencyManager - - glyphObject.include actions true true - - $Exec$.setGlyphToBlockDependency glyphObject - - if saveGlyphName : begin - if (saveGlyphName.0 != '.' && [glyphStore.queryByName saveGlyphName]) - throw : new Error "Glyph \(saveGlyphName) already exists" - glyphStore.addGlyph saveGlyphName glyphObject - if unicode : begin - local u unicode - if ([typeof unicode] === "string") : begin - set u [unicode.codePointAt 0] - glyphStore.encodeGlyph u glyphObject - - return glyphObject + # Glyph saving sink + define $GlyphSaveSink$ : new GlyphSaveSink $Exec$ Metrics glyphStore # Spiro kit and boole kit define SpiroFns : SpiroKit.SetupBuilders : object @@ -86,9 +48,9 @@ export : define [buildGlyphs para recursive] : begin # Setup the capture define $$Capture$$ : object - $createAndSaveGlyphImpl$ $NamedParameterPair$ $Exec$ + $GlyphSaveSink$ Metrics : Object.assign {.} Metrics para recursive @@ -100,7 +62,6 @@ export : define [buildGlyphs para recursive] : begin MarkSet AS_BASE ALSO_METRICS - glyph-is-needed buildGlyphs fontMetrics GlyphProc @@ -148,8 +109,4 @@ export : define [buildGlyphs para recursive] : begin $Exec$.executePendingBlocks - Gr.linkSuffixPairGr glyphStore 'NWID' 'WWID' Gr.Nwid Gr.Wwid - Gr.linkSuffixPairGr glyphStore 'lnum' 'onum' Gr.Lnum Gr.Onum - Gr.linkSuffixGr glyphStore 'aplForm' Gr.AplForm - return : object glyphStore fontMetrics diff --git a/packages/font-glyphs/src/letter-like/fraktur/common.ptl b/packages/font-glyphs/src/letter-like/fraktur/common.ptl index 456b4d918..b1e2bb24f 100644 --- a/packages/font-glyphs/src/letter-like/fraktur/common.ptl +++ b/packages/font-glyphs/src/letter-like/fraktur/common.ptl @@ -4,7 +4,7 @@ import [mix fallback] from "@iosevka/util" import [SpiroPenGeometry] from "@iosevka/geometry" import [Vec2] from "@iosevka/geometry/point" import [Box] from "@iosevka/geometry/box" -import [Interpolator] from "@iosevka/geometry/spiro-control" +import [AfBase FunctionInterpolator] from "@iosevka/geometry/spiro-control" import [PenKnotCollector] from "@iosevka/geometry/spiro-pen-expand" glyph-module @@ -61,8 +61,13 @@ glyph-block LetterLike-Fraktur-Common : begin # Directive to change the profile glyph-block-export change-pen - define [change-pen newPen] : function : begin - this.setProfile : newPen.getPenShape this.gizmo + define [change-pen newPen] : new AfChangePen newPen + + class AfChangePen : inherits AfBase + public [new newPen] : begin + this.newPen = newPen + public [applyTo target] : begin + target.setProfile : this.newPen.getPenShape target.gizmo # A pen profile describes a virtual flat-tip pen. We use a 45-degree arrangement to # simplify the math. @@ -152,26 +157,26 @@ glyph-block LetterLike-Fraktur-Common : begin export : define DepthX : 1 * DecoSizeX export : define LTDecoSize : 0.75 * DecoSizeX - export : define [h o] : Interpolator hBlender [object o] + export : define [h o] : new FunctionInterpolator hBlender [object o] define [hBlender before after args] : begin return : list g2 [mix before.x after.x 0.375] (after.y + [fallback args.o 0]) g2 [mix before.x after.x 0.625] (before.y - [fallback args.o 0]) - export : define [vc waveDepth] : Interpolator vcBlender [object waveDepth] + export : define [vc waveDepth] : new FunctionInterpolator vcBlender [object waveDepth] define [vcBlender before after args] : begin local [object waveDepth] args return : list g2 (before.x + 0.5 * waveDepth) [mix before.y after.y 0.375] g2 (after.x - 0.5 * waveDepth) [mix before.y after.y 0.625] - export : define [v] : Interpolator vBlender + export : define [v] : new FunctionInterpolator vBlender define [vBlender before after] : begin return : list g2 after.x [mix before.y after.y 0.375] g2 before.x [mix before.y after.y 0.625] - export : define [vDistAfter d] : Interpolator vDistAfterBlender [object d] + export : define [vDistAfter d] : new FunctionInterpolator vDistAfterBlender [object d] define [vDistAfterBlender before after args] : begin return : list g2 after.x [mix before.y after.y 0.375] diff --git a/packages/font-glyphs/src/letter/cyrillic/iotified-a.ptl b/packages/font-glyphs/src/letter/cyrillic/iotified-a.ptl index 7f17a4bb2..75fc815cc 100644 --- a/packages/font-glyphs/src/letter/cyrillic/iotified-a.ptl +++ b/packages/font-glyphs/src/letter/cyrillic/iotified-a.ptl @@ -101,14 +101,14 @@ glyph-block Letter-Cyrillic-Iotified-A : begin swSerif -- swSerif do "iotified A" - glyph-block-import Letter-Latin-Upper-A : AMaskShape ALetterShape AConfig + glyph-block-import Letter-Latin-Upper-A : AShape AConfig foreach { suffix { fStraightBar slabKind } } [Object.entries AConfig] : do create-glyph "cyrl/AIotified.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3.5 include : df.markSet.capital - local gap : (df.width - 2 * df.leftSB - 4 * df.mvs) / 3 + local gap : (df.width - 2 * df.leftSB - 3 * df.mvs) / 3 local divSub : (df.width - gap - df.mvs) / Width local subDf : DivFrame divSub 2 (df.leftSB / SB) df.mvs 0 @@ -117,14 +117,14 @@ glyph-block Letter-Cyrillic-Iotified-A : begin local botGap : Math.max ((df.rightSB - df.leftSB) * 0.08) [AdviceStroke 6] include : difference with-transform [ApparentTranslate shift 0] - ALetterShape subDf fStraightBar slabKind CAP df.mvs + AShape.Letter subDf fStraightBar slabKind CAP df.mvs intersection [MaskBelow df.mvs] MaskLeft : mix xIotifiedBarRight [Math.min (subDf.leftSB + shift) (xIotifiedBarRight + botGap)] 0.5 include : difference Iotified.A df CAP [mix df.leftSB df.rightSB (3 / 4)] (CAP / 2) (fCapital -- true) with-transform [ApparentTranslate shift 0] - AMaskShape subDf fStraightBar CAP df.mvs + AShape.Mask subDf fStraightBar CAP df.mvs do "iotified a" glyph-block-import Letter-Latin-Lower-A : DoubleStorey DoubleStoreyConfig SingleStorey SingleStoreyConfig diff --git a/packages/font-glyphs/src/letter/cyrillic/small-yus.ptl b/packages/font-glyphs/src/letter/cyrillic/small-yus.ptl index 2936b9675..ea2238605 100644 --- a/packages/font-glyphs/src/letter/cyrillic/small-yus.ptl +++ b/packages/font-glyphs/src/letter/cyrillic/small-yus.ptl @@ -8,7 +8,8 @@ glyph-block Letter-Cyrillic-SmallYus : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives glyph-block-import Letter-Shared-Shapes : SerifFrame - glyph-block-import Letter-Latin-Upper-A : LambdaShape DeltaShape AMaskShape + glyph-block-import Letter-Latin-Upper-A : AShape + glyph-block-import Letter-Latin-Upper-Lambda-Delta : LambdaShape DeltaShape glyph-block-import Letter-Cyrillic-Iotified-A : Iotified define [CyrSmallYusShape df top straightBar _fine] : glyph-proc @@ -16,12 +17,12 @@ glyph-block Letter-Cyrillic-SmallYus : begin include : LambdaShape df -- df fBarStraight -- straightBar + slabKind -- 0 top -- top sw -- fine - slabKind -- 0 include : intersection HBar.t df.leftSB df.rightSB (top / 2) fine - AMaskShape df straightBar top fine + AShape.Mask df [if straightBar 1 0] top fine include : VBar.m df.middle (top / 2) 0 fine if SLAB : begin @@ -41,7 +42,7 @@ glyph-block Letter-Cyrillic-SmallYus : begin slab -- false include : intersection HBar.t df.leftSB df.rightSB (top / 2) fine - AMaskShape df straightBar top fine + AShape.Mask df [if straightBar 1 0] top fine if SLAB : begin local sf : SerifFrame.fromDf df top 0 (swSerif -- fine) diff --git a/packages/font-glyphs/src/letter/greek.ptl b/packages/font-glyphs/src/letter/greek.ptl index 685c2f721..0db330b93 100644 --- a/packages/font-glyphs/src/letter/greek.ptl +++ b/packages/font-glyphs/src/letter/greek.ptl @@ -4,6 +4,7 @@ export : define [apply] : begin define $$Capture$$ this run-glyph-module "./greek/upper-gamma.mjs" run-glyph-module "./greek/upper-theta.mjs" + run-glyph-module "./greek/upper-lambda-delta.mjs" run-glyph-module "./greek/upper-xi.mjs" run-glyph-module "./greek/pi.mjs" run-glyph-module "./greek/upper-sigma.mjs" diff --git a/packages/font-glyphs/src/letter/greek/upper-lambda-delta.ptl b/packages/font-glyphs/src/letter/greek/upper-lambda-delta.ptl new file mode 100644 index 000000000..db9467201 --- /dev/null +++ b/packages/font-glyphs/src/letter/greek/upper-lambda-delta.ptl @@ -0,0 +1,152 @@ +$$include '../../meta/macros.ptl' + +import [mix fallback SuffixCfg] from "@iosevka/util" +import [MathSansSerif] from "@iosevka/glyph/relation" +import [bitOr] from "@iosevka/util/mask-bit" + +glyph-module + +glyph-block Letter-Latin-Upper-Lambda-Delta : begin + glyph-block-import CommonShapes + glyph-block-import Common-Derivatives + glyph-block-import Letter-Shared : CreateTurnedLetter + glyph-block-import Letter-Latin-Upper-A : AShape ASerifs + glyph-block-import Letter-Latin-V : VShapeOutline VShape + + define SLAB-NONE 0 + define SLAB-TOP 1 + define SLAB-LEFT 2 + define SLAB-RIGHT 4 + define SLAB-CYRL-BGR 8 + + define LambeaConfig : SuffixCfg.weave + object + straight true + curly false + + object + serifless SLAB-NONE + topSerifed SLAB-TOP + baseSerifed [bitOr SLAB-LEFT SLAB-RIGHT] + triSerifed [bitOr SLAB-TOP SLAB-LEFT SLAB-RIGHT] + + glyph-block-export LambdaShape + define [LambdaShape] : with-params [df fBarStraight slabKind top sw] : glyph-proc + include : VShape df fBarStraight top sw + include : FlipAround df.middle (top / 2) + include : ASerifs df top sw slabKind + + define [LambdaMask] : with-params [df fBarStraight top sw] : glyph-proc + include : VShapeOutline df fBarStraight top sw + include : FlipAround df.middle (top / 2) + + foreach { suffix { fStraightBar slabKind } } [Object.entries LambeaConfig] : do + create-glyph "grek/Lambda.\(suffix)" : glyph-proc + include : MarkSet.capital + include : LambdaShape + df -- [DivFrame 1] + fBarStraight -- fStraightBar + slabKind -- slabKind + top -- CAP + sw -- Stroke + + create-glyph "grek/smcpLambda.\(suffix)" : glyph-proc + include : MarkSet.e + include : LambdaShape + df -- [DivFrame 1] + fBarStraight -- fStraightBar + slabKind -- slabKind + top -- XH + sw -- Stroke + + create-glyph "cyrl/el.BGR.\(suffix)" : glyph-proc + include : MarkSet.e + include : LambdaShape + df -- [DivFrame 1] + fBarStraight -- fStraightBar + slabKind -- [bitOr slabKind SLAB-CYRL-BGR] + top -- XH + sw -- Stroke + + select-variant 'grek/Lambda' 0x39B + link-reduced-variant 'grek/Lambda/sansSerif' 'grek/Lambda' MathSansSerif + select-variant 'grek/smcpLambda' 0x1D27 (follow -- 'grek/Lambda') + + alias 'cyrl/El.BGR' null 'grek/Lambda' + select-variant 'cyrl/el.BGR' (follow -- 'grek/Lambda') + + # Delta + glyph-block-export DeltaShape + define [DeltaShape] : with-params [df top sw fBarStraight] : union + LambdaShape + df -- df + fBarStraight -- fBarStraight + slabKind -- 0 + top -- top + sw -- sw + intersection + HBar.b 0 df.width 0 sw + LambdaMask df fBarStraight top sw + + define DeltaConfig : object + straight true + curly false + + foreach { suffix fBarStraight } [pairs-of DeltaConfig] : do + create-glyph "grek/Delta.\(suffix)" : glyph-proc + include : MarkSet.capital + include : DeltaShape + df -- [DivFrame 1] + fBarStraight -- fBarStraight + top -- CAP + sw -- Stroke + + create-glyph "increment.\(suffix)" : glyph-proc + include : MarkSet.capital + include : DeltaShape + df -- [DivFrame 1] + fBarStraight -- fBarStraight + top -- CAP + sw -- OperatorStroke + + create-glyph "increment.aplForm.\(suffix)" : glyph-proc + include : MarkSet.oper + define shapeHeight : OperTop - OperBot + include : DeltaShape + df -- [DivFrame 1] + fBarStraight -- fBarStraight + top -- shapeHeight + sw -- OperatorStroke + include : ApparentTranslate 0 (SymbolMid - shapeHeight / 2) + + create-glyph "increment.aplThin.\(suffix)" : glyph-proc + include : MarkSet.oper + define shapeHeight : OperTop - OperBot + include : DeltaShape + df -- [DivFrame 1] + fBarStraight -- fBarStraight + top -- shapeHeight + sw -- [AdviceStroke 3.75] + include : ApparentTranslate 0 (SymbolMid - shapeHeight / 2) + + define [CodeNonApl u] : if (para.variantSelector.__enableAplForm === 'enable') null u + define [CodeApl u] : if (para.variantSelector.__enableAplForm === 'enable') u null + + select-variant 'grek/Delta' 0x394 + select-variant 'increment' [CodeNonApl 0x2206] (follow -- 'grek/Delta') + select-variant 'increment.aplForm' [CodeApl 0x2206] (follow -- 'grek/Delta') + select-variant 'increment.aplThin' (follow -- 'grek/Delta') + + CreateTurnedLetter 'nabla' [CodeNonApl 0x2207] 'increment' HalfAdvance (CAP / 2) + CreateTurnedLetter 'nabla.aplForm' [CodeApl 0x2207] 'increment.aplForm' HalfAdvance SymbolMid + CreateTurnedLetter 'nabla.aplThin' null 'increment.aplThin' HalfAdvance SymbolMid + + derive-glyphs 'cyrl/De.BGR' null 'grek/Delta' : function [src gr] : glyph-proc + include [refer-glyph src] AS_BASE ALSO_METRICS + local descenderOverflow : if SLAB SideJut ((RightSB - SB) * 0.075) + local xCutLeft SB + local xCutRight RightSB + include : HBar.b (xCutLeft - descenderOverflow) (xCutRight + descenderOverflow) 0 + include : VBar.l (xCutLeft - descenderOverflow) (-LongJut + HalfStroke) Stroke + include : VBar.r (xCutRight + descenderOverflow) (-LongJut + HalfStroke) Stroke + diff --git a/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl b/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl index 2b7334cc9..ffe4b407f 100644 --- a/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/upper-aa-ao.ptl @@ -12,18 +12,17 @@ glyph-block Letter-Latin-Upper-AA-AO : begin glyph-block-import Letter-Latin-Lower-M : MEnoughSpaceForFullSerifs dfM do "A glyphs" - glyph-block-import Letter-Latin-Upper-A : AConfig AMaskShape ALetterShape - glyph-block-import Letter-Latin-Upper-A : ABottomRightRemoved ABarPosition + glyph-block-import Letter-Latin-Upper-A : AShape AConfig define [AHalfShape pShift df top fStraightBar slabKind] : begin local { subDf shift } : SubDfAndShift pShift df return : with-transform [ApparentTranslate shift 0] - ALetterShape subDf fStraightBar slabKind top df.mvs + AShape.Letter subDf fStraightBar slabKind top df.mvs define [AHalfShapeMask pShift df top fStraightBar slabKind] : begin local { subDf shift } : SubDfAndShift pShift df return : with-transform [ApparentTranslate shift 0] - AMaskShape subDf fStraightBar top df.mvs + AShape.Mask subDf fStraightBar top df.mvs define SLAB-NONE 0 define SLAB-TOP 1 @@ -35,7 +34,7 @@ glyph-block Letter-Latin-Upper-AA-AO : begin smcpAA { null 'e' XH } foreach { prefix { code mk height } } [Object.entries ALetters] : do - foreach { suffix { fStraightBar slabKind } } [Object.entries AConfig] : do + foreach { suffix { bodyShape slabKind } } [Object.entries AConfig] : do define skLeft : maskOffBits slabKind SLAB-RIGHT define skRight : maskOffBits slabKind SLAB-LEFT @@ -43,39 +42,39 @@ glyph-block Letter-Latin-Upper-AA-AO : begin define df : include : DivFrame para.diversityM 3.5 include : df.markSet.(mk) set-base-anchor 'cvDecompose' 0 0 - include : AHalfShape 0 df height fStraightBar skLeft + include : AHalfShape 0 df height bodyShape skLeft create-glyph "\(prefix)/LeftMask.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3.5 include : df.markSet.(mk) set-base-anchor 'cvDecompose' 0 0 - include : AHalfShapeMask 0 df height fStraightBar skLeft + include : AHalfShapeMask 0 df height bodyShape skLeft create-glyph "\(prefix)/Right.\(suffix)" : glyph-proc define df : DivFrame para.diversityM 3.5 set-width 0 include : df.markSet.(mk) set-mark-anchor 'cvDecompose' 0 0 0 0 - include : AHalfShape 1 df height fStraightBar skRight + include : AHalfShape 1 df height bodyShape skRight create-glyph "\(prefix)/RightMask.\(suffix)" : glyph-proc define df : DivFrame para.diversityM 3.5 set-width 0 include : df.markSet.(mk) set-mark-anchor 'cvDecompose' 0 0 0 0 - include : AHalfShapeMask 1 df height fStraightBar skRight + include : AHalfShapeMask 1 df height bodyShape skRight create-glyph "\(prefix)/AU/Left.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3.5 local { subDf shift } : SubDfAndShift 1 df - include : ABottomRightRemoved subDf fStraightBar slabKind CAP df.mvs + include : AShape.LetterBottomRightRemoved subDf bodyShape slabKind CAP df.mvs create-glyph "\(prefix)/AU/LeftMask.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3.5 local { subDf shift } : SubDfAndShift 1 df include : union - MaskAbove : [ABarPosition slabKind CAP] - df.mvs + MaskAbove : [AShape.BarPos bodyShape slabKind CAP] - df.mvs MaskLeft : subDf.width / 2 - include : ABottomRightRemoved subDf fStraightBar slabKind CAP df.mvs + include : AShape.LetterBottomRightRemoved subDf bodyShape slabKind CAP df.mvs select-variant "\(prefix)/Left" (follow -- 'A') select-variant "\(prefix)/LeftMask" (follow -- 'A') diff --git a/packages/font-glyphs/src/letter/latin-ext/upper-ae-oe.ptl b/packages/font-glyphs/src/letter/latin-ext/upper-ae-oe.ptl index 1f6461d09..3c99b8b1c 100644 --- a/packages/font-glyphs/src/letter/latin-ext/upper-ae-oe.ptl +++ b/packages/font-glyphs/src/letter/latin-ext/upper-ae-oe.ptl @@ -72,6 +72,15 @@ glyph-block Letter-Latin-Upper-AE-OE : begin corner eleft top corner eleft 0 + define [AEAHalfRoundTop df top eleft sw] : glyph-proc + include : HBar.t df.leftSB eleft (XH * 0.75 / CAP * top) sw + include : dispiro + widths.rhs sw + flat df.leftSB 0 [heading Upward] + curl pre@ (post@ <-> ArchDepthA) + arcvh + straight.right.end eleft top [heading Rightward] + define [AEAHalfSerifs df top slabKind] : glyph-proc define sw : Math.min df.mvs : AdviceStroke2 3 3 top df.div define eleft : df.middle - [HSwToV : 0.25 * sw] @@ -84,12 +93,13 @@ glyph-block Letter-Latin-Upper-AE-OE : begin [Just SLAB-A-TOP] : begin include : HSerif.lt df.middle top [mix MidJutSide LongJut 0.5] - define [AEAHalf df top straight slabKind] : glyph-proc + define [AEAHalf df bodyShape top slabKind] : glyph-proc define sw : AESW df top define eleft : df.middle - [HSwToV : 0.25 * sw] - include : if straight - AEAHalfStraight df top eleft sw - AEAHalfCurly df top eleft sw + include : match bodyShape + [Just 0] : AEAHalfCurly df top eleft sw + [Just 1] : AEAHalfStraight df top eleft sw + [Just 2] : AEAHalfRoundTop df top eleft sw include : AEAHalfSerifs df top slabKind define [AEEHalf df top slabKind] : glyph-proc @@ -100,7 +110,7 @@ glyph-block Letter-Latin-Upper-AE-OE : begin local xMidRight : df.rightSB - sw / 4 local yBar : top * eBarPos - local { jutTop jutBot } : EFVJutLength top eBarPos sw + local { jutTop jutBot jutMid } : EFVJutLength top eBarPos sw # E half include : VBar.l eleft 0 top sw @@ -115,7 +125,7 @@ glyph-block Letter-Latin-Upper-AE-OE : begin match slabKind [Just SLAB-E-CAPPED] : begin local fine : swVJut * [AdviceStroke 3.5] / Stroke - include : VBar.r xMidRight (yBar - 0.5 * jutBot) (yBar + 0.5 * jutBot) fine + include : VBar.r xMidRight (yBar - jutMid) (yBar + jutMid) fine do "P/Ya Half" glyph-block-import Letter-Latin-Upper-P : PShape PBarPosY @@ -139,31 +149,33 @@ glyph-block Letter-Latin-Upper-AE-OE : begin eject-contour 'serifRT' define AConfig : object - straightSerifless { true SLAB-A-NONE } - curlySerifless { false SLAB-A-NONE } - straightTopSerifed { true SLAB-A-TOP } - curlyTopSerifed { false SLAB-A-TOP } - straightBaseSerifed { true SLAB-A-BASE } - curlyBaseSerifed { false SLAB-A-BASE } - straightTriSerifed { true SLAB-A-TRI } - curlyTriSerifed { false SLAB-A-TRI } + straightSerifless { 1 SLAB-A-NONE } + curlySerifless { 0 SLAB-A-NONE } + roundTopSerifless { 2 SLAB-A-NONE } + straightTopSerifed { 1 SLAB-A-TOP } + curlyTopSerifed { 0 SLAB-A-TOP } + straightBaseSerifed { 1 SLAB-A-BASE } + curlyBaseSerifed { 0 SLAB-A-BASE } + roundTopBaseSerifed { 2 SLAB-A-BASE } + straightTriSerifed { 1 SLAB-A-TRI } + curlyTriSerifed { 0 SLAB-A-TRI } define EConfig : object serifless { SLAB-E-NONE } serifed { SLAB-E-ALL } serifedCapped { SLAB-E-CAPPED } - foreach { suffix { fStraightBar slabKind } } [Object.entries AConfig] : do + foreach { suffix { bodyShape slabKind } } [Object.entries AConfig] : do create-glyph "AE/AHalf.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3 include : df.markSet.capital set-base-anchor 'cvDecompose' 0 0 - include : AEAHalf df CAP fStraightBar slabKind + include : AEAHalf df bodyShape CAP slabKind create-glyph "smcpAE/AHalf.\(suffix)" : glyph-proc define df : include : DivFrame para.diversityM 3 include : df.markSet.e set-base-anchor 'cvDecompose' 0 0 - include : AEAHalf df XH fStraightBar slabKind + include : AEAHalf df bodyShape XH slabKind foreach { suffix { slabKind } } [Object.entries EConfig] : do create-glyph "AE/EHalf.\(suffix)" : glyph-proc @@ -196,7 +208,7 @@ glyph-block Letter-Latin-Upper-AE-OE : begin local xMidRight : df.rightSB - sw / 4 local yBar : top * eBarPos - local { jutTop jutBot } : EFVJutLength top eBarPos sw + local { jutTop jutBot jutMid } : EFVJutLength top eBarPos sw # O half include : dispiro @@ -221,7 +233,7 @@ glyph-block Letter-Latin-Upper-AE-OE : begin match slabKind [Just SLAB-E-CAPPED] : begin local fine : swVJut * [AdviceStroke 3.5] / Stroke - include : VBar.r xMidRight (yBar - 0.5 * jutBot) (yBar + 0.5 * jutBot) fine + include : VBar.r xMidRight (yBar - jutMid) (yBar + jutMid) fine foreach { suffix { slabKind } } [Object.entries EConfig] : do create-glyph "OE.\(suffix)" : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/c.ptl b/packages/font-glyphs/src/letter/latin/c.ptl index 10624b79b..242d409e3 100644 --- a/packages/font-glyphs/src/letter/latin/c.ptl +++ b/packages/font-glyphs/src/letter/latin/c.ptl @@ -1,6 +1,6 @@ $$include '../../meta/macros.ptl' -import [mix linreg clamp fallback] from "@iosevka/util" +import [mix linreg clamp fallback SuffixCfg] from "@iosevka/util" import [DependentSelector MathSansSerif] from "@iosevka/glyph/relation" glyph-module @@ -371,51 +371,61 @@ glyph-block Letter-Latin-C : begin CShapeT spiro-outline 0.1 [DivFrame 1] SLAB-NONE SLAB-NONE XH 0 SmallArchDepthA SmallArchDepthB Hook BBS VBar.l (SB + BBD + OX) 0 CAP BBS - define CentBarConfig : object - open { (Descender / 2) (XH - Descender / 2) 0 "std" } - through { (Descender / 2) (XH - Descender / 2) 1 "std" } - interrupted { (Descender / 2) (XH - Descender / 2) 2 "std" } - openCap { 0 CAP 0 "cap" } - throughCap { 0 CAP 1 "cap" } - interruptedCap { 0 CAP 2 "cap" } + define CentConfig : SuffixCfg.weave + object # slope + "" 0 + "slanted" 0.08 + object # body + open 0 + through 1 + interrupted 2 + object # height + "" { 0 XH (Descender / 2) (XH - Descender / 2) "std" } + "cap" { (CAP / 2 - XH / 2) (CAP / 2 + XH / 2) 0 CAP "cap" } + + foreach { suffix { sl fillType { bMask tMask bot top selector }}} [pairs-of CentConfig] : do + define [xBot df] : mix df.leftSB df.rightSB (0.5 - sl) + define [xTop df] : mix df.leftSB df.rightSB (0.5 + sl) + + define swBarThick : AdviceStroke 3 + define swBarFine : AdviceStroke [StrokeWidthBlend 3 5.5] + + define [FullBar df sw] : dispiro + flat [xBot df] bot [widths.center.heading sw Downward] + curl [xTop df] top [widths.center.heading sw Downward] + + define [InterruptBar df] : begin + local cofine : AdviceStroke 4 + return : union + dispiro + flat [xTop df] top [widths.center.heading cofine Downward] + curl df.middle [mix top bot 0.5] [widths.center.heading swBarFine Downward] + dispiro + flat [xBot df] bot [widths.center.heading cofine Upward] + curl df.middle [mix bot top 0.5] [widths.center.heading swBarFine Upward] + + define [OutlineMask df] : spiro-outline + curl (df.leftSB + 0.5 * Stroke) (post@ <-> SmallArchDepthA) + arch.rhs (sw -- Stroke) (tMask - 0.5 * Stroke) + flat (df.rightSB - 0.5 * Stroke) (pre@ <-> SmallArchDepthB) + curl pre@ (post@ <+> SmallArchDepthA) + arch.rhs (sw -- Stroke) (bMask + 0.5 * Stroke) + flat post@ (pre@ <+> SmallArchDepthB) + + define [InterruptMask df] : begin + define gap : Math.max (XH / 8) [AdviceStroke2 6 6 XH] + return : HBar.m 0 df.width [mix bot top 0.5] gap - foreach { suffix { bot top fillType selector } } [Object.entries CentBarConfig] : do create-glyph "cent/bar.\(suffix)" : glyph-proc - define w : AdviceStroke 3 - define fine : AdviceStroke [StrokeWidthBlend 3 5.5] - - local yMid : mix bot top 0.5 - local fillBottom : yMid - XH / 2 + HalfStroke - local fillTop : yMid + XH / 2 - HalfStroke - - set-base-anchor 'cvDecompose' Middle yMid - - # Draw the outside subbars - include : dispiro - flat Middle fillTop [widths.center w] - curl Middle top [heading Upward] - include : dispiro - flat Middle fillBottom [widths.center w] - curl Middle bot [heading Downward] - - include : match fillType - [Just 1] : VBar.m Middle fillBottom fillTop fine - [Just 2] : begin - define cofine : AdviceStroke 4 - define gap : Math.max (XH / 8) [AdviceStroke2 6 6 XH] - - union - dispiro - flat Middle fillTop [widths.center.heading cofine Downward] - curl Middle (yMid + gap / 2) [widths.center.heading fine Downward] - dispiro - flat Middle fillBottom [widths.center.heading cofine Upward] - curl Middle (yMid - gap / 2) [widths.center.heading fine Upward] - - __ : no-shape - + local df : include : DivFrame 1 + set-base-anchor 'cvDecompose' df.middle [mix bot top 0.5] DependentSelector.set currentGlyph selector + include : difference [FullBar df swBarThick] [OutlineMask df] + if (fillType === 1) : include : intersection [FullBar df swBarFine] [OutlineMask df] + if (fillType === 2) : include : intersection [InterruptBar df] + difference [OutlineMask df] [InterruptMask df] + select-variant 'cent/bar' (follow -- 'cent') CreateDependentComposite 'cent/centSign' 0xA2 "cent/bar" : object diff --git a/packages/font-glyphs/src/letter/latin/lower-e.ptl b/packages/font-glyphs/src/letter/latin/lower-e.ptl index 12bfc8c3c..37aceddde 100644 --- a/packages/font-glyphs/src/letter/latin/lower-e.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-e.ptl @@ -166,7 +166,7 @@ glyph-block Letter-Latin-Lower-E : begin dispiro g4 lastKnot.x lastKnot.y [widths.rhs fine] g4 (lastKnot.x - beginCoSlope * TINY) (lastKnot.y - TINY) - alsoThruThem.fromTWithOffset {(1/3) (2/3)} : object + alsoThruThem.computed { (1/3) (2/3) } : object rx : function [rt] rt deltaX : function [rt] 0 ry : function [rt] : 1/24 + rt + (1/2 - rt) * (3/8) diff --git a/packages/font-glyphs/src/letter/latin/lower-g.ptl b/packages/font-glyphs/src/letter/latin/lower-g.ptl index 28bc54238..8b5c1a90a 100644 --- a/packages/font-glyphs/src/letter/latin/lower-g.ptl +++ b/packages/font-glyphs/src/letter/latin/lower-g.ptl @@ -51,7 +51,7 @@ glyph-block Letter-Latin-Lower-G : begin set-base-anchor 'overlay' Middle [mix (Descender + O) groundy 0.5] set-base-anchor 'strike' Middle (XH / 2) - create-forked-glyph 'gBar.doubleStorey' : OverlayW obwDoubleStorey + derive-composites "gBar.doubleStorey" null "g.doubleStorey" [OverlayW obwDoubleStorey] create-glyph 'g.openDoubleStorey' : glyph-proc include : MarkSet.p @@ -81,7 +81,7 @@ glyph-block Letter-Latin-Lower-G : begin set-base-anchor 'overlay' Middle [mix (Descender + O) groundy 0.5] set-base-anchor 'strike' Middle (XH / 2) - create-forked-glyph 'gBar.openDoubleStorey' : OverlayW obwDoubleStorey + derive-composites "gBar.openDoubleStorey" null "g.openDoubleStorey" [OverlayW obwDoubleStorey] define SingleStorey : namespace export : define [RoundHookT sink df yTop offset sw] : sink diff --git a/packages/font-glyphs/src/letter/latin/s.ptl b/packages/font-glyphs/src/letter/latin/s.ptl index 8769264ac..9374b5669 100644 --- a/packages/font-glyphs/src/letter/latin/s.ptl +++ b/packages/font-glyphs/src/letter/latin/s.ptl @@ -1,6 +1,6 @@ $$include '../../meta/macros.ptl' -import [mix linreg clamp fallback] from "@iosevka/util" +import [mix linreg clamp fallback SuffixCfg] from "@iosevka/util" import [DependentSelector MathSansSerif] from "@iosevka/glyph/relation" glyph-module @@ -461,53 +461,72 @@ glyph-block Letter-Latin-S : begin .y ([if (sign < 0) 0.25 0.375] * sign * BBD * [Math.cos theta]) } + define DollarConfig : SuffixCfg.weave + object # slope + "" 0 + "slanted" 0.08 + object # body + open 0 + through 1 + interrupted 2 + object # height + "" { 0.05 0.95 (Descender / 2) "std" } + "cap" { 0.12 0.88 0 "cap" } + foreach { suffix { sl fillType { kBot kTop overflow selector } } } [pairs-of DollarConfig] : do + define [xBot df] : mix df.leftSB df.rightSB (0.5 - sl) + define [xTop df] : mix df.leftSB df.rightSB (0.5 + sl) + define bot : CAP * kBot + define top : CAP * kTop - define DollarConfig : object - open { 0.95 0.05 (Descender / 2) 0 "std" } - through { 0.95 0.05 (Descender / 2) 1 "std" } - interrupted { 0.95 0.05 (Descender / 2) 2 "std" } - openCap { 0.88 0.12 0 0 "cap" } - throughCap { 0.88 0.12 0 1 "cap" } - interruptedCap { 0.88 0.12 0 2 "cap" } + define swBarThick : AdviceStroke 3 + define swBarFine : AdviceStroke [StrokeWidthBlend 3 5.5] + + define [FullBar df sw] : dispiro + flat [xBot df] (0 + overflow) [widths.center.heading sw Downward] + curl [xTop df] (CAP - overflow) [widths.center.heading sw Downward] + + define [InterruptBar df] : begin + local cofine : AdviceStroke 4 + return : union + dispiro + flat [xTop df] (CAP - overflow) [widths.center.heading cofine Downward] + curl df.middle [mix top bot 0.5] [widths.center.heading swBarFine Downward] + dispiro + flat [xBot df] (0 + overflow) [widths.center.heading cofine Upward] + curl df.middle [mix bot top 0.5] [widths.center.heading swBarFine Upward] + + define [DollarMask df stroke] : begin + define archDepthA : AdviceSArchDepth (top - bot) (-1) stroke + define archDepthB : AdviceSArchDepth (top - bot) (+1) stroke + return : spiro-outline + curl (df.leftSB + 0.5 * stroke) (post@ <-> archDepthA) + arch.rhs (sw -- stroke) (top - 0.5 * stroke) + flat (df.rightSB - 0.5 * stroke) (pre@ <-> archDepthB) + curl pre@ (post@ <+> archDepthA) + arch.rhs (sw -- stroke) (bot + 0.5 * stroke) + flat post@ (pre@ <+> archDepthB) + + define [InterruptMask df] : begin + local gap : (swBarThick / Stroke * EssUpper) + [Math.max ((top - bot) / 6) [AdviceStroke2 3 3 (top - bot)]] + local yMid : mix bot top 0.5 + local yTermLeft : mix yMid (top - [AdviceSArchDepth (top - bot) (-1) swBarThick]) 0.5 + local yTermRight : mix yMid (bot + [AdviceSArchDepth (top - bot) (-1) swBarThick]) 0.5 + + return : dispiro [corner 0 yTermLeft : widths.center gap] [corner Width yTermRight] - foreach { suffix { kTop kBot overflow fillType selector } } [Object.entries DollarConfig] : do create-glyph "dollar/bar.\(suffix)" : glyph-proc - define top : CAP * kTop - define bot : CAP * kBot - define w : AdviceStroke 3 - define fine : AdviceStroke [StrokeWidthBlend 3 5.5] - - set-base-anchor 'cvDecompose' Middle (CAP / 2) - - include : dispiro - widths.center w - flat Middle (top - HalfStroke) - curl Middle (CAP - overflow) [heading Upward] - include : dispiro - widths.center w - flat Middle overflow [heading Upward] - curl Middle (bot + HalfStroke) - if (fillType === 1) : include : VBar.m Middle (bot + HalfStroke) (top - HalfStroke) fine - if (fillType === 2) : begin - local cofine : AdviceStroke 4 - local gap : (w / Stroke * EssUpper) + [Math.max ((top - bot) / 6) [AdviceStroke2 3 3 (top - bot)]] - local yMid : mix bot top 0.5 - local yTermLeft : mix yMid (top - [AdviceSArchDepth (top - bot) (-1) w]) 0.5 - local yTermRight : mix yMid (bot + [AdviceSArchDepth (top - bot) (-1) w]) 0.5 - include : difference - union - dispiro - flat Middle (top - HalfStroke) [widths.center.heading cofine Downward] - curl Middle [mix bot top 0.5] [widths.center.heading fine Downward] - dispiro - flat Middle (bot + HalfStroke) [widths.center.heading cofine Upward] - curl Middle [mix bot top 0.5] [widths.center.heading fine Upward] - - dispiro [corner 0 yTermLeft : widths.center gap] [corner Width yTermRight] - + local df : include : DivFrame 1 + set-base-anchor 'cvDecompose' df.middle (CAP / 2) DependentSelector.set currentGlyph selector + local [outlineMask] : DollarMask df [AdviceStroke2 2 3 CAP] + + include : difference [FullBar df swBarThick] [outlineMask] + if (fillType === 1) : include : intersection [FullBar df swBarFine] [outlineMask] + if (fillType === 2) : include : intersection [InterruptBar df] + difference [outlineMask] [InterruptMask df] + select-variant 'dollar/bar' (follow -- 'dollar') CreateDependentComposite 'dollar' '$' "dollar/bar" : object diff --git a/packages/font-glyphs/src/letter/latin/upper-a.ptl b/packages/font-glyphs/src/letter/latin/upper-a.ptl index 2eb277106..5c861102b 100644 --- a/packages/font-glyphs/src/letter/latin/upper-a.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-a.ptl @@ -15,34 +15,109 @@ glyph-block Letter-Latin-Upper-A : begin glyph-block-import Letter-Shared-Shapes : SerifFrame glyph-block-import Letter-Latin-V : VShapeOutline VShape VCornerHalfWidth + define BODY-CURLY 0 + define BODY-STRAIGHT 1 + define BODY-ROUND-TOP 2 + define SLAB-NONE 0 define SLAB-TOP 1 define SLAB-LEFT 2 define SLAB-RIGHT 4 define SLAB-CYRL-BGR 8 - glyph-block-export AMaskShape - define [AMaskShape] : with-params [df fBarStraight top sw] : new-glyph : glyph-proc - include : VShapeOutline df fBarStraight top sw - include : FlipAround (df.width / 2) (top / 2) + glyph-block-export AShape + define AShape : namespace + export : define [BarPos bodyShape slabKind top] : begin + local fBaseSlabs : maskBits slabKind : bitOr SLAB-LEFT SLAB-RIGHT + return : mix [if fBaseSlabs Stroke 0] top : match bodyShape + [Just BODY-ROUND-TOP] : Math.min 0.5 (XH * 0.75 / CAP) + __ : XH / 2 / CAP - glyph-block-export ABarPosition - define [ABarPosition slabKind top] : begin - local fBaseSlabs : maskBits slabKind : bitOr SLAB-LEFT SLAB-RIGHT - return : mix [if fBaseSlabs Stroke 0] top (XH / 2 / CAP) + export : define [Mask df bodyShape top sw] : match bodyShape + ([Just BODY-CURLY] || [Just BODY-STRAIGHT]) : new-glyph : glyph-proc + include : VShapeOutline df bodyShape top sw + include : FlipAround df.middle (top / 2) + [Just BODY-ROUND-TOP] : spiro-outline + corner df.leftSB 0 + curl pre@ (post@ <-> ArchDepthA) + arch.rhs top (sw -- sw) + flat post@ (pre@ <-> ArchDepthB) + corner df.rightSB 0 - glyph-block-export AConfig - define AConfig : SuffixCfg.weave - object - straight true - curly false + export : define [Outer df bodyShape top sw] : match bodyShape + ([Just BODY-CURLY] || [Just BODY-STRAIGHT]) : new-glyph : glyph-proc + include : VShape df bodyShape top sw + include : FlipAround df.middle (top / 2) + [Just BODY-ROUND-TOP] : dispiro + widths.rhs sw + flat df.leftSB 0 [heading Upward] + curl pre@ (post@ <-> ArchDepthA) + arch.rhs top (sw -- sw) + flat post@ (pre@ <-> ArchDepthB) + curl df.rightSB 0 [heading Downward] - object - serifless SLAB-NONE - topSerifed SLAB-TOP - baseSerifed [bitOr SLAB-LEFT SLAB-RIGHT] - triSerifed [bitOr SLAB-TOP SLAB-LEFT SLAB-RIGHT] + define [CrossBar df bodyShape top sw] : begin + define yBar : BarPos bodyShape slabKind top + return : tagged 'crossBar' + intersection [HBar.t 0 df.width yBar sw] [Mask df bodyShape top sw] + export : define [Letter df bodyShape slabKind top sw] : new-glyph : glyph-proc + include : Outer df bodyShape top sw + include : CrossBar df bodyShape top sw + include : ASerifs df top sw slabKind + define [CuspBottomRightRemovedImpl df bodyShape slabKind top sw] : new-glyph : glyph-proc + define yBar : BarPos bodyShape slabKind top + include : VShape df bodyShape top sw + eject-contour 'strokeDown' + include : FlipAround df.middle (top / 2) + + local rightStrokeKnots : begin + local s : Seg (df.middle + VCornerHalfWidth * sw / Stroke) top df.rightSB (yBar - sw) + list + s.z (-1) flat + s.z 0 flat + s.zz 0.55 [StrokeWidthBlend 0.48 0.45] [if bodyShape curl g4] + s.z 1 straight.down.end + + include : intersection + MaskBelow top + MaskAbove (yBar - sw) + dispiro [widths.rhs sw] rightStrokeKnots + + include : tagged 'crossBar' + intersection + HBar.t 0 df.width yBar sw + union + AShape.Mask df bodyShape top sw + intersection + MaskRight df.middle + MaskAbove (yBar - sw) + spiro-outline rightStrokeKnots + corner df.rightSB 0 + corner 0 0 + corner 0 top + + include : ASerifs df top sw slabKind + eject-contour 'serifRB' + + define [RoundTopBottomRightRemovedImpl df slabKind top sw] : new-glyph : glyph-proc + define yBar : BarPos BODY-ROUND-TOP slabKind top + include : difference + Outer df BODY-ROUND-TOP top sw + intersection + MaskRight df.middle + MaskBelow (yBar - sw) + include : CrossBar df BODY-ROUND-TOP top sw + include : ASerifs df top sw slabKind + eject-contour 'serifRB' + + export : define [LetterBottomRightRemoved df bodyShape slabKind top sw] : match bodyShape + ([Just BODY-CURLY] || [Just BODY-STRAIGHT]) : begin + return : CuspBottomRightRemovedImpl df bodyShape slabKind top sw + [Just BODY-ROUND-TOP] : begin + return : RoundTopBottomRightRemovedImpl df slabKind top sw + + glyph-block-export ASerifs define [ASerifs df top sw slabKind] : glyph-proc : begin local sf : SerifFrame.fromDf df top 0 if [maskBits slabKind SLAB-LEFT] : include @@ -54,76 +129,32 @@ glyph-block Letter-Latin-Upper-A : begin : then : HSerif.lt df.middle top (MidJutSide + [HSwToV : 0.25 * sw]) sf.swSerif : else : HSerif.lt df.middle top [mix MidJutSide LongJut 0.5] sf.swSerif - glyph-block-export ABottomRightRemoved - define [ABottomRightRemoved] : with-params [df fStraightBar slabKind top sw] : new-glyph : glyph-proc - define yBar : ABarPosition slabKind top - include : VShape df fStraightBar top sw - eject-contour 'strokeDown' - include : FlipAround df.middle (top / 2) + glyph-block-export AConfig + define AConfig : SuffixCfg.weave + object + straight BODY-STRAIGHT + curly BODY-CURLY + roundTop BODY-ROUND-TOP - local rightStrokeKnots : begin - local s : Seg (df.middle + VCornerHalfWidth * sw / Stroke) top df.rightSB (yBar - sw) - list - s.z (-1) flat - s.z 0 flat - s.zz 0.55 [StrokeWidthBlend 0.48 0.45] [if fStraightBar curl g4] - s.z 1 straight.down.end + object + serifless SLAB-NONE + topSerifed SLAB-TOP + baseSerifed [bitOr SLAB-LEFT SLAB-RIGHT] + triSerifed [bitOr SLAB-TOP SLAB-LEFT SLAB-RIGHT] - include : intersection - MaskBelow top - MaskAbove (yBar - sw) - dispiro [widths.rhs sw] rightStrokeKnots - - include : tagged 'crossBar' - intersection - HBar.t 0 df.width yBar sw - union - AMaskShape df fStraightBar top sw - intersection - MaskRight df.middle - MaskAbove (yBar - sw) - spiro-outline rightStrokeKnots - corner df.rightSB 0 - corner 0 0 - corner 0 top - - include : ASerifs df top sw slabKind - eject-contour 'serifRB' - - return : yBar - sw - - glyph-block-export ALetterShape - define [ALetterShape] : with-params [df fStraightBar slabKind top sw] : new-glyph : glyph-proc - include : VShape df fStraightBar top sw - include : FlipAround df.middle (top / 2) - define yBar : ABarPosition slabKind top - include : tagged 'crossBar' - intersection [HBar.t 0 df.width yBar sw] [AMaskShape df fStraightBar top sw] - include : ASerifs df top sw slabKind - - glyph-block-export LambdaShape - define [LambdaShape] : with-params [df fBarStraight top sw slabKind] : glyph-proc - include : VShape df fBarStraight top sw - include : FlipAround df.middle (top / 2) - include : ASerifs df top sw slabKind - - foreach { suffix { fStraightBar slabKind } } [Object.entries AConfig] : do + foreach { suffix { bodyShape slabKind } } [Object.entries AConfig] : do define [AShapeImpl mak top fGrek fOverlays] : glyph-proc local df : DivFrame 1 include : df.markSet.(mak) set-base-anchor 'trailing' df.rightSB 0 - if fGrek : include : SetGrekUpperTonos - (df.rightSB - df.leftSB) * [if [maskBits slabKind SLAB-TOP] 0 0.2] + if fGrek : include : SetGrekUpperTonos : match bodyShape + [Just BODY-ROUND-TOP] 0 + __ : (df.rightSB - df.leftSB) * [if [maskBits slabKind SLAB-TOP] 0 0.2] - include : ALetterShape - df -- df - top -- top - sw -- Stroke - fStraightBar -- fStraightBar - slabKind -- slabKind + include : AShape.Letter df bodyShape slabKind top Stroke if fOverlays : begin - define yBar : ABarPosition slabKind top + define yBar : AShape.BarPos bodyShape slabKind top eject-contour 'crossBar' include : HOverlayBar [mix 0 SB 0.5] [mix Width RightSB 0.5] (yBar - HalfStroke + 0.5 * OverlayStroke) include : HOverlayBar [mix 0 SB 0.5] [mix Width RightSB 0.5] [mix yBar top 0.25] @@ -134,33 +165,6 @@ glyph-block Letter-Latin-Upper-A : begin create-glyph "currency/australSign.\(suffix)" : AShapeImpl "capital" CAP false true - create-glyph "grek/Lambda.\(suffix)" : glyph-proc - include : MarkSet.capital - include : LambdaShape - df -- [DivFrame 1] - fBarStraight -- fStraightBar - top -- CAP - sw -- Stroke - slabKind -- slabKind - - create-glyph "grek/smcpLambda.\(suffix)" : glyph-proc - include : MarkSet.e - include : LambdaShape - df -- [DivFrame 1] - fBarStraight -- fStraightBar - top -- XH - sw -- Stroke - slabKind -- slabKind - - create-glyph "cyrl/el.BGR.\(suffix)" : glyph-proc - include : MarkSet.e - include : LambdaShape - df -- [DivFrame 1] - fBarStraight -- fStraightBar - top -- XH - sw -- Stroke - slabKind -- [bitOr slabKind SLAB-CYRL-BGR] - select-variant 'A' 'A' link-reduced-variant 'A/sansSerif' 'A' MathSansSerif select-variant 'smcpA' 0x1D00 (follow -- 'A') @@ -170,88 +174,6 @@ glyph-block Letter-Latin-Upper-A : begin alias 'cyrl/A' 0x410 'A' CreateTurnedLetter 'turnA' 0x2C6F 'A' HalfAdvance (CAP / 2) - select-variant 'grek/Lambda' 0x39B - link-reduced-variant 'grek/Lambda/sansSerif' 'grek/Lambda' MathSansSerif - select-variant 'grek/smcpLambda' 0x1D27 (follow -- 'grek/Lambda') - - alias 'cyrl/El.BGR' null 'grek/Lambda' - select-variant 'cyrl/el.BGR' (follow -- 'grek/Lambda') - - # Delta - glyph-block-export DeltaShape - define [DeltaShape] : with-params [df top sw fBarStraight] : union - LambdaShape - df -- df - fBarStraight -- fBarStraight - top -- top - sw -- sw - slab -- false - intersection - HBar.b 0 df.width 0 sw - AMaskShape df fBarStraight top sw - - define DeltaConfig : object - straight true - curly false - - foreach { suffix fBarStraight } [pairs-of DeltaConfig] : do - create-glyph "grek/Delta.\(suffix)" : glyph-proc - include : MarkSet.capital - include : DeltaShape - df -- [DivFrame 1] - fBarStraight -- fBarStraight - top -- CAP - sw -- Stroke - - create-glyph "increment.\(suffix)" : glyph-proc - include : MarkSet.capital - include : DeltaShape - df -- [DivFrame 1] - fBarStraight -- fBarStraight - top -- CAP - sw -- OperatorStroke - - create-glyph "increment.aplForm.\(suffix)" : glyph-proc - include : MarkSet.oper - define shapeHeight : OperTop - OperBot - include : DeltaShape - df -- [DivFrame 1] - fBarStraight -- fBarStraight - top -- shapeHeight - sw -- OperatorStroke - include : ApparentTranslate 0 (SymbolMid - shapeHeight / 2) - - create-glyph "increment.aplThin.\(suffix)" : glyph-proc - include : MarkSet.oper - define shapeHeight : OperTop - OperBot - include : DeltaShape - df -- [DivFrame 1] - fBarStraight -- fBarStraight - top -- shapeHeight - sw -- [AdviceStroke 3.75] - include : ApparentTranslate 0 (SymbolMid - shapeHeight / 2) - - define [CodeNonApl u] : if (para.variantSelector.__enableAplForm === 'enable') null u - define [CodeApl u] : if (para.variantSelector.__enableAplForm === 'enable') u null - - select-variant 'grek/Delta' 0x394 - select-variant 'increment' [CodeNonApl 0x2206] (follow -- 'grek/Delta') - select-variant 'increment.aplForm' [CodeApl 0x2206] (follow -- 'grek/Delta') - select-variant 'increment.aplThin' (follow -- 'grek/Delta') - - CreateTurnedLetter 'nabla' [CodeNonApl 0x2207] 'increment' HalfAdvance (CAP / 2) - CreateTurnedLetter 'nabla.aplForm' [CodeApl 0x2207] 'increment.aplForm' HalfAdvance SymbolMid - CreateTurnedLetter 'nabla.aplThin' null 'increment.aplThin' HalfAdvance SymbolMid - - derive-glyphs 'cyrl/De.BGR' null 'grek/Delta' : function [src gr] : glyph-proc - include [refer-glyph src] AS_BASE ALSO_METRICS - local descenderOverflow : if SLAB SideJut ((RightSB - SB) * 0.075) - local xCutLeft SB - local xCutRight RightSB - include : HBar.b (xCutLeft - descenderOverflow) (xCutRight + descenderOverflow) 0 - include : VBar.l (xCutLeft - descenderOverflow) (-LongJut + HalfStroke) Stroke - include : VBar.r (xCutRight + descenderOverflow) (-LongJut + HalfStroke) Stroke - glyph-block-import Letter-Blackboard : BBS BBD glyph-block-import Letter-Latin-V : BBVShape BBVInnerMaskShape diff --git a/packages/font-glyphs/src/letter/latin/upper-e.ptl b/packages/font-glyphs/src/letter/latin/upper-e.ptl index 4468c9a7e..77d52f713 100644 --- a/packages/font-glyphs/src/letter/latin/upper-e.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-e.ptl @@ -19,7 +19,7 @@ glyph-block Letter-Latin-Upper-E : begin define [EShape] : with-params [top pyBar serifLT serifLB serifV serifM [stroke : AdviceStroke2 2 3 top]] : glyph-proc local xMidRight : RightSB - [xMidBarShrink serifV] local yBar : yMidBar top pyBar - local { jutTop jutBot } : EFVJutLength top pyBar stroke + local { jutTop jutBot jutMid } : EFVJutLength top pyBar stroke include : VBar.l (xEBarLeft) 0 top stroke include : HBar.t (xEBarLeft - O) RightSB top stroke @@ -33,7 +33,7 @@ glyph-block Letter-Latin-Upper-E : begin include : VSerif.ur RightSB 0 jutBot if serifM : begin local fine : stroke * [AdviceStroke 3.5] / Stroke - include : VBar.r xMidRight (yBar - 0.5 * jutBot) (yBar + 0.5 * jutBot) fine + include : VBar.r xMidRight (yBar - jutMid) (yBar + jutMid) fine glyph-block-export RevEShape define [RevEShape] : with-params [top pyBar serifRT serifRB serifV serifM [stroke : AdviceStroke2 2 3 top]] : glyph-proc diff --git a/packages/font-glyphs/src/letter/latin/upper-f.ptl b/packages/font-glyphs/src/letter/latin/upper-f.ptl index 62f2a18f6..d572c08cd 100644 --- a/packages/font-glyphs/src/letter/latin/upper-f.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-f.ptl @@ -23,7 +23,8 @@ glyph-block Letter-Latin-Upper-F : begin top - [mix (top - stroke) ([yMidBar top pyBar] + stroke / 2) 0.5] local jutBot : Math.min VJut mix stroke ([yMidBar top pyBar] - stroke / 2) 0.5 - return { jutTop jutBot } + local jutMid : 0.5 * [Math.min jutTop jutBot] + return { jutTop jutBot jutMid } define xFBarLeft : SB * 1.5 define xFBarRight : Width - SB * 1.5 @@ -31,7 +32,7 @@ glyph-block Letter-Latin-Upper-F : begin define [FShape] : with-params [top pyBar serifLT serifLB serifV serifM [stroke : AdviceStroke2 2 3 top]] : glyph-proc local xMidRight : RightSB - [xMidBarShrink serifV] local yBar : yMidBar top pyBar - local { jutTop jutBot } : EFVJutLength top pyBar stroke + local { jutTop jutBot jutMid } : EFVJutLength top pyBar stroke include : VBar.l (xFBarLeft) 0 top stroke include : HBar.t (xFBarLeft - O) RightSB top stroke @@ -44,7 +45,7 @@ glyph-block Letter-Latin-Upper-F : begin if serifV : include : VSerif.dr RightSB top jutTop if serifM : begin local fine : stroke * [AdviceStroke 3.5] / Stroke - include : VBar.r xMidRight (yBar - 0.5 * jutBot) (yBar + 0.5 * jutBot) fine + include : VBar.r xMidRight (yBar - jutMid) (yBar + jutMid) fine define FConfig : object serifless { false false false false } diff --git a/packages/font-glyphs/src/letter/shared.ptl b/packages/font-glyphs/src/letter/shared.ptl index 0bfbb56fd..cad4c1655 100644 --- a/packages/font-glyphs/src/letter/shared.ptl +++ b/packages/font-glyphs/src/letter/shared.ptl @@ -1,7 +1,7 @@ $$include '../meta/macros.ptl' import [mix clamp fallback] from "@iosevka/util" -import [Interpolator] from "@iosevka/geometry/spiro-control" +import [FunctionInterpolator] from "@iosevka/geometry/spiro-control" import [Dotless CvDecompose] from "@iosevka/glyph/relation" import [RightDependentTrigger RightDependentLink DependentSelector] from "@iosevka/glyph/relation" import [DesignParameters] from "../meta/aesthetics.mjs" @@ -211,7 +211,7 @@ glyph-block Letter-Shared-Shapes : begin local-parameter : swBefore -- Stroke local-parameter : terminalSlopeAdj -- 0.5 - return : Interpolator normalBlender + return : new FunctionInterpolator normalBlender object [flat false] fine bottom xOuter x2 y2 yLoopTop swBefore terminalSlopeAdj export : define flex-params [f] : begin @@ -223,7 +223,7 @@ glyph-block Letter-Shared-Shapes : begin local-parameter : swBefore -- Stroke local-parameter : terminalSlopeAdj -- 0.5 - return : Interpolator normalBlender + return : new FunctionInterpolator normalBlender object [flat true] fine bottom xOuter x2 yLoopTop swBefore terminalSlopeAdj glyph-block-export HCurlyTail diff --git a/packages/font-glyphs/src/meta/aesthetics.ptl b/packages/font-glyphs/src/meta/aesthetics.ptl index a6ad7b1d6..4d7f78a10 100644 --- a/packages/font-glyphs/src/meta/aesthetics.ptl +++ b/packages/font-glyphs/src/meta/aesthetics.ptl @@ -177,10 +177,6 @@ export : define [calculateMetrics para] : begin define GeometryStroke : AdviceStroke 4 define ShoulderFine : Math.min (Stroke * para.shoulderFineMin) [AdviceStroke 16] - define [_SuperXY x superness] : Math.pow - 1 - [Math.pow x [fallback superness DesignParameters.superness]] - 1 / [fallback superness DesignParameters.superness] - define [AdviceGlottalStopArchDepth y sign] : begin return : ((y - Stroke) * 0.24 + Stroke * 0.625) + sign * TanSlope * SmoothAdjust @@ -199,7 +195,7 @@ export : define [calculateMetrics para] : begin EssUpper EssLower EssQuestion HalfStroke RightSB Middle DotRadius PeriodRadius SideJut ArchDepthA ArchDepthB SmallArchDepthA SmallArchDepthB CorrectionOMidX CorrectionOMidS compositeBaseAnchors AdviceStroke AdviceStroke2 OverlayStroke OperatorStroke GeometryStroke - ShoulderFine _SuperXY AdviceGlottalStopArchDepth StrokeWidthBlend ArchDepthAOf ArchDepthBOf + ShoulderFine AdviceGlottalStopArchDepth StrokeWidthBlend ArchDepthAOf ArchDepthBOf SmoothAdjust MidJutSide MidJutCenter YSmoothMidR YSmoothMidL HSwToV NarrowUnicodeT WideUnicodeT VERY-FAR TINY] diff --git a/packages/font-glyphs/src/meta/macros.ptl b/packages/font-glyphs/src/meta/macros.ptl index 0d08b6808..7a6dbca01 100644 --- a/packages/font-glyphs/src/meta/macros.ptl +++ b/packages/font-glyphs/src/meta/macros.ptl @@ -149,40 +149,35 @@ define-macro eject-contour : syntax-rules ###### Canvas-based mechanism define-macro new-glyph : syntax-rules `[new-glyph @body] : begin - dirty `[$createAndSaveGlyphImpl$ null null @[formOf body]] + dirty `[$GlyphSaveSink$.save null null @[formOf body]] define-macro create-glyph : syntax-rules `[create-glyph @body] : begin - if [not externEnv.$nWFGlyphs$] : set externEnv.$nWFGlyphs$ 0 - inc externEnv.$nWFGlyphs$ - local f0 : '.' + [[env.macros.get 'input-path']].1 + '.' - local tcn {".quote" (".WF" + f0 + externEnv.$nWFGlyphs$)} - dirty `[$createAndSaveGlyphImpl$ @tcn null @[formOf body]] + dirty `[$GlyphSaveSink$.save null null @[formOf body]] `[create-glyph @name @body] : begin - dirty `[$createAndSaveGlyphImpl$ @[formOf name] null @[formOf body]] + dirty `[$GlyphSaveSink$.save @[formOf name] null @[formOf body]] `[create-glyph @name @code @body] : begin - dirty `[$createAndSaveGlyphImpl$ @[formOf name] @[formOf code] @[formOf body]] + dirty `[$GlyphSaveSink$.save @[formOf name] @[formOf code] @[formOf body]] define-macro create-aliased-glyph : syntax-rules `[create-aliased-glyph @name] : begin dirty `[create-aliased-glyph @[formOf name] null] `[create-aliased-glyph @name @code] : begin - dirty `[$createAndSaveGlyphImpl$ @[formOf name] @[formOf code] + dirty `[$GlyphSaveSink$.save @[formOf name] @[formOf code] [new $Capture$.ForkGlyphProc currentGlyph null] ] define-macro create-forked-glyph : syntax-rules `[create-forked-glyph @body] : begin - if [not externEnv.$nWFGlyphs$] : set externEnv.$nWFGlyphs$ 0 - inc externEnv.$nWFGlyphs$ - local f0 : '.' + [[env.macros.get 'input-path']].1 + '.' - local tcn {".quote" (".WF" + f0 + externEnv.$nWFGlyphs$)} - dirty `[create-forked-glyph @tcn null @[formOf body]] + dirty `[create-forked-glyph null null @[formOf body]] `[create-forked-glyph @name @body] : begin dirty `[create-forked-glyph @[formOf name] null @[formOf body]] `[create-forked-glyph @name @code @body] : begin - dirty `[$createAndSaveGlyphImpl$ @[formOf name] @[formOf code] + dirty `[$GlyphSaveSink$.save @[formOf name] @[formOf code] [new $Capture$.ForkGlyphProc currentGlyph @[formOf body]] ] +define-macro glyph-is-needed : syntax-rules + `[glyph-is-needed @name] : dirty `[$GlyphSaveSink$.glyphIsNeeded @[formOf name]] + ###### Glyph modules and Glyph blocks define-macro glyph-module : syntax-rules @@ -265,13 +260,13 @@ define-macro glyph-block : syntax-rules ([typeof form] === "string") : set variableSet.(form) true traceBody body - traceBody `[$NamedParameterPair$ $createAndSaveGlyphImpl$ $Exec$] + traceBody `[$NamedParameterPair$ $GlyphSaveSink$ $Exec$] set externEnv.$glyphBlockVariableUsage$ variableSet - define captureImports `[$createAndSaveGlyphImpl$ $NamedParameterPair$ $Exec$ Metrics para - recursive glyphStore glyph-is-needed SpiroFns BooleFns MarkSet AS_BASE ALSO_METRICS - buildGlyphs DivFrame fontMetrics] + define captureImports `[$GlyphSaveSink$ $NamedParameterPair$ $Exec$ Metrics para recursive + glyphStore SpiroFns BooleFns MarkSet AS_BASE ALSO_METRICS buildGlyphs DivFrame + fontMetrics] define metricImports `[DesignParameters UPM HalfUPM Width SB CAP XH Ascender Descender Contrast SymbolMid ParenTop ParenBot OperTop OperBot TackTop TackBot PlusTop PlusBot @@ -284,10 +279,10 @@ define-macro glyph-block : syntax-rules WideWidth2 WideWidth3 WideWidth4 EssUpper EssLower EssQuestion HalfStroke RightSB Middle DotRadius PeriodRadius SideJut ArchDepthA ArchDepthB SmallArchDepthA SmallArchDepthB CorrectionOMidX CorrectionOMidS AdviceStroke AdviceStroke2 - OverlayStroke OperatorStroke GeometryStroke ShoulderFine _SuperXY - AdviceGlottalStopArchDepth StrokeWidthBlend ArchDepthAOf ArchDepthBOf SmoothAdjust - MidJutSide MidJutCenter compositeBaseAnchors YSmoothMidR YSmoothMidL HSwToV - NarrowUnicodeT WideUnicodeT VERY-FAR TINY] + OverlayStroke OperatorStroke GeometryStroke ShoulderFine AdviceGlottalStopArchDepth + StrokeWidthBlend ArchDepthAOf ArchDepthBOf SmoothAdjust MidJutSide MidJutCenter + compositeBaseAnchors YSmoothMidR YSmoothMidL HSwToV NarrowUnicodeT WideUnicodeT + VERY-FAR TINY] define spiroFnImports `[g4 g2 corner flat curl virt close end straight g2c cg2 flatc ccurl widths disable-contrast heading unimportant important alsoThru alsoThruThem bezControls quadControls archv arcvh dispiro spiro-outline spiro-collect] diff --git a/packages/font-glyphs/src/symbol/math/letter-like.ptl b/packages/font-glyphs/src/symbol/math/letter-like.ptl index 92d9362bb..5f1bff635 100644 --- a/packages/font-glyphs/src/symbol/math/letter-like.ptl +++ b/packages/font-glyphs/src/symbol/math/letter-like.ptl @@ -7,8 +7,6 @@ glyph-module glyph-block Symbol-Math-Letter-Like : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - glyph-block-import Letter-Latin-Upper-A : DeltaShape - glyph-block-import Letter-Latin-Upper-E : RevEShape glyph-block-import Digits-Zero : OvalShapeT turned 'forall' 0x2200 'A.straightSerifless' Middle (CAP / 2) diff --git a/packages/font-glyphs/src/symbol/pictograph.ptl b/packages/font-glyphs/src/symbol/pictograph.ptl index b5b38bb49..a43585787 100644 --- a/packages/font-glyphs/src/symbol/pictograph.ptl +++ b/packages/font-glyphs/src/symbol/pictograph.ptl @@ -22,6 +22,7 @@ export : define [apply] : begin run-glyph-module "./pictograph/loops.mjs" run-glyph-module "./pictograph/metric-marks.mjs" run-glyph-module "./pictograph/musical.mjs" + run-glyph-module "./pictograph/ocr.mjs" run-glyph-module "./pictograph/powerline-and-gui.mjs" run-glyph-module "./pictograph/robot-and-human.mjs" run-glyph-module "./pictograph/schematic.mjs" diff --git a/packages/font-glyphs/src/symbol/pictograph/ocr.ptl b/packages/font-glyphs/src/symbol/pictograph/ocr.ptl new file mode 100644 index 000000000..adf569677 --- /dev/null +++ b/packages/font-glyphs/src/symbol/pictograph/ocr.ptl @@ -0,0 +1,67 @@ +$$include '../../meta/macros.ptl' + +import [mix linreg clamp fallback] from "@iosevka/util" +import [Transform] from "@iosevka/geometry/transform" + +glyph-module + +glyph-block Symbol-Pictograph-OCR : begin + glyph-block-import CommonShapes + glyph-block-import Common-Derivatives + + create-glyph 'ockHook' 0x2440 : glyph-proc + local df : include : DivFrame 1 + local sw : df.adviceStroke 3 + + include : VBar.l df.leftSB OperBot SymbolMid sw + include : VBar.m df.middle OperBot OperTop sw + include : VBar.r df.rightSB SymbolMid OperTop sw + include : HBar.b df.leftSB df.middle OperBot sw + include : HBar.t df.middle df.rightSB OperTop sw + + create-glyph 'ocrChair' 0x2441 : glyph-proc + local df : include : DivFrame 1 + local sw : df.adviceStroke 3 + + include : VBar.l df.leftSB OperBot SymbolMid sw + include : VBar.r df.rightSB OperBot OperTop sw + include : HBar.m df.leftSB df.rightSB SymbolMid sw + + create-glyph 'ocrFork' 0x2442 : glyph-proc + local df : include : DivFrame 1 + local sw : df.adviceStroke 3 + + include : VBar.l df.leftSB SymbolMid OperTop sw + include : VBar.r df.rightSB SymbolMid OperTop sw + include : VBar.m df.middle OperBot SymbolMid sw + include : HBar.m df.leftSB df.rightSB SymbolMid sw + + turned 'ocrInvertedFork' 0x2443 'ocrFork' [DivFrame 1].middle SymbolMid + + create-glyph 'ocrBeltBuckle' 0x2444 : glyph-proc + local df : include : DivFrame 1 + local sw : df.adviceStroke 3 + local gap : Math.max (XH / 4) [df.adviceStroke2 6 6 XH] + + include : HBar.t df.leftSB df.rightSB OperTop sw + include : HBar.b df.leftSB df.rightSB OperBot sw + include : VBar.m df.middle OperBot OperTop sw + include : with-knockout [HBar.m OperBot df.width SymbolMid gap] + VBar.l df.leftSB OperBot OperTop sw + VBar.r df.rightSB OperBot OperTop sw + + create-glyph 'ocrBowTie' 0x2445 : glyph-proc + local df : include : DivFrame 1 + local sw : df.adviceStroke2 4 6 (OperTop - OperBot) + + local y0 : mix OperBot OperTop 0.35 + local y1 : mix OperBot OperTop 0.65 + + include : VBar.l df.leftSB y0 y1 sw + include : VBar.r df.rightSB y0 y1 sw + include : dispiro + flat df.leftSB y0 [widths.rhs sw] + curl df.rightSB y1 [widths.lhs sw] + include : dispiro + flat df.leftSB y1 [widths.lhs sw] + curl df.rightSB y0 [widths.rhs sw] diff --git a/packages/font-kits/package.json b/packages/font-kits/package.json index 63b090495..3fda13893 100644 --- a/packages/font-kits/package.json +++ b/packages/font-kits/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/font-kits", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { "./derived-coordinates": "./src/derived-coordinates.mjs", @@ -8,8 +8,8 @@ "./spiro-kit": "./src/spiro-kit.mjs" }, "dependencies": { - "@iosevka/geometry": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/util": "31.3.0" + "@iosevka/geometry": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/util": "31.4.0" } } diff --git a/packages/font-kits/src/spiro-kit.mjs b/packages/font-kits/src/spiro-kit.mjs index ee24410c0..dc9b4ed07 100644 --- a/packages/font-kits/src/spiro-kit.mjs +++ b/packages/font-kits/src/spiro-kit.mjs @@ -1,6 +1,7 @@ import { DiSpiroGeometry, SpiroGeometry } from "@iosevka/geometry"; import { - Interpolator, + AfBase, + InterpolatorBase, SpiroFlattener, TerminateInstruction, UserCloseKnotPair, @@ -167,12 +168,21 @@ export function SetupBuilders(bindings) { } } + class AfSetWidths extends AfBase { + constructor(l, r) { + super(); + this.l = l; + this.r = r; + } + applyTo(target) { + target.setWidth(this.l, this.r); + } + } + function widths(l, r) { if (!isFinite(l)) throw new TypeError("NaN detected for left width"); if (!isFinite(r)) throw new TypeError("NaN detected for right width"); - return function () { - if (this.setWidth) this.setWidth(l, r); - }; + return new AfSetWidths(l, r); } widths.lhs = function (w) { w = fallback(w, Stroke); @@ -190,154 +200,172 @@ export function SetupBuilders(bindings) { return widths(w / 2, w / 2); }; + class AfHeading extends AfBase { + constructor(d) { + super(); + this.d = d; + } + applyTo(target) { + target.headsTo(this.d); + } + } function heading(d) { if (!isFinite(d.x) || !isFinite(d.y)) throw new TypeError("NaN detected for heading directions"); - return function () { - if (this.headsTo) this.headsTo(d); - }; + return new AfHeading(d); } + + class AfWidthsHeading extends AfBase { + constructor(l, r, d) { + super(); + this.l = l; + this.r = r; + this.d = d; + } + applyTo(target) { + target.setWidth(this.l, this.r); + target.headsTo(this.d); + } + } + widths.heading = function (l, r, d) { if (!isFinite(l)) throw new TypeError("NaN detected for left width"); if (!isFinite(r)) throw new TypeError("NaN detected for left width"); if (!isFinite(d.x) || !isFinite(d.y)) throw new TypeError("NaN detected for heading directions"); - return function () { - if (this.setWidth) this.setWidth(l, r); - if (this.headsTo) this.headsTo(d); - }; + return new AfWidthsHeading(l, r, d); }; widths.lhs.heading = function (w, d) { w = fallback(w, Stroke); if (!isFinite(w)) throw new TypeError("NaN detected for left width"); if (!isFinite(d.x) || !isFinite(d.y)) throw new TypeError("NaN detected for heading directions"); - return function () { - if (this.setWidth) this.setWidth(w, 0); - if (this.headsTo) this.headsTo(d); - }; + return new AfWidthsHeading(w, 0, d); }; widths.rhs.heading = function (w, d) { w = fallback(w, Stroke); if (!isFinite(w)) throw new TypeError("NaN detected for left width"); if (!isFinite(d.x) || !isFinite(d.y)) throw new TypeError("NaN detected for heading directions"); - return function () { - if (this.setWidth) this.setWidth(0, w); - if (this.headsTo) this.headsTo(d); - }; + return new AfWidthsHeading(0, w, d); }; widths.center.heading = function (w, d) { w = fallback(w, Stroke); if (!isFinite(w)) throw new TypeError("NaN detected for left width"); if (!isFinite(d.x) || !isFinite(d.y)) throw new TypeError("NaN detected for heading directions"); - return function () { - if (this.setWidth) this.setWidth(w / 2, w / 2); - if (this.headsTo) this.headsTo(d); - }; + return new AfWidthsHeading(w / 2, w / 2, d); }; + class AfDisableContrast extends AfBase { + applyTo(target) { + target.setContrast(1); + } + } function disableContrast() { - return function () { - if (this.setContrast) this.setContrast(1); - }; - } - function unimportant() { - if (this.setUnimportant) this.setUnimportant(1); - } - function important() { - return void 0; + return new AfDisableContrast(); } - function afInterpolate(before, after, args) { - return g4( - mix(before.x, after.x, args.rx), - mix(before.y, after.y, args.ry), - fallback(args.raf, unimportant), - ); + class AfUnimportant extends AfBase { + applyTo(target) { + target.setUnimportant(); + } } - function afInterpolateDelta(before, after, args) { - return g4( - mix(before.x, after.x, args.rx) + args.deltaX, - mix(before.y, after.y, args.ry) + args.deltaY, - fallback(args.raf, unimportant), - ); + const unimportant = new AfUnimportant(); + + class AfImportant extends AfBase { + applyTo(target) { + target.setImportant(); + } } - function afInterpolateG2(before, after, args) { - return g2( - mix(before.x, after.x, args.rx), - mix(before.y, after.y, args.ry), - fallback(args.raf, unimportant), - ); - } - function afInterpolateThem(before, after, args) { - let innerKnots = []; - for (const [rx, ry, rt] of args.rs) { - innerKnots.push( - fallback(args.ty, g2)( - mix(before.x, after.x, rx), - mix(before.y, after.y, ry), - args.raf && args.raf.blend && rt !== void 0 - ? args.raf.blend(rt) - : args.raf - ? args.raf - : unimportant, - ), + const important = new AfImportant(); + + /// Simple (single mix) interpolator + class SimpleMixInterpolator extends InterpolatorBase { + constructor(ty, rx, ry, deltaX, deltaY, raf) { + super(); + this.ty = ty; + this.rx = rx; + this.ry = ry; + this.deltaX = deltaX; + this.deltaY = deltaY; + this.raf = fallback(raf, unimportant); + } + resolveInterpolation(before, after) { + return this.ty( + mix(before.x, after.x, this.rx) + this.deltaX, + mix(before.y, after.y, this.ry) + this.deltaY, + this.raf, ); } - return innerKnots; - } - function afInterpolateThemWithDelta(before, after, args) { - let innerKnots = []; - for (const [rx, ry, deltaX, deltaY, rt] of args.rs) { - innerKnots.push( - fallback(args.ty, g2)( - mix(before.x, after.x, rx) + deltaX, - mix(before.y, after.y, ry) + deltaY, - args.raf && args.raf.blend && rt !== void 0 - ? args.raf.blend(rt) - : args.raf - ? args.raf - : unimportant, - ), - ); - } - return innerKnots; - } - function afInterpolateThemFromTWithDelta(before, after, args) { - let innerKnots = []; - for (const rt of args.rs) { - innerKnots.push( - fallback(args.ty, g2)( - mix(before.x, after.x, args.raf.rx(rt)) + args.raf.deltaX(rt), - mix(before.y, after.y, args.raf.ry(rt)) + args.raf.deltaY(rt), - args.raf.modifier(rt), - ), - ); - } - return innerKnots; } function alsoThru(rx, ry, raf) { - return Interpolator(afInterpolate, { rx, ry, raf }); + return new SimpleMixInterpolator(g4, rx, ry, 0, 0, raf); } alsoThru.withOffset = function (rx, ry, deltaX, deltaY, raf) { - return Interpolator(afInterpolateDelta, { rx, ry, deltaX, deltaY, raf }); + return new SimpleMixInterpolator(g4, rx, ry, deltaX, deltaY, raf); }; alsoThru.g2 = function (rx, ry, raf) { - return Interpolator(afInterpolateG2, { rx, ry, raf }); + return new SimpleMixInterpolator(g2, rx, ry, 0, 0, raf); }; - function alsoThruThem(rs, raf, ty) { - return Interpolator(afInterpolateThem, { rs, raf, ty }); + + /// Multi-mix interpolator + class MultiMixInterpolator extends InterpolatorBase { + constructor(rs, raf, ty) { + super(); + this.rs = rs; + this.raf = raf; + this.ty = fallback(ty, g2); + } + resolveInterpolation(before, after) { + let innerKnots = []; + for (const [rx, ry, rt] of this.rs) { + const x = mix(before.x, after.x, rx); + const y = mix(before.y, after.y, ry); + const af = + this.raf && this.raf.blend && rt !== void 0 + ? this.raf.blend(rt) + : this.raf + ? this.raf + : unimportant; + innerKnots.push(this.ty(x, y, af)); + } + return innerKnots; + } } - alsoThruThem.withOffset = function (rs, raf, ty) { - return Interpolator(afInterpolateThemWithDelta, { rs, raf, ty }); - }; - alsoThruThem.fromTWithOffset = function (rs, raf, ty) { - return Interpolator(afInterpolateThemFromTWithDelta, { rs, raf, ty }); + function alsoThruThem(rs, raf, ty) { + return new MultiMixInterpolator(rs, raf, ty); + } + + /// Multi-mix interpolator that use function set to compute proportion/deltas + class MultiMixComputeInterpolator extends InterpolatorBase { + constructor(rs, raf, ty) { + super(); + this.rs = rs; + this.raf = raf; + this.ty = fallback(ty, g2); + } + resolveInterpolation(before, after) { + let innerKnots = []; + for (const rt of this.rs) { + innerKnots.push( + this.ty( + mix(before.x, after.x, this.raf.rx(rt)) + this.raf.deltaX(rt), + mix(before.y, after.y, this.raf.ry(rt)) + this.raf.deltaY(rt), + this.raf.modifier(rt), + ), + ); + } + return innerKnots; + } + } + alsoThruThem.computed = function (rs, raf, ty) { + return new MultiMixComputeInterpolator(rs, raf, ty); }; + // Bezier control interpolator + function bezControlsImpl(x1, y1, x2, y2, samples, raf, ty) { let rs = []; for (let j = 1; j < samples; j = j + 1) @@ -362,44 +390,64 @@ export function SetupBuilders(bindings) { ); } - let DEFAULT_STEPS = 6; - let [buildHV, buildVH] = (function (cache) { - function build(samples, _superness) { - const superness = fallback(_superness, Superness); - let hv = []; - let vh = []; - for (let j = 1; j < samples; j = j + 1) { - const theta = (((j + 1) / (samples + 2)) * Math.PI) / 2; - const c = Math.pow(Math.cos(theta), 2 / superness); - const s = Math.pow(Math.sin(theta), 2 / superness); - hv.push([s, 1 - c]); - vh.push([1 - c, s]); + // ArcHV and ArcVH interpolators + class ArcHvInterpolator extends InterpolatorBase { + constructor(steps, superness) { + super(); + this.steps = steps; + this.superness = superness; + } + resolveInterpolation(before, after) { + let innerKnots = []; + for (let j = 1; j < this.steps; j++) { + const theta = (((j + 1) / (this.steps + 2)) * Math.PI) / 2; + const c = Math.pow(Math.cos(theta), 2 / this.superness); + const s = Math.pow(Math.sin(theta), 2 / this.superness); + const x = mix(before.x, after.x, s); + const y = mix(before.y, after.y, 1 - c); + innerKnots.push(g2(x, y, unimportant)); } - return { hv, vh: vh }; + return innerKnots; } - function buildHVImpl(samples, _superness) { - if (_superness) return build(samples, _superness).hv; - if (!cache[samples]) cache[samples] = build(samples, _superness); - return cache[samples].hv; + } + class ArcVhInterpolator extends InterpolatorBase { + constructor(steps, superness) { + super(); + this.steps = steps; + this.superness = superness; } - function buildVHImpl(samples, _superness) { - if (_superness) return build(samples, _superness).vh; - if (!cache[samples]) cache[samples] = build(samples, _superness); - return cache[samples].vh; + resolveInterpolation(before, after) { + let innerKnots = []; + for (let j = 1; j < this.steps; j++) { + const theta = (((j + 1) / (this.steps + 2)) * Math.PI) / 2; + const c = Math.pow(Math.cos(theta), 2 / this.superness); + const s = Math.pow(Math.sin(theta), 2 / this.superness); + const x = mix(before.x, after.x, 1 - c); + const y = mix(before.y, after.y, s); + innerKnots.push(g2(x, y, unimportant)); + } + return innerKnots; } - return [buildHVImpl, buildVHImpl]; - })([]); + } + + let DEFAULT_STEPS = 6; function archv(samples, superness) { - return alsoThruThem(buildHV(fallback(samples, DEFAULT_STEPS), superness)); + return new ArcHvInterpolator( + fallback(samples, DEFAULT_STEPS), + fallback(superness, Superness), + ); } archv.superness = function (s) { - return archv(DEFAULT_STEPS, s); + return new ArcHvInterpolator(DEFAULT_STEPS, s); }; function arcvh(samples, superness) { - return alsoThruThem(buildVH(fallback(samples, DEFAULT_STEPS), superness)); + return new ArcVhInterpolator( + fallback(samples, DEFAULT_STEPS), + fallback(superness, Superness), + ); } arcvh.superness = function (s) { - return arcvh(DEFAULT_STEPS, s); + return new ArcVhInterpolator(DEFAULT_STEPS, s); }; archv.yFromX = function (px, _s) { const s = fallback(_s, Superness); diff --git a/packages/font-otl/package.json b/packages/font-otl/package.json index 9c1c237f6..9aede4841 100644 --- a/packages/font-otl/package.json +++ b/packages/font-otl/package.json @@ -1,13 +1,13 @@ { "name": "@iosevka/font-otl", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./lib/index.mjs" }, "dependencies": { - "@iosevka/font-glyphs": "31.3.0", - "@iosevka/glyph": "31.3.0", + "@iosevka/font-glyphs": "31.4.0", + "@iosevka/glyph": "31.4.0", "toposort": "^2.0.2" } } diff --git a/packages/font-otl/src/gsub-cv-ss.ptl b/packages/font-otl/src/gsub-cv-ss.ptl index 2ed6f5666..b4fa2c795 100644 --- a/packages/font-otl/src/gsub-cv-ss.ptl +++ b/packages/font-otl/src/gsub-cv-ss.ptl @@ -58,15 +58,23 @@ class CvLookupManager return lookup public [linkDeps] : begin - if (this.decompositionLookup && this.altrenatesLookup) : begin - this.table.setDependency this.decompositionLookup this.altrenatesLookup + if this.decompositionLookup : begin + if this.altrenatesLookup : begin + this.table.setDependency this.decompositionLookup this.altrenatesLookup + foreach lookupSS [items-of this.singleSubstLookups] : if lookupSS : begin + this.table.setDependency this.decompositionLookup lookupSS + foreach lookupCP [items-of this.cherryPickingLookups] : if lookupCP : begin + this.table.setDependency this.decompositionLookup lookupCP + if this.altrenatesLookup : begin foreach lookupSS [items-of this.singleSubstLookups] : if lookupSS : begin this.table.setDependency this.altrenatesLookup lookupSS foreach lookupCP [items-of this.cherryPickingLookups] : if lookupCP : begin this.table.setDependency lookupCP this.altrenatesLookup - foreach lookupSS [items-of this.singleSubstLookups] : if lookupSS : begin - this.table.setDependency lookupCP lookupSS + + foreach lookupCP [items-of this.cherryPickingLookups] : if lookupCP : begin + foreach lookupSS [items-of this.singleSubstLookups] : if lookupSS : begin + this.table.setDependency lookupCP lookupSS public [linkCrossDeps other] : begin if (this.altrenatesLookup && other.altrenatesLookup) : begin @@ -101,41 +109,35 @@ export : define [buildCVSS gsub para glyphStore] : begin local lookup : [cvs.get gr.tag].createDecompositionSubst if [not lookup.substitutions.(gn)] : set lookup.substitutions.(gn) parts - do "cvxx" - local cvGrs {} - foreach {name prime} para.variants.primes : foreach {vn variant} prime.variants : begin - if (variant.tag && variant.rank) : cvGrs.push variant - cvGrs.sort AnyCv.compare + do "cvxx / ssxx" + local grSetUsedBySs : new Set + foreach {name composition} para.variants.composites : if composition.tag : begin + define feature : gsub.addCommonFeature : gsub.createFeature composition.tag - foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin - foreach gr [items-of cvGrs] : begin - local subst : gr.get glyph - if (subst && subst != gn) : begin - local cvAlt : [cvs.get gr.tag].createAlternateSubst - if [not cvAlt.substitutions.(gn)] : set cvAlt.substitutions.(gn) { } - set cvAlt.substitutions.(gn).(gr.rank - 1) : glyphStore.ensureExists subst + define decomp : composition.decompose para para.variants.selectorTree + local ssGrs {} + foreach { prime pv } [items-of decomp] : if (pv.tag && pv.rank) : begin + ssGrs.push pv + local dl [cvs.get pv.tag].decompositionLookup + if dl : feature.addLookup dl + ssGrs.sort AnyCv.compare - do "ssxx" : foreach {name composition} para.variants.composites : if composition.tag : begin - define feature : gsub.addCommonFeature : gsub.createFeature composition.tag - - define decomp : composition.decompose para para.variants.selectorTree - local ssGrs {} - foreach { prime pv } [items-of decomp] : if (pv.tag && pv.rank) : begin - ssGrs.push pv - local dl [cvs.get pv.tag].decompositionLookup - if dl : feature.addLookup dl - ssGrs.sort AnyCv.compare - - foreach gr [items-of ssGrs] : begin - local cvSingle : [cvs.get gr.tag].createSingleSubstFor gr.rank - feature.addLookup cvSingle - - foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin foreach gr [items-of ssGrs] : begin + local cvSingle : [cvs.get gr.tag].createSingleSubstFor gr.rank + feature.addLookup cvSingle + grSetUsedBySs.add gr + + foreach {gn glyph} [glyphStore.namedEntriesWithFilter nonDecomposable] : begin + foreach gr [items-of : AnyCv.query glyph] : begin local subst : gr.get glyph if (subst && subst != gn) : begin - local cvSingle : [cvs.get gr.tag].createSingleSubstFor gr.rank - set cvSingle.substitutions.(gn) : glyphStore.ensureExists subst + if (gr.tag && gr.rank) : begin + local cvAlt : [cvs.get gr.tag].createAlternateSubst + if [not cvAlt.substitutions.(gn)] : set cvAlt.substitutions.(gn) { } + set cvAlt.substitutions.(gn).(gr.rank - 1) : glyphStore.ensureExists subst + if [grSetUsedBySs.has gr] : begin + local cvSingle : [cvs.get gr.tag].createSingleSubstFor gr.rank + set cvSingle.substitutions.(gn) : glyphStore.ensureExists subst do "CV cherry picking" foreach {name prime} para.variants.primes : if prime.cherryPicking : begin @@ -147,7 +149,7 @@ export : define [buildCVSS gsub para glyphStore] : begin if cv.decompositionLookup : feature.addLookup cv.decompositionLookup feature.addLookup lookup - foreach {gn glyph} [glyphStore.namedEntries] : if [not : CvDecompose.get glyph] : begin + foreach {gn glyph} [glyphStore.namedEntriesWithFilter nonDecomposable] : begin local subst : gr.get glyph if (subst && subst != gn) : begin set lookup.substitutions.(gn) : glyphStore.ensureExists subst @@ -172,3 +174,4 @@ export : define [buildCVSS gsub para glyphStore] : begin return cvs define [objectIsNotEmpty obj] : obj && [Object.keys obj].length +define [nonDecomposable gn g] : not : CvDecompose.get g diff --git a/packages/font-otl/src/index.ptl b/packages/font-otl/src/index.ptl index 4b2233bef..2462069ab 100644 --- a/packages/font-otl/src/index.ptl +++ b/packages/font-otl/src/index.ptl @@ -108,6 +108,11 @@ define [buildGDEF para glyphStore markGlyphs] : begin return GDEF export : define [buildOtl para glyphStore] : begin + # Link glyph pairs by suffix + Gr.linkSuffixPairGr glyphStore 'NWID' 'WWID' Gr.Nwid Gr.Wwid + Gr.linkSuffixPairGr glyphStore 'lnum' 'onum' Gr.Lnum Gr.Onum + Gr.linkSuffixGr glyphStore 'aplForm' Gr.AplForm + local markGlyphs { .all [new Set] .markAttachClassDef [new Map] .markGlyphSets {} } local GPOS : buildGPOS para glyphStore markGlyphs local GDEF : buildGDEF para glyphStore markGlyphs diff --git a/packages/font/package.json b/packages/font/package.json index 4427fcae2..d4d0aef6d 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/font", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs", @@ -10,13 +10,13 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/font-glyphs": "31.3.0", - "@iosevka/font-otl": "31.3.0", - "@iosevka/geometry": "31.3.0", - "@iosevka/geometry-cache": "31.3.0", - "@iosevka/glyph": "31.3.0", - "@iosevka/param": "31.3.0", - "@iosevka/util": "31.3.0", + "@iosevka/font-glyphs": "31.4.0", + "@iosevka/font-otl": "31.4.0", + "@iosevka/geometry": "31.4.0", + "@iosevka/geometry-cache": "31.4.0", + "@iosevka/glyph": "31.4.0", + "@iosevka/param": "31.4.0", + "@iosevka/util": "31.4.0", "harfbuzzjs": "^0.3.6", "ot-builder": "^1.7.4", "semver": "^7.6.3" diff --git a/packages/geometry-cache/package.json b/packages/geometry-cache/package.json index d78e7dcb7..5ad786d02 100644 --- a/packages/geometry-cache/package.json +++ b/packages/geometry-cache/package.json @@ -1,12 +1,12 @@ { "name": "@iosevka/geometry-cache", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { - "@iosevka/geometry": "31.3.0", + "@iosevka/geometry": "31.4.0", "@msgpack/msgpack": "^2.8.0" } } diff --git a/packages/geometry/package.json b/packages/geometry/package.json index a2182d9b4..640b82d4f 100644 --- a/packages/geometry/package.json +++ b/packages/geometry/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/geometry", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs", @@ -15,7 +15,7 @@ "./spiro-pen-expand": "./src/spiro-pen-expand.mjs" }, "dependencies": { - "@iosevka/util": "31.3.0", + "@iosevka/util": "31.4.0", "spiro": "^3.0.1", "typo-geom": "^0.16.1" } diff --git a/packages/geometry/src/spiro-control.mjs b/packages/geometry/src/spiro-control.mjs index 9506b1fd2..399990de0 100644 --- a/packages/geometry/src/spiro-control.mjs +++ b/packages/geometry/src/spiro-control.mjs @@ -1,7 +1,7 @@ // This class is used to "flatten" the spiro controls into a plain list of UserControlKnot export class SpiroFlattener { constructor() { - this.preControlFunctions = []; + this.preControls = []; this.controls = []; this.postControls = []; } @@ -9,13 +9,21 @@ export class SpiroFlattener { add(c) { if (Array.isArray(c)) { for (const item of c) this.add(item); - } else if (c instanceof Function) { - if (!this.controls.length) this.preControlFunctions.push(c); - else throw new Error("Invalid spiro control sequence"); + } else if (c instanceof AfBase) { + if (this.controls.length) { + throw new Error( + "Invalid spiro control sequence: pre-control functions must be added first", + ); + } + this.preControls.push(c); } else if (c instanceof TerminateInstruction) { this.postControls.push(c); } else { - if (this.postControls.length) throw new Error("Invalid spiro control sequence"); + if (this.postControls.length) { + throw new Error( + "Invalid spiro control sequence: post-control functions must be added last", + ); + } this.controls.push(c); } } @@ -34,7 +42,7 @@ export class SpiroFlattener { } pipe(collector) { - for (const fn of this.preControlFunctions) fn.call(collector); + for (const fn of this.preControls) fn.applyTo(collector); for (const control of this.controls) collector.pushKnot(control); for (const postControl of this.postControls) postControl.applyTo(collector); collector.finish(); @@ -214,6 +222,27 @@ class CoordinatePropagator { /////////////////////////////////////////////////////////////////////////////////////////////////// +/** The "amendmend function" */ +export class AfBase { + applyTo() { + throw new Error("Unimplemented"); + } +} + +export class AfCombine extends AfBase { + constructor(af1, af2) { + super(); + this.af1 = af1; + this.af2 = af2; + } + applyTo(target) { + if (this.af1) this.af1.applyTo(target); + if (this.af2) this.af2.applyTo(target); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + const RES_DEP_STAGE_COORDINATE_PROPOGATION_X = 0; const RES_DEP_STAGE_COORDINATE_PROPOGATION_Y = 1; const RES_DEP_STAGE_INTERPOLATION = 2; @@ -241,7 +270,7 @@ export class UserControlKnot { this.af = af; } applyTo(ctx) { - if (this.af) this.af.call(ctx); + if (this.af) this.af.applyTo(ctx); } getDependency(stage) { @@ -261,7 +290,6 @@ export class UserControlKnot { return this; } resolveCoordiantePropogation(ic, pre, post) { - // console.log(this, ic, pre, post); switch (ic) { case 0: this.x = this.x.resolveX(pre, this, post); @@ -388,7 +416,7 @@ export class DecorInterpolator extends InterpolatorBase { } } -class FunctionInterpolator extends InterpolatorBase { +export class FunctionInterpolator extends InterpolatorBase { constructor(blendFn, extraArgs) { super(); this.blendFn = blendFn; @@ -430,10 +458,6 @@ export class KnotProxyInterpolator extends InterpolatorBase { return this.actual.resolveInterpolation(pre, post); } } - -export function Interpolator(blender, restParameters) { - return new FunctionInterpolator(blender, restParameters); -} export function WithKnotProxy(proxy, actual) { return new KnotProxyInterpolator(proxy, actual); } @@ -448,7 +472,6 @@ export class TerminateInstruction { applyTo(ctx) { if (this.type === "close") ctx.closed = true; if (this.af) throw new Error("Unreachable"); - // if (this.af) this.af.call(ctx); } } diff --git a/packages/geometry/src/spiro-expand.mjs b/packages/geometry/src/spiro-expand.mjs index beb497de3..fa7ca04e7 100644 --- a/packages/geometry/src/spiro-expand.mjs +++ b/packages/geometry/src/spiro-expand.mjs @@ -55,6 +55,11 @@ export class BiKnotCollector { this.lastKnot.proposedNormal = direction; } } + setImportant() { + if (this.lastKnot) { + this.lastKnot.unimportant = 0; + } + } setUnimportant() { if (this.lastKnot) { this.lastKnot.unimportant = 1; diff --git a/packages/geometry/src/spiro-pen-expand.mjs b/packages/geometry/src/spiro-pen-expand.mjs index 45af7dc2a..8456c3392 100644 --- a/packages/geometry/src/spiro-pen-expand.mjs +++ b/packages/geometry/src/spiro-pen-expand.mjs @@ -33,6 +33,7 @@ export class PenKnotCollector { setUnimportant() { if (this.m_lastKnot) this.m_lastKnot.profile = null; } + setImportant() {} // Not used setContrast() {} setProfile(profile) { diff --git a/packages/glyph/package.json b/packages/glyph/package.json index a9a289e4a..627e827de 100644 --- a/packages/glyph/package.json +++ b/packages/glyph/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/glyph", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/glyph.mjs", @@ -9,6 +9,6 @@ "./relation": "./src/relation.mjs" }, "dependencies": { - "@iosevka/geometry": "31.3.0" + "@iosevka/geometry": "31.4.0" } } diff --git a/packages/glyph/src/block.mjs b/packages/glyph/src/block.mjs index 53212c6c4..686119f83 100644 --- a/packages/glyph/src/block.mjs +++ b/packages/glyph/src/block.mjs @@ -1,3 +1,5 @@ +import { Glyph } from "./glyph.mjs"; + export class GlyphBuildExecutor { constructor(recursiveBuildFilter) { this.recursiveBuildFilter = recursiveBuildFilter; @@ -174,3 +176,60 @@ export class GlyphBlock { return this.exports; } } + +/// The class used to handle glyph saving. +export class GlyphSaveSink { + constructor(exec, metrics, store) { + this.exec = exec; + this.metrics = metrics; + this.glyphStore = store; + } + + glyphIsNeeded(name) { + return ( + !this.exec.recursiveBuildFilter || this.exec.recursiveBuildFilter.glyphIsNeeded(name) + ); + } + + save($1, $2, contents) { + // Figure out the glyph name and unicode to save + let saveGlyphName = null; + let unicode = null; + if ($1 && typeof $1 === "string") { + saveGlyphName = $1; + unicode = $2 || 0; + } else if ($1 && typeof $1 === "number") { + saveGlyphName = "uni" + $1.toString(16).padStart(4, "0").toUpperCase(); + unicode = $1; + } + + // If we are in a recursive build run, and the glyph is not needed, skip it + if (saveGlyphName && !this.glyphIsNeeded(saveGlyphName)) return; + + // Create the glyph object & include the contents + const glyphObject = new Glyph(saveGlyphName); + glyphObject.setWidth(this.metrics.Width); + glyphObject.gizmo = this.metrics.GlobalTransform; + glyphObject._m_dependencyManager = this.exec.dependencyManager; + + glyphObject.include(contents, true, true); + + // Set the glyph-to-block dependency + this.exec.setGlyphToBlockDependency(glyphObject); + + // Save the glyph if requested + if (saveGlyphName) { + if (this.glyphStore.queryByName(saveGlyphName)) { + throw new Error(`Duplicate glyph: ${saveGlyphName}`); + } + + this.glyphStore.addGlyph(saveGlyphName, glyphObject); + if (unicode) { + let u = typeof unicode === "string" ? unicode.codePointAt(0) : unicode; + this.glyphStore.encodeGlyph(u, glyphObject); + } + } + + return glyphObject; + } +} diff --git a/packages/glyph/src/store.mjs b/packages/glyph/src/store.mjs index 80209f6ed..68e135cff 100644 --- a/packages/glyph/src/store.mjs +++ b/packages/glyph/src/store.mjs @@ -14,6 +14,11 @@ export class GlyphStore { namedEntries() { return this.nameForward.entries(); } + *namedEntriesWithFilter(fn) { + for (const [name, g] of this.nameForward.entries()) { + if (fn(name, g)) yield [name, g]; + } + } glyphNames() { return this.nameForward.keys(); } diff --git a/packages/param/package.json b/packages/param/package.json index 2322f1af0..2ebc57772 100644 --- a/packages/param/package.json +++ b/packages/param/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/param", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs", @@ -9,6 +9,6 @@ "./metric-override": "./src/metric-override.mjs" }, "dependencies": { - "@iosevka/util": "31.3.0" + "@iosevka/util": "31.4.0" } } diff --git a/packages/util/package.json b/packages/util/package.json index b3657b07c..2e9647cdd 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/util", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs", diff --git a/packages/util/src/index.mjs b/packages/util/src/index.mjs index 9c7985ab5..87f05ab69 100644 --- a/packages/util/src/index.mjs +++ b/packages/util/src/index.mjs @@ -71,13 +71,6 @@ export const SuffixCfg = { for (const item of configs) for (const [k, v] of Object.entries(item)) ans[k] = v; return ans; }, - collect: function (pairs) { - let ans = {}; - for (const pair of pairs) { - if (pair) ans[pair.left] = pair.right; - } - return ans; - }, }; /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/params/variants.toml b/params/variants.toml index 28f0101ec..ed932dae2 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -567,6 +567,13 @@ selectorAffix.A = "curly" selectorAffix."A/sansSerif" = "curly" selectorAffix.AE = "curly" +[prime.capital-a.variants-buildup.stages.body.round-top] +rank = 3 +descriptionAffix = "round top" +selectorAffix.A = "roundTop" +selectorAffix."A/sansSerif" = "roundTop" +selectorAffix.AE = "curly" + [prime.capital-a.variants-buildup.stages.serifs.serifless] rank = 1 descriptionAffix = "serifs" @@ -578,6 +585,7 @@ selectorAffix.AE = "" [prime.capital-a.variants-buildup.stages.serifs.top-serifed] rank = 2 descriptionAffix = "serifs at top" +enableIf = [{ body = "NOT round-top" }] selectorAffix.A = "topSerifed" selectorAffix."A/sansSerif" = "serifless" selectorAffix.AE = "" @@ -592,6 +600,7 @@ selectorAffix.AE = "" [prime.capital-a.variants-buildup.stages.serifs.tri-serifed] rank = 4 descriptionAffix = "serifs at both top and base" +enableIf = [{ body = "NOT round-top" }] selectorAffix.A = "triSerifed" selectorAffix."A/sansSerif" = "serifless" selectorAffix.AE = "" @@ -7704,8 +7713,8 @@ selector.punctuationDot = "square" [prime.braille-dot] -sampler = "⠭⠽ " -hotChars = "⠭⠽" +sampler = "⣝⣑ " +hotChars = "⣝⣑" samplerExplain = "Dot shape in braille" tagKind = "dot" @@ -8116,71 +8125,114 @@ selectorAffix.at = "tall" sampler = "$" tagKind = "symbol" -[prime.dollar.variants.open] +[prime.dollar.variants-buildup] +entry = "height" +descriptionLeader = "Dollar symbol (`$`)" + +[prime.dollar.variants-buildup.stages.height."*"] +next = "shape" + +[prime.dollar.variants-buildup.stages.height.normal] rank = 1 -description = "Dollar symbol with open contour" -selector.dollar = "open" +keyAffix = "" +descriptionAffix = "normal height" +selectorAffix.dollar = "" -[prime.dollar.variants.through] +[prime.dollar.variants-buildup.stages.height.cap] rank = 2 -description = "Dollar symbol with strike-through vertical bar" -selector.dollar = "through" +descriptionAffix = "cap height" +selectorAffix.dollar = "cap" -[prime.dollar.variants.interrupted] +[prime.dollar.variants-buildup.stages.shape."*"] +next = "bar-slope" +mode = "prepend" + +[prime.dollar.variants-buildup.stages.shape.open] +rank = 1 +descriptionAffix = "open contour" +selectorAffix.dollar = "open" + +[prime.dollar.variants-buildup.stages.shape.through] +rank = 2 +descriptionAffix = "strike-through vertical bar" +selectorAffix.dollar = "through" + +[prime.dollar.variants-buildup.stages.shape.interrupted] rank = 3 -description = "Dollar symbol with interrupted strike-through vertical bar" -selector.dollar = "interrupted" +descriptionAffix = "interrupted strike-through vertical bar" +selectorAffix.dollar = "interrupted" -[prime.dollar.variants.open-cap] -rank = 4 -description = "Dollar symbol with open contour, sized not exceeding baseline and ascender" -selector.dollar = "openCap" +[prime.dollar.variants-buildup.stages.bar-slope."*"] +mode = "prepend" -[prime.dollar.variants.through-cap] -rank = 5 -description = "Dollar symbol with strike-through vertical bar, sized not exceeding baseline and ascender" -selector.dollar = "throughCap" - -[prime.dollar.variants.interrupted-cap] -rank = 6 -description = "Dollar symbol with interrupted strike-through vertical bar, sized not exceeding baseline and ascender" -selector.dollar = "interruptedCap" +[prime.dollar.variants-buildup.stages.bar-slope.vertical] +rank = 1 +keyAffix = "" +descriptionAffix = "vertical bar" +selectorAffix.dollar = "" +[prime.dollar.variants-buildup.stages.bar-slope.slanted] +rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "slanted bar" +selectorAffix.dollar = "slanted" [prime.cent] sampler = "¢" tagKind = "symbol" -[prime.cent.variants.open] +[prime.cent.variants-buildup] +entry = "height" +descriptionLeader = "Cent sign (`¢`)" + +[prime.cent.variants-buildup.stages.height."*"] +next = "shape" + +[prime.cent.variants-buildup.stages.height.normal] rank = 1 -description = "Cent sign (`¢`) with open contour" -selector.cent = "open" +keyAffix = "" +descriptionAffix = "normal height" +selectorAffix.cent = "" -[prime.cent.variants.through] +[prime.cent.variants-buildup.stages.height.cap] rank = 2 -description = "Cent sign (`¢`) with vertical bar all through the `c` part" -selector.cent = "through" +descriptionAffix = "cap height" +selectorAffix.cent = "cap" -[prime.cent.variants.bar-interrupted] +[prime.cent.variants-buildup.stages.shape."*"] +mode = "prepend" +next = "bar-slope" + +[prime.cent.variants-buildup.stages.shape.open] +rank = 1 +descriptionAffix = "open contour" +selectorAffix.cent = "open" + +[prime.cent.variants-buildup.stages.shape.through] +rank = 2 +descriptionAffix = "vertical bar all through the `c` part" +selectorAffix.cent = "through" + +[prime.cent.variants-buildup.stages.shape.bar-interrupted] rank = 3 -description = "Cent sign (`¢`) with vertical bar breaks at center" -selector.cent = "interrupted" +descriptionAffix = "vertical bar breaks at center" +selectorAffix.cent = "interrupted" -[prime.cent.variants.open-cap] -rank = 4 -description = "Cent sign (`¢`) with open contour, sized not exceeding baseline and ascender" -selector.cent = "openCap" +[prime.cent.variants-buildup.stages.bar-slope."*"] +mode = "prepend" -[prime.cent.variants.through-cap] -rank = 5 -description = "Cent sign (`¢`) with vertical bar all through the `c` part, sized not exceeding baseline and ascender" -selector.cent = "throughCap" +[prime.cent.variants-buildup.stages.bar-slope.vertical] +rank = 1 +keyAffix = "" +descriptionAffix = "vertical bar" +selectorAffix.cent = "" -[prime.cent.variants.bar-interrupted-cap] -rank = 6 -description = "Cent sign (`¢`) with vertical bar breaks at center, sized not exceeding baseline and ascender" -selector.cent = "interruptedCap" +[prime.cent.variants-buildup.stages.bar-slope.slanted] +rank = 2 +nonBreakingVariantAdditionPriority = 100 +descriptionAffix = "slanted bar" +selectorAffix.cent = "slanted" @@ -8842,15 +8894,16 @@ capital-j = "serifless" a = "double-storey-serifless" d = "toothed-serifless" e = "flat-crossbar" -f = "flat-hook-serifless" +f = "flat-hook-serifless-crossbar-at-x-height" g = "double-storey" i = "hooky" j = "serifed" k = "straight-serifless" l = "zshaped" +t = "bent-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" -long-s = "flat-hook-middle-serifed" +long-s = "flat-hook-middle-serifed-xh" eszet = "longs-s-lig-serifless" lower-eth = "straight-bar" lower-iota = "tailed" @@ -8898,7 +8951,7 @@ a = "double-storey-serifed" b = "toothed-serifed" c = "unilateral-serifed" d = "toothed-serifed" -f = "flat-hook-serifed" +f = "flat-hook-serifed-crossbar-at-x-height" h = "straight-serifed" i = "zshaped" k = "straight-serifed" @@ -8913,7 +8966,7 @@ w = "straight-serifed" x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" -long-s = "flat-hook-double-serifed" +long-s = "flat-hook-double-serifed-xh" eszet = "longs-s-lig-bottom-serifed" lower-iota = "tailed-serifed" lower-mu = "toothed-serifed" @@ -8952,7 +9005,7 @@ a = "double-storey-serifless" c = "unilateral-serifed" d = "toothed-top-serifed" e = "flat-crossbar" -f = "flat-hook-serifed" +f = "flat-hook-serifed-crossbar-at-x-height" i = "serifed" j = "serifed" k = "straight-serifless" @@ -8963,7 +9016,7 @@ w = "straight-flat-top-serifless" x = "straight-serifed" y = "straight-turn-serifless" z = "straight-serifed" -long-s = "flat-hook-double-serifed" +long-s = "flat-hook-double-serifed-xh" eszet = "longs-s-lig-serifless" lower-eth = "straight-bar" lower-iota = "serifed-flat-tailed" @@ -9056,6 +9109,7 @@ i = "serifed" j = "serifed" k = "symmetric-touching-serifless" l = "serifed" +t = "bent-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" @@ -9088,7 +9142,8 @@ brace = "straight" guillemet = "straight" number-sign = "slanted" at = "fourfold" -cent = "through-cap" +dollar = "slanted-through" +cent = "slanted-through-cap" percent = "rings-continuous-slash" question = "corner-flat-hooked" micro-sign = "tailed-serifless" @@ -9174,16 +9229,16 @@ capital-q = "straight" a = "double-storey-serifless" e = "flat-crossbar" d = "toothed-serifless" -f = "flat-hook-serifless" +f = "flat-hook-serifless-crossbar-at-x-height" i = "serifed" j = "flat-hook-serifed" k = "straight-serifless" l = "serifed-flat-tailed" -t = "flat-hook" +t = "flat-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" -long-s = "flat-hook-middle-serifed" +long-s = "flat-hook-middle-serifed-xh" eszet = "longs-s-lig-serifless" lower-eth = "straight-bar" lower-iota = "serifed-flat-tailed" @@ -9234,7 +9289,7 @@ a = "double-storey-serifed" b = "toothed-serifed" c = "unilateral-serifed" d = "toothed-serifed" -f = "flat-hook-serifed" +f = "flat-hook-serifed-crossbar-at-x-height" g = "single-storey-serifed" h = "straight-serifed" k = "straight-serifed" @@ -9250,7 +9305,7 @@ x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" capital-eszet = "rounded-serifed" -long-s = "flat-hook-double-serifed" +long-s = "flat-hook-double-serifed-xh" eszet = "longs-s-lig-bottom-serifed" lower-mu = "tailed-serifed" lower-psi = "flat-top-serifed" @@ -9292,6 +9347,7 @@ j = "serifed" k = "symmetric-touching-serifless" l = "serifed-semi-tailed" r = "corner-hooked-serifed" +t = "bent-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" @@ -9387,12 +9443,13 @@ capital-j = "serifed" a = "double-storey-tailed" d = "toothed-serifless" e = "flat-crossbar" -f = "flat-hook-serifless" +f = "flat-hook-serifless-crossbar-at-x-height" i = "serifed" j = "serifed" k = "straight-serifless" l = "serifed-flat-tailed" r = "hookless-serifless" +t = "bent-hook-short-neck" u = "toothed-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" @@ -9437,7 +9494,7 @@ capital-g = "toothless-corner-serifed-hooked" b = "toothed-serifed" c = "unilateral-serifed" d = "toothed-serifed" -f = "flat-hook-serifed" +f = "flat-hook-serifed-crossbar-at-x-height" g = "single-storey-serifed" h = "straight-serifed" k = "straight-serifed" @@ -9494,10 +9551,11 @@ k = "symmetric-touching-serifless" l = "zshaped" q = "earless-corner-straight-serifless" r = "corner-hooked-serifless" +t = "bent-hook-short-neck" u = "toothed-serifless" w = "straight-flat-top-serifless" y = "straight-turn-serifless" -long-s = "flat-hook-serifless" +long-s = "bent-hook-middle-serifed" eszet = "longs-s-lig-serifless" lower-iota = "zshaped" lower-lambda = "straight-turn" @@ -9549,7 +9607,7 @@ w = "straight-flat-top-serifed" x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" -long-s = "flat-hook-bottom-serifed" +long-s = "bent-hook-double-serifed" eszet = "longs-s-lig-bottom-serifed" lower-mu = "toothed-serifed" cyrl-a = "double-storey-serifed" @@ -9640,6 +9698,8 @@ percent = "dots" micro-sign = "toothed-serifless" lig-ltgteq = "slanted" lig-neq = "slightly-slanted-dotted" +lig-double-arrow-bar = "with-notch" +lig-single-arrow-bar = "with-notch" [composite.ss08.italic] g = "single-storey-serifless" @@ -9721,11 +9781,12 @@ j = "serifed" k = "straight-serifless" l = "serifed-semi-tailed" r = "hookless-serifless" +t = "bent-hook-short-neck" u = "toothed-serifless" w = "straight-flat-top-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" -long-s = "flat-hook-middle-serifed" +long-s = "bent-hook-middle-serifed" eszet = "longs-s-lig-serifless" lower-lambda = "straight-turn" lower-tau = "short-tailed" @@ -9777,7 +9838,7 @@ x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" capital-eszet = "rounded-serifed" -long-s = "flat-hook-double-serifed" +long-s = "bent-hook-double-serifed" eszet = "longs-s-lig-bottom-serifed" cyrl-a = "double-storey-serifed" cyrl-ve = "standard-bilateral-serifed" @@ -9812,6 +9873,7 @@ tag = "ss10" description = "Envy Code R Style" [composite.ss10.design] +capital-a = "round-top-serifless" capital-i = "serifed" capital-j = "serifless" capital-k = "symmetric-touching-serifless" @@ -9829,7 +9891,6 @@ w = "rounded-vertical-sides-serifless" y = "cursive-flat-hook-serifless" long-s = "flat-hook-middle-serifed" eszet = "sulzbacher-serifless" -lower-eth = "straight-bar" lower-delta = "flat-top" lower-iota = "serifed-flat-tailed" lower-lambda = "straight" @@ -9847,11 +9908,13 @@ underscore = "low" guillemet = "straight" at = "threefold" dollar = "through-cap" +cent = "slanted-through" percent = "rings-continuous-slash" pilcrow = "low" micro-sign = "toothless-rounded-serifless" [composite.ss10.italic] +capital-a = "straight-serifless" a = "single-storey-tailed" i = "serifed-flat-tailed" j = "serifed" @@ -9860,6 +9923,7 @@ cyrl-a = "single-storey-tailed" cyrl-u = "cursive-flat-hook-serifless" [composite.ss10.slab-override.design] +capital-a = "round-top-base-serifed" capital-j = "serifed" capital-k = "symmetric-touching-serifed" capital-w = "straight-vertical-sides-serifed" @@ -9882,6 +9946,7 @@ seven = "straight-serifed" micro-sign = "toothless-rounded-serifed" [composite.ss10.slab-override.italic] +capital-a = "straight-base-serifed" g = "single-storey-flat-hook-serifless" i = "serifed-flat-tailed" k = "symmetric-connected-top-left-and-bottom-right-serifed" @@ -9953,6 +10018,7 @@ n = "earless-corner-straight-serifless" p = "earless-corner-serifless" q = "earless-corner-straight-serifless" r = "earless-corner-serifless" +t = "bent-hook-short-neck" u = "toothless-corner-serifless" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" @@ -10089,7 +10155,7 @@ r = "corner-hooked-serifless" t = "bent-hook-short-neck2" u = "toothed-serifless" y = "straight-turn-serifless" -long-s = "flat-hook-middle-serifed" +long-s = "bent-hook-middle-serifed" eszet = "longs-s-lig-serifless" lower-iota = "tailed" lower-lambda = "straight-turn" @@ -10147,7 +10213,7 @@ w = "straight-serifed" x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" -long-s = "flat-hook-double-serifed" +long-s = "bent-hook-double-serifed" eszet = "longs-s-lig-bottom-serifed" lower-iota = "tailed-serifed" lower-mu = "toothed-serifed" @@ -10184,7 +10250,7 @@ i = "serifed" j = "flat-hook-serifed" k = "symmetric-connected-serifless" l = "serifed-flat-tailed" -t = "flat-hook" +t = "flat-hook-short-neck" u = "toothless-rounded-serifless" w = "straight-flat-top-serifless" y = "straight-serifless" @@ -10307,20 +10373,20 @@ capital-j = "serifed" capital-m = "hanging-serifless" a = "double-storey-tailed" d = "toothed-serifless" -f = "flat-hook-serifed" +f = "flat-hook-serifed-crossbar-at-x-height" g = "double-storey" i = "serifed" j = "flat-hook-serifed" k = "straight-serifless" l = "serifed" r = "hookless-serifed" -t = "flat-hook" +t = "flat-hook-short-neck" u = "toothed-serifless" w = "straight-flat-top-serifless" x = "straight-serifless" y = "straight-turn-serifless" capital-eszet = "corner-serifless" -long-s = "flat-hook-double-serifed" +long-s = "flat-hook-double-serifed-xh" eszet = "traditional-flat-hook-serifless" lower-delta = "flat-top" lower-iota = "serifed-flat-tailed" @@ -10360,20 +10426,20 @@ micro-sign = "toothed-serifless" [composite.ss15.italic] a = "single-storey-tailed" -f = "flat-hook-diagonal-tailed" +f = "flat-hook-diagonal-tailed-crossbar-at-x-height" g = "single-storey-serifless" i = "serifed-diagonal-tailed" j = "diagonal-tailed-serifed" k = "diagonal-tailed-cursive-serifless" l = "serifed-diagonal-tailed" r = "hookless-top-serifed" -t = "diagonal-tailed" +t = "diagonal-tailed-short-neck" v = "cursive-serifed" w = "cursive-serifless" x = "cursive" y = "cursive-serifless" z = "cursive" -long-s = "flat-hook-diagonal-tailed-middle-serifed" +long-s = "flat-hook-diagonal-tailed-middle-serifed-xh" lower-iota = "serifed-diagonal-tailed" lower-tau = "diagonal-tailed" cyrl-a = "single-storey-tailed" @@ -10456,7 +10522,7 @@ t = "bent-hook-short-neck2" u = "toothed-serifed" y = "straight-turn-serifless" capital-eszet = "rounded-serifless" -long-s = "flat-hook-middle-serifed" +long-s = "bent-hook-middle-serifed" eszet = "longs-s-lig-middle-serifed" lower-thorn = "motion-serifed" capital-gamma = "serifed" @@ -10503,6 +10569,7 @@ capital-d = "more-rounded-bilateral-serifed" capital-k = "symmetric-connected-serifed" capital-l = "serifed" capital-m = "hanging-serifed" +a = "double-storey-hook-inward-serifed-serifed" h = "straight-serifed" k = "straight-serifed" m = "serifed" @@ -10516,10 +10583,11 @@ x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" capital-eszet = "rounded-serifed" -long-s = "flat-hook-double-serifed" +long-s = "bent-hook-double-serifed" eszet = "longs-s-lig-dual-serifed" lower-thorn = "serifed" lower-mu = "toothed-serifed" +cyrl-a = "double-storey-hook-inward-serifed-serifed" cyrl-ve = "standard-bilateral-serifed" cyrl-ka = "symmetric-connected-serifed" cyrl-em = "hanging-serifed" @@ -10570,7 +10638,7 @@ m = "serifless" n = "straight-serifless" r = "hookless-serifed" s = "serifless" -t = "flat-hook" +t = "flat-hook-short-neck" v = "straight-serifless" w = "straight-serifless" x = "straight-serifless" @@ -10660,6 +10728,7 @@ capital-r = "straight-serifed" capital-s = "bilateral-inward-serifed" capital-u = "toothed-serifed" capital-z = "straight-serifed" +a = "double-storey-hook-inward-serifed-tailed" b = "toothed-serifed" c = "unilateral-inward-serifed" h = "straight-serifed" @@ -10676,6 +10745,7 @@ capital-eszet = "corner-serifed" long-s = "bent-hook-bottom-serifed" eszet = "longs-s-lig-bottom-serifed" capital-thorn = "serifed" +cyrl-a = "double-storey-hook-inward-serifed-tailed" cyrl-ze = "unilateral-inward-serifed" cyrl-capital-ka = "symmetric-connected-serifed" cyrl-ka = "symmetric-connected-serifed" @@ -10691,6 +10761,7 @@ micro-sign = "tailed-serifed" [composite.ss17.slab-override.italic] capital-u = "toothed-motion-serifed" +a = "single-storey-tailed" b = "toothless-corner-serifed" h = "tailed-motion-serifed" k = "cursive-top-left-and-bottom-right-serifed" @@ -10704,6 +10775,7 @@ y = "cursive-motion-serifed" z = "cursive" long-s = "bent-hook-descending" eszet = "longs-s-lig-descending-serifless" +cyrl-a = "single-storey-tailed" cyrl-ze = "unilateral-bottom-inward-serifed" cyrl-ka = "symmetric-connected-top-left-and-bottom-right-serifed" cyrl-u = "cursive-motion-serifed" @@ -10734,7 +10806,7 @@ l = "serifed" q = "earless-corner-straight-serifless" u = "toothed-serifless" y = "straight-turn-serifless" -long-s = "flat-hook-middle-serifed-xh" +long-s = "bent-hook-middle-serifed-xh" eszet = "longs-s-lig-serifless" lower-alpha = "barred-tailed" lower-gamma = "straight" @@ -10771,7 +10843,7 @@ micro-sign = "tailed-serifless" [composite.ss18.italic] f = "extended-crossbar-at-x-height" -long-s = "flat-hook-descending-middle-serifed-xh" +long-s = "bent-hook-descending-middle-serifed-xh" eszet = "longs-s-lig-descending-serifless" [composite.ss18.slab-override.design] @@ -10787,7 +10859,7 @@ u = "toothed-serifed" x = "straight-serifed" y = "straight-turn-serifed" z = "straight-serifed" -long-s = "flat-hook-double-serifed-xh" +long-s = "bent-hook-double-serifed-xh" eszet = "longs-s-lig-bottom-serifed" lower-alpha = "barred-tailed-serifed" lower-upsilon = "straight-serifed" @@ -10809,7 +10881,7 @@ k = "symmetric-connected-top-left-and-bottom-right-serifed" u = "toothed-motion-serifed" x = "straight-bilateral-motion-serifed" y = "straight-turn-motion-serifed" -long-s = "flat-hook-descending-middle-serifed-xh" +long-s = "bent-hook-descending-middle-serifed-xh" eszet = "longs-s-lig-descending-serifless" lower-alpha = "barred-tailed" cyrl-ve = "standard-unilateral-serifed" diff --git a/tools/amend-readme/package.json b/tools/amend-readme/package.json index 4497ef800..8be957dfe 100644 --- a/tools/amend-readme/package.json +++ b/tools/amend-readme/package.json @@ -1,13 +1,13 @@ { "name": "@iosevka/amend-readme", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "31.3.0", + "@iosevka/param": "31.4.0", "@unicode/unicode-15.1.0": "^1.5.2" } } diff --git a/tools/data-export/package.json b/tools/data-export/package.json index 2c714d0b7..10dac0b2f 100644 --- a/tools/data-export/package.json +++ b/tools/data-export/package.json @@ -1,6 +1,6 @@ { "name": "@iosevka/data-export", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs", @@ -10,7 +10,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@iosevka/param": "31.3.0", + "@iosevka/param": "31.4.0", "@unicode/unicode-15.1.0": "^1.5.2", "cldr": "^7.5.0" } diff --git a/tools/generate-samples/package.json b/tools/generate-samples/package.json index 30a73c7e7..11eebd0e8 100644 --- a/tools/generate-samples/package.json +++ b/tools/generate-samples/package.json @@ -1,11 +1,11 @@ { "name": "@iosevka/generate-samples", - "version": "31.3.0", + "version": "31.4.0", "private": true, "exports": { ".": "./src/index.mjs" }, "dependencies": { - "@iosevka/data-export": "31.3.0" + "@iosevka/data-export": "31.4.0" } } diff --git a/tools/misc/package.json b/tools/misc/package.json index 1d5b007fb..bb491cf9a 100644 --- a/tools/misc/package.json +++ b/tools/misc/package.json @@ -1,10 +1,10 @@ { "name": "@iosevka/misc", - "version": "31.3.0", + "version": "31.4.0", "private": true, "dependencies": { "semver": "^7.6.3", "wawoff2": "^2.0.1", - "@iosevka/util": "31.3.0" + "@iosevka/util": "31.4.0" } } diff --git a/tools/misc/src/generate-release-sha-file.mjs b/tools/misc/src/generate-release-sha-file.mjs index 0b79b2fc5..c1a9c2da0 100644 --- a/tools/misc/src/generate-release-sha-file.mjs +++ b/tools/misc/src/generate-release-sha-file.mjs @@ -4,27 +4,10 @@ import crypto from "crypto"; import fs from "fs"; import path from "path"; -import { glob } from "glob"; - -setTimeout( - () => - main().catch(e => { - console.error(e); - process.exit(1); - }), - 0, -); - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -async function main() { - const sourcesPattern = process.argv[2]; - const outPath = process.argv[3]; - +export default async function main(fromPaths, outPath) { const o = fs.createWriteStream(outPath); - const zipFilesToArchive = (await glob(sourcesPattern)).sort(); - for (const filePath of zipFilesToArchive) { + for (const filePath of fromPaths) { console.log(`Checking ${filePath}...`); o.write(`${await hashFile(filePath)}\t${path.basename(filePath)}\n`); } diff --git a/verdafile.mjs b/verdafile.mjs index ba99eb895..a5c507c2d 100644 --- a/verdafile.mjs +++ b/verdafile.mjs @@ -14,7 +14,7 @@ import which from "which"; export const build = Verda.create(); const { task, file, oracle, computed } = build.ruleTypes; const { de, fu, sfu, ofu } = build.rules; -const { run, node, cd, cp, rm, fail, echo, silently, absolutelySilently } = build.actions; +const { run, node, cd, cp, rm, mv, fail, echo, silently, absolutelySilently } = build.actions; const { FileList } = build.predefinedFuncs; /////////////////////////////////////////////////////////// @@ -611,11 +611,19 @@ function formatSuffix(fmt, unhinted) { const DistWoff2 = file.make( (gr, fn, unhinted) => `${DIST}/${gr}/${formatSuffix("WOFF2", unhinted)}/${fn}.woff2`, async (target, out, group, f, unhinted) => { + const [rp] = await target.need(RawPlans); const Ctor = unhinted ? DistUnhintedTTF : DistHintedTTF; - const [from] = await target.need(Ctor(group, f), de`${out.dir}`); + echo.action(echo.hl.command("Create WOFF2"), out.full, echo.hl.operator("<-"), from.full); - await silently.node(`tools/misc/src/ttf-to-woff2.mjs`, from.full, out.full); + if (rp.buildOptions && rp.buildOptions.woff2CompressApp) { + // woff2_compress does not support specifying output file name. + // Thus we need to move it after compression. + await absolutelySilently.run(rp.buildOptions.woff2CompressApp, from.full); + await mv(`${from.dir}/${from.name}.woff2`, out.full); + } else { + await silently.node(`tools/misc/src/ttf-to-woff2.mjs`, from.full, out.full); + } }, ); @@ -1284,7 +1292,7 @@ const CleanDist = task(`clean-dist`, async () => { const Release = task(`release`, async target => { await target.need(ReleaseAncillary); - await target.need(ReleaseArchives); + await target.need(ReleaseArchives, ReleaseSha256Text); }); const ReleaseAncillary = task(`release:ancillary`, async target => { @@ -1299,7 +1307,16 @@ const ReleaseArchives = task(`release:archives`, async target => { goals.push(ReleaseArchivesFor(cgr)); } - await target.need(goals); + const [archiveFiles] = await target.need(goals); + return archiveFiles.flat(1); +}); +const ReleaseSha256Text = file(`${ARCHIVE_DIR}/SHA-256.txt`, async (target, out) => { + const [files] = await target.need(ReleaseArchives); + await node( + `tools/misc/src/generate-release-sha-file.mjs`, + files.map(f => f.full), + out.full, + ); }); const ReleaseArchivesFor = task.group(`release:archives-for`, async (target, cgr) => { @@ -1386,7 +1403,7 @@ const CompiledJsFromPtl = file.make( await target.need(MacroPtlFiles, sfu(ptl)); echo.action(echo.hl.command("Compile Script"), ptl); - await Promise.all([rm(oldOutPath), rm(out.full)]); // Remove old output file + await rm(oldOutPath); // Remove old output file await target.need(de(Path.dirname(out.full))); // Create output directory await silently.run(PATEL_C, "--strict", "--esm", ptl, "-o", out.full); },