The mark sat tiny on a black square (invisible in the browser tab).
Make the near-black background transparent (alpha from max channel,
sub-22 floor removes the glow haze) and crop to the mark's bounding
box with ~8% margin so it fills the frame at favicon sizes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switch the favicon set + icon-512 + apple-touch-icon to the no-text
hexagon+wrench mark so it stays legible at 16-32px (the wordmark
version was unreadable at favicon sizes).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace placeholder favicon.svg with the designed Fabric icon as a PNG
favicon set (16/32/256), apple-touch-icon (180), icon-512; document
title -> 'Fabric'; theme-color black to match the icon.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 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>
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>
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>
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>
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>
- 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>
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>
- 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>
- 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>