feat(web): compose forms — new topic and reply submission (ATB-31) (#47)
* docs: add compose forms design doc (ATB-31)
Captures approved design for HTMX-powered new topic and reply forms,
including web server proxy architecture, HTMX integration patterns,
character counter approach, and testing requirements.
* docs: add ATB-31 compose forms implementation plan
Step-by-step TDD plan for new topic form (GET+POST), board flash
banner, and reply form with proxy handlers for the AppView write API.
* feat(appview): add uri field to board API response (ATB-31)
- Add computed uri field to serializeBoard (at://did/space.atbb.forum.board/rkey)
- Add uri assertion to AppView board serialization test
- Add uri to BoardResponse interface in web boards route
- Update makeBoardResponse helpers in web test files
* refactor(appview): strengthen boards uri test assertion and update JSDoc
* feat(web): new topic form GET handler with board context (ATB-31)
* refactor(web): add network error test and fix spinner text in new-topic form
* feat(web): new topic POST handler proxied to AppView (ATB-31)
* test(web): add missing POST /new-topic edge case tests (ATB-31)
- Non-numeric boardId validation test
- AppView 5xx error path with console.error assertion
* feat(web): success banner on board page after new topic (ATB-31)
* feat(web): reply form and POST /topics/:id/reply handler (ATB-31)
* test(web): add missing reply POST edge case tests (ATB-31)
- Non-numeric topic ID in POST handler
- Cookie forwarding assertion for AppView proxy call
* test(web): add missing reply POST error branch tests (ATB-31)
- AppView 5xx with console.error assertion
- 403 banned branch
- 403 non-JSON body fallback
* test(appview): update serializeBoard toEqual assertions to include uri field (ATB-31)
* fix(web): address code review feedback on ATB-31 compose forms
- Bruno: add uri field to Get Board and List All Boards docs and assertions
- boards.tsx: gate ?posted=1 success banner on auth?.authenticated
- new-topic.tsx: parse 403 JSON body to distinguish banned vs no-permission;
add logging to all silent catch blocks (parseBody, 400, 403 inner catches);
add else-if branch logging for unexpected 4xx responses
- topics.tsx: add uri to BoardResponse interface; remove unused rootPostId and
parentPostId hidden form fields; add logging to all silent catch blocks
(parseBody, 400, 403 inner catches); add else-if branch logging for 4xx
- tests: update hidden-field assertions for removed reply form fields; add URL
assertion to reply POST body test; add 400 non-JSON body test for new-topic;
add unauthenticated banner suppression test for boards