Commit graph

457 commits

Author SHA1 Message Date
96ff3bef78
Image/voice shares: bold + italic so they stand out in the log 2026-07-10 21:09:36 +00:00
b1b628bdc9
Fix CTCP ACTION: wrap in \x01 so /me + image shares render as '* nick …' in every client (mIRC etc.) 2026-07-10 21:09:36 +00:00
4f8d10c8a5
yomirc: float the hover toolbar above the log line so it no longer overlaps the next line (fixes hover jump) 2026-07-10 20:04:46 +00:00
f90aca5252
Sidebar rows: div[role=button] + a real close button — valid HTML, keyboard-reachable close 2026-07-10 19:54:40 +00:00
5d6de5a357
Sidebar: memoize each room row (subscribes to its own buffer) so a message updates only that row 2026-07-10 19:50:37 +00:00
b7265b5706
Composer: mark fire-and-forget image uploads with void (intent; store already catches) 2026-07-10 19:45:06 +00:00
d3300d4a4e
Images: decode avatars + link previews off-thread (decoding=async), pin preview img size 2026-07-10 19:43:33 +00:00
bbd8b81ea6
Modals: trap Tab inside the dialog and return focus to the trigger on close (a11y) 2026-07-10 19:41:51 +00:00
77d8a0a669
Message rows use content-visibility to skip off-screen layout/paint (faster channel switch) 2026-07-10 19:17:13 +00:00
c3b96c5b16
Memoize message rows: a new message re-renders only the new row, not the whole list 2026-07-10 19:07:11 +00:00
67e6493b71
Native tactile press feedback: controls dip+dim on touch, no tap delay/callout 2026-07-10 18:54:21 +00:00
8bc88557b3
Mobile native-feel: kill iOS input-zoom (16px), overscroll-contain, no tap-flash, safe-area top, non-selectable chrome 2026-07-10 18:37:30 +00:00
c0ec75d6dd
iOS keyboard: native easing curve + 60px threshold to stop suggestion-bar jitter 2026-07-10 18:21:24 +00:00
d5af169c73
Self-heal the iOS pre-resize when no keyboard opens (hardware keyboard / programmatic focus) 2026-07-10 17:54:51 +00:00
88e689fc82
Smooth iOS keyboard open: pre-resize on focus + CSS height glide, corrected by the resize event 2026-07-10 17:53:14 +00:00
9a4757e839
Track mobile keyboard via VisualViewport directly; drop the pre-resize guess that broke the first open 2026-07-10 17:41:50 +00:00
db1ba1420f
Analytics consent: grant only analytics_storage in the app (ad signals stay denied, ad-free) 2026-07-10 16:26:02 +00:00
e2ecd093a6
Make the console/status window follow the theme accent (drop hardcoded terminal green) 2026-07-10 15:43:30 +00:00
df3f9d4b92
Reflect own away state in the member list (patch self entry) + orange away name 2026-07-10 15:04:23 +00:00
04f229053a
Fix avatar click crash: capture rect before the state updater runs 2026-07-10 14:48:22 +00:00
b94b9f8994
Open a presence menu (Available/Away + reason) from the account avatar 2026-07-10 14:45:28 +00:00
cf51efe339
Rework theme presets: rename, orange Night-orange accent, theme-aware console 2026-07-10 14:25:26 +00:00
8894974479
Drop the app's consent banner; consent is handled on the site (same origin) 2026-07-10 14:01:44 +00:00
6f9df54864
Switch analytics to Google Consent Mode v2 (advanced) 2026-07-10 13:29:01 +00:00
8fd1af78bb
Fix stale app-update comment to match no-auto-reload behavior 2026-07-10 10:30:47 +00:00
726ce7b609
Strip IRC formatting codes from WebMCP read_messages output 2026-07-10 10:27:21 +00:00
7f6fb14b19
Expose the chat as WebMCP tools for AI agents (list/read/send/join/switch/members) 2026-07-10 10:21:10 +00:00
6ad0d2bbd9
Fix mobile drawer footer: give the nav tabs their own full-width row 2026-07-10 09:25:46 +00:00
c18604c426
Stop the app from auto-reloading on new builds; update on next manual refresh instead 2026-07-10 09:04:31 +00:00
ad05f3e470
Fix mobile topbar overflow: drop the redundant channel avatar and tighten spacing 2026-07-10 08:13:30 +00:00
937a9dc38c
Fix mobile: wrap the extban composer and full-screen the channel panel 2026-07-10 08:06:22 +00:00
4a0b6b51e0
Fix mobile layout: constrain the app to the viewport height when a navbar shell wraps it 2026-07-10 08:00:46 +00:00
27cfae944a
Support extban stacking: nest a matching extban inside an acting one (mute:account:...) 2026-07-10 07:42:11 +00:00
a390078876
List +e ban-exceptions and +I invite-exceptions in the channel panel, removable per mode 2026-07-10 07:27:02 +00:00
a141742868
Gate the extban +e/+I modes on the server's CHANMODES list modes 2026-07-10 07:17:41 +00:00
2bae979b30
Let extbans be set as +b, +e or +I from the channel panel, with the example following the mode 2026-07-10 07:11:33 +00:00
efe0fb0df9
Add a security-group quick-pick for the securitygroup extban (config-driven) 2026-07-10 07:01:13 +00:00
f920d52847
Show the full +b command example for the selected extban type 2026-07-10 06:45:29 +00:00
5a3d6e737d
Type the new bans tab in the Tab union 2026-07-10 06:36:39 +00:00
d5c8da0d50
Give plain bans their own tab and reflow the channel panel to a single full-width column 2026-07-10 06:34:45 +00:00
e620f72f84
Replace the extban chip grid with a compact searchable type selector 2026-07-10 06:18:49 +00:00
4fe83e790a
Move extbans into their own channel-panel tab, separate from plain bans 2026-07-10 06:13:06 +00:00
9b3db02721
Add an extban picker to the channel panel, driven by ISUPPORT EXTBAN 2026-07-10 05:52:46 +00:00
900859acdf
Share the Django site's analytics consent instead of asking twice (same-origin tchatou-consent) 2026-07-10 05:28:23 +00:00
56ae05f56d
Clear any lingering GA cookies at boot when analytics consent isn't granted 2026-07-10 05:19:09 +00:00
69cd4eb024
Gate Google Analytics behind a consent banner (opt-in, withdrawable in Settings) 2026-07-10 05:16:43 +00:00
68c7560212
Add opt-in Google Analytics (gtag.js) with per-channel page views, DMs redacted 2026-07-10 04:32:33 +00:00
1a82247a7d
Enable cookieless analytics on the app (config.analytics endpoint) 2026-07-10 04:19:00 +00:00
c222eda4c1
Loosen the analytics beacon backstop below the debounce so session events aren't dropped 2026-07-10 04:12:27 +00:00
66509f5adb
Add a sandboxed cookieless analytics feature (host-mediated beacon, off by default) 2026-07-10 04:03:29 +00:00