<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SvitsGames devlog</title><description>Notes on building HTML5 games with Phaser 4, TypeScript and Vite.</description><link>https://svitsgames.com/blog/</link><language>en-gb</language><atom:link href="https://svitsgames.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>Astro scoped CSS silently skips child components</title><link>https://svitsgames.com/blog/astro-scoped-styles-miss/</link><guid isPermaLink="true">https://svitsgames.com/blog/astro-scoped-styles-miss/</guid><description>Astro adds a scope id to every compound selector, so .foot__links a misses an anchor rendered by a child component. Ours fell from a 44px tap target to 16px.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>astro</category><category>css</category><category>accessibility</category><category>debugging</category></item><item><title>Your clip-path is eating your drop-shadow</title><link>https://svitsgames.com/blog/clip-path-filter-drop-shadow/</link><guid isPermaLink="true">https://svitsgames.com/blog/clip-path-filter-drop-shadow/</guid><description>CSS applies filter before clip-path, so a drop-shadow on a clipped element is generated and then clipped away. In Chrome it renders identically to no filter.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>css</category><category>design</category><category>debugging</category></item><item><title>A Phaser loading screen can&apos;t cover its own bundle</title><link>https://svitsgames.com/blog/phaser-boot-splash/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-boot-splash/</guid><description>A Phaser loading screen ships inside the bundle it would cover, so it can&apos;t paint until that bundle has. Measured — 72ms to an inline splash, 601ms to handover.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>typescript</category><category>vite</category><category>performance</category><category>debugging</category></item><item><title>Two Vite defaults that break only after upload</title><link>https://svitsgames.com/blog/vite-base-and-public-traps/</link><guid isPermaLink="true">https://svitsgames.com/blog/vite-base-and-public-traps/</guid><description>Vite emits root-absolute asset paths, which 404 from a portal subpath, and copies public/ wholesale, so 1.89 MB of flag-disabled audio ships anyway.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>vite</category><category>deployment</category><category>debugging</category></item><item><title>A target-size fix that WCAG didn&apos;t require</title><link>https://svitsgames.com/blog/wcag-22-target-size/</link><guid isPermaLink="true">https://svitsgames.com/blog/wcag-22-target-size/</guid><description>A 15px breadcrumb link looks like a WCAG 2.2 SC 2.5.8 failure at 24x24. Measured, its exceptions rescue it — and the AAA criterion is the stricter test.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>accessibility</category><category>css</category><category>debugging</category></item><item><title>Phaser 4 sizes the canvas mid-rotation</title><link>https://svitsgames.com/blog/phaser-4-orientation-resize/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-orientation-resize/</guid><description>Phaser 4.1.0 measures the viewport inside its orientationchange handler, mid-rotation, then caches the correct rect — which blocks its own recovery path.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>mobile</category><category>scaling</category><category>typescript</category><category>debugging</category></item><item><title>Phaser drops pointerup if you release off-canvas</title><link>https://svitsgames.com/blog/phaser-4-pointerup-outside/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-pointerup-outside/</guid><description>Phaser routes an up event to pointerup only when pointer.upElement is the canvas. Miss pointerupoutside and a drag that leaves the canvas freezes, silently.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>input</category><category>typescript</category><category>debugging</category></item><item><title>Phaser&apos;s Scale.RESIZE can&apos;t use device pixels</title><link>https://svitsgames.com/blog/phaser-4-scale-none-dpr/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-scale-none-dpr/</guid><description>In Phaser 4.1.0, Scale.RESIZE overwrites gameSize with the parent&apos;s CSS-pixel size on every refresh, so the canvas can never track the device pixel ratio.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>scaling</category><category>mobile</category><category>typescript</category><category>debugging</category></item><item><title>Phaser 4 reuses the scene across restart()</title><link>https://svitsgames.com/blog/phaser-4-scene-restart-state/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-scene-restart-state/</guid><description>Phaser reuses the scene instance across restart(), so TypeScript field initializers run once while create() runs many times. Stale state accumulates.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>typescript</category><category>debugging</category></item><item><title>Phaser&apos;s setFont() splits the family on spaces</title><link>https://svitsgames.com/blog/phaser-4-text-font-shorthand/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-text-font-shorthand/</guid><description>Phaser 4.1.0&apos;s setFont() parses a font string with split(&apos; &apos;) and keeps three tokens, so setFont(&apos;bold 24px Cook Line Font&apos;) sets the family to &quot;Cook&quot;.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>css</category><category>fonts</category><category>typescript</category><category>debugging</category></item><item><title>Phaser 4&apos;s volume setter isn&apos;t broken</title><link>https://svitsgames.com/blog/phaser-4-volume-setter/</link><guid isPermaLink="true">https://svitsgames.com/blog/phaser-4-volume-setter/</guid><description>In Phaser 4.1.0 the WebAudioSound volume setter looks dead because the write doesn&apos;t read back. Skip it and your music returns 3.13x too loud on resume.</description><pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate><category>phaser</category><category>audio</category><category>typescript</category><category>debugging</category></item></channel></rss>