diff --git a/src/shared/utils/pieceUtils.test.ts b/src/shared/utils/pieceUtils.test.ts
new file mode 100644
index 00000000..718df905
--- /dev/null
+++ b/src/shared/utils/pieceUtils.test.ts
@@ -0,0 +1,28 @@
+import assert from 'node:assert/strict';
+import { test } from 'node:test';
+
+import { intrinsicPxOf } from './pieceUtils';
+
+test('intrinsicPxOf converts px/mm/pt dimensions to pixels', () => {
+ assert.equal(intrinsicPxOf(''), 512);
+ assert.equal(
+ intrinsicPxOf(''),
+ 189
+ );
+ assert.equal(
+ intrinsicPxOf(''),
+ 933
+ );
+ assert.equal(intrinsicPxOf(''), 0);
+});
+
+test('intrinsicPxOf ignores child element width/height attributes', () => {
+ const svg =
+ '';
+ assert.equal(intrinsicPxOf(svg), 45);
+});
+
+test('intrinsicPxOf returns 0 when no svg tag is present', () => {
+ assert.equal(intrinsicPxOf('not an svg string'), 0);
+});
diff --git a/src/shared/utils/pieceUtils.ts b/src/shared/utils/pieceUtils.ts
index aaaa5c2b..4c7db7b8 100644
--- a/src/shared/utils/pieceUtils.ts
+++ b/src/shared/utils/pieceUtils.ts
@@ -123,6 +123,9 @@ export function getCachedPieceStyle(
const MAX_DATA_URL_CACHE = 48;
const pieceDataUrlCache = new Map();
+const MIN_PIECE_INTRINSIC_PX = 64;
+const MAX_PIECE_INTRINSIC_PX = 2048;
+
const FALLBACK_PIECE_SVG =
'