736 Commits

Author SHA1 Message Date
Max Leiter
78cadc5ff1 ircv3: monitor and extended-monitor (#5045)
Updated version of #4550. Closes #337, closes #872 (#337 can't be fully
addressed — tracking nick changes isn't really possible atm).

<img width="253" height="149" alt="image"
src="https://github.com/user-attachments/assets/8a961868-0aa9-406b-92e2-f9d4858e2d0d"
/>

Away support:
<img width="214" alt="image"
src="https://user-images.githubusercontent.com/8675906/165882385-6f928c8e-5a0b-4502-8bd3-3cd0bd70e0e0.png">

## Summary

Query windows show whether the person behind them is online, and whether
they are away, using
[MONITOR](https://ircv3.net/specs/extensions/monitor) rather than
polling. `Network` keeps the monitor list: queries are registered in
batched `MONITOR +` commands once RPL_ISUPPORT tells us the server
supports it, and one at a time as new query windows open. The limit
advertised in `MONITOR=<n>` is respected, with anything over it waiting
for a slot; `MONITOR=0` means no monitoring at all, a bare `MONITOR`
means no limit. A nick change on a monitored query swaps the target in
place so the query keeps its slot.

[extended-monitor](https://ircv3.net/specs/extensions/extended-monitor)
is requested too, so away, nick, account and chghost updates arrive for
monitored nicks we share no channel with. Away state for people we do
share a channel with comes from a WHO on join.

The indicator is a dot on the query in the sidebar and next to the nick
in the message bubble, with a tooltip and an `img` role so it isn't
colour-only, and it can be turned off under Appearance.

Known limitation: a server that enforces a monitor limit it doesn't
advertise will reject part of a batch with `ERR_MONLISTFULL`; the user
gets a message in the lobby, but the client's own list isn't reconciled
until reconnect.

## Test Plan

- Unit tests for the monitor list: add, case-insensitive dedupe,
queueing at the limit, removal draining the queue, batching, and the
rename path.
- Ran the server against a local IRCd and watched the wire: opening
queries sends `MONITOR + <nick>` each, a reconnect with four open
queries sends a single `MONITOR + bob,carol,dave,mallory`, 730/731 drive
the online/offline state, a rename sends `MONITOR - bob` then `MONITOR +
bob2`, `MONITOR=0` sends nothing at all, and a bare `MONITOR` behaves as
unlimited.
2026-07-22 09:46:58 -07:00
Max Leiter
a19088ad16 Redesign settings (#5070)
|  |  |
|--------|--------|
| <img width="2016" height="1476" alt="image"
src="https://github.com/user-attachments/assets/381036c4-f9e2-4412-b3c7-2ac3c1a1163f"
/> | <img width="1890" height="1458" alt="image"
src="https://github.com/user-attachments/assets/f7d55d77-52f8-4493-9ad5-37ca00cb051f"
/> |
| <img width="1760" height="940" alt="image"
src="https://github.com/user-attachments/assets/dacb9a5e-cf96-4f9c-bd4a-0633b2b55120"
/> | <img width="1966" height="1424" alt="image"
src="https://github.com/user-attachments/assets/110d409e-2bba-4fec-90e9-48ef2cdd5c98"
/> |

## Summary

Each settings page becomes a stack of cards with a consistent title,
intro line and toggle rows, instead of loose headings and bare
checkboxes. The shared pieces are `SettingCard.vue` and
`SettingToggle.vue`, and the styling moves out of `style.css` into
`client/css/settings.css`.

Appearance is now the landing page for `/settings` (General moves to
`/settings/general`, with a redirect so old `/settings/appearance` links
keep working). Below the width where the fixed sidebar would collide
with the centered container, the tabs collapse into a dropdown instead
of stacking above the content.

Setting names and bindings are unchanged, so nothing about how
preferences are stored or synced moves.

## Test Plan

- Ran the client and stepped through Appearance and Notifications:
toggling a switch still writes through to the settings store,
`/settings/appearance` redirects to Appearance, and the mobile dropdown
opens aligned to the card.
- Not verified in a browser: Account and General, which need a
non-public instance.
2026-07-20 14:46:02 -07:00
Max Leiter
f77e4d1e6f ircv3: add +reply support (#5062)
Relies on https://github.com/kiwiirc/irc-framework/pull/411

https://ircv3.net/specs/client-tags/reply.html

Design feedback very welcome

<img width="1718" height="278" alt="Screenshot 2026-04-11 at 21-00-22
#thelounge — The Lounge"
src="https://github.com/user-attachments/assets/ba6e7c69-2477-4a7b-b196-901d19ca9cba"
/>

1. we lack a 'thread' view (irccloud, slack, etc). can be a followup if
we do want it
2. need to test scrolling to messages outside of the current buffer
3. due to lack of client support, i opted to auto prefill the input with
\`<targetNick>: \` so people can follow along even without reply support
4. CSS can definitely be improved (once a design is settled on)

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
2026-07-15 20:18:09 -07:00
Max Leiter
db5a183117 ircv3: +typing support (#5050)
https://ircv3.net/specs/client-tags/typing

https://libera.chat/news/new-and-upcoming-features-3#client-tags

Very open to style feedback: I took some tips from discord:
- bump padding on the bottom to the chat to fit it (20px, not very
noticeable)
- when scrolled up, a gradient is applied
- I dont love adding the padding but idk a better solution and IMO its
not noticeable



https://github.com/user-attachments/assets/a911994e-1564-45bf-8475-37742ad8b4f5


<img width="1288" height="330" alt="image"
src="https://github.com/user-attachments/assets/19441440-be8c-477c-8513-9c43b83c009b"
/>
<img width="1608" height="1086" alt="image"
src="https://github.com/user-attachments/assets/339dff30-6719-450d-9d4f-e01ec354de3f"
/>

Closes https://github.com/thelounge/thelounge/issues/2419
Supersedes/closes #4611

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-07-14 13:12:57 -07:00
Max Leiter
a7280c39ac ircv3: add bot mode support and [bot] userlist indicator (#5043)
This PR adds support for ircv3's bot mode:
https://ircv3.net/specs/extensions/bot-mode

irc-framework already exposes it in message tags, but we don't do
anything with it at the moment. This adds it to our `User` model and
adds an indicator in the userlist.

<img width="176" height="264" alt="image"
src="https://github.com/user-attachments/assets/03248607-4094-4fff-9417-607ae360097a"
/>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-07-14 13:08:37 -07:00
Max Leiter
2ecdbf9ec9 ircv3: support standard-replies (#5047)
https://ircv3.net/specs/extensions/standard-replies

irc-framework already supports it (behind a flag but unpublished to npm)
so its trivial for us to support and unblocks more ircv3 features
2026-07-14 13:07:42 -07:00
Max Leiter
0fe011235e remove webpack, babel, mocha; switch to vite/vitest (#5064)
```
Webpack vs Vite Build Comparison

  ┌────────────┬──────────────────────┬────────────────────┬───────────────┐
  │   Metric   │      Webpack 5       │ Vite 8 (Rolldown)  │    Change     │
  ├────────────┼──────────────────────┼────────────────────┼───────────────┤
  │ Build time │ 1,961ms (2.96s wall) │ 612ms (0.82s wall) │ 3.2x faster   │
  ├────────────┼──────────────────────┼────────────────────┼───────────────┤
  │ CPU time   │ 11.0s user           │ 1.3s user          │ 8.5x less CPU │
  └────────────┴──────────────────────┴────────────────────┴───────────────┘

  Bundle sizes (gzipped)

  ┌────────────────┬─────────┬────────┬────────┐
  │     Asset      │ Webpack │  Vite  │ Change │
  ├────────────────┼─────────┼────────┼────────┤
  │ App JS         │ 152.6K  │ 104.9K │ -31%   │
  ├────────────────┼─────────┼────────┼────────┤
  │ Vendor JS      │ 251.1K  │ 81.6K  │ -68%   │
  ├────────────────┼─────────┼────────┼────────┤
  │ Runtime JS     │ —       │ 0.5K   │ new    │
  ├────────────────┼─────────┼────────┼────────┤
  │ Total JS       │ 403.7K  │ 187.0K │ -54%   │
  ├────────────────┼─────────┼────────┼────────┤
  │ CSS            │ 12.5K   │ 11.9K  │ -5%    │
  ├────────────────┼─────────┼────────┼────────┤
  │ Total transfer │ 416.2K  │ 198.9K │ -52%   │
  └────────────────┴─────────┴────────┴────────┘

  Raw (uncompressed)

  ┌───────────────┬─────────┬──────┬────────┐
  │     Asset     │ Webpack │ Vite │ Change │
  ├───────────────┼─────────┼──────┼────────┤
  │ App JS        │ 1.3M    │ 304K │ -77%   │
  ├───────────────┼─────────┼──────┼────────┤
  │ Vendor JS     │ 1.1M    │ 236K │ -79%   │
  ├───────────────┼─────────┼──────┼────────┤
  │ CSS           │ 64K     │ 56K  │ -13%   │
  ├───────────────┼─────────┼──────┼────────┤
  │ Total public/ │ 5.1M    │ 3.4M │ -33%   │
  └───────────────┴─────────┴──────┴────────┘
```

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-06-01 09:02:09 -07:00
Max Leiter
18662cb2bf fix: a11y labels and semantics (#5057)
Fixes #4862, #4863, #4864, #4865, #4866


instead of using `aria-label`, we can use `data-tooltip` to avoid
duplicating their names in the a11y tree

the scroll down button looks fine:
<img width="670" height="228" alt="image"
src="https://github.com/user-attachments/assets/d1b3e7b9-1c0f-477b-a0f8-c7d96684b4f4"
/>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-04-16 09:50:40 -07:00
Reto Brunner
fc135023a4 style chghost messages
chghost messages weren't styled properly, given that they are
similar to a nick change, re-use the corresponding icon and style.
2025-09-06 11:36:49 +02:00
Reto Brunner
e25c296901 push: remove iOS warning
iOS 16.4 introduced webpush, we can get rid of the special case
in our settings panel.
2023-03-28 10:00:56 +02:00
Reto Brunner
f55f772659 style: Put user colors into the smallest possible scope
The only thing that cares about user colors is the user component.
Putting a class value on the chat component seems to be the wrong
place.

This also allows us to remove various css selectors so that we
don't need to be that specific.
After all whatever has that class needs to be colored, we don't
care where it is.
2022-11-27 16:04:56 +01:00
Max Leiter
dd05ee3a65 TypeScript and Vue 3 (#4559)
Co-authored-by: Eric Nemchik <eric@nemchik.com>
Co-authored-by: Pavel Djundik <xPaw@users.noreply.github.com>
2022-06-18 17:25:21 -07:00
Max Leiter
24bdc46b0a Settings: move nav to left side on larger screens 2022-04-29 19:27:52 -07:00
Max Leiter
31b67b7786 git push --set-upstream origin maxleiter/tabbedSettings 2022-04-29 19:27:50 -07:00
Roni Laukkarinen
ec757c9b69 Fix topic wrapping on mobile 2022-04-17 19:07:56 +03:00
Roni Laukkarinen
7b725ea55c Fix the alignment of the header buttons 2022-04-17 13:39:52 +03:00
Val Lorentz
8edec1a5a8 Make sure the leading '<' is select when copypasting a message
Firefox does not seem to select leading (or trailing) characters that are
too small; so this commit sets a very small width, that is still large
enough to be selected.

This commit also adds `display: inline-block`, so the width is not
ignored; but this causes Chrome to ignore the space after `>`, so I made
it a non-breakable space.

An alternative is to make only the leading `only-copy` an
`inline-block`, but I think the non-breakable space is a good idea
regardless.
2022-02-12 13:59:31 +01:00
Max Leiter
4be9a282fa Add the option to mute channels, queries, and networks (#4282)
Co-authored-by: Reto <reto@labrat.space>
2022-02-10 17:56:17 -08:00
Val Lorentz
1e3a7b1250 Emit a message for SASL loggedin/loggedout events
Closes GH-3921
2022-02-10 22:30:04 +01:00
Reto
d228a8c4f4 Bump most deps (#4453) 2022-02-09 15:27:34 -08:00
Reto Brunner
1953e03253 Add RPL_UMODEIS msg handler 2021-12-06 07:24:21 +01:00
itsjohncs
ea619f5463 Prevent round and white search styling in iOS 15. 2021-11-03 01:50:11 -07:00
Max Leiter
3cab39c59b Merge pull request #4340 from itsjohncs/long-channel-names
Improve responsiveness of channel name and topic.
2021-11-02 13:18:39 -07:00
itsjohncs
393d4fe591 Enable Android's context menus in network list.
After #4326 Android users could no longer long-touch to bring up the
context menu for channels in the network list. Now they can again.
2021-10-30 02:06:35 -07:00
deejayy
cf18d04f06 Move font assignment of password reveal icon 2021-10-25 19:39:59 +02:00
itsjohncs
56d4a6afde Improve responsiveness of channel name and topic.
This commit makes two changes:

1. Long channel names are truncated.
2. Topics cannot be shrinked into non-existence.
2021-10-22 13:57:13 -07:00
Max Leiter
1d33e0195a Merge pull request #4324 from itsjohncs/gestures-next-channel
Two-finger swipe now switches windows (#3901)
2021-10-12 15:53:54 -07:00
Max Leiter
fcffab1259 Merge pull request #4326 from itsjohncs/mobile-channel-list-sorting
Allow network list reordering via touch.
2021-10-12 15:53:18 -07:00
itsjohncs
5c614785bf Suppress iOS long touch behavior in network list.
When a user long touches on iOS, they will select the nearest
selectable text. This causes a distracting visual bug when reordering
the network list (which also uses a long press).
2021-10-10 17:08:17 -07:00
itsjohncs
a48f449c59 Allow network list reordering via touch.
Users can now long touch and drag a channel or network to change its
ordering in the sidebar.
2021-10-10 14:40:08 -07:00
John Sullivan
2ab671664e Vertically center topic editing input in Safari. (#4325) 2021-10-09 22:23:58 -07:00
itsjohncs
91a0815bb5 Add Gestures section to help window.
This documents the two gestures that The Lounge currently supports.

The section is only visible if your device supports touch.
2021-10-07 13:39:30 -07:00
JeDaYoshi
998f8d2beb Fix userlist's wrong position on mobile devices 2021-07-03 23:50:51 +00:00
Max Leiter
3e4b22255d Merge pull request #4201 from thelounge/maxleiter/accessiblityImprovements
Initial accessibility improvements
2021-07-01 12:05:22 -07:00
Max Leiter
d106889127 Merge branch 'master' into feature/socks-support 2021-06-29 22:48:00 -07:00
Bradley Shaw
a2d23810bf Differentiate WALLOPS from NOTICE 2021-06-22 11:50:22 +01:00
Max Leiter
867fff33c0 Adjust chat layout so messages directly above input 2021-06-21 21:55:54 -07:00
Max Leiter
3fdc42350e Revert "Fix load more button hidden behind search form"
This reverts commit 115d970604.
2021-06-13 16:21:27 -07:00
Mary Strodl
abcad094d1 network: add support for SOCKS (closes #1375) 2021-05-05 20:06:00 -04:00
Nachtalb
bb41871873 Add close search button 2021-04-30 01:53:08 +02:00
Nachtalb
115d970604 Fix load more button hidden behind search form 2021-04-30 01:53:08 +02:00
Mary Strodl
283ef445e5 Merge remote-tracking branch 'origin/master' into richrd/message-search 2021-04-12 22:00:49 +02:00
Mitaka
dc0e233fe0 Show give/revoke modes and kick on other modes than +o
Fix #3965

Signed-off-by: Mitaka <jin@mitaka.nl>
2021-03-12 14:33:51 +01:00
Yorick Bosman
51b0ec1e98 Add ignore option to contextmenu 2020-11-18 23:57:20 +01:00
Pavel Djundik
5a1963647e Merge pull request #3962 from thelounge/xpaw/help-info-blocks
Implement generic monospace blocks for INFO and HELP numerics
2020-07-27 11:02:14 +03:00
Pavel Djundik
3e26611e9f Fix layout trashing in Chrome
https://bugs.chromium.org/p/chromium/issues/detail?id=1063575#c21
2020-07-27 10:27:52 +03:00
Pavel Djundik
63a420ac21 Implement generic monospace blocks for INFO and MOTD numerics
Fixes #3961
2020-07-20 10:07:49 +03:00
Richard Lewis
9a1fb0c0a0 Search improvements. 2020-04-26 22:39:05 +03:00
Richard Lewis
0f3c292098 Message search WIP. 2020-04-26 22:39:05 +03:00
Pavel Djundik
ad6569cf06 Add an indicator to statusmsg messages 2020-04-24 11:46:39 +03:00