Commit graph

153 commits

Author SHA1 Message Date
Bruno Deanoz
9f7e3fb8b0 fix: center text and icons vertically in input capsule
Column gets heightIn(min=64dp) + Arrangement.Center so content
sits in the middle. Placeholder maxLines=1 to prevent overflow dots.
2026-06-23 14:24:21 +02:00
Bruno Deanoz
1d47e05dbf style: taller input (64dp), rounder corners (34dp), centered text 2026-06-23 14:20:46 +02:00
Bruno Deanoz
e683419d96 style: taller capsule input matching Gemini proportions
56dp min height, 30dp corner radius, generous inner padding.
Icons 40dp touch targets, 22dp icon size. Text 16sp centered.
High opacity (0.92/0.97) for solid feel. 16dp horizontal margin.
2026-06-23 14:18:23 +02:00
Bruno Deanoz
fb8f21dfd8 style: compact capsule input like Gemini
Tighter row: 36dp icons, 6dp padding, 15sp text, capsule shape.
Higher opacity (0.90/0.96) for solid feel against background.
All action buttons (Send/Call/Stop) matched to 36dp.
2026-06-23 14:02:37 +02:00
Bruno Deanoz
e56bef05f6 style: rounder input card, stronger shadow, higher opacity
pill shape (32dp radius), level4 shadow for stronger separation from
background, tintAlpha 0.88/0.94 (more opaque, cleaner), tighter
horizontal margin (12dp).
2026-06-23 13:59:12 +02:00
Bruno Deanoz
4958ca8429 feat: single-row input, pills inside card, new-chat button
ChatInput redesigned: single row (Plus | Text | Tune | Mic | Send).
Pills hidden by default, expandable via tune icon with slide animation
inside the same GlassSurface card. Shape lg (28dp) instead of pill.

ModePillsRow moved from separate floating row into ChatInput as
pillsContent lambda. Bottom dock scrim simplified.

New Chat button (PenLine icon) added to top bar next to TokenBadge.

LazyColumn bottom padding 260→140dp (dock is now smaller).
2026-06-23 13:57:28 +02:00
Bruno Deanoz
ad98b9f499 feat: redesign app icon + splash to match glass-lens orb
Foreground: opaque plastic orb → translucent glass-lens with subtle
amber tint, lighter speculars, thinner rims. 10 layers → 8 layers.

Backgrounds: warm cream → neutral off-white (light), cleaner obsidian
(dark). Matches app's actual background colors.

Monochrome: cleaner gradient, thinner rim.

Splash screen uses the same foreground via windowSplashScreenAnimatedIcon.
2026-06-23 13:48:25 +02:00
Bruno Deanoz
1c9491e3dc feat: text selection, modern sidebar profile, markdown spacing
Text selection: SelectionContainer wraps both user and assistant
messages — long-press to select, copy, share.

Sidebar profile: avatar 30→38dp with radial gradient, rounded lg
shape, icon buttons with subtle backgrounds, bigger text (15sp W400).

Markdown: heading spacing 18→24/20dp, list items better aligned
(8dp gap, bullet muted), blockquote bar 4dp inset + 12dp gap.
2026-06-23 13:45:23 +02:00
Bruno Deanoz
95672d3124 fix: mode pills more visible, action buttons larger, revert Brain icon
Pills: higher background alpha, stronger borders, removed muted text
opacity, bigger padding (14x8dp), icon 16dp, text 13sp W400/W500.

Action buttons: Plus/Mic/Call/Send/Stop 38dp→42dp, icons 19→22dp.

Brain icon reverted to Lucide — custom version too complex at 16dp.
2026-06-23 13:11:47 +02:00
Bruno Deanoz
3c6a8911c4 feat: custom 1.0px icons for highest-visibility touchpoints
Hand-drawn Menu, Plus, Mic, AudioLines, Brain, SlidersHorizontal,
Globe, Image with 1.0px stroke (vs Lucide's 1.5px) to match the
lighter W300 typography. Registered in KaizenIcons — all usages
update automatically, no call-site changes.
2026-06-23 13:05:50 +02:00
Bruno Deanoz
0f6e55d77a feat: upgrade NetworkImageCache — disk cache, shared client, crossfade
Shared OkHttpClient via KaizenApi.imageClient (reuses connection pool),
file-based disk cache in cacheDir/img (survives app restart), 32MB
size-based memory limit instead of 50-entry count, Crossfade animation
on image load.
2026-06-23 13:00:49 +02:00
Bruno Deanoz
38678a2add refactor: extract hardcoded colors into KaizenSemanticColors
Single source of truth for error, success, indigo, link, and dropdown
colors. Replaces ~25 scattered Color(0xFF...) literals across 10 files.
Syntax highlighting and glass-surface tints intentionally left local.
2026-06-23 12:56:09 +02:00
Bruno Deanoz
75ca8c0e7b feat: visual refresh — lighter typography, message animations, richer themes
Typography: body text W400→W300 for airier feel, headings scaled up
(H1 26sp, H2 22sp, H3 18sp), W600/W500 weight hierarchy for contrast.

Animations: animateItem() on LazyColumn messages — 350ms fade-in,
spring placement, 200ms fade-out.

Themes: blobs 20% larger + better full-screen distribution, higher
alpha on OLED (0.48 peak), light mode factor 0.65→0.78, reduced
vignette, distinct primaryDeep per theme for richer gradients.
2026-06-23 12:22:38 +02:00
Bruno Deanoz
fbead82ada fix: increase chat content padding to prevent overlap with top/bottom bars 2026-06-23 07:17:12 +02:00
Bruno Deanoz
10154d98bb fix: set gradlew execute permission 2026-06-23 07:15:17 +02:00
Bruno Deanoz
ecf096bf3b docs: passkey registration plan (WebAuthn/FIDO2 via Credential Manager)
Three-phase plan: registration + management (Phase 1), authentication
for login + unlock (Phase 2), YubiKey + cross-device (Phase 3).

Covers backend changes (assetlinks.json, multi-origin verification,
v1 re-exports with Bearer auth) and app implementation (Credential
Manager API, PasskeyManager, Settings UI, strings).
2026-06-23 01:53:04 +02:00
Bruno Deanoz
fd684fff2e fix: scroll button direction follows scroll position
Single button instead of two mutually exclusive ones. Arrow direction
is based on proximity to bottom: near bottom → arrow up (scroll to top),
not near bottom → arrow down (scroll to end). Updates instantly as the
user scrolls. Hidden when already at the target end.

Old logic had an if/else that always showed ArrowUp first (because
!atTop was always true when scrolled down), making ArrowDown unreachable
in most scroll positions.
2026-06-23 01:44:47 +02:00
Bruno Deanoz
f855a26b31 fix: sidebar overlapping status bar on notch devices
statusBarsPadding() was on the inner Column (only pushed content down),
but the GlassSurface itself started at a fixed 12dp from the top edge —
on devices with tall notches (S25 Ultra) the sidebar header sat behind
the system clock/icons. Moved statusBarsPadding() to the GlassSurface
modifier so the entire glass panel starts below the status bar.
2026-06-23 01:41:07 +02:00
Bruno Deanoz
8099f463b8 docs: comprehensive CLAUDE.md update for 2026-06-23 design session
Added 12 new commit entries (sidebar redesign through ReasoningBlock
redesign), new bugs-fixed section, updated API contract (webSearchProvider),
Room schema (titleGenerated, v4), voice recording docs (auto-send +
waveform), new feature checkboxes (edit/resend, sidebar search, generate
title, duplicate, web search provider picker).
2026-06-23 01:39:44 +02:00
Bruno Deanoz
421b29ef5a feat: redesign ReasoningBlock + SourceCards to match design system
ReasoningBlock: accent-tinted background + gradient border (matches pill
language), KaizenShapes.md (16dp radius), larger padding, better line
height (20sp), softer icon tint. Replaces flat gray box with solid border.

SourceCards: gradient border instead of solid, KaizenShapes.md, shows
domain instead of full URL in the link line, slightly larger padding.

Both blocks now use the same visual language as the rest of the app —
gradient borders, accent tinting, squircle shapes.
2026-06-23 01:35:45 +02:00
Bruno Deanoz
b2df7e9330 feat: modern message action icons — larger, distinctive
Icons swapped to more distinctive Lucide variants:
- Copy → ClipboardCopy (clipboard with arrow, instantly recognizable)
- Edit → SquarePen (filled square with pen, modern)
- Regenerate → RotateCcw (single-arrow rotate, cleaner than RefreshCw)
- Delete/Volume stay (already good)

Size: 36dp touch target, 20dp icons (was 32/18). Tint alpha 0.50→0.55
for better visibility. Added ClipboardCopy, SquarePen, RotateCcw, PenLine
to KaizenIcons registry.
2026-06-23 01:33:59 +02:00
Bruno Deanoz
8f72afd714 feat: edit and resend user messages
Pencil icon on user messages (next to copy, before delete). Tap removes
the edited message and all messages after it from the UI + server, then
puts the text back into the input field for editing and resending.

Only shown on user messages with text content (not voice-only), and only
when not currently streaming.
2026-06-23 01:30:52 +02:00
Bruno Deanoz
44ff82a66d fix: voice messages appear in wrong order after reopening chat
Voice auto-send was saving messages to the server but not caching them
in Room with correct sortOrder. When navigating away and back, the app
loaded from Room cache (empty for voice messages) then from server,
where the tree-based ordering could differ from insertion order.

Now caches both user and assistant messages in Room with proper sortOrder
after the server save succeeds, matching the normal send() flow.
2026-06-23 01:28:53 +02:00
Bruno Deanoz
1899f2cff1 fix: voice messages show as compact pill instead of file attachment chip
Audio-only user messages (no text, only audio attachments) now render as
a clean "🎤 Sprachnachricht" pill instead of the ugly filename chip
(voice_1782170416740.m4a). Detects via attachments.all { kind == "audio" }
&& content.isBlank(). Regular file attachments are unaffected.
2026-06-23 01:24:56 +02:00
Bruno Deanoz
fb6bc981d1 feat: web search provider picker for Vertex models (Google vs Enterprise)
When search mode is active and a vertex: model is selected, a second pill
appears next to "Suche" with a dropdown to choose between Google Search
(default) and Enterprise Web Search grounding. The selection is sent as
webSearchProvider in the chat request body. Matches the web frontend's
OptionPill for webSearchProvider.

Only visible for Vertex models — OpenRouter uses agentive web_search
server-tool which has no provider toggle.
2026-06-23 01:23:03 +02:00
Bruno Deanoz
4150936b18 fix: sampling panel too large + pills barely visible
Sampling panel: width 260→220dp, padding reduced, spacing 14→6dp between
parameters, checkbox 20→16dp, slider height capped at 28dp, removed extra
spacer between label row and slider. Panel is now ~40% shorter.

Pills visibility: inactive background alpha raised (dark 0.06→0.10, light
0.04→0.07), border alpha doubled (dark 0.08→0.14, light was white-on-light
invisible, now uses black 0.10), icon tint 0.60→0.75, text 0.70→0.80.
Active state also strengthened. Pills are now clearly visible in both modes.
2026-06-23 01:17:56 +02:00
Bruno Deanoz
d289466276 feat: live voice waveform replaces static recording indicator
32-bar waveform visualization that reacts to microphone amplitude in
real-time. MediaRecorder.getMaxAmplitude() polled every 60ms, normalized
to 0-1 range, fed into a scrolling bar chart (new bars enter right, old
shift left). Bars use accent color — louder = taller + more opaque,
quiet = short + muted. Replaces the static "Aufnahme läuft…" text.
2026-06-23 01:15:51 +02:00
Bruno Deanoz
20a71adb99 feat: voice recording auto-send + recording indicator UI
Voice messages now upload and send automatically when recording stops —
no manual send button needed. The input area transforms during recording:
text field replaced by a centered pulsing red dot + "Aufnahme läuft…" label,
with a single centered red stop button below.

The old flow (record → attachment chip → manual send) treated voice like
a file attachment. New flow: tap mic → record → tap stop → auto-upload →
auto-send → stream response. Matches the expected voice message UX.
2026-06-23 01:12:48 +02:00
Bruno Deanoz
497f0a82f7 feat: redesign mode pills and dropdowns
Pills: extracted shared ModePill composable — thinner border (0.8dp gradient
instead of 1.2dp solid), subtler inactive background, smaller text (12.5sp),
compact padding (12x7 instead of 13x8). Active state uses accent gradient
border instead of solid color.

Reasoning dropdown: styled container (dark glass bg, 16dp shadow, squircle
shape), check icon on selected preset, cleaner row layout.

Sampling popover: same styled container, custom checkbox (squircle with accent
tint instead of Material Checkbox), disabled state dims labels and track,
wider panel (260dp), more spacing between parameters.
2026-06-23 01:07:57 +02:00
Bruno Deanoz
fcac983201 fix: flat message action icons — remove background box
Clean flat icons without bordered container. 32dp touch target (circle clip
for ripple), 18dp icon size, no background fill. Modern minimal look.
2026-06-23 01:04:30 +02:00
Bruno Deanoz
dea379e237 fix: increase message spacing from 16dp to 24dp 2026-06-23 01:02:47 +02:00
Bruno Deanoz
0ade063b34 feat: improve message action buttons — larger, visible, subtle background
Buttons: 30dp→34dp with squircle shape (KaizenShapes.sm), subtle tinted
background (dark: white 4%, light: black 2.5%), icons 16→17dp. Tint alpha
raised from 0.35→0.50 (copy/regenerate/volume) and 0.6→0.70 (delete) so
buttons are actually visible in both light and dark mode. Spacing 2→4dp
between buttons, top padding 4→6dp.
2026-06-23 01:02:07 +02:00
Bruno Deanoz
10ece6d72f feat: rounder chat items with card-style borders
Items use KaizenShapes.md (16dp radius) instead of sm (12dp), more spacing
(4dp gap), horizontal padding, and subtle glass borders on inactive items.
Active items get accent gradient border + shadow. Matches web's rounded-xl
card treatment.
2026-06-23 00:59:58 +02:00
Bruno Deanoz
558b1be675 feat: sidebar redesign — glasier look, functional search, generate title, duplicate
Design: lower tintAlpha (0.80/0.86) for more blob bleed-through, accent-tinted
gradient borders + level1 shadow on active items, specular borders on search bar
and user card, accent gradient avatar, separator line in context menu.

Features: live search filter, "Titel generieren" (Sparkles, manual POST with
{ manual: true }), "Duplizieren" (copies all messages with new IDs + parentId
chain), titleGenerated field on ConversationSummary/Entity (Room v4).
2026-06-23 00:56:58 +02:00
Bruno Deanoz
2f9ada646c docs: comprehensive CLAUDE.md update for 2026-06-23 session
- Document voice recording, TTS read-aloud, TTS cache, server-synced voice
- Add /api/v1/audio-gen and PATCH /api/v1/me to API contract
- Mark 5 Voice & Call Mode items as done (recording, TTS, cache, sync, backend)
- Add bugs-fixed section for 06-23 (padding, locale, shadow, migration)
- Update backend section with audio-gen, tts_voice, me PATCH
2026-06-23 00:47:01 +02:00
Bruno Deanoz
1645be8a97 feat: sync TTS voice from server — app reads ttsVoice from /api/v1/me
Voice preference set in web settings now automatically applies in the app.
Falls back to "Kore" if no server preference set.
2026-06-23 00:39:34 +02:00
Bruno Deanoz
c4884a3748 feat: TTS audio cache in Room — skip regeneration on replay
- MessageEntity gets ttsUrl + ttsVoice fields (Room version 2→3)
- MessageDao.getTtsUrl() checks cache before API call
- MessageDao.updateTts() saves URL + voice after generation
- readAloud() checks Room first, only calls /api/v1/audio-gen on miss
- Voice change invalidates cache automatically (query includes voice)
- Default voice "Kore" (Gemini-TTS)
2026-06-23 00:33:09 +02:00
Bruno Deanoz
9e1f30de1f feat: voice recording + TTS read-aloud for assistant messages
Audio recording:
- Mic button wired to MediaRecorder (AAC/M4A, 44.1kHz/128kbps)
- Tap to start, tap again to stop — auto-uploads as audio attachment
- RECORD_AUDIO permission with runtime request
- Recording state: red stop-square on mic button

TTS read-aloud:
- Volume button on assistant messages → POST /api/v1/audio-gen
- Gemini-TTS generates speech server-side, MediaPlayer streams it
- Tap again to stop playback, accent-colored icon when playing
- Graceful error handling (Toast on failure)

Supporting changes:
- KaizenApi.generateSpeech() for /api/v1/audio-gen endpoint
- KaizenIcons.Volume2 added (Lucide)
- DE/EN strings for recording, permission, TTS states
2026-06-23 00:27:02 +02:00
Bruno Deanoz
edd8ccaa05 fix messages overlapping mode pills — increase bottom padding to 220dp
The two-row ChatInput redesign made the bottom dock ~210dp tall but
contentPadding was still 152dp, causing the last message to scroll
behind the mode pills.
2026-06-23 00:13:21 +02:00
Bruno Deanoz
3c6dab33a0 docs: add Call Mode roadmap (Weg A pipeline + Weg B Live API), image/media gen section
- Mark auto-logout on 401 as done
- Remove WebSocket text-streaming TODO (not needed)
- Add Voice & Call Mode section with v1 (pipeline) and v2 (Gemini Live API via Vertex/GCP)
- Add Image & media generation section
- Document stop button, locale fix, login shadow migration in shipped features
2026-06-23 00:10:15 +02:00
Bruno Deanoz
141d4de227 fix locale, add stop button, auto-logout on 401, migrate login shadows
- EmptyHero date respects system locale instead of hardcoded German
- Stop button (red square) replaces send/call during streaming, cancels stream cleanly
- Auto-logout on HTTP 401 (expired token) routes to login instead of error banner
- LoginScreen migrated from Modifier.shadow to kaizenShadow (design system pillar 4)
2026-06-23 00:02:30 +02:00
Bruno Deanoz
3032dc869f docs: update CLAUDE.md for 2026-06-22 session — input redesign, perf, markdown
Mark completed: table rendering, clickable links, strikethrough, task
lists, streaming performance (pre-compiled regex). Document: ChatInput
two-row layout, soft dock scrim, sensor/blob perf optimizations,
CallButton with AudioLines, expanded code highlighting languages.
2026-06-22 23:12:42 +02:00
Bruno Deanoz
bf9441422b style CallButton to match SendButton — accent gradient, press animation
Same 38dp circle as SendButton. Subtle accent gradient fill (16-28%
alpha), AudioLines icon in accent.primary color, press-scale animation.
Visually pairs with the send button as its idle counterpart.
2026-06-22 19:21:16 +02:00
Bruno Deanoz
fd0de5ccef upgrade Markdown renderer — tables, strikethrough, clickable links, task lists
New block types: Table (header + separator + body rows, horizontal scroll,
styled borders), task lists (- [ ] / - [x] with check icons).
New inline: ~~strikethrough~~, clickable links (tap opens ACTION_VIEW).
Code highlighting: block comments (/* */), HTML comments (<!-- -->),
template strings, SQL case-insensitive keywords, added C/C++/Ruby/PHP/
Dockerfile/TOML language support. All regex patterns pre-compiled as
top-level constants for streaming performance.
2026-06-22 19:20:17 +02:00
Bruno Deanoz
70aa5c56da fix ChatInput — restore mic/call toggle, softer send button
Mic (voice recording) stays left next to +. Right side toggles
between AudioLines icon (call, when empty) and send button
(when content). Send button: removed border, translucent gradient,
38dp instead of 44dp.
2026-06-22 19:16:50 +02:00
Bruno Deanoz
313c21d47d perf: reduce sensor rate and pause blob animation during chat
Sensor: SENSOR_DELAY_GAME → SENSOR_DELAY_UI (~15Hz instead of ~60Hz),
parallax effect unchanged. Blob drift animation only runs on empty
state, frozen at midpoint during chat (blobs still visible, no GPU
animation cost).
2026-06-22 19:01:25 +02:00
Bruno Deanoz
f703196087 soften bottom dock scrim — transparent gradient instead of opaque block
Keyboard closed: 0% → 25% → 55% alpha gradient.
Keyboard open: 50% → 85% instead of solid fill.
Pills and input now float over the mesh background.
2026-06-22 18:58:04 +02:00
Bruno Deanoz
34a527cdb6 redesign ChatInput — two-row layout, rounder, elevated
Text field on top with full width, action icons below.
More padding (16dp margins, 14dp inner), pill shape with
32dp corners, level3 shadow for float effect. Plus and Mic
buttons get subtle circular backgrounds.
2026-06-22 18:54:32 +02:00
Bruno Deanoz
4351428c66 docs: comprehensive CLAUDE.md update for 2026-06-22 session
8 commits documented: biometric bypass fix, security settings (devices +
password change + biometric toggle), app icon redesign, unified top bar,
snappy sidebar (optimistic insert + instant title + smart merge),
KaizenIcons system (7th design pillar), multi-select file picker.
Updated shipped features table, bugs fixed section, NOT done checklist,
dependencies.
2026-06-22 18:33:44 +02:00
Bruno Deanoz
ad11c0ee46 fix: multi-select for gallery and file picker
Gallery uses PickMultipleVisualMedia (image + video), file picker uses
OpenMultipleDocuments — both now allow selecting multiple items at once.
Camera stays single-shot (one photo per shutter, standard behavior).
Each selected item uploads in parallel as before.
2026-06-22 16:29:35 +02:00