- Import chat-ui.css via CSS @import in main.css (not JS import)
so @layer directives go through Tailwind's compilation
- Add @source directive for packages/chat-ui so Tailwind v4
scans the package for utility classes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace chatscope implementation with ChatProvider, ChatMessageList,
and ChatComposer from @xtablo/chat-ui. Props interface unchanged.
Also fix unused Tag import in chat-ui layouts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace leftover chatcn CSS variables in ticket status/priority
configs and filter tabs with xtablo design tokens.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Spec and plan for integrating chatcn as @xtablo/chat-ui package,
replacing chatscope for the chat UI rendering layer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add shared ChatMessages component with date separators (Aujourd'hui, Hier, etc.)
- Show sender name and avatar on incoming messages
- Own messages aligned to the right, others to the left
- Show message timestamps on each message
- Typing indicator shows member names
- Optimistic messages shown with reduced opacity
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DO RPC doesn't support WebSocket upgrade requests. Forward the request
via stub.fetch() and pass userId/channelId via custom headers.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove useSignUpToStream from hooks/auth.ts and oauth-signin.tsx
- Fix useRef initial values in useChat.ts
- Remove unused destructured variables in chat.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Delete ChatProvider, ChannelPreview, CustomChannelHeader, hooks/channel.ts
- Replace TabloDiscussionSection with chatscope-based implementation using useChat
- Update tablo-details.tsx to use useChatUnread instead of useTabloDiscussionUnread
- Remove streamToken field from User type in UserStoreProvider
- Remove useSignUpToStream from shared auth hooks
- Remove stream-chat and stream-chat-react packages
- Remove stream-chat-react CSS import from main.tsx
- Clean up all streamToken references from test mocks and helpers
- Update chat.test.tsx and tablo-details.layout.test.tsx for new implementation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ensures the UpgradeBlockProvider waits for both user and organization
data before computing the block reason, preventing premature paywall
flash. Temporary users are never blocked.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
useUser() throws when the store is null (before user data is fetched).
Switch to useMaybeUser() which safely returns null.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On mobile, the sidebar was 192px wide (w-48) and could appear collapsed (icons-only)
depending on prior desktop state. This introduces effectivelyCollapsed to always force
expanded mode when the mobile overlay is open, and uses a narrower w-40 (160px) width
to reduce screen coverage on small devices like iPhone SE (375px).
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Add flex-wrap to the member action row (date + remove button) and the
header badge/language selector row so they wrap gracefully on narrow
screens without affecting desktop layout.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Cloudflare serves static assets before the worker runs, so the icon
redirect logic was never reached. Renamed the default icon files to
default-* prefix. The worker now handles all requests for the original
icon paths: redirects to org-specific icons when cookie is set, or to
the renamed defaults otherwise.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
iOS uses the apple-touch-icon link tag for the home screen icon, not
the manifest. The worker now intercepts requests for apple-touch-icon
and favicon PNGs, redirecting to the org-specific version from R2
when the x-org-id cookie is set.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Icons are stored in the web-assets R2 bucket which is already served
via assets.xtablo.com, same as user avatars. No need to proxy through
the API endpoint.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
The API runs on a separate domain from the frontend. Org icon URLs
in the manifest and settings page need the full API base URL.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Stack avatar and org logo sections vertically on mobile, wrap header badges/language selector, and make member list items stack on small screens.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Add horizontal padding to page containers so cards don't bleed to the
edges on small screens, reduce card inner padding on mobile, scale down
headings at mobile breakpoints, and change the first/last name grid from
a fixed two-column layout to responsive (single column on mobile).
Replace the fixed-width form class (w-95) with w-full on the login form.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>