Skip to content

Commit 630a5fe

Browse files
createFontStack: Ensure provided size-adjust is factored into overrides (#199)
1 parent f55acae commit 630a5fe

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

.changeset/sour-mayflies-visit.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
'@capsizecss/core': patch
3+
---
4+
5+
createFontStack: Ensure provided \`size-adjust\` is factored into metric overrides
6+
7+
Ensures a custom `size-adjust` value provided via the `fontFaceProperties` option is factored into the calculations for the metric overrides.
8+
9+
#### Example
10+
11+
If a custom `size-adjust` value is provided:
12+
13+
```ts
14+
createFontStack(
15+
[ merriweatherSans, arial ],
16+
{
17+
fontFaceProperties: {
18+
sizeAdjust: '300%'
19+
}
20+
},
21+
)
22+
```
23+
24+
The resulting metric overrides are now adjusted accordingly:
25+
26+
```diff
27+
@font-face {
28+
font-family: "Merriweather Sans Fallback";
29+
src: local('Arial');
30+
- ascent-override: 92.3409%;
31+
+ ascent-override: 32.8%;
32+
- descent-override: 25.619%;
33+
+ descent-override: 9.1%;
34+
line-gap-override: 0%;
35+
size-adjust: 300%;
36+
}
37+
```

packages/core/src/createFontStack.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -509,10 +509,10 @@ describe('createFontStack', () => {
509509
"fontFaces": "@font-face {
510510
font-family: "Merriweather Sans Fallback";
511511
src: local('Arial');
512-
size-adjust: 300%;
513-
ascent-override: 92.3409%;
514-
descent-override: 25.619%;
512+
ascent-override: 32.8%;
513+
descent-override: 9.1%;
515514
line-gap-override: 0%;
515+
size-adjust: 300%;
516516
}",
517517
"fontFamily": ""Merriweather Sans", "Merriweather Sans Fallback", Arial",
518518
}

packages/core/src/createFontStack.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { round } from './round';
33
import type { FontMetrics, SupportedSubset } from './types';
44

55
const toPercentString = (value: number) => `${round(value * 100)}%`;
6+
const fromPercentString = (value: string) => parseFloat(value) / 100;
67

78
export const toCssProperty = (property: string) =>
89
property.replace(/([A-Z])/g, (property) => `-${property.toLowerCase()}`);
@@ -40,23 +41,29 @@ interface OverrideValuesParams {
4041
metrics: FontStackMetrics;
4142
fallbackMetrics: FontStackMetrics;
4243
subset: SupportedSubset;
44+
sizeAdjust?: AtRule.FontFace['sizeAdjust'];
4345
}
4446
const calculateOverrideValues = ({
4547
metrics,
4648
fallbackMetrics,
4749
subset,
50+
sizeAdjust: sizeAdjustOverride,
4851
}: OverrideValuesParams): AtRule.FontFace => {
4952
// Calculate size adjust
5053
const preferredFontXAvgRatio =
5154
resolveXWidthAvg(metrics, subset) / metrics.unitsPerEm;
5255
const fallbackFontXAvgRatio =
5356
resolveXWidthAvg(fallbackMetrics, subset) / fallbackMetrics.unitsPerEm;
5457

55-
const sizeAdjust =
58+
const calculatedSizeAdjust =
5659
preferredFontXAvgRatio && fallbackFontXAvgRatio
5760
? preferredFontXAvgRatio / fallbackFontXAvgRatio
5861
: 1;
5962

63+
const sizeAdjust = sizeAdjustOverride
64+
? fromPercentString(sizeAdjustOverride)
65+
: calculatedSizeAdjust;
66+
6067
const adjustedEmSquare = metrics.unitsPerEm * sizeAdjust;
6168

6269
// Calculate metric overrides for preferred font
@@ -185,12 +192,14 @@ type FontFaceFormatObject = {
185192
const resolveOptions = (options: Parameters<typeof createFontStack>[1]) => {
186193
const fontFaceFormat = options?.fontFaceFormat ?? 'styleString';
187194
const subset = options?.subset ?? 'latin';
188-
const fontFaceProperties = options?.fontFaceProperties ?? {};
195+
const { sizeAdjust, ...fontFaceProperties } =
196+
options?.fontFaceProperties ?? {};
189197

190198
return {
191199
fontFaceFormat,
192200
subset,
193201
fontFaceProperties,
202+
sizeAdjust,
194203
} as const;
195204
};
196205

@@ -206,7 +215,7 @@ export function createFontStack(
206215
[metrics, ...fallbackMetrics]: FontStackMetrics[],
207216
optionsArg: CreateFontStackOptions = {},
208217
) {
209-
const { fontFaceFormat, fontFaceProperties, subset } =
218+
const { fontFaceFormat, fontFaceProperties, sizeAdjust, subset } =
210219
resolveOptions(optionsArg);
211220
const { familyName } = metrics;
212221

@@ -230,10 +239,8 @@ export function createFontStack(
230239
metrics,
231240
fallbackMetrics: fallback,
232241
subset,
242+
sizeAdjust,
233243
}),
234-
...(fontFaceProperties?.sizeAdjust
235-
? { sizeAdjust: fontFaceProperties.sizeAdjust }
236-
: {}),
237244
},
238245
});
239246
});

0 commit comments

Comments
 (0)