diff --git a/LOTUS_BUGS.md b/LOTUS_BUGS.md index 9a4800519..40bda195b 100644 --- a/LOTUS_BUGS.md +++ b/LOTUS_BUGS.md @@ -113,6 +113,7 @@ This document tracks identified bugs, edge cases, and architectural discrepancie * **Root Cause:** `filter` and `opacity` CSS properties affect an element AND all its descendants. Applying these as part of the `animation` shorthand on the `Page` container made them "inherited" visually by everything inside the room view. * **Side Effect:** `filter` animation also created a CSS stacking context on Page, which pushed Seasonal Theme overlays (position:fixed; z-index:9997) behind the Page compositor layer. * **Fix Applied:** Removed `animRainGlowKeyframe`, `animGridBrightnessKeyframe`, `animFirefliesGlowKeyframe`, and `animFirefliesBlinkKeyframe` from `chatBackground.ts`. Only `backgroundPosition` / `backgroundSize` animations remain — these are safe and do not affect descendants or create stacking contexts. +* **Follow-up (June 2026):** The initial fix only removed glow/brightness keyframes from the DARK variant definitions. The LIGHT variant `anim-rain` and `anim-pulse` entries still referenced `animRainGlowKeyframe` and `animGridBrightnessKeyframe` (which were no longer imported, causing a build error). Both references removed from LIGHT variants to complete the fix. ### 7. Seasonal Themes Display Behind Chat Background **File:** `src/app/components/seasonal/SeasonalEffect.tsx` @@ -123,9 +124,29 @@ This document tracks identified bugs, edge cases, and architectural discrepancie * **Fix Applied:** See Bug #6. No additional changes to SeasonalEffect required. ### 8. Avatar Decoration Images Not Rendering in Settings -**File:** `src/app/features/settings/account/ProfileDecoration.tsx` +**File:** `src/app/features/settings/account/ProfileDecoration.tsx` / LXC 106 nginx **Status:** ✅ RESOLVED (June 2026) * **Issue:** Under Settings → Account → Avatar Decoration, no decoration images were visible. -* **Root Cause:** The `DecorationPreviewCell` used `loading="lazy"` on decoration images. The browser's lazy-loading algorithm determines image visibility from the viewport, but the decoration grid is inside a nested `overflowY: auto` scroll container inside a settings panel — the browser did not correctly detect these images as near the viewport and never triggered them to load. -* **Fix Applied:** Changed `loading="lazy"` to `loading="eager"` in `DecorationPreviewCell`. The settings panel is user-initiated, so eager loading is appropriate. +* **Initial (incorrect) diagnosis:** Suspected `loading="lazy"` in a nested scroll container. Changed to `loading="eager"` — images still did not render. +* **Actual Root Cause:** The server nginx Content Security Policy (`img-src` directive) on LXC 106 did not include `https://drive.lotusguild.org`. The browser silently blocked all 99 APNG requests with CSP violation errors (206 violations visible in DevTools console). The lazy-loading change was a red herring. +* **Fix Applied:** Added `https://drive.lotusguild.org` to the `img-src` directive in `/etc/nginx/sites-available/cinny` on LXC 106 (cinny-web-server) and reloaded nginx. Updated config is tracked in `pve-infra/containers/106-cinny-web-server/etc/nginx/sites-available/cinny`. + +### 9. Avatar Decoration Grid Spacing Too Tight +**File:** `src/app/features/settings/account/ProfileDecoration.tsx` +**Status:** ✅ RESOLVED (June 2026) + +* **Issue:** Decoration preview cells in the settings picker appeared vertically and horizontally squished together with almost no gap between images. +* **Root Cause:** The flex container used `gap: 20px`, but each `52×52` button renders its decoration image with `position: absolute; top: -8px; left: -8px` (INSET=8), so each image bleeds 8px outside the button on all sides. The visual gap between images was `20 - 8 - 8 = 4px` — nearly nothing. Additionally `paddingBottom: 4` clipped the bottom overflow of the last row, and `paddingRight` was absent so the rightmost column clipped. +* **Fix Applied:** Increased `gap` from `20` to `36` (visual gap = 36 - 8 - 8 = 20px), changed `paddingBottom` from `4` to `INSET` (8px), added `paddingRight: INSET`. + +### 10. Windows Taskbar Badge Has Black Square Background and Small Number +**File:** `src-tauri/src/lib.rs` (cinny-desktop) — `set_badge_count` command +**Status:** ✅ RESOLVED (June 2026) + +* **Issue:** The notification badge overlaid on the Windows taskbar icon had a solid black square background instead of a transparent circle, and the number was too small to read at a glance. +* **Root Cause (black square):** `CreateDIBSection` initialises the pixel buffer to zero (BGRA `0x00000000`). GDI drawing functions (`Ellipse`, `DrawTextW`) paint RGB values but never touch the alpha channel — all pixels retain `A=0`. When every pixel has `A=0`, Windows cannot use per-pixel alpha compositing and falls back to the monochrome mask (`hbm_mask`, all zeros = fully opaque), so the entire 16×16 bitmap is drawn opaque. The corner pixels outside the ellipse are `RGB(0,0,0)` = black, producing the black square. +* **Root Cause (small number):** Bitmap was 16×16 with an 11px font, giving very little room, especially for two-digit counts. +* **Fix Applied:** + 1. After all GDI drawing, iterate the pixel buffer and set `alpha = 0xFF` for every non-zero pixel (`*pixel |= 0xFF00_0000`). Corner pixels (zero) retain `A=0` and composite as transparent. + 2. Increased bitmap size from `16` to `20` and font height from `11` to `14`. diff --git a/src/app/features/lotus/chatBackground.ts b/src/app/features/lotus/chatBackground.ts index ea36da248..192dc609d 100644 --- a/src/app/features/lotus/chatBackground.ts +++ b/src/app/features/lotus/chatBackground.ts @@ -428,7 +428,7 @@ const LIGHT: Record = { ].join(','), backgroundSize: '40px 200px, 12px 200px', backgroundPosition: '0 0, 0 0', - animation: `${animRainKeyframe} 8s linear infinite, ${animRainGlowKeyframe} 2.1s ease-in-out infinite`, + animation: `${animRainKeyframe} 8s linear infinite`, }, 'anim-stars': { @@ -452,7 +452,7 @@ const LIGHT: Record = { 'linear-gradient(90deg, rgba(0,98,184,0.06) 1px, transparent 1px)', ].join(','), backgroundSize: '60px 60px, 60px 60px, 12px 12px, 12px 12px', - animation: `${animGridPulseKeyframe} 4s ease-in-out infinite, ${animGridBrightnessKeyframe} 3.3s ease-in-out infinite`, + animation: `${animGridPulseKeyframe} 4s ease-in-out infinite`, }, 'anim-aurora': { diff --git a/src/app/features/settings/account/ProfileDecoration.tsx b/src/app/features/settings/account/ProfileDecoration.tsx index d2c6da7cf..2da0b846d 100644 --- a/src/app/features/settings/account/ProfileDecoration.tsx +++ b/src/app/features/settings/account/ProfileDecoration.tsx @@ -250,9 +250,10 @@ export function ProfileDecoration() { style={{ display: 'flex', flexWrap: 'wrap', - gap: 20, - paddingBottom: 4, + gap: 36, + paddingBottom: INSET, paddingLeft: INSET, + paddingRight: INSET, paddingTop: INSET, }} >