The v0.10.0 release of BlockSuite includes a total of 246 PRs and welcomes 10 new contributors. Besides the continuous enhancement of the framework and more product features for the prebuilt AFFiNE editors, with an increased number of bug fixes and broader usage in production environments, we believe BlockSuite has been very close to its beta stage. This signifies:
- For first-party editors based on BlockSuite, their stability is now sufficient for production environment usage, and common functionalities are covered by E2E tests. Notably, about 20% of the BlockSuite codebase are test cases, ensuring a robust and reliable experience. Except for a few edge cases, interactions like selection and shortcuts should mostly align with intuition during typical operations.
- The architecture of the block-editing framework is now established, with best practices for operation data flow and event stream determined. Some legacy logic will be gradually refactored and removed, such as the
_legacy
directory in the@blocksuite/blocks
package. Documentation about the relevant API surface is being continuously improved. However, understanding the usage for customizing blocks and extending selections may still require code consultation at this point. - Subsequent releases may still feature API breaking changes, but data will continue to be forward compatible.
We plan to enter the beta phase of BlockSuite in the next upcoming release. Exciting updates are on the way!
Below is a brief overview of the framework improvements and editor features in 0.10.0:
Framework Refinements
- Enhanced Documentation (#5263): Added comprehensive API documentation for key packages and updated getting started guides to align with new API designs. The BlockSuite documentation site has also been vastly updated.
- Page Load Callback Functionality (#5325): The new
page.load
API distinguishes between creating and loading documents, offering more precise control. Details are provided in the BlockSuite Data Persistence Tutorial. - Partial Update Support in Store (#5396): Refactored the store event stream to support incremental updates to nested object structures, removing events that could lead to leakage of underlying Yjs abstractions.
- Optimized Batch Drag Update Size (#5272): Optimized the batch drag update size to reduce redundant ydoc writes, minimizing the update patch sizes in collaborative edits.
- Recursive Deletion in
deleteBlock
(#5224): ModifieddeleteBlock
to allow recursive deletion of child nodes by default, with configurable behavior. - Garbage Collection in Blob Manager (#5196): The
BlobManager
now actively removes unlinked resources, enhancing efficiency in resource management. - Configurable Block-Level Config (#5158): Support for dynamic configuration (e.g., maximum file size for attachment block) via service config.
Editor Features
- Surface Reference Block (#5013): The new
affine:surface-ref
block enables embedding whiteboard frames or groups into the document mode. - Grouping Capability in Edgeless (#5069): Enhanced ability to group edgeless elements, with support for nested groupings.
- New Style Collapsible Note in Edgeless (#5337): Edgeless now supports note blocks with various shadow, corner, and border styles, including preset effects for visually rich notes.
- Per-Element Selected Box in Edgeless (#5322): Multi-selection now shows individual selection boxes for each selected element, enhancing clarity in grouped selections.
- Auto-Connect Indicator and Index Label (#5136): Automatically connects and indexes content visible in document mode, enhancing navigational clarity.
- New Connector Addition Method (#5161): Introduces a new way to add connectors by dragging with an auto-complete button, along with widgets for easy connector shape selection.
- Optimized Double Click for Canvas Text Edit in Hollow Shapes (#5043): Enhanced click detection for text-filled shapes, preserving transparency effects for easier selection of elements beneath hollow shapes.
- Extended Font Support in Canvas Text (#5339): Introduced new preset fonts like Satoshi, Lora, and Bebas Nene, alongside an updated toolbar UI for easier font adjustments.
- Revamped Text Highlighting (#5434): Enhanced text highlighting now allows setting the text color itself, not just the background color.
- Expanded Connector Arrow Styles (#5064): Added new connector endpoint styles including Triangle, Circle, and Diamond.
- Linked Page Creation from Selected Text (#5171): Quickly create and link new pages from selected text using a simple keystroke.
- Refined Indent Behavior (#5072): Improved indent behavior for maintaining child node hierarchy more intuitively.
Detailed Bugfixes
- fix: new clipboard will auto merge type for empty paragraph @Saul-Mirone (#5124)
- fix: update test cases links @fourdim (#5142)
- fix: surface-ref interaction && failed test in AFFiNE @doouding (#5242)
- fix: aligning lit version @doouding (#5251)
- fix: allow unbound variable in publish @fourdim (#5266)
- fix: unset eux for publish.sh @fourdim (#5268)
- fix: unset eu on nightly version script @fourdim (#5277)
- fix: failed to format text with color in database @Flrande (#5288)
- fix: sync
PageMeta.title
withPageBlockModel.title
while importing markdown files @hyf0 (#5297) - fix: triple click issue @pengx17 (#5363)
- fix: delete should happen after copy when cut in new clipboard @Saul-Mirone (#5365)
- fix: backwards compatible with remote selection @lawvs (#5364)
- fix: size report workflow @Rachit1313 (#5412)
- fix: blockUpdated flavour error @regischen (#5435)
- fix: fix note data compatibility @regischen (#5437)
- fix: flaky test on image import @fourdim (#5467)
- fix(database): kanban add button hover animation where :has is not supported @AyushAgrawal-A2 (#5350)
- fix(database): incorrect tag modal position @mingjuu (#5452)
- fix(edgeless): improper handler removement @fourdim (#5054)
- fix(edgeless): fix
copyAsPng
not work @zqran (#5062) - fix(edgeless): register services @regischen (#5071)
- fix(edgeless): frame to image @doouding (#5073)
- fix(edgeless): can't click frame in affine @regischen (#5084)
- fix(edgeless): style frame @regischen (#5074)
- fix(edgeless): incomplete content export @fourdim (#5093)
- fix(edgeless): collaborators unable to view images after upload @Flrande (#5098)
- fix(edgeless): frame ui style @regischen (#5102)
- fix(edgeless): connector not follow image @regischen (#5099)
- fix(edgeless): unselect database cell when click blank area @donteatfriedrice (#5104)
- fix(edgeless): position of dragged shape @lzlme (#5106)
- fix(edgeless): frame container zindex @regischen (#5110)
- fix(edgeless): group hotkey and show title at init @regischen (#5121)
- fix(edgeless): edgeless toolbar submenu tooltip position @donteatfriedrice (#5123)
- fix(edgeless): label flickering when switching shape style @lawvs (#5125)
- fix(edgeless): limit initial zoom ratio @donteatfriedrice (#5130)
- fix(edgeless): keep component toolbar in viewport @donteatfriedrice (#5141)
- fix(edgeless): should not zoom on pressing enter during editing @regischen (#5173)
- fix(edgeless): group can't be connected @regischen (#5192)
- fix(edgeless): shape text init font family should be consistent with shape style @donteatfriedrice (#5207)
- fix(edgeless): ellipse nearest point and relative point location @regischen (#5182)
- fix(edgeless): text editor should not have minWidth without adjusting width @donteatfriedrice (#5212)
- fix(edgeless): export pdf incomplete @EYHN (#5216)
- fix(edgeless): fix screen ratio not right after presentation @regischen (#5222)
- fix(edgeless): fix frame not update in collaboration @regischen (#5232)
- fix(edgeless): optimize shape text color when shape is transparent @donteatfriedrice (#5244)
- fix(edgeless): group copy & paste @regischen (#5250)
- fix(edgeless): remove shape overlay when element disconnect @lawvs (#5275)
- fix(edgeless): auto connect for ref block @regischen (#5233)
- fix(edgeless): layout shift when switching editor mode @doouding (#5287)
- fix(edgeless): frames update in navigation @regischen (#5304)
- fix(edgeless): local xywh update slots @regischen (#5308)
- fix(edgeless): set default shape style as general type and text font-family as sans-serif @donteatfriedrice (#5314)
- fix(edgeless): fix group copy as png @regischen (#5320)
- fix(edgeless): local record issue @doouding (#5311)
- fix(edgeless): group load order @regischen (#5340)
- fix(edgeless): reset cursor when the selection changes @lawvs (#5378)
- fix(edgeless): for group element, apply local record update recursively @AyushAgrawal-A2 (#5393)
- fix(edgeless): prevent duplicate font faces @Flrande (#5398)
- fix(edgeless): add font isolation on canvas text @Flrande (#5403)
- fix(edgeless): remove fractional digits part of font size @Flrande (#5406)
- fix(edgeless): hand mode in share page @regischen (#5401)
- fix(edgeless): note component toolbar update @regischen (#5413)
- fix(edgeless): duplicated remote cursor @doouding (#5410)
- fix(edgeless): change navigator icon @regischen (#5414)
- fix(edgeless): toolbar right-side clipping position @alpakaka0o0 (#5453)
- fix(edgeless): undo not work for note style change @regischen (#5473)
- fix(page): incorrect cursor position when click slowly @lawvs (#5045)
- fix(page): enter key should as expected after setting heading by shortkey @lzlme (#5002)
- fix(page): user should be able to expand toggle list in readonly mode @lawvs (#5066)
- fix(page): copy multiple times in list when no text selection @fourdim (#5114)
- fix(page):
getPreviousBlock
not works as expected when there are several notes @Flrande (#5131) - fix(page): lang list in code block covered by database @lawvs (#5148)
- fix(page): format bar styling and simplify button property @lawvs (#5160)
- fix(page): failed to insert image as a child of other content block @Flrande (#5163)
- fix(page): questionmark with IME should not trigger slash menu @lawvs (#5213)
- fix(page): sometimes page tags disappear @zzj3720 (#5215)
- fix(page): mock selection of multiline text on create/edit link @AyushAgrawal-A2 (#5241)
- fix(page): multiple link elements when part of selection has attributes @AyushAgrawal-A2 (#5245)
- fix(page): keep content after converted to code block @Flrande (#5257)
- fix(page): fix missing pink background @fourdim (#5270)
- fix(page): markdown to quote block @donteatfriedrice (#5279)
- fix(page): unexpected placeholder @zqran (#5295)
- fix(page): arrow up/down navigation @AyushAgrawal-A2 (#5282)
- fix(page): unexpected scroll in long text @Flrande (#5301)
- fix(page): unable to open link page entry from slash menu @Flrande (#5310)
- fix(page): optimize default dropdown placement @doodlewind (#5331)
- fix(page): stale number list index state @zqran (#5326)
- fix(page): shift + arrow text selection @AyushAgrawal-A2 (#5315)
- fix(page): arrow up/down navigation in code block @AyushAgrawal-A2 (#5341)
- fix(page): delay when inserting attachments via dnd @lawvs (#5332)
- fix(page): support setting index of ordered list @AliceLanniste (#5349)
- fix(page): paste not work when trying to create a link in edgeless @zqran (#5355)
- fix(page): tweak attachment styles @lawvs (#5357)
- fix(page): link popup unexpectedly disappear when hovering from bottom @zqran (#5369)
- fix(page): divider selection and deletion @AyushAgrawal-A2 (#5368)
- fix(page): incorrect cursor position on pasting text @AyushAgrawal-A2 (#5382)
- fix(page): console error on deleting at the start of first paragraph @AyushAgrawal-A2 (#5391)
- fix(page): prevent scrolling to bottom of page when clicking on sides of document @zqran (#5405)
- fix(page): autoIdentityLink behavior @AyushAgrawal-A2 (#5370)
- fix(page): disable database action in readonly @lawvs (#5416)
- fix(page): attachment download @AyushAgrawal-A2 (#5426)
- fix(page): extra space between dot and ordinals @AliceLanniste (#5409)
- fix(page): make sure closest note inside same editor page when there are multiple editors @donteatfriedrice (#5438)
- fix(std): should not re-execute previous commands in the chain before
try
@Flrande (#5278) - fix(std): commands in
tryAll
should share same context @Flrande (#5293) - fix(store): add fallbacks for checking assets mime type @fourdim (#5164)
- fix(store): missing newline when there are images involved @fourdim (#5247)
- fix(store):
deleteBlock
should delete children recursively by default @Flrande (#5224) - fix(store): revert gc @Flrande (#5344)
- fix(store): block should add default value to props if not exist @Saul-Mirone (#5470)
New Contributors
- @jerrywu001 made their first contribution in #5063
- @EYHN made their first contribution in #5217
- @AyushAgrawal-A2 made their first contribution in #5227
- @xiazeyu made their first contribution in #5261
- @hyf0 made their first contribution in #5298
- @Rachit1313 made their first contribution in #5412
- @yangvom made their first contribution in #5447
- @mingjuu made their first contribution in #5458
- @kimhyeonju made their first contribution in #5459
- @alpakaka0o0 made their first contribution in #5453
Full Changelog: v0.9.0...v0.10.0