Skip to content

Commit 1a3ec94

Browse files
authored
fix: apply theme font family to text surfaces and geoms (#54)
2 parents fb062e4 + bc2b95b commit 1a3ec94

11 files changed

Lines changed: 217 additions & 111 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- feat: `labs()` fields default to `auto`; pass `none` to suppress an axis or legend title and reclaim the space it reserved. (#12)
1313
- feat: `element-blank()` on a text surface (axis, plot, or legend title) collapses the space the text would reserve. (#12)
1414
- feat: `width`/`height` accept `auto` to fill the available space of a bounded container. (#10)
15+
- fix: the `font` set on `element-text`/`element-typst`/`element-geom` is applied to every text surface and to the text-drawing geoms, inheriting the base `text` font when unset. (#54)
1516
- fix: a `stage`/`after-scale` channel now trains its scale on the marker's source column, so the closure receives the channel's scale-resolved value as documented. (#52)
1617
- fix: grouped geoms (e.g., `geom-smooth`) no longer panic when a grouping aesthetic is mapped via `after-scale` or `stage`. (#51)
1718
- fix: facet-grid legends reserve space for a secondary x-axis so a top legend no longer overlaps its ticks. (#46)

src/geom/label.typ

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@
215215

216216
let g-defaults = geom-defaults(ctx.theme)
217217
let theme-colour = geom-colour-default(g-defaults)
218+
// `none` font keeps the document font; only pass `text(font: ...)` when set.
219+
let font-args = if g-defaults.font != none { (font: g-defaults.font) } else {
220+
(:)
221+
}
218222
let (default-colour, default-fill) = resolve-pair-defaults(
219223
layer,
220224
mapping,
@@ -270,7 +274,7 @@
270274
stroke: stroke-spec,
271275
inset: layer.params.inset,
272276
radius: layer.params.radius,
273-
text(size: text-size, fill: text-paint)[#label],
277+
text(size: text-size, fill: text-paint, ..font-args)[#label],
274278
)
275279
if state.segment-on {
276280
draw-segment(idx, state.placements.at(idx), state.aabbs, state.seg-cfg)

src/geom/text.typ

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,12 @@
189189
let y-trained = ctx.trained.at("y", default: none)
190190
if x-trained == none or y-trained == none { return }
191191

192-
let theme-colour = geom-colour-default(geom-defaults(ctx.theme))
192+
let g-defaults = geom-defaults(ctx.theme)
193+
let theme-colour = geom-colour-default(g-defaults)
194+
// `none` font keeps the document font; only pass `text(font: ...)` when set.
195+
let font-args = if g-defaults.font != none { (font: g-defaults.font) } else {
196+
(:)
197+
}
193198
let label-typst = layer
194199
.at("typst-marks", default: (:))
195200
.at("label", default: false)
@@ -224,7 +229,7 @@
224229
}
225230
cetz.draw.content(
226231
centre,
227-
text(size: text-size, fill: colour)[#label],
232+
text(size: text-size, fill: colour, ..font-args)[#label],
228233
anchor: layer.params.anchor,
229234
)
230235
}

src/legend.typ

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#import "utils/level-resolve.typ": resolve-level
1717
#import "theme/defaults.typ": resolve-colour
1818
#import "theme/theme.typ": (
19-
_line-stroke, _rect-outset-cm, _rect-style, _text-style,
19+
_line-stroke, _rect-outset-cm, _rect-style, _text-args, _text-style,
2020
)
2121
#import "guide/draw-key.typ": default-key-for, draw-glyph
2222
#import "scale/train.typ": mapping-display-name
@@ -1044,19 +1044,15 @@
10441044
}
10451045
cetz.draw.content(
10461046
(tx, cursor),
1047-
text(
1048-
size: s.size,
1049-
fill: s.fill,
1050-
weight: s.weight,
1051-
)[#resolve-prose(title, eval-strings: s.typst)],
1047+
text(.._text-args(s))[#resolve-prose(title, eval-strings: s.typst)],
10521048
anchor: t-anchor,
10531049
)
10541050
}
10551051

10561052
#let _draw-swatch(guide, ctx, ox, cursor, theme, title-h) = {
10571053
let ink = resolve-colour(theme, "ink")
10581054
let _legend-text = _text-style(theme, "legend-text")
1059-
let text-colour = _legend-text.fill
1055+
let legend-text-args = _text-args(_legend-text)
10601056
let text-size = _legend-text.size
10611057
let size-pt = text-size / 1pt
10621058
let line-h = _swatch-line-h-cm(size-pt)
@@ -1111,7 +1107,7 @@
11111107
let (lx, l-anchor) = _hjust-right-of(align, label-start, slot-w)
11121108
cetz.draw.content(
11131109
(lx, cm),
1114-
text(size: text-size, fill: text-colour)[#label-text],
1110+
text(..legend-text-args)[#label-text],
11151111
anchor: l-anchor,
11161112
)
11171113
}
@@ -1120,7 +1116,7 @@
11201116
#let _draw-size-ladder(guide, ctx, ox, cursor, theme, title-h) = {
11211117
let ink = resolve-colour(theme, "ink")
11221118
let _legend-text = _text-style(theme, "legend-text")
1123-
let text-colour = _legend-text.fill
1119+
let legend-text-args = _text-args(_legend-text)
11241120
let text-size = _legend-text.size
11251121
let size-pt = text-size / 1pt
11261122
let line-h = _ladder-line-h-cm(size-pt)
@@ -1157,7 +1153,7 @@
11571153
let (lx, l-anchor) = _hjust-below(align, cx)
11581154
cetz.draw.content(
11591155
(lx, cy - glyph-size * 2 - 0.1),
1160-
text(size: text-size, fill: text-colour)[#break-text],
1156+
text(..legend-text-args)[#break-text],
11611157
anchor: l-anchor,
11621158
)
11631159
}
@@ -1202,7 +1198,7 @@
12021198
)
12031199
cetz.draw.content(
12041200
(lx, cm),
1205-
text(size: text-size, fill: text-colour)[#break-text],
1201+
text(..legend-text-args)[#break-text],
12061202
anchor: l-anchor,
12071203
)
12081204
}
@@ -1240,7 +1236,7 @@
12401236
let trained = ctx.trained.at(bar-aes)
12411237
let ink = resolve-colour(theme, "ink")
12421238
let _legend-text = _text-style(theme, "legend-text")
1243-
let text-colour = _legend-text.fill
1239+
let legend-text-args = _text-args(_legend-text)
12441240
let text-size = _legend-text.size
12451241
let size-pt = text-size / 1pt
12461242
let (lo, hi) = guide.domain
@@ -1361,7 +1357,7 @@
13611357
}
13621358
cetz.draw.content(
13631359
label-pos,
1364-
text(size: text-size, fill: text-colour)[#tick-text],
1360+
text(..legend-text-args)[#tick-text],
13651361
anchor: label-anchor,
13661362
)
13671363
}

0 commit comments

Comments
 (0)