From 8aa2b0b1e8d1b386cd0b01fdf6281e1d2859e61b Mon Sep 17 00:00:00 2001
From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com>
Date: Thu, 12 Mar 2026 10:57:08 +0000
Subject: [PATCH] fix: eliminate network dependency in avatar visual regression
test
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The WithImage avatar story fetched an external GitHub avatar URL, creating
a race condition: if the image hadn't loaded before the screenshot was
taken, the fallback text was captured instead, causing a spurious baseline
diff (809 → 159 bytes).
Two fixes:
- Replace the external URL with an inline data URI so the story never
depends on network availability or latency.
- Add a waitForImages() helper to the visual regression test that waits
for all
elements inside #storybook-root to finish loading before
taking the screenshot. This guards against future stories that may
reference slow-loading images.
---
.../kilo-ui/src/stories/avatar.stories.tsx | 7 ++++++-
.../kilo-ui/tests/visual-regression.spec.ts | 19 +++++++++++++++++++
.../with-image-chromium-linux.png | 3 ---
3 files changed, 25 insertions(+), 4 deletions(-)
delete mode 100644 packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png
diff --git a/packages/kilo-ui/src/stories/avatar.stories.tsx b/packages/kilo-ui/src/stories/avatar.stories.tsx
index 6ee6edb411c..9cc53007a4e 100644
--- a/packages/kilo-ui/src/stories/avatar.stories.tsx
+++ b/packages/kilo-ui/src/stories/avatar.stories.tsx
@@ -33,10 +33,15 @@ export const WithCustomColors: Story = {
args: { fallback: "KL", background: "#1a4d8f", foreground: "#ffffff" },
}
+// Inline data URI so the visual regression test never depends on network.
+// 1×1 teal PNG — small enough to embed, large enough to prove
rendering.
+const AVATAR_DATA_URI =
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADZJREFUWIW2xzERACAQBLA7/pWACxrsgfFhJpmtsrMn0N2S2RNIZk+gu2X2BLpbZk8gmT0B4AWJGwMhBjARKwAAAABJRU5ErkJggg=="
+
export const WithImage: Story = {
args: {
fallback: "OC",
- src: "https://avatars.githubusercontent.com/u/154330673?s=48",
+ src: AVATAR_DATA_URI,
},
}
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts b/packages/kilo-ui/tests/visual-regression.spec.ts
index 553ce269027..24662af93fe 100644
--- a/packages/kilo-ui/tests/visual-regression.spec.ts
+++ b/packages/kilo-ui/tests/visual-regression.spec.ts
@@ -45,6 +45,24 @@ async function disableAnimations(page: Page) {
})
}
+// Wait for every
inside the story root to finish loading so screenshots
+// never capture an intermediate state with missing / half-loaded images.
+async function waitForImages(page: Page) {
+ await page.evaluate(() => {
+ const imgs = document.querySelectorAll("#storybook-root img")
+ return Promise.all(
+ Array.from(imgs).map(
+ (img) =>
+ img.complete ||
+ new Promise((resolve) => {
+ img.addEventListener("load", () => resolve(), { once: true })
+ img.addEventListener("error", () => resolve(), { once: true })
+ }),
+ ),
+ )
+ })
+}
+
// Stories to skip from visual regression:
// - Font/Favicon: inject into , no visible content in #storybook-root
// - Typewriter: uses JS setTimeout + Math.random(), inherently non-deterministic
@@ -72,6 +90,7 @@ for (const story of stories) {
await disableAnimations(page)
// Wait for Kobalte/SolidJS to finish hydrating interactive components
await page.waitForSelector("#storybook-root *", { state: "attached" })
+ await waitForImages(page)
// Screenshot just the story content, not the full 1280x720 canvas.
// Use [component, variant] path so snapshots are grouped per component dir.
diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png
deleted file mode 100644
index 0e23ee9a5f4..00000000000
--- a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-avatar/with-image-chromium-linux.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:79b80c13a1fa198f1602c85728a48467ac9b47c6430dadd6ff698f9c4d39980e
-size 809