Repository navigation
feat(write): editable quotes with lists inside, uploaded cover images, Write-only welcome content (T-19) - #32
Merged
Conversation
…, Write-only welcome content (T-19) - Sign-up creates only the Write welcome document; no welcome spreadsheet. - Quote text can be clicked, selected and edited again: the quote bar's painter no longer absorbs taps and clicks. The bars of a multi-paragraph quote join into one unbroken bar. - Lists inside quotes: a list line may carry `blockquote: true` (bullet, numbered, task, any indent). Supported in the validator, normalizer, IR, Markdown and HTML import/export, TXT/DOCX/ODT/RTF/PDF export, the editor (rendering, Markdown shortcuts, Enter/Backspace/Tab, block-type commands) and MCP `write.set_block_type` (`quoted`). - Submit dialog: the cover image is uploaded in the dialog as an image file of the story's document instead of picked from its text; the server accepts it, lists it in the webhook's `assets` and refuses an invalid required cover. - HTML import keeps a whitespace-only heading (found by the property tests). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wonky task review: T-19: Various improvementsScreenshot: the description has an image of the changed UI. This pull request successfully resolves the three requested improvements. It removes the extra spreadsheet creation upon signup, correctly fixes hit-testing and styling for blockquotes and quoted lists in Write, and smoothly integrates an inline cover image uploader into the submission dialog. The changes are accompanied by solid test coverage and spec updates.
Scope:
Tests: Added. Comprehensive server and widget tests were added for the new components and updated logic. Specs: Updated. Several specifications were updated to reflect the new account flow, quoted lists, and upload capabilities. Risks:
Facts
Reviewed commit |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wonky-Task: T-19
Wonky-Claim: H3WG-TSXR
Addresses #24 (no default Sheets document), #25 (editing quotes in Write) and #27 (uploading the blog cover image).
Acceptance criteria
AccountService.ensureWelcomeContentno longer creates the welcome spreadsheet; there never was a welcome presentation. Thesheets.welcometemplate stays so spreadsheets that older accounts already got from it still resolve. Server test: a new account has exactly New here? Read me first and nospreadsheetrow (user_endpoint_test.dart).CustomPaintwhose painter didn't overridehitTest, soRenderCustomPaint.hitTestSelfreturned true and every quote line absorbed taps and clicks before the document interactor below it saw them. The painter now returnsfalse. The bars of a multi-paragraph quote also had a 4 px break (line spacing outside the bar); that spacing is now inside the bar, so the quote shows one unbroken bar.blockquote: true(bullet, numbered, task, any indent). This was confirmed with you before implementing, and overrides the task's "don't change the schema" note. Changes:> - itemround-trips) and HTML (<blockquote><ul>) import and export, with quote bar and indent in TXT, DOCX, ODT, RTF and PDF export.-/1./[ ]/>shortcuts, Enter/Backspace/Tab and the block-type commands.write.set_block_type, which gains an optionalquoted; block listings reportquoted.wonky_write/test/features/editor/components/blockquote_test.dart, 32 cases, touch and mouse interactors) cover tapping, double-click selection, typing, Mod+B, Enter, Backspace, Tab, Markdown shortcuts and the commands, plus undo (and redo for typing). All of them failed before the fix.ImageFieldSpecin the shared form dialog has a 16:9 thumbnail, Upload image (Replace), Remove and a hint, and MCP can operate it. The Submit dialog uses it instead of a picker of the document's images. The image is uploaded as an image file of the story's document; it is not inserted into the text, so blogs don't show it twice. Widget tests cover the empty state in both themes, uploading, removing, a cancelled picker, a failed upload and MCPsetField.SubmissionService.submitaccepts a cover that is either in the text or a ready image file of the story's document. Anything else is dropped, and a required cover that isn't valid is refused. The cover is listed in the webhook'sassetsand recorded as asubmission_asset, soGET assets/{id}serves it. The webhook's shape is unchanged:fields.coverImageis still an asset id. Server tests are insubmission_cover_test.dart.docs/blog-integration.mdnotes that the cover usually isn't in the Markdown.Also fixed: HTML import dropped a heading containing only whitespace. The property tests found it once they started generating quoted lists.
Specs updated: 04 §1.1, 18 §4.2/§7.1/§9.2/§13, 19, Write 02 §1.2/§2.2, 04 §14 (AC-14.2, AC-14.3), 07 (fidelity tables), 09.
Known limits: DOCX, ODT and RTF import still read a list inside a quote as a plain list item. Tabs still running an older build may strip the quote from such lines until they reload.
Screenshots
These are rendered from the real widgets in a test. The editor's fonts don't load in tests, so its text shows as boxes.
Checks
dart analyzeanddart formatare clean in every changed package, plus Slides, Sheets and Drive.🤖 Generated with Claude Code