From e43e55c2b78d0e386425c2163ab31c4bf6e6fd23 Mon Sep 17 00:00:00 2001
From: Takuma IMAMURA <209989118+hyperfinitism@users.noreply.github.com>
Date: Wed, 6 May 2026 18:00:11 +0900
Subject: [PATCH] feat: replace render-time text wrapping with browser-native
wrapping (#191)
This PR uses `foreignObject` with CSS line-clamp to let the browser
handle text wrapping natively instead of manually wrapping on the
server. This provides better font-aware wrapping while keeping
server-side line estimation for SVG height calculation.
Fixes https://github.com/anuraghazra/github-readme-stats/issues/4862.
### Example card
---------
Signed-off-by: Takuma IMAMURA <209989118+hyperfinitism@users.noreply.github.com>
Co-authored-by: martin-mfg <2026226+martin-mfg@users.noreply.github.com>
---
.../__snapshots__/gist.test.js.snap | 30 ++-
.../__snapshots__/pin.test.js.snap | 28 +-
docs/advanced_documentation.md | 2 +
packages/core/package.json | 3 +-
packages/core/src/api/gist.js | 2 +
packages/core/src/api/pin.js | 2 +
packages/core/src/cards/gist.js | 69 ++++-
packages/core/src/cards/repo.js | 85 ++++--
packages/core/src/cards/types.d.ts | 2 +
packages/core/src/common/fmt.js | 27 +-
packages/core/src/common/render.js | 245 ++++++++++++++++--
packages/core/src/fetchers/stats.js | 2 +-
packages/core/src/fetchers/top-languages.js | 2 +-
packages/core/tests/fmt.test.js | 22 +-
packages/core/tests/render.test.js | 76 +++++-
packages/core/tests/renderGistCard.test.js | 24 +-
packages/core/tests/renderRepoCard.test.js | 35 ++-
packages/core/tests/renderStatsCard.test.js | 2 +-
pnpm-lock.yaml | 3 -
19 files changed, 537 insertions(+), 124 deletions(-)
diff --git a/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap b/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap
index 6e8e2779..57e28a92 100644
--- a/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap
+++ b/apps/backend/tests/public-instance/__snapshots__/gist.test.js.snap
@@ -30,7 +30,7 @@ exports[`Test /api/gist contract > should match the private missing-id response
exports[`Test /api/gist contract > should match the public happy-path response snapshot 1`] = `
{
- "content": "