Commit Graph

268 Commits

Author SHA1 Message Date
Nicolas Varrot
0329fa48bf fix: replace ugly focus ring with subtle border color change on textarea 2026-02-13 17:55:19 +00:00
Nicolas Varrot
ac29646dc8 fix: hide non-essential header buttons on mobile (sound, export, theme, language) 2026-02-13 17:50:49 +00:00
Nicolas Varrot
219d487c43 fix: hide preview and syntax highlight buttons on mobile to give textarea more space 2026-02-13 17:50:00 +00:00
Nicolas Varrot
153d165457 fix: navigator not defined in test environment 2026-02-13 15:51:07 +00:00
Nicolas Varrot
ea8e5e3dab chore: bump version to v1.37.0 2026-02-13 15:46:50 +00:00
Nicolas Varrot
622aa107f8 feat: show response generation time on assistant messages
Track how long each assistant response took to generate and display
it subtly next to the timestamp (e.g. '· 12.3s'). The timing is
measured from the first streaming delta to the final state, and
preserved across the history reload that follows stream completion.

Only visible for messages generated during the current session.
2026-02-13 15:46:29 +00:00
Nicolas Varrot
d31374baf7 docs: add missing features to README (PWA, notifications, keyboard shortcuts, accessibility) 2026-02-13 15:27:10 +00:00
Nicolas Varrot
a9ed8872fb chore: bump version to v1.36.1 2026-02-13 15:12:15 +00:00
Nicolas Varrot
d3e8f3143a fix: sync html lang attribute with i18n locale selection
- Set document.documentElement.lang on initial load and locale change
- Ensures screen readers and browser features respect the active language
- Removes duplicate aria-label on MessageSearch input
2026-02-13 15:11:39 +00:00
Nicolas Varrot
a44b6db77d style: add global focus-visible outline for keyboard navigation accessibility
Adds a consistent focus ring (accent-dim color, 2px) on all focusable
elements when navigated via keyboard (:focus-visible). Mouse/touch clicks
no longer show the default browser outline (:focus:not(:focus-visible)).

Elements with existing Tailwind focus:ring-* classes are unaffected since
they already handle their own focus styling.
2026-02-13 14:57:39 +00:00
Nicolas Varrot
74278476e4 chore: bump version to v1.36.0 2026-02-13 14:43:26 +00:00
Nicolas Varrot
1942ba18c7 feat: semantic <time> elements with full-date tooltip on message timestamps
- Replace raw text timestamps with <time> HTML elements
- Add dateTime attribute (ISO 8601) for accessibility and machine readability
- Add title attribute showing full date+time on hover (weekday, date, time with seconds)
- Localized tooltip using the user's language preference
- Helps users see exact timestamps for older messages shown as abbreviated times
2026-02-13 14:43:05 +00:00
Nicolas Varrot
3d707dbd90 perf: lazy-load ReactMarkdown and plugins for faster initial render
Move react-markdown, remark-gfm, remark-breaks, and rehype-highlight
imports from eager to dynamic via a LazyMarkdown wrapper component.
The ~336KB markdown bundle is now loaded on-demand after initial paint
instead of blocking the critical rendering path.

- Create LazyMarkdown component with Suspense fallback
- Pre-load plugins in parallel on module init
- Replace all ReactMarkdown usage in ChatMessage with LazyMarkdown
2026-02-13 14:26:14 +00:00
Nicolas Varrot
388879e14e style: add print stylesheet for conversation export
- Hide sidebar, header, chat input, and scroll button when printing
- Reset backgrounds to white, text to black for readability
- Code blocks get light background with borders
- Tool calls styled for print (compact, bordered)
- External links show their URL in parentheses
- Chat scroll area becomes fully visible (no overflow)
- Messages avoid page-break-inside for clean pagination
- Remove shadows and backdrop filters in print
2026-02-13 14:12:41 +00:00
Nicolas Varrot
52458b6171 test: add GatewayClient WebSocket unit tests (12 tests)
Cover core networking: connect/disconnect, challenge handshake,
event routing, request/response, error handling, timeout,
reconnect behavior, and credential updates.

Adds __APP_VERSION__ define to vitest.config.ts for test env.
Total test count: 95 → 107.
2026-02-13 14:03:16 +00:00
Nicolas Varrot
98f273649e docs: add reverse proxy configuration guide (Nginx, Caddy, Traefik) 2026-02-13 13:42:13 +00:00
Nicolas Varrot
7c8f3ba78f chore: bump version to v1.35.0 2026-02-13 13:28:28 +00:00
Nicolas Varrot
e230f9791f feat: improve accessibility — semantic HTML landmarks, skip-to-content link, ARIA attributes
- Replace div with <main> for primary chat pane (screen reader landmark)
- Replace div with <section> for split pane
- Add skip-to-content link for keyboard navigation (Tab → jump to chat input)
- Add aria-expanded and aria-label to tool call badge buttons
- Add id='chat-input' to textarea for skip link target
- Add i18n keys for new ARIA labels (EN + FR)
2026-02-13 13:28:02 +00:00
Nicolas Varrot
60411971b7 chore: remove duplicate PR template (keep uppercase version) 2026-02-13 13:10:16 +00:00
Nicolas Varrot
26e433b1a3 chore: bump version to v1.34.1 2026-02-13 12:58:53 +00:00
Nicolas Varrot
be8f5b62ff fix: drop Node 18 from CI matrix — Vite 7.3 requires Node 20.19+
- Remove Node 18 from CI test matrix (crypto.hash not available)
- Update engines field to >=20.19
- Update README Node.js version references
2026-02-13 12:58:23 +00:00
Nicolas Varrot
ad0efe3f5b chore: update dependencies (react 19.2.4, typescript-eslint 8.55, vite-react 5.1.4, lucide 0.564) 2026-02-13 12:41:29 +00:00
Nicolas Varrot
b478f3e89c chore: bump version to v1.34.0 2026-02-13 12:26:22 +00:00
Nicolas Varrot
ee2b244fcd feat: add loading spinner and noscript fallback to index.html
Show a CSS-only spinner while JS bundles load, improving perceived
performance on slow connections. Add noscript message for users with
JavaScript disabled.
2026-02-13 12:26:08 +00:00
Nicolas Varrot
3fab1c0f5e docs: add SEO improvements — robots.txt, sitemap.xml, canonical URL, structured data 2026-02-13 12:12:31 +00:00
Nicolas Varrot
b93d5f54bf chore: bump version to v1.33.1 2026-02-13 11:58:01 +00:00
Nicolas Varrot
72e9bce4c5 fix: bust service worker cache on each build with version+timestamp
The SW cache name was hardcoded to 'pinchchat-v1', meaning PWA users
would get stale cached assets forever. Now the cache name includes
the package version and build timestamp, so each build creates a new
cache and old ones are cleaned up on activation.

Also adds:
- Periodic SW update check (every 30 min)
- Auto-reload when new SW version is detected
2026-02-13 11:57:32 +00:00
Nicolas Varrot
13f5c4ac0c fix: textarea overflow and width in highlighted input container 2026-02-13 11:52:39 +00:00
Nicolas Varrot
beced29c91 fix: textarea not expanding in flex layout with syntax highlight enabled 2026-02-13 11:51:55 +00:00
Nicolas Varrot
daa0ce7494 chore: remove unused dependencies (radix-ui, class-variance-authority)
Remove 5 unused production dependencies:
- @radix-ui/react-collapsible
- @radix-ui/react-scroll-area
- @radix-ui/react-separator
- @radix-ui/react-tooltip
- class-variance-authority

These were leftover from initial scaffolding and never imported.
Reduces install footprint and dependency count.
2026-02-13 11:41:25 +00:00
Nicolas Varrot
879d73e3ac chore: bump version to v1.33.0 2026-02-13 11:30:35 +00:00
Nicolas Varrot
f8324b760c feat: add C, C++, and Java syntax highlighting support
Add c, cpp, and java to the highlight.js language bundle for code block
rendering. These are among the most commonly used languages in AI coding
conversations and were previously unsupported, falling back to plain text.

Also adds aliases: h (C headers), cc/cxx/c++/hpp/hxx (C++ variants).
2026-02-13 11:30:18 +00:00
Nicolas Varrot
6fb2f83716 fix: add Docker HEALTHCHECK for container health monitoring
- Add HEALTHCHECK instruction to Dockerfile (wget localhost:80, 30s interval)
- Add healthcheck config to docker-compose.yml
- Enables Docker/orchestrator health monitoring and auto-restart on failure
2026-02-13 11:12:43 +00:00
Nicolas Varrot
ccabb8699f perf: memoize ChatMessage component and hoist ReactMarkdown plugin arrays
- Wrap ChatMessageComponent with React.memo to skip re-renders when props unchanged
- Hoist remarkPlugins and rehypePlugins arrays to module scope to avoid
  creating new array references on every render (prevents unnecessary
  ReactMarkdown re-processing)
- Use proper PluggableList type from unified instead of any
2026-02-13 10:58:11 +00:00
Nicolas Varrot
1c09ccde22 fix: improve accessibility — add ARIA attributes to ThemeSwitcher, ThinkingBlock, ThinkingIndicator, ErrorBoundary, SessionIcon
- ThemeSwitcher: aria-expanded, aria-haspopup, aria-pressed on theme/accent buttons, Escape to close, dialog role
- ThinkingBlock: aria-expanded on toggle, region role on content
- ThinkingIndicator: role=status, aria-label, decorative icon aria-hidden
- ErrorBoundary: role=alert on error state
- SessionIcon: aria-hidden on decorative SVG brand icons
2026-02-13 10:42:10 +00:00
Nicolas Varrot
3657476fd9 docs: add pull request template 2026-02-13 10:25:10 +00:00
Nicolas Varrot
66a6b1fd94 docs: add Customization section to README (themes, accents, preferences) 2026-02-13 10:11:48 +00:00
Nicolas Varrot
6ce633e714 docs: update CHANGELOG for v1.32.0–v1.32.2 2026-02-13 09:55:26 +00:00
Nicolas Varrot
63af0b0dde chore: bump version to v1.32.2 2026-02-13 09:40:34 +00:00
Nicolas Varrot
cbb46115a0 fix: render markdown lists with proper bullet/number styles
Tailwind's preflight resets list-style to none on ul/ol elements.
Add explicit list-style-type rules for markdown-body: disc for ul,
decimal for ol, with circle/square for nested levels.
Also add li margin for spacing.

Closes feedback #61
2026-02-13 09:40:22 +00:00
Nicolas Varrot
a64a235d6c chore: bump version to v1.32.1 2026-02-13 09:28:04 +00:00
Nicolas Varrot
5acc5a820d fix: improve light theme readability for tool badges and user bubbles
- Expose resolvedTheme in ThemeContext for theme-aware rendering
- Tool call badges: darker text colors and higher bg opacity in light theme
- User message bubbles: increased bg opacity and border strength in light theme
- Progress bars and send button already use accent CSS variables (no change needed)

Closes feedback #60
2026-02-13 09:27:42 +00:00
Nicolas Varrot
0a0acbe4e0 chore: bump version to v1.32.0 2026-02-13 09:12:24 +00:00
Nicolas Varrot
b783ae181b feat: optimistic message rendering with send status indicators
- User messages appear instantly with 'sending' state (dimmed, clock icon)
- Transitions to 'sent' (checkmark) when server acknowledges
- Shows error state (alert icon, retry visible) if send fails
- Applied to both primary and secondary sessions
2026-02-13 09:12:09 +00:00
Nicolas Varrot
495dd0352f docs: add debugging section to troubleshooting guide 2026-02-13 08:57:41 +00:00
Nicolas Varrot
85a14224ad fix: theme switcher portal — max z-index, remove backdrop-blur to fix compositing 2026-02-13 08:46:13 +00:00
Nicolas Varrot
885cd0ea22 fix: render theme switcher via portal to escape overflow/stacking context 2026-02-13 08:44:26 +00:00
Nicolas Varrot
f2162c6731 test: add i18n and highlight.js test suites (18 cases, 95 total) 2026-02-13 08:42:59 +00:00
Nicolas Varrot
317096499c fix: theme switcher click handling — prevent click-outside from swallowing button clicks 2026-02-13 08:36:12 +00:00
Nicolas Varrot
97ceb08b86 docs: release v1.31.1 — theme variable fix in App.tsx 2026-02-13 08:27:31 +00:00