Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problems with axes with custom font size + Discrepancies in font rendering across browsers #3889

Closed
m-gallesio opened this issue Oct 3, 2024 · 1 comment
Labels

Comments

@m-gallesio
Copy link

Operating system: Microsoft Windows 10 Pro - 10.0.19045 Build 19045
Browser: Firefox 130.0.1 / Edge 129.0.2792.65

1. Custom font size in axis labels

We use custom CSS to slightly increase the font size used in charts. Of course the library is not designed for this, so this change can cause oddities when calculating the size and spacing of text elements. I noticed this in particular for axis labels, where some text can even end up truncated.

Firefox:
actual_firefox_nofix
Edge:
actual_edge_nofix

After some digging through the code I found the logic which determines the font size at AxisRendererHelper.getSizeFor1Char:

static getSizeFor1Char(node: d3Selection): {w: number, h: number} {
// default size for one character
const size = {
w: 5.5,
h: 11.5
};
const text = node.select("text");
!text.empty() && text
.text("0")
.call((el: d3Selection) => {
try {
const {width, height} = el.node().getBBox();
if (width && height) {
size.w = width;
size.h = height;
}
} finally {
el.text("");
}
});
this.getSizeFor1Char = () => size;
return size;
}

I assume the memoization at line 60 is meant to increase performance, but by removing it the issue gets fixed.

Firefox:
actual_firefox_fix

Edge:
actual_edge_fix

Note the lack of truncation in the Edge version, as well as the increased line spacing in both browsers (and the fact that lines get overlapped in Firefox, but that's another issue).

I could not find a way to monkeypatch this method since it's in an internal class. Of course removing the line would cause a performance degradation which could be siginificant in more complex use cases.

2. Discrepancies in font rendering

Related to the above, I noticed Firefox renders fonts differently from Chromium which means labels often end up slightly larger and cause more line breaks.
Additionally, there seem to be some inconsistencies in the interpretation of padding.left + axis.x.tick.width (related to #3550).
This happens regardless of whether a custom font size is set.

Firefox:
demo_firefox

Edge:
demo_edge

Source:
custom_font_size_demo.zip

Ideally the rendering of labels should be more consistent, but I acknowledge this could be outside the technical possibilities of this library.

@netil
Copy link
Member

netil commented Oct 7, 2024

Hi @m-gallesio,

  1. Custom font size in axis labels

As your examination, after evaluating each axes tick text dimension, will get memoized for performance issue.
But it doesn't iterate for all ticks to get the text dimension.

Probably providing an option to let user can control the way to evaluate text dimension will solve the issue.

  1. Discrepancies in font rendering

Tested on below browser with the example you provided, and each browser evaluated differently the text dimension.
So, having some discrepancies among browsers is inevitable.

  • Chrome v129.0.6668.90: w: 6.3046875, h: 12
  • Safari v18.0.1: w: 5.5625, h: 11.515625
  • Firefox v131: w: 8.300000190734863, h: 12

netil pushed a commit to netil/billboard.js that referenced this issue Oct 7, 2024
Implement axis text's size evaluation option

Ref naver#3889
@netil netil closed this as completed in 87048e9 Oct 7, 2024
github-actions bot pushed a commit that referenced this issue Oct 11, 2024
# [3.14.0-next.1](3.13.0...3.14.0-next.1) (2024-10-11)

### Bug Fixes

* **api:** Fix to return indexed categories ([55c17c6](55c17c6)), closes [#3365](#3365)
* **axis:** fix error when showing tick only ([705947f](705947f)), closes [#3881](#3881)
* **bar:** Fix stacking bar position on multiple xs ([216da62](216da62)), closes [#3372](#3372)
* **candlestick:** Fix rendering on rotated axis ([17f5058](17f5058)), closes [#3387](#3387)
* **clip:** Fix x axis hide on title.bottom ([beec1bb](beec1bb)), closes [#3364](#3364)
* **event:** Fix interaction with viewBox ([243bf3c](243bf3c)), closes [#3414](#3414)
* **input:** Fix touch/mouse input detection ([3d4392a](3d4392a)), closes [#3854](#3854)
* **option:** Fix inconsistency of padding ([0c1ce81](0c1ce81)), closes [#3426](#3426)
* **shape:** Fix circleY() undefined error ([f4ac3f1](f4ac3f1)), closes [#3388](#3388)
* **size:** Fix legend overflows with padding fit mode ([8357d11](8357d11)), closes [#3872](#3872)
* **subchart, zoom:** Fix returning domain value ([90338ec](90338ec)), closes [#3347](#3347)
* **subchart:** Fix handlebar position ([b897cbb](b897cbb)), closes [#3358](#3358)
* **title:** fix title text center align ([b254a61](b254a61)), closes [#3363](#3363)
* **tooltip:** Fix tooltip.format.value call ([f7d587d](f7d587d)), closes [#3371](#3371)
* **tooltip:** Fix tootip display on tooltip.init ([98e6f8b](98e6f8b)), closes [#3369](#3369)
* **zoom:** Fix unzoom after dynamic data load ([385907e](385907e)), closes [#3878](#3878)

### Features

* **api:** Intent to ship subchart method ([976f04a](976f04a)), closes [#3342](#3342)
* **axis:** Intent to ship axis.evalTextSize ([87048e9](87048e9)), closes [#3889](#3889)
* **interaction:** Intent to ship interaction.onout ([9c668e6](9c668e6)), closes [#3887](#3887)
* **module:** Support dual CJS/ESM package ([437c007](437c007)), closes [#2202](#2202)
* **plugin:** Intent to ship TableView plugin ([215b611](215b611)), closes [#1873](#1873)
* **regions:** Intent to ship regions.label ([b4e3bc2](b4e3bc2)), closes [#3319](#3319)
* **render:** Add forced init option on lazy rendering  ([218ce46](218ce46)), closes [#3106](#3106)
* **resize:** Intent to ship resize.auto='viewBox' ([db21387](db21387)), closes [#3893](#3893)
github-actions bot pushed a commit that referenced this issue Oct 25, 2024
# [3.14.0](3.13.0...3.14.0) (2024-10-25)

### Bug Fixes

* **axis:** fix error when showing tick only ([705947f](705947f)), closes [#3881](#3881)
* **bar:** fix representation of radius for small data ([91b5dca](91b5dca)), closes [#3903](#3903)
* **event:** Fix interaction with viewBox ([243bf3c](243bf3c)), closes [#3414](#3414)
* **input:** Fix touch/mouse input detection ([3d4392a](3d4392a)), closes [#3854](#3854)
* **point:** fix sensitivity error when blank area is clicked ([0060786](0060786)), closes [#3900](#3900)
* **scale:** Fix non-shape's element positioned accurately ([216141b](216141b)), closes [#3907](#3907)
* **size:** Fix legend overflows with padding fit mode ([8357d11](8357d11)), closes [#3872](#3872)
* **zoom:** Fix unzoom after dynamic data load ([385907e](385907e)), closes [#3878](#3878)
* **zoom:** Prevent error for out of range ([6f69e97](6f69e97)), closes [#3895](#3895)

### Features

* **axis:** Intent to ship axis.evalTextSize ([87048e9](87048e9)), closes [#3889](#3889)
* **interaction:** Intent to ship interaction.onout ([9c668e6](9c668e6)), closes [#3887](#3887)
* **legend:** Pass visibility state to legend item's event callback ([ba71911](ba71911)), closes [#3897](#3897)
* **render:** Add forced init option on lazy rendering  ([218ce46](218ce46)), closes [#3106](#3106)
* **resize:** Intent to ship resize.auto='viewBox' ([db21387](db21387)), closes [#3893](#3893)
newkdr added a commit to newkdr/vscode-gitlens that referenced this issue Dec 18, 2024
![snyk-top-banner](https://redirect.github.com/andygongea/OWASP-Benchmark/assets/818805/c518c423-16fe-447e-b67f-ad5a49b5d123)


<h3>Snyk has created this PR to upgrade billboard.js from 3.14.0 to
3.14.2.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.

<hr/>


- The recommended version is **2 versions** ahead of your current
version.

- The recommended version was released on **21 days ago**.



<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>billboard.js</b></summary>
    <ul>
      <li>
<b>3.14.2</b> - <a
href="https://redirect.github.com/naver/billboard.js/releases/tag/3.14.2">2024-11-26</a></br><h2><a
href="https://redirect.github.com/naver/billboard.js/compare/3.14.1...3.14.2">3.14.2</a>
(2024-11-26)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>axis:</strong> Fix x axis extent to work (<a
href="https://redirect.github.com/naver/billboard.js/commit/4d738348ee5c189274d277ce07bd31d626de303d">4d73834</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3768"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3768/hovercard">gitkraken#3768</a></li>
<li><strong>tooltip:</strong> Fix tooltip position on viewBox resizing
(<a
href="https://redirect.github.com/naver/billboard.js/commit/582feb46500a2eaf337a83f225dcebcc4d9317e9">582feb4</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3917"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3917/hovercard">gitkraken#3917</a></li>
</ul>
      </li>
      <li>
<b>3.14.1</b> - <a
href="https://redirect.github.com/naver/billboard.js/releases/tag/3.14.1">2024-11-18</a></br><h2><a
href="https://redirect.github.com/naver/billboard.js/compare/3.14.0...3.14.1">3.14.1</a>
(2024-11-18)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>point:</strong> fix data.onclick working with sensitivity
function (<a
href="https://redirect.github.com/naver/billboard.js/commit/587d71e9b413d5abd2265a3fb13c3c09914fca80">587d71e</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3912"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3912/hovercard">gitkraken#3912</a></li>
<li><strong>tooltip:</strong> Hide tooltip on redraw when unexpected
error (<a
href="https://redirect.github.com/naver/billboard.js/commit/35406406962c89bac0503800771d96ba2f47f56d">3540640</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3909"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3909/hovercard">gitkraken#3909</a>
<a href="https://redirect.github.com/naver/billboard.js/issues/3910"
data-hovercard-type="pull_request"
data-hovercard-url="/naver/billboard.js/pull/3910/hovercard">gitkraken#3910</a></li>
</ul>
      </li>
      <li>
<b>3.14.0</b> - <a
href="https://redirect.github.com/naver/billboard.js/releases/tag/3.14.0">2024-10-25</a></br><h1><a
href="https://redirect.github.com/naver/billboard.js/compare/3.13.0...3.14.0">3.14.0</a>
(2024-10-25)</h1>
<p>The detailed new feature description can be found at:</p>
<blockquote>
<p><a
href="https://netil.medium.com/billboard-js-3-14-release-viewbox-resizing-e1cb90ee0697"
rel="nofollow">billboard.js 3.14 release: viewBox resizing!</a> (<a
href="https://dev.to/netil/billboardjs-314-release-viewbox-resizing-p6e"
rel="nofollow">dev.to link</a>)</p>
</blockquote>
<h3>Bug Fixes</h3>
<ul>
<li><strong>axis:</strong> fix error when showing tick only (<a
href="https://redirect.github.com/naver/billboard.js/commit/705947f635807e359c5c2f869a7d906e2315a01a">705947f</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3881"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3881/hovercard">gitkraken#3881</a></li>
<li><strong>bar:</strong> fix representation of radius for small data
(<a
href="https://redirect.github.com/naver/billboard.js/commit/91b5dca91a86779b0c808e3498d85dcb93ab5f0e">91b5dca</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3903"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3903/hovercard">gitkraken#3903</a></li>
<li><strong>event:</strong> Fix interaction with viewBox (<a
href="https://redirect.github.com/naver/billboard.js/commit/243bf3cf10a7d3b4b0f668240168e4b2d9ba1eba">243bf3c</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3414"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3414/hovercard">gitkraken#3414</a></li>
<li><strong>input:</strong> Fix touch/mouse input detection (<a
href="https://redirect.github.com/naver/billboard.js/commit/3d4392ac51dca1947c6380329f7c6a6e0b3a497a">3d4392a</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3854"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3854/hovercard">#3854</a></li>
<li><strong>point:</strong> fix sensitivity error when blank area is
clicked (<a
href="https://redirect.github.com/naver/billboard.js/commit/00607861a96826b2e1c9fec37159065680ff278e">0060786</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3900"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3900/hovercard">#3900</a></li>
<li><strong>scale:</strong> Fix non-shape's element positioned
accurately (<a
href="https://redirect.github.com/naver/billboard.js/commit/216141bd6a415752fbb31ba3016188b20401f5b0">216141b</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3907"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3907/hovercard">#3907</a></li>
<li><strong>size:</strong> Fix legend overflows with padding fit mode
(<a
href="https://redirect.github.com/naver/billboard.js/commit/8357d1161fa132a6d788c1349dee1f7e99eedf39">8357d11</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3872"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3872/hovercard">gitkraken#3872</a></li>
<li><strong>zoom:</strong> Fix unzoom after dynamic data load (<a
href="https://redirect.github.com/naver/billboard.js/commit/385907e5cbab1af52b63f9a2987a302d479fe332">385907e</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3878"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3878/hovercard">gitkraken#3878</a></li>
<li><strong>zoom:</strong> Prevent error for out of range (<a
href="https://redirect.github.com/naver/billboard.js/commit/6f69e970bd31fdd9d353854c54437c2a9c95e269">6f69e97</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3895"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3895/hovercard">gitkraken#3895</a></li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>axis:</strong> Intent to ship axis.evalTextSize (<a
href="https://redirect.github.com/naver/billboard.js/commit/87048e9258d521ffb4da7b98a167e184fe3489a3">87048e9</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3889"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3889/hovercard">gitkraken#3889</a></li>
<li><strong>interaction:</strong> Intent to ship interaction.onout (<a
href="https://redirect.github.com/naver/billboard.js/commit/9c668e688624e0003d6dca6ea00fcf79a3f1b782">9c668e6</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3887"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3887/hovercard">gitkraken#3887</a></li>
<li><strong>legend:</strong> Pass visibility state to legend item's
event callback (<a
href="https://redirect.github.com/naver/billboard.js/commit/ba71911b7c4b47b95f0b1e2bf8f12138d5b31cb1">ba71911</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3897"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3897/hovercard">gitkraken#3897</a></li>
<li><strong>render:</strong> Add forced init option on lazy rendering
(<a
href="https://redirect.github.com/naver/billboard.js/commit/218ce4608dd7da7a5288bce1c6f95d71d8aa9c5f">218ce46</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3106"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3106/hovercard">gitkraken#3106</a></li>
<li><strong>resize:</strong> Intent to ship resize.auto='viewBox' (<a
href="https://redirect.github.com/naver/billboard.js/commit/db213873e2959b7c24c44f1330ec86af801406e8">db21387</a>),
closes <a
href="https://redirect.github.com/naver/billboard.js/issues/3893"
data-hovercard-type="issue"
data-hovercard-url="/naver/billboard.js/issues/3893/hovercard">gitkraken#3893</a></li>
</ul>
      </li>
    </ul>
from <a
href="https://redirect.github.com/naver/billboard.js/releases">billboard.js
GitHub release notes</a>
  </details>
</details>

---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs._

**For more information:** <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiJkY2EwZTViMC1mNjdhLTQwZDMtODQwOS05ZDMxYWU5ZDY4YzkiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6ImRjYTBlNWIwLWY2N2EtNDBkMy04NDA5LTlkMzFhZTlkNjhjOSJ9fQ=="
width="0" height="0"/>

> - 🧐 [View latest project
report](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)
> - 📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=&utm_content=fix-pr-template)
> - 🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)
> - 🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17/settings/integration?pkg&#x3D;billboard.js&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"billboard.js","from":"3.14.0","to":"3.14.2"}],"env":"prod","hasFixes":false,"isBreakingChange":false,"isMajorUpgrade":false,"issuesToFix":[],"prId":"dca0e5b0-f67a-40d3-8409-9d31ae9d68c9","prPublicId":"dca0e5b0-f67a-40d3-8409-9d31ae9d68c9","packageManager":"npm","priorityScoreList":[],"projectPublicId":"12a8a5f5-3e19-438c-8280-eb8f4ee06d17","projectUrl":"https://app.snyk.io/org/newkdr/project/12a8a5f5-3e19-438c-8280-eb8f4ee06d17?utm_source=github&utm_medium=referral&page=upgrade-pr","prType":"upgrade","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":[],"type":"auto","upgrade":[],"upgradeInfo":{"versionsDiff":2,"publishedDate":"2024-11-26T05:44:58.122Z"},"vulns":[]}'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants