apps/web/src/components/BranchToolbar.logic.test.ts | 16 +- apps/web/src/components/BranchToolbar.logic.ts | 7 +- apps/web/src/components/BranchToolbar.tsx | 112 ++- apps/web/src/components/BranchToolbarBranchSelector.tsx | 14 +- apps/web/src/components/BranchToolbarEnvModeSelector.tsx | 4 +- apps/web/src/components/BranchToolbarEnvironmentSelector.tsx | 4 +- apps/web/src/components/ChatView.tsx | 81 +- apps/web/src/components/ComposerPromptEditor.tsx | 68 +- apps/web/src/components/chat/AssistantCitationChip.tsx | 2 + apps/web/src/components/chat/ChatComposer.tsx | 1328 +++++++++++++++++++++++++++++--- apps/web/src/components/chat/CompactComposerControlsMenu.tsx | 16 +- apps/web/src/components/chat/ComposerControl.test.tsx | 76 ++ apps/web/src/components/chat/ComposerControl.tsx | 72 +- apps/web/src/components/chat/ComposerPrimaryActions.tsx | 3 +- apps/web/src/components/chat/ComposerSurface.tsx | 2 +- apps/web/src/components/chat/ContextWindowMeter.tsx | 2 + apps/web/src/components/chat/MessagesTimeline.test.tsx | 53 +- apps/web/src/components/chat/MessagesTimeline.tsx | 46 +- apps/web/src/components/chat/ProviderModelPicker.test.tsx | 20 + apps/web/src/components/chat/ProviderModelPicker.tsx | 36 +- apps/web/src/components/chat/TraitsPicker.tsx | 31 +- apps/web/src/components/chat/composerEventScope.test.ts | 61 ++ apps/web/src/components/chat/composerEventScope.ts | 21 + apps/web/src/components/chat/composerProviderState.tsx | 15 + apps/web/src/components/chat/composerScrollGesture.test.ts | 94 +++ apps/web/src/components/chat/composerScrollGesture.ts | 60 ++ apps/web/src/components/chat/timelineScrollAnchoring.test.tsx | 35 +- apps/web/src/components/chat/timelineScrollAnchoring.ts | 16 - apps/web/src/components/composerFooterLayout.test.ts | 163 ++++ apps/web/src/components/composerFooterLayout.ts | 77 ++ apps/web/src/components/composerSelection.test.ts | 27 + apps/web/src/components/composerSelection.ts | 15 + docs/user/composer.md | 12 + 33 files changed, 2297 insertions(+), 292 deletions(-)