# 인터페이스 계약 ## 메시지 제출 이벤트 Textual의 `Input.Submitted` 이벤트가 `#user-input`에서 발생하면 `ChatApp.on_input_submitted`가 처리한다. ### 입력 정규화 1. 이벤트의 `value`에 `strip()`을 적용한다. 2. 입력 위젯의 값을 빈 문자열로 초기화한다. 3. 정규화 결과가 빈 문자열이면 추가 처리를 중단한다. 공백만 포함한 입력은 사용자 메시지, 응답 선택, 대화 항목을 생성하지 않는다. ### 유효한 입력 처리 정규화 결과가 비어 있지 않으면 다음 순서로 처리한다. 1. 정규화된 사용자 메시지를 `submitted_inputs`에 추가한다. 2. `random.choice(RESPONSE_MESSAGES)`로 응답을 선택한다. 3. 선택 응답을 `selected_responses`에 추가한다. 4. 대화 영역에 사용자 메시지 `Label`을 추가한다. 5. 바로 이어서 응답 `Label`을 추가한다. 6. 대화 영역을 마지막 항목까지 스크롤한다. 사용자 메시지와 응답은 별도 대화 항목이며, 화면 표시 순서는 항상 사용자 메시지 다음 응답이다. ## 화면 위젯 계약 - 대화 영역은 `#conversation` 식별자의 `VerticalScroll`이다. - 입력창은 `#user-input` 식별자의 `Input`이다. - 사용자 메시지는 `user-message` 클래스를 사용한다. - 응답은 `response-message` 클래스를 사용한다. - 애플리케이션 마운트 시 입력창에 포커스를 둔다. ## 종료 계약 `Escape`와 `Ctrl+Q`는 기존 `quit` 바인딩을 통해 애플리케이션 종료를 요청한다.