Lotus Bot
528e2a48fc
perf(router): lazy-load Lobby/Explore/Inbox routes; fix spoiler aria-pressed initial state
...
Lobby, Explore/FeaturedRooms/PublicRooms, Inbox/Notifications/Invites are
now lazy-loaded via React.lazy so they only enter the bundle when navigated
to. Main bundle: 2547 kB → 2472 kB (gzip 637 → 618 kB).
Spoiler aria-pressed was initialised to false (revealed); changed to true
so the spoiler starts hidden, matching CSS logic (aria-pressed=true →
color:transparent).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 16:14:08 -04:00
Lotus Bot
0d3eabb884
fix(a11y): semantic headings, htmlFor/id associations, remove duplicate aria-labels
...
H-tag: add as=h1/h2 to dialog/UIA/auth headings (21 components)
Label: add htmlFor/id to PasswordRegisterForm (5 pairs) and PasswordResetForm (3 pairs)
Dupe: remove duplicate aria-label from Controls.tsx screenshare button, MembersDrawer, Members, RoomInput
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 15:36:59 -04:00
Lotus Bot
220245dba5
fix(a11y): replace aria-pressed with aria-expanded on Home/Space/Direct menu triggers\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:51:14 -04:00
Lotus Bot
13e22d7c47
fix(a11y): add htmlFor/id label associations in login and token input forms\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:49:49 -04:00
Lotus Bot
7784f4358d
fix: add color-scheme meta, og:type, fix fonts.googleapis.com crossorigin\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:48:19 -04:00
Lotus Bot
906c7c7138
fix(a11y): add aria-live regions to SyncStatus connection banners\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:43:26 -04:00
Lotus Bot
2c3f006ef0
fix(a11y): add labels to unlabeled form inputs\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:40:35 -04:00
Lotus Bot
f45aefdf1f
fix(a11y): add semantic heading hierarchy across settings, modals, and pages\n\nAdd as="h1"/h2/h3 to Text components used as visual headings:\n- Auth pages: h1 brand, h2 section titles\n- Settings panels: h2 for General/Permissions/DeveloperTools/Members/Emojis\n- Modal dialogs: h2 for CreateRoom, CreateSpace, AddServer\n- Explore pages: h2 page heading, h3 subsections\n- Inbox pages: h2 Notifications/Invites, h3 Primary/Public/Spam\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:35:55 -04:00
Lotus Bot
a6e378483e
perf: lazy-load modal renderers and auth pages, split vendor chunks\n\nMain bundle: 3866 kB -> 2547 kB gzip (637 kB, was 997 kB)\nNew cacheable chunks: matrix-sdk, react-dom, router, react-query, linkify\nLazy-loaded: RoomSettings, SpaceSettings, Search, CreateRoom, CreateSpace, Auth\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:32:40 -04:00
Lotus Bot
b1d2dfd4fa
fix(a11y): label all buttons in Editor.preview.tsx demo component\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:21:34 -04:00
Lotus Bot
fce55a708b
fix(a11y): label remaining unlabeled icon buttons across 12 components\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:17:07 -04:00
Lotus Bot
df626a9064
fix(a11y): replace aria-pressed with aria-expanded on menu-trigger buttons\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:06:40 -04:00
Lotus Bot
d93d3719a6
fix(a11y): fix remaining unlabeled icon buttons and portaled tooltip issue\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 13:04:11 -04:00
Lotus Bot
f867a5b578
fix(perf): hoist lotusTerminal setting out of Message component (Perf-10)
...
Previously every visible Message subscribed to settingsAtom via useSetting,
creating O(80) active atom subscriptions. Now RoomTimeline reads it once
and passes it down as a prop, reducing subscriptions to 1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 12:07:42 -04:00
Lotus Bot
78123b36b5
feat(a11y): form input labels (H-6), remaining button labels (C-1)
...
H-6: aria-label on all form inputs missing accessible names:
- Login: username, password (already done)
- Register: username, password, confirm, token, email
- Password reset: email, new password, confirm password
- Settings: display name, user ID to ignore, keyword, page zoom,
date format, device name, backup passwords (new/confirm/restore)
- Auth: server URL picker input
C-1: additional icon buttons:
- RoomInput: toolbar toggle (aria-pressed + label)
- Lobby/Members: scroll to top, toggle member list
- UIAFlowOverlay: cancel authentication
- BackupRestore: backup options menu
- UrlPreview: previous/next preview buttons
- RoomPacks: undo remove/remove pack buttons
- RoomViewHeader: start call, member list toggle
- ServerPicker: change server button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 12:03:26 -04:00
Lotus Bot
141b93f36f
feat(a11y): comprehensive icon button label sweep — 60+ remaining buttons labeled
...
C-1 complete sweep across all components and features:
- Call controls: mic mute/unmute, deafen/undeafen, video, screenshare, chat
- RoomInput: dismiss reply, attach file, sticker, emoji, GIF, location, toolbar
- Media viewers: close in image/pdf/text viewers and editors
- Settings dialogs: close buttons in all room/space/common settings panels
- Lobby: back, toggle member list, scroll to top, pack add/remove
- Auth: server picker, UIA flow cancel
- Upload cards: cancel uploads
- URL preview: prev/next buttons
- Members drawer: close + scroll to top
- RoomViewHeader: back, start call, toggle member list
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-21 11:58:40 -04:00
Lotus Bot
fdc45db52f
fix(perf,a11y): selectAtom for unread subscriptions, semantic headings, Perf-5 binary search
...
Perf-3: Replace raw roomToUnreadAtom subscription in Home, Direct, Space with
selectAtom-derived Set<string> — components now only re-render when rooms
gain/lose unread presence, not on every notification count update
Perf-5: RoomTimeline eventRenderer now uses binary search on precomputed
timelineSegments instead of O(N×T) linear scan per visible message
A11y L-1: Add as=h2 semantic heading to Home, Direct, Inbox, Space page nav
titles so screen readers announce page sections correctly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:59:09 -04:00
Lotus Bot
584da83bf0
feat(a11y,perf): comprehensive icon button labels, toolbar a11y, timeline binary search
...
A11y C-1: aria-label on 30+ remaining icon-only buttons across:
- settings panels (close, reset, info, expand, remove, undo)
- editor toolbar (bold, italic, underline, strike, code, spoiler,
blockquote, code block, ordered/unordered list, headings 1-3)
- auth stages (cancel buttons in SSO, Password stages)
- device verification (cancel buttons)
- password input (show/hide toggle with dynamic label)
- event readers, account data editor close buttons
- global emoji packs (add/remove buttons)
Perf-5: Replace O(N×T) getTimelineAndBaseIndex scan with precomputed binary
search (timelineSegments useMemo) — O(log T) per visible message render
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:54:33 -04:00
Lotus Bot
888e741f94
fix(a11y,sec): remove tabIndex=-1 from interactive buttons, npm audit fix
...
H-3: tabIndex=-1 removed from login info, settings reset, settings info buttons
+ aria-label added to each for screen reader discoverability
SEC: npm audit fix - 18 non-breaking dependency updates (34 vulns -> 16 remaining)
Remaining 16 require --force (breaking changes, deferred)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:47:20 -04:00
Lotus Bot
1f0686ddaf
feat(a11y): landmark regions, skip link, dialog labels, icon button labels
...
C-3: nav/main landmark roles in ClientLayout (nav + main areas)
C-4: Skip-to-main-content link in ClientLayout (visually hidden, focusable)
H-2: aria-labelledby on LeaveRoomPrompt and RoomTopicViewer dialogs
C-1: aria-label on ~15 icon-only buttons (back, menu, close, folder, account)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:44:41 -04:00
Lotus Bot
19c47fe88e
fix(bug,perf): poll first-vote race, stale timeline ref, lazy GifPicker/EmojiBoard, focusItem timer leak, RoomNavItem memo
...
BUG-18: clearTimeout cleanup in focusItem useLayoutEffect prevents leaked timers
BUG-24: Room timeline listener catches first poll vote before Relations object exists
BUG-25: Use timelineRef.current in handleOpenEvent to prevent stale index on rapid navigation
Perf-6: React.lazy + Suspense for GifPicker and EmojiBoard (initial bundle -114 kB)
Perf-7: React.memo on RoomNavItem to prevent re-renders on unrelated state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:39:35 -04:00
Lotus Bot
60c2c97ba6
fix(a11y,bug): aria-labels on dialogs/buttons, useAlive GIF guard, typing timer fix
...
A11y:
- Add aria-label Close to RoomTopicViewer, ImagePackView close buttons
- Add aria-label Cancel to LeaveRoomPrompt cancel button
- Add aria-label to Send, Reply, Thread, Edit, React, Search, Mute, Download buttons
- Fix aria-pressed -> aria-expanded + aria-haspopup on menu anchor triggers
- Add aria-label to username/password auth inputs
BUG-21: Add useAlive unmount guard to handleGifSelect error path in RoomInput
BUG-22: Fix typing status timer accumulation with typingTimerRef
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:26:18 -04:00
Lotus Bot
a77929de8b
Bug fixes, security hardening, and performance improvements
...
- BUG-16: Fixed pagination deadlock (fetching flag stuck on error path)
- BUG-17: Fixed absoluteIndex===0 falsy check skipping unread jump
- BUG-19: Fixed mEvt.getRoomId()! non-null assertion crash
- BUG-20: Wrapped getSettings()/setSettings() in try/catch for corrupt localStorage
- SEC: Replaced randomStr() Math.random() with crypto.getRandomValues() CSPRNG
- SEC: Fixed afterLoginRedirectPath open redirect validation
- SEC: Narrowed OSM iframe sandbox to scripts-only (removed allow-same-origin)
- Perf-2: Memoized selectAtom in useSetting (prevented new atom ref per render)
- Perf-4: Fixed typingMembers setTimeout leak (tracked timers per user/room)
- Perf-8: Memoized getChatBg() result in RoomView (not inline in JSX)
- Perf-12: Replaced body.class * font-family with body.class (inherited)
- Perf-15: Memoized typingNames array chain in RoomViewTyping
- Perf-9: Added blob URL cleanup useEffect in AudioContent
- BUG: Fixed forEach(async) -> Promise.all in useCommands join handler
- BUG: Fixed useCompositionEndTracking missing dependency array
- A11y: Fixed spoiler button aria-pressed + keyboard handler
- A11y: Added aria-label to Send message button
- Build: Set sourcemap:false, removed netlify.toml from copyFiles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 21:11:38 -04:00
Lotus Bot
2b2619145c
PTT fixes, TDS expansions, performance hooks, state event renderers
...
PTT fixes (BUG-7/8/9):
- BUG-7: Fix isEditable to use ownerDocument.body (works in EC iframe context)
- BUG-8: Release mic if callEmbed changes during active PTT (cleanup fn)
- BUG-9: Wire iframe blur/focus listeners for stuck-mic prevention
PiP bug fix (BUG-11):
- Track prevPipMode ref so position only resets when first entering pip mode,
not on every callVisible change (user drag position preserved)
GIF improvements (BUG-15):
- Show user-visible error text in toolbar on GIF send failure
- Also surface size-limit rejection with a 4-second auto-clearing message
Performance:
- useInterval: replace useMemo with useEffect for setInterval (React StrictMode safe)
- usePan: add unmount cleanup effect to remove document mousemove/mouseup listeners
Feature: timeline state event renderers (low effort, high value):
- Added renderers for RoomEncryption, RoomJoinRules, RoomGuestAccess, RoomCanonicalAlias
- These were silently falling through to the hidden-events fallback
TDS (Lotus Terminal Design System):
- Fix: correct 8 escaped template literals in GIF picker light-mode block
- Add data-emoji-board attribute to EmojiBoardLayout for stable CSS targeting
- Add Tooltip panel styles (dark + light mode)
- Add Switch toggle styles (dark + light mode)
- Add Spinner stroke colors (dark + light mode)
- Add EmojiBoard panel styles (dark + light mode)
- Add PopOut/Menu/floating panel styles (dark + light mode)
2026-05-19 16:45:02 -04:00
Lotus Bot
63e1085984
Security, performance, bug fixes, and TDS improvements
...
Security:
- HIGH-1: Validate hex color format before CSS interpolation in sanitize.ts
- HIGH-5: Add sandbox attribute to OpenStreetMap iframe
- MED-1: Fix permissive URL scheme regex in LINKIFY_OPTS
- MED-3/HIGH-4: Add .js.map blocking + CSP header to nginx config
- LOW-2: Validate OIDC authUrl scheme before window.open
- Accessibility: Remove maximum-scale=1.0 from viewport meta (WCAG 1.4.4)
Performance:
- O(1) Map index in computePositions (was O(M×T) findIndex per member)
- Add RoomMemberEvent.Membership subscription so positions update on join/leave
- Fix uncleaned 2000ms setTimeout in RoomTimeline useLayoutEffect
Bug fixes:
- BUG-5: Add QUEUED/CANCELLED cases to DeliveryStatus component
- BUG-6: Guard DeliveryStatus against state events via isState() check
- BUG-10: Clamp PiP position on window resize
- BUG-14: Separate runLotusBootSequence into dedicated useEffect([lotusTerminal])
- Fix aria-live on typing indicator (WCAG 4.1.3)
- Add aria-label + aria-multiline to message editor
TDS (Lotus Terminal Design System):
- Add reaction chip styles (dark + light mode)
- Add GIF picker CSS via globalStyle instead of runtime injection
- Add URL preview styles (dark + light mode)
- Add complete GIF picker light-mode TDS block (was missing)
2026-05-19 16:26:25 -04:00
root
20ee28b423
docs: update README for session 2 improvements
...
- Delivery status indicators for own messages
- URL preview card TDS styling
- Reaction chip TDS styling (dark + light)
- GIF picker CSS moved to lotus-terminal.css.ts
- PTT mic state save/restore
- Boot animation Escape-to-skip
- Read receipt debounce (150ms)
- Chat background count updated
2026-05-16 02:14:17 -04:00
root
9b62b1cb6f
feat: URL preview TDS styling, settings description update
...
- UrlPreview.tsx: add data-url-preview attribute for CSS targeting
- lotus-terminal.css.ts: dark cyan border-left accent + transparent bg
for URL preview cards in TDS mode (dark + light variants)
- General.tsx: mention Escape-to-skip in boot animation description
2026-05-16 02:11:52 -04:00
root
948ed39d69
fix: save/restore mic state on PTT mode toggle (I-4)
...
When enabling PTT mode, save current mic state before muting.
When disabling PTT, restore saved state instead of unconditionally unmuting.
Prevents surprising unmute if user had manually muted before switching to PTT.
2026-05-16 01:59:42 -04:00
root
b14575fa0a
feat: delivery status indicator, GIF picker CSS to TDS file (M-6, M-7)
...
- Message.tsx: show delivery status (sending/sent/failed) on own messages when
no read receipts yet; hidden once server confirms (status null); TDS-styled
- GifPicker.tsx: move terminal CSS from runtime <style> tag into lotus-terminal.css.ts
eliminating flash of unstyled content (M-6)
- lotus-terminal.css.ts: add [data-gif-terminal] selector rules for GIF picker
2026-05-16 01:49:25 -04:00
root
4249150100
feat: reaction TDS styling, debounce read receipts, Escape to skip boot, type fixes
...
- lotus-terminal.css.ts: add reaction chip styles for dark + light TDS modes
(cyan border/bg for unselected, orange accent for own/pressed reactions)
- useRoomReadPositions: debounce receipt handler at 150ms (M-3)
- lotus-boot.ts: Escape key skips boot animation (I-3)
- RoomInput.tsx: replace (uploadRes as any) with typed assertion (M-7)
- CallEmbedProvider: call mention detection, audio cleanup, display name (C-1, C-2, M-5)
- EventReaders: timestamps in seen-by modal, filter self, TDS styling
- ReadReceiptAvatars: StackedAvatar pill, TDS visual treatment
- chatBackground: add waves/neon/aurora backgrounds
- RoomView: auto-apply tactical bg when TDS active and bg is none
- settings: extend ChatBackground union type
2026-05-16 01:34:20 -04:00
root
6648ec68a2
docs: add per-message read receipts, GIF picker, DM calls, infra sections to README
2026-05-16 00:54:33 -04:00
root
12541cf987
fix: suppress uncaught promise rejections from fire-and-forget useAsync calls in useEffect
2026-05-15 19:07:13 -04:00
root
74963b6bf2
feat: per-message read receipt avatars showing each user s last-read position
2026-05-15 18:56:17 -04:00
root
bf544ebc84
fix: incoming call auto-dismiss, deleted message text, PiP drag cleanup
2026-05-15 16:00:17 -04:00
root
1ab38281f3
fix: location NaN guard, PiP drag unmount cleanup, README v4.12.1
2026-05-15 15:56:43 -04:00
root
0d5ba83f40
fix: use space-parent check to exclude text channels from call button
2026-05-15 15:47:28 -04:00
root
b2d36d79e6
fix: restrict call button to DMs and invite-only rooms only
2026-05-15 15:44:51 -04:00
root
549634dca0
fix: VideoButton disabled state, PTT listener leak, TS prop errors
...
- VideoButton now accepts disabled prop with tooltip and visual feedback;
PrescreenControls passes disabled=true when cameraOnJoin=false
- PTT key listener in settings tracked via ref, cleaned up on unmount,
guarded against stacking on double-click; useCallback + useRef
- CallControls screenshare cancel button: variant Surface -> Secondary
- General.tsx Box align prop: align -> alignItems (TS2322 fix)
2026-05-15 15:38:02 -04:00
root
a2331eab1f
feat: poll vote counting — show tallies, persist vote across refreshes
...
PollContent now:
- Reads existing m.poll.response / org.matrix.msc3381.poll.response events
from the room timeline on mount to restore vote state across refreshes
- Counts votes per answer (per-sender latest-wins deduplication)
- Shows percentage bars and vote totals in real time
- Subscribes to RelationsEvent.Add/Remove/Redaction so counts update live
when other users vote without requiring a page reload
- Optimistic local update keeps the UI snappy while the send request flies
2026-05-15 15:21:20 -04:00
root
e30212f409
fix: call system bugs and security hardening
...
- CallEmbed: fix memory leak — mx event listeners were never removed
because dispose() called .bind(this) again, creating new function
objects. Now uses arrow class fields so start()/dispose() share the
exact same reference.
- callPreferences: toggleVideo is a no-op when cameraOnJoin=false,
preventing internal state drift from the returned value.
- CallControls: PTT key guard now blocks on SELECT elements and walks
the DOM for inherited contentEditable to prevent key interception
inside dropdowns and custom editors.
- RoomInput: GIF fetch validates Giphy CDN domain allow-list,
HTTP Content-Type header, and enforces 20 MB size cap.
2026-05-15 15:08:55 -04:00
root
0d28f10c95
chore: remove dead code — IncomingCallNotification and useIncomingDmCall
...
These are superseded by IncomingCallListener in CallEmbedProvider (merged from v4.12.1). IncomingCallNotification was already removed from Router.tsx in a previous commit.
2026-05-15 14:57:51 -04:00
root
0a2ba171b9
fix: remove debug console.log from UserChips.tsx
2026-05-15 14:57:35 -04:00
root
8e9936b829
fix: post-merge bugs — webRTCSupported call, duplicate imports
2026-05-15 14:56:30 -04:00
root
0a29e42b49
fix: correct event type in ForwardMessageDialog and poll response format
...
- ForwardMessageDialog: use sendEvent instead of sendMessage to preserve
the original event type (stickers, polls, etc.)
- PollContent: use m.selections for stable m.poll.response (per spec),
was incorrectly using m.responses
2026-05-15 14:43:31 -04:00
root
977b45f6da
fix: show deletion reason as primary text on redacted messages
2026-05-15 14:39:16 -04:00
root
0afd77deaa
Post-merge fixes: remove duplicate IncomingCallNotification, restore PiP touch drag + grip dots, show redacted message content
...
- Router.tsx: remove IncomingCallNotification (CallEmbedProvider.IncomingCallListener now handles all calls)
- CallEmbedProvider: restore touch drag (handlePipTouchStart), grip dots on resize handles, fix normaliseToTopLeft width/height
- FallbackContent/MsgTypeRenderers: add originalBody prop to show struck-through original text on deleted messages
- RoomTimeline: cache text message bodies so they can be shown after redaction
2026-05-15 14:13:41 -04:00
root
c8d9906788
chore: merge v4.12.1 — security, calling, editor, media fixes
...
Key v4.12.1 changes merged:
- Security: sanitize-html updated to v2.17.4
- Calling: video calls in DMs/rooms, user avatars during calls, right-click to start
- Calling: IncomingCallListener with ring sound and answer/reject UI
- Editor: list crash fixes (Firefox + empty headings), codeblock filename support
- Media: URL preview hover state, keyboard nav, click-to-open, OGG audio support
- Date: ISO 8601 (YYYY-MM-DD) date format option
- Misc: stable mutual rooms endpoint, Android notification crash fix
Lotus customisations preserved:
- PiP drag/resize, DM call ring notification, PTT, GIF picker, noise suppression
- Poll voting, message forwarding, image captions, location sharing
- Lotus Terminal design theme
2026-05-15 13:43:04 -04:00
root
5bba52e315
feat: poll voting, location sharing, image captions, message forwarding
...
- Poll voting: PollContent sends m.poll.response on answer click
- Location: MLocation shows OSM map embed + share-location button in toolbar
- Image captions: caption field on media uploads sets message body
- Message forwarding: ForwardMessageDialog with searchable room picker
- Also includes ring timeout fix and earlier session patches
2026-05-15 13:37:03 -04:00
kfiven
e89b8f7d12
chore(release): 4.12.1 [skip ci]
2026-05-15 07:20:54 +00:00
Krishan
9bc1e7e9ff
fix: null edit for another release ( #2942 )
2026-05-15 17:19:08 +10:00