The last line of .gitattributes was getting truncated mid-token to
'GUIDE.md text working-tree-enc' on save, dropping the
'oding=UTF-8 eol=lf' suffix and the trailing newline. Restored the
full rule. Also normalized the file to LF line endings.
The new '* text=auto eol=lf' rule a couple lines above is a one-shot
fix for the LF-vs-CRLF churn that was generating phantom 'modified'
status on ~120 files in working trees on Windows; with this rule in
place, future checkouts normalize cleanly. No content-affecting
change to the rest of the repo.
Follow-up fixes for the post-3.24.0 soundboard rework plus AlexT2803's
three reports (#5417, #5418, #5419).
#5419 Soundboard popout breaks sound manager button
(public/js/modules/app-media.js)
- _openSoundModal was short-circuiting for ALL tabs whenever the popout
was active, which meant the admin Custom Sounds button (opens
'manage') and the Assign-to-Events tab were both unreachable until
the popout was closed. Now the flash-the-PiP path only fires when
the requested tab is 'soundboard'; 'assign' and 'manage' open the
modal as usual.
#5417 Non-image files instantly uploaded
(public/js/modules/app-media.js, app-ui.js, app-messages.js, style.css)
- Mirrored the existing image queue. Added _queueGeneralFile,
_clearFileQueue, _flushFileQueue. The composer file button, paste,
and drag-drop all route non-image attachments through the queue
instead of calling _uploadGeneralFile directly. Chips render in the
same #image-queue-bar with filename + size + a × remove button.
_flushFileQueue runs alongside _flushImageQueue at send time.
PiP DM and threads still use the immediate upload path.
#5418 Sound Manager dropdown overflows the window
(public/js/modules/app-media.js, public/css/style.css)
- Native <select> popups render outside the Haven window and cannot
be constrained. Added _enhanceSelectAsCustom which hides the native
select and renders a div-based dropdown that stays inside the modal,
flips above if needed, and scrolls when long. Wired into the five
assign-* selects in _renderAssignTab; idempotent on re-render.
#5418 Residual mojibake the prior sweep missed
(public/index.html, public/js/modules/app-media.js)
- index.html TOS page: three em-dashes and one '⚖️' restored from
cp1252 round-trip damage.
- app-media.js avatar save error: '❌' restored (the c3a2c29dc592
byte pattern was below the length threshold the earlier sweep used).
UTF-8 writes used Python with explicit BOM preservation per
AGENT_INSTRUCTIONS.md.
Restored ~70 corrupted emojis across docs/index.html and website/index.html (matched contextually: nav, hero, channel-code, platform tags, feature icons, footer).
Added four-layer prevention so this doesn't ship again:
- UTF-8 BOM on the landing pages (first 3 bytes EF BB BF)
- .editorconfig pinning charset=utf-8-bom for docs/website index + support
- .gitattributes working-tree-encoding=UTF-8 for landing pages, CHANGELOG, README, GUIDE
- scripts/fix-emoji-encoding.py reusable repair script
Verified hashes match between docs and website copies. Google Ads tag AW-17950126697 already present (2 occurrences in each file).