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:
-📦 Iosevka — Monospace, Default Super TTC TTC
+📦 Iosevka — Monospace, Default Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka Slab — Monospace, Slab-serif Super TTC TTC
+ ├ Iosevka Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka Slab — Monospace, Slab-serif Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka Slab Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term Slab Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed Slab Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka Curly — Monospace, Curly Style Super TTC TTC
+ ├ Iosevka Slab Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term Slab Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed Slab Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka Curly — Monospace, Curly Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka Curly Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term Curly Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed Curly Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka Curly Slab — Monospace, Curly Style, Slab-serif Super TTC TTC
+ ├ Iosevka Curly Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term Curly Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed Curly Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka Curly Slab — Monospace, Curly Style, Slab-serif Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka Curly Slab Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term Curly Slab Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed Curly Slab Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS01 — Monospace, Andale Mono Style Super TTC TTC
+ ├ Iosevka Curly Slab Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term Curly Slab Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed Curly Slab Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS01 — Monospace, Andale Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS01 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS01 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS01 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS02 — Monospace, Anonymous Pro Style Super TTC TTC
+ ├ Iosevka SS01 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS01 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS01 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS02 — Monospace, Anonymous Pro Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS02 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS02 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS02 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS03 — Monospace, Consolas Style Super TTC TTC
+ ├ Iosevka SS02 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS02 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS02 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS03 — Monospace, Consolas Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS03 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS03 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS03 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS04 — Monospace, Menlo Style Super TTC TTC
+ ├ Iosevka SS03 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS03 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS03 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS04 — Monospace, Menlo Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS04 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS04 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS04 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS05 — Monospace, Fira Mono Style Super TTC TTC
+ ├ Iosevka SS04 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS04 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS04 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS05 — Monospace, Fira Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS05 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS05 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS05 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS06 — Monospace, Liberation Mono Style Super TTC TTC
+ ├ Iosevka SS05 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS05 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS05 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS06 — Monospace, Liberation Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS06 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS06 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS06 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS07 — Monospace, Monaco Style Super TTC TTC
+ ├ Iosevka SS06 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS06 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS06 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS07 — Monospace, Monaco Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS07 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS07 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS07 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS08 — Monospace, Pragmata Pro Style Super TTC TTC
+ ├ Iosevka SS07 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS07 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS07 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS08 — Monospace, Pragmata Pro Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS08 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS08 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS08 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS09 — Monospace, Source Code Pro Style Super TTC TTC
+ ├ Iosevka SS08 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS08 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS08 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS09 — Monospace, Source Code Pro Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS09 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS09 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS09 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS10 — Monospace, Envy Code R Style Super TTC TTC
+ ├ Iosevka SS09 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS09 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS09 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS10 — Monospace, Envy Code R Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS10 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS10 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS10 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS11 — Monospace, X Windows Fixed Style Super TTC TTC
+ ├ Iosevka SS10 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS10 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS10 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS11 — Monospace, X Windows Fixed Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS11 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS11 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS11 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS12 — Monospace, Ubuntu Mono Style Super TTC TTC
+ ├ Iosevka SS11 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS11 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS11 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS12 — Monospace, Ubuntu Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS12 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS12 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS12 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS13 — Monospace, Lucida Style Super TTC TTC
+ ├ Iosevka SS12 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS12 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS12 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS13 — Monospace, Lucida Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS13 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS13 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS13 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS14 — Monospace, JetBrains Mono Style Super TTC TTC
+ ├ Iosevka SS13 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS13 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS13 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS14 — Monospace, JetBrains Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS14 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS14 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS14 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS15 — Monospace, IBM Plex Mono Style Super TTC TTC
+ ├ Iosevka SS14 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS14 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS14 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS15 — Monospace, IBM Plex Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS15 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS15 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS15 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS16 — Monospace, PT Mono Style Super TTC TTC
+ ├ Iosevka SS15 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS15 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS15 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS16 — Monospace, PT Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS16 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS16 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS16 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS17 — Monospace, Recursive Mono Style Super TTC TTC
+ ├ Iosevka SS16 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS16 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS16 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS17 — Monospace, Recursive Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS17 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS17 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS17 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
-📦 Iosevka SS18 — Monospace, Input Mono Style Super TTC TTC
+ ├ Iosevka SS17 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS17 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS17 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
+📦 Iosevka SS18 — Monospace, Input Mono Style Super TTC TTC
└ Sub-packages Spacing Ligatures Downloads
- ├ Iosevka SS18 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- ├ Iosevka Term SS18 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
- └ Iosevka Fixed SS18 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
+ ├ Iosevka SS18 Default Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ ├ Iosevka Term SS18 Terminal Yes Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+ └ Iosevka Fixed SS18 Fixed No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
📦 Iosevka Aile — Quasi-proportional, Sans-serif
└ Sub-packages Spacing Ligatures Downloads
- └ Iosevka Aile Default No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
+ └ Iosevka Aile Default No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
+
📦 Iosevka Etoile — Quasi-proportional, Slab-serif
└ Sub-packages Spacing Ligatures Downloads
- └ Iosevka Etoile Default No Super TTC TTC TTF (Unhinted )WebFont (Unhinted )
-
+ └ Iosevka Etoile Default No Super TTC TTC TTF (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
capital-a = 'straight-serifless'
, cv11 = 1
A
with straight shape; without serifs (default for Sans)
@@ -529,6 +529,10 @@ Subsection `variants` is used to configure character variants in the font. Prope
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
braille-dot = 'round'
, VDAD = 1
@@ -3283,36 +3287,60 @@ Subsection `variants` is used to configure character variants in the font. Prope
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);
},