Commit Graph

31 Commits

Author SHA1 Message Date
b1c270a6ce feat(chat): file upload + attachments + pinned canvas
- composer 📎 attach (multi-file) with removable chips; uploads to
  /files then sends a message with attachments; image preview /
  download chips via ?access_token.
- pinned per-channel canvas panel below the topbar (fixed; independent
  of message scroll): md→renderMarkdown, text→<pre>, html→sandboxed
  iframe; collapse/expand.
- share/edit canvas modal (sharer-only Edit/Remove); live via
  canvas.updated/canvas.removed sockets; channel & messages context
  menus get canvas actions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 20:17:10 +01:00
f063807089 feat(chat): custom right-click context menus
Override the native browser menu with resource-specific menus:
- guild (rail icon): open, copy node id/name, add guild
- channel: open, join/leave, close, copy id/name, create channel
- message: copy text/id, mention author, delete (soft)
- user (member row): mention, copy id/name, move-to-bypass
  (discuss/work in-channel only), settings (self)
- blank areas (rail/channels/messages/members/root): scoped
  create/refresh actions

Menu closes on click/Escape/scroll/resize; positioned within the
viewport; the most specific target wins via stopPropagation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 19:35:57 +01:00
372805c9fa feat(chat): bypass-list UI for discuss/work channels
- create-channel modal: optional bypass multi-select (discuss/work only),
  sent as bypassUserIds; reset on open/close.
- members panel (in-channel, discuss/work): bypass members tagged
  'bypass'; others get a '→ bypass' action -> POST /channels/:id/bypass.
- loadChannelMembers consumes the new {userId,bypass} member shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 19:26:24 +01:00
44c308bd06 feat(frontend): closed-channel read-only UI
Closed channels: composer replaced by a read-only banner; history still
viewable; GuildChannel carries closed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 16:52:44 +01:00
2d9aec8657 feat(frontend): render <@id> as @name mention chips
Markdown renderer turns <@userId> into a Discord-style mention chip
(@displayName, resolved via guild members; short-id fallback). Tokens
inside backticks stay literal; untranslated <@user.name:..> left as-is.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 15:52:43 +01:00
24eb458621 feat(frontend): per-message markdown rendering
Self-contained, HTML-escaped (XSS-safe) markdown for history messages;
each message rendered independently so a syntax error (e.g. unclosed
code fence) cannot leak into the next message.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 15:47:02 +01:00
8272ed495e feat(frontend): hide channel-members section for public channels
Public channel selected -> single guild member list (no In-channel split).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 15:27:36 +01:00
ab31afa13d feat(frontend): split members sidebar into channel + guild sections
When a channel is selected the Members panel shows 'In channel — N'
(that channel's members) above 'Guild — N' (all guild members).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 15:00:24 +01:00
b04b099754 feat(frontend): channel type colors, triage/custom create fields, join/leave, dev mode
- per-x_type channel row colors (general/work/report/discuss/triage/custom)
- create-channel: required On-duty select (triage) / Listeners checklist (custom)
- channel Join/Leave in topbar; list carries isMember
- Developer mode toggle (Settings): show guild /ack + per-message wakeup
  metadata; off by default (metadata stays transparent)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 14:51:20 +01:00
396b2fd231 feat(frontend): channel type selector on create
Required Type dropdown (general|work|report|discuss|triage|custom) in the
create-channel modal; sends xType; shows type badge on channel rows.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:35:37 +01:00
53d21381d9 feat(frontend): Discord-style dark redesign
- full design system rewrite (dark theme, system tokens)
- chat shell: server rail / channel sidebar / message area / members
- message rows with avatars, author + time; empty/loading states
- login screen redesign; add-guild moved to a modal
- removed debug v1/v2/v4 panel toggles; members toggle in topbar

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:26:11 +01:00
1b70f27fc4 fix(frontend): refresh guild tokens on mount to avoid stale-token 401
Guild access tokens (15-min TTL) are persisted in localStorage but were
never refreshed on page (re)load - only the center token was. After the
TTL elapsed, GET /channels failed with 401 ('Failed to load channels').
Re-issue guild tokens via refreshGuilds() on mount and reload channels
when the guild token changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:14:10 +01:00
6b35d92aef feat(frontend): public channels, self-excluded member picker, editable display name
- create-channel modal: Public checkbox (default off), self excluded from
  member list (creator auto-added), shows member display names
- Settings modal to edit your own display name
- members panel shows names and marks (you)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 09:09:49 +01:00
c10cdcf2e5 fix(frontend): create channel under selected guild and surface errors via modal
- createChannel falls back to selectedGuildId when guildDbId is unknown,
  so the first channel of a guild can be created (no chicken-and-egg)
- channel is created under the currently selected guild
- errors now show in a dismissible modal instead of the Messages pane

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 08:52:25 +01:00
nav
40540ab8a6 feat(frontend): add guild join flow, members panel, and channel-create member modal 2026-05-14 16:58:12 +00:00
nav
75fee7c725 fix(frontend): require guildId for channel creation and fallback from channel list 2026-05-14 16:49:57 +00:00
nav
d0bbd4a20f feat(frontend): add collapsible v1/v2/v4 panels and guild members column 2026-05-14 16:46:38 +00:00
nav
12265e09ec feat(frontend): add create channel action in channel pane 2026-05-14 16:41:20 +00:00
nav
04d8f9e3bf feat(frontend): redesign post-login layout into guild/channel/chat panes 2026-05-14 16:38:19 +00:00
nav
4f28f102e0 feat(auth): remove center api key from frontend login flow 2026-05-14 14:17:12 +00:00
nav
cfaa1cb657 feat(frontend): translate UI to English and refresh layout styles 2026-05-14 13:33:37 +00:00
nav
4724678035 feat(frontend): require center API key on login/auth calls 2026-05-13 08:18:01 +00:00
nav
c906cde209 feat(frontend): login with center URL and consume center-issued guild tokens 2026-05-13 08:00:32 +00:00
nav
25bd1df290 feat(frontend): add loading empty and error states for chat operations 2026-05-12 16:08:17 +00:00
root
763f06ab8c feat(frontend): add typing presence and reconnect repull realtime behavior 2026-05-12 16:04:25 +00:00
root
e7faf92d3c feat(frontend): show next_expected_seq and page continuity hints 2026-05-12 16:00:38 +00:00
root
e7b2721280 feat(frontend): add message edit delete and ranged pull controls 2026-05-12 15:59:11 +00:00
root
048a55aaeb feat(frontend): load guild-channel lists and sync chat channel in url 2026-05-12 15:25:40 +00:00
root
d718128f89 feat(frontend): implement center auth session flow with route guard 2026-05-12 15:09:06 +00:00
root
6219fbbcfe feat(frontend): add api client and socket client wrappers with runtime config 2026-05-12 13:46:19 +00:00
root
b3291b5874 feat(frontend): add routing skeleton with workspace chat and login pages 2026-05-12 13:13:52 +00:00