mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-12 23:56:36 +08:00
8ca3f2d53d4d43ed0d21bb5953c3ea09a23ad734
11161 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
8ca3f2d53d |
fix(core): settings i18n refresh (#14760)
replace #14758 #### PR Dependency Tree * **PR #14760** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Enhanced language switching to ensure the settings dialog properly reflects language changes when users update their language preference. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
0da32d61ae |
fix(server): race condition for sync (#14770)
#### PR Dependency Tree * **PR #14770** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **New Features** * Implemented batch processing for calendar synchronization to improve performance and resource utilization. * Added distributed locking to prevent concurrent operations in multi-instance environments. * **Bug Fixes** * Improved reliability by preventing duplicate synchronization attempts. * **Tests** * Enhanced test coverage for batch processing and locking mechanisms. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
233004f867 | chore: bump oxlint & enable more supported rules (#14769) | ||
|
|
cdadf8588a |
fix(core): nested numbered list order (#14764)
## The Fix ## Fixes #13396. The issue happened because 'doc.getPrev(model)' returns previous node based in document order instead of previous sibling within list level. This caused nested list items to inherit the numbering from their parent rather than restarting. The fix ensures that numbering is calculated relative to correct list context. ## Video Demonstration ## ### Before ### https://github.com/user-attachments/assets/9523209a-93d9-4984-aa9e-149ac1941036 ### After ### https://github.com/user-attachments/assets/ff28b166-3572-4536-9893-0ab5c05c8d9f <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Enhanced numbered list ordering logic for improved list handling. * **Chores** * Updated environment configuration template with active sample values for database connectivity, caching services, AI integrations, and email delivery settings. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
8c07ea2a0e |
fix: allow PDF preview on readonly public pages (#14761)
fixes https://github.com/toeverything/AFFiNE/issues/14727 https://www.loom.com/share/dfcd558332404896b3e02aad97b18f02 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * PDF attachments can now be previewed in read-only documents. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
91ad783973 |
fix(test): e2e stability (#14749)
#### PR Dependency Tree * **PR #14749** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved link preview reliability by updating request identification to better match modern browsers. * **Tests** * Made end-to-end and integration tests deterministic and more robust, improving AI chat, image generation, attachment handling, settings visibility, and editor flows. * **Chores** * Updated underlying tooling versions to enhance stability and compatibility. <!-- end of auto-generated comment: release notes by coderabbit.ai -->v2026.3.30-canary.932 |
||
|
|
9ca520a81f |
feat(core): auto scroll for chat panel (#14748)
#### PR Dependency Tree * **PR #14748** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Enhanced auto-scroll behavior for AI chat messages—the chat now intelligently pauses auto-scrolling when you manually scroll away and resumes when you scroll back near the bottom. * Auto-scroll now pauses when expanding or collapsing AI tool results and document edits. * **Tests** * Added unit tests for AI chat message scroll behavior and interactions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
64f385817d |
feat(server): add perf metrics for apply update (#14736)
#### PR Dependency Tree * **PR #14736** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Enhanced Kubernetes deployment health check configurations with explicit timeout, period, failure threshold, and success threshold settings for improved reliability. * Improved document synchronization infrastructure with enhanced codec comparison and merge update capabilities for better data consistency handling. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
9cf98d9345 |
fix: restore kanban scroll in fullscreen mode (#14708)
fixes #14679 This fixes a layout issue where Kanban boards stopped horizontally scrolling in fullscreen/full-width page mode. https://github.com/user-attachments/assets/375fb8f7-3652-4207-8f9c-ee4cdae881ad The root cause was not in the Kanban view itself, but in the page-mode viewport wrapper. In fullscreen mode, the editor expands to full width, and the existing display: table wrapper caused the outer editor container to size from Kanban content instead of the viewport. That prevented the Kanban scroller from owning horizontal overflow correctly. ### What changed Keep the fullscreen editor wrapper constrained to the viewport width Override the page-mode viewport content wrapper from display: table to display: block only when a fullscreen editor is present Leave the default/non-fullscreen layout behavior unchanged ### Why this works With the outer fullscreen wrapper locked to viewport width, horizontal overflow stays inside the Kanban view, so its existing overflow-x: scroll behavior works again. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved full-screen editor layout rendering to ensure proper width and display constraints are applied correctly in full-screen mode. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
a617da99e2 |
fix: iCloud CalDAV discovery fallback and resolve calendarsCount in GraphQL (#14728)
fixes #14696 iCloud was returning 400 Bad Request for /.well-known/caldav, which caused AFFiNE to fail before reaching the actual CalDAV endpoints. This change makes discovery fall back to the base CalDAV URL for that case, which lets the iCloud account link flow continue successfully. This also adds a GraphQL field resolver for CalendarAccountObjectType.calendarsCount. The field is requested by the frontend, but some mutation return paths were returning a raw account object without that computed value, which caused GraphQL to fail on a non-null field. --- ### Why this was needed iCloud rejected the standard well-known discovery probe with 400, even though the rest of the CalDAV flow worked. calendarsCount is a computed field used by the frontend, so it should be resolved by GraphQL rather than manually attached in individual service methods. --- ### How to test Generate an Apple app-specific password: [Apple Support](https://support.apple.com/en-gb/102654) In AFFiNE, add an iCloud CalDAV account using: your Apple Account email the new app-specific password Confirm the account links successfully and calendars load without the previous GraphQL error. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Calendar accounts now display the total number of calendars. * **Bug Fixes** * Enhanced calendar discovery process to handle additional HTTP error conditions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
a41c5e4366 |
feat: adapt cloudflare worker ai (#14732)
#### PR Dependency Tree * **PR #14732** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Cloudflare Workers AI added as a Copilot provider (configurable in admin settings). * Gemini 3.1 Flash Lite Preview model made available. * **Behavior Changes** * Reranking now uses a different default model identifier (affects relevancy scores). * **Tests** * Rerank tests adjusted to focus on the updated model and expected results. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
5b05c5a1b2 |
feat(server): refactor record schema (#14729)
#### PR Dependency Tree * **PR #14729** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Transcriptions now produce structured meeting summaries (strict JSON) and a normalized, speaker‑tagged, non‑overlapping transcript with legacy projection support. * **API** * Submission accepts richer transcription input; results return source‑audio metadata, slice manifest, quality indicators, normalized segments/transcript, and structured summary JSON. * **Frontend** * Recording flow stores transcription metadata and uploads preprocessed audio slices with slice/quality info; UI-side result normalization applied. * **Tests** * Expanded unit, contract, and e2e coverage for normalization, payload parsing, persistence/retry, and end‑to‑end transcription flows. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
a3379c8979 |
fix(editor): font weight dropdown empty on Chrome/Safari in edgeless mode (#14725)
### Summary Resolves #14528. Normalizes font family string before comparison. Removes browser dependency. ### What Changed On Edgeless mode, font dropdown was not appearing for shapes on Chrome. Now, it appears on Chrome, Safari, and Firefox. ### Screenshot Verification **Google Chrome** <img width="623" height="322" alt="Screenshot 2026-03-25 at 1 24 51 PM" src="https://github.com/user-attachments/assets/fb05790d-6842-43ce-a014-2b24d15bc80d" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved font matching to be more tolerant of whitespace, quotes, and casing so font family comparisons are consistent across browsers, reducing incorrect font fallbacks and visual mismatches. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
166372cc3e |
fix: test in mac (#14712)
#### PR Dependency Tree * **PR #14712** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Enhanced Electron test environment cleanup with improved termination signal handling and child process resource management. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
9b56a05159 |
feat(native): async recorder (#14700)
#### PR Dependency Tree * **PR #14700** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Durable, resumable import queue with explicit import lifecycle and updated popup/tray status behavior. * Async native recording APIs and ability to abort recordings; audio quality metrics (degraded, overflow count). * Added "Importing..." translation. * **Bug Fixes** * More reliable single-claim import processing, retries and cleanup to avoid duplicate imports. * Improved stop/abort teardown stability and safer shutdown behavior. * **Tests** * New/updated tests covering coordinator, import queue, native async flows and teardown scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
b0251c93cb |
chore: bump up rustc version to v1.94.0 (#14701)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [rustc](https://redirect.github.com/rust-lang/rust) | minor | `1.93.1` → `1.94.0` | --- ### Release Notes <details> <summary>rust-lang/rust (rustc)</summary> ### [`v1.94.0`](https://redirect.github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1940-2026-03-05) [Compare Source](https://redirect.github.com/rust-lang/rust/compare/1.93.1...1.94.0) \========================== <a id="1.94.0-Language"></a> ## Language - [Impls and impl items inherit `dead_code` lint level of the corresponding traits and trait items](https://redirect.github.com/rust-lang/rust/pull/144113) - [Stabilize additional 29 RISC-V target features including large portions of the RVA22U64 / RVA23U64 profiles](https://redirect.github.com/rust-lang/rust/pull/145948) - [Add warn-by-default `unused_visibilities` lint for visibility on `const _` declarations](https://redirect.github.com/rust-lang/rust/pull/147136) - [Update to Unicode 17](https://redirect.github.com/rust-lang/rust/pull/148321) - [Avoid incorrect lifetime errors for closures](https://redirect.github.com/rust-lang/rust/pull/148329) <a id="1.94.0-Platform-Support"></a> ## Platform Support - [Add `riscv64im-unknown-none-elf` as a tier 3 target](https://redirect.github.com/rust-lang/rust/pull/148790) Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. [platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html <a id="1.94.0-Libraries"></a> ## Libraries - [Relax `T: Ord` bound for some `BinaryHeap<T>` methods.](https://redirect.github.com/rust-lang/rust/pull/149408) <a id="1.94.0-Stabilized-APIs"></a> ## Stabilized APIs - [`<[T]>::array_windows`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.array_windows) - [`<[T]>::element_offset`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.element_offset) - [`LazyCell::get`](https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#method.get) - [`LazyCell::get_mut`](https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#method.get_mut) - [`LazyCell::force_mut`](https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#method.force_mut) - [`LazyLock::get`](https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#method.get) - [`LazyLock::get_mut`](https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#method.get_mut) - [`LazyLock::force_mut`](https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#method.force_mut) - [`impl TryFrom<char> for usize`](https://doc.rust-lang.org/stable/std/convert/trait.TryFrom.html#impl-TryFrom%3Cchar%3E-for-usize) - [`std::iter::Peekable::next_if_map`](https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if_map) - [`std::iter::Peekable::next_if_map_mut`](https://doc.rust-lang.org/stable/std/iter/struct.Peekable.html#method.next_if_map_mut) - [x86 `avx512fp16` intrinsics](https://redirect.github.com/rust-lang/rust/issues/127213) (excluding those that depend directly on the unstable `f16` type) - [AArch64 NEON fp16 intrinsics](https://redirect.github.com/rust-lang/rust/issues/136306) (excluding those that depend directly on the unstable `f16` type) - [`f32::consts::EULER_GAMMA`](https://doc.rust-lang.org/stable/std/f32/consts/constant.EULER_GAMMA.html) - [`f64::consts::EULER_GAMMA`](https://doc.rust-lang.org/stable/std/f64/consts/constant.EULER_GAMMA.html) - [`f32::consts::GOLDEN_RATIO`](https://doc.rust-lang.org/stable/std/f32/consts/constant.GOLDEN_RATIO.html) - [`f64::consts::GOLDEN_RATIO`](https://doc.rust-lang.org/stable/std/f64/consts/constant.GOLDEN_RATIO.html) These previously stable APIs are now stable in const contexts: - [`f32::mul_add`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.mul_add) - [`f64::mul_add`](https://doc.rust-lang.org/stable/std/primitive.f64.html#method.mul_add) <a id="1.94.0-Cargo"></a> ## Cargo - Stabilize the config include key. The top-level include config key allows loading additional config files, enabling better organization, sharing, and management of Cargo configurations across projects and environments. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#including-extra-configuration-files) [#​16284](https://redirect.github.com/rust-lang/cargo/pull/16284) - Stabilize the pubtime field in registry index. This records when a crate version was published and enables time-based dependency resolution in the future. Note that crates.io will gradually backfill existing packages when a new version is published. Not all crates have pubtime yet. [#​16369](https://redirect.github.com/rust-lang/cargo/pull/16369) [#​16372](https://redirect.github.com/rust-lang/cargo/pull/16372) - Cargo now parses [TOML v1.1](https://toml.io/en/v1.1.0) for manifests and configuration files. Note that using these features in Cargo.toml will raise your development MSRV, but the published manifest remains compatible with older parsers. [#​16415](https://redirect.github.com/rust-lang/cargo/pull/16415) - [Make `CARGO_BIN_EXE_<crate>` available at runtime ](https://redirect.github.com/rust-lang/cargo/pull/16421/) <a id="1.94.0-Compatibility-Notes"></a> ## Compatibility Notes - [Forbid freely casting lifetime bounds of `dyn`-types](https://redirect.github.com/rust-lang/rust/pull/136776) - [Make closure capturing have consistent and correct behaviour around patterns](https://redirect.github.com/rust-lang/rust/pull/138961) Some finer details of how precise closure captures get affected by pattern matching have been changed. In some cases, this can cause a non-move closure that was previously capturing an entire variable by move, to now capture only part of that variable by move, and other parts by borrow. This can cause the borrow checker to complain where it previously didn't, or cause `Drop` to run at a different point in time. - [Standard library macros are now imported via prelude, not via injected `#[macro_use]`](https://redirect.github.com/rust-lang/rust/pull/139493) This will raise an error if macros of the same name are glob imported. For example if a crate defines their own `matches` macro and then glob imports that, it's now ambiguous whether the custom or standard library `matches` is meant and an explicit import of the name is required to resolve the ambiguity. One exception is `core::panic` and `std::panic`, if their import is ambiguous a new warning ([`ambiguous_panic_imports`](https://redirect.github.com/rust-lang/rust/issues/147319)) is raised. This may raise a new warning ([`ambiguous_panic_imports`](https://redirect.github.com/rust-lang/rust/issues/147319)) on `#![no_std]` code glob importing the std crate. Both `core::panic!` and `std::panic!` are then in scope and which is used is ambiguous. - [Don't strip shebang in expression-context `include!(…)`s](https://redirect.github.com/rust-lang/rust/pull/146377) This can cause previously working includes to no longer compile if they included files which started with a shebang. - [Ambiguous glob reexports are now also visible cross-crate](https://redirect.github.com/rust-lang/rust/pull/147984) This unifies behavior between local and cross-crate errors on these exports, which may introduce new ambiguity errors. - [Don't normalize where-clauses before checking well-formedness](https://redirect.github.com/rust-lang/rust/pull/148477) - [Introduce a future compatibility warning on codegen attributes on body-free trait methods](https://redirect.github.com/rust-lang/rust/pull/148756) These attributes currently have no effect in this position. - [On Windows `std::time::SystemTime::checked_sub_duration` will return `None` for times before the Windows epoch (1/1/1601)](https://redirect.github.com/rust-lang/rust/pull/148825) - [Lifetime identifiers such as `'a` are now NFC normalized](https://redirect.github.com/rust-lang/rust/pull/149192). - [Overhaul filename handling for cross-compiler consistency](https://redirect.github.com/rust-lang/rust/pull/149709) Any paths emitted by compiler now always respect the relative-ness of the paths and `--remap-path-prefix` given originally. One side-effect of this change is that paths emitted for local crates in Cargo (path dependencies and workspace members) are no longer absolute but relative when emitted as part of a diagnostic in a downstream crate. <a id="1.94.0-Internal-Changes"></a> ## Internal Changes These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - [Switch to `annotate-snippets` for error emission](https://redirect.github.com/rust-lang/rust/pull/150032) This should preserve mostly the same outputs in rustc error messages. </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
5d124ee55b | feat(server): improve subscription sync stability (#14703) | ||
|
|
dcf041a3f2 |
fix(editor): ci stability (#14704)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Improved Electron shutdown, diagnostics and tab teardown for more reliable exits and forced cleanup on stubborn processes. * **Tests** * Added polling-based test helpers, stronger scroll/page readiness, timeout-tolerant page selection, and async cleanup/worker teardown; updated many tests to wait for UI/model updates and rendering frames. * **Bug Fixes** * Reduced flakiness by awaiting paragraph visibility, nested counts, selection/navigation stability, tab counts, post-action renders, and safer element interactions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
8ba02ed6fb |
chore: bump up RevenueCat/purchases-ios-spm version to from: "5.66.0" (#14699)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [RevenueCat/purchases-ios-spm](https://redirect.github.com/RevenueCat/purchases-ios-spm) | minor | `from: "5.60.0"` → `from: "5.66.0"` | --- ### Release Notes <details> <summary>RevenueCat/purchases-ios-spm (RevenueCat/purchases-ios-spm)</summary> ### [`v5.66.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.65.0...5.66.0) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.65.0...5.66.0) ### [`v5.65.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/blob/HEAD/CHANGELOG.md#5650) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.64.0...5.65.0) #### 5.65.0 ### [`v5.64.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/blob/HEAD/CHANGELOG.md#5640) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.63.0...5.64.0) #### 5.64.0 ### [`v5.63.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/blob/HEAD/CHANGELOG.md#5630) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.62.0...5.63.0) #### 5.63.0 ### [`v5.62.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/blob/HEAD/CHANGELOG.md#5620) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.61.0...5.62.0) #### 5.62.0 ### [`v5.61.0`](https://redirect.github.com/RevenueCat/purchases-ios-spm/blob/HEAD/CHANGELOG.md#5610) [Compare Source](https://redirect.github.com/RevenueCat/purchases-ios-spm/compare/5.60.0...5.61.0) #### 5.61.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
ffa3ff9d7f |
chore: bump up apple/swift-collections version to from: "1.4.1" (#14697)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [apple/swift-collections](https://redirect.github.com/apple/swift-collections) | patch | `from: "1.4.0"` → `from: "1.4.1"` | --- ### Release Notes <details> <summary>apple/swift-collections (apple/swift-collections)</summary> ### [`v1.4.1`](https://redirect.github.com/apple/swift-collections/releases/tag/1.4.1): Swift Collections 1.4.1 [Compare Source](https://redirect.github.com/apple/swift-collections/compare/1.4.0...1.4.1) This patch release is mostly focusing on evolving the package traits `UnstableContainersPreview` and `UnstableHashedContainers`, with the following notable fixes and improvements to the stable parts of the package: - Make the package documentation build successfully on the DocC that ships in Swift 6.2. - Avoid using floating point arithmetic to size collection storage in the `DequeModule` and `OrderedCollections` modules. #### Changes to experimental package traits The new set and dictionary types enabled by the `UnstableHashedContainers` trait have now resolved several correctness issues in their implementation of insertions. They have also gained some low-hanging performance optimizations. Like before, these types are in "working prototype" phase, and while they have working implementations of basic primitive operations, we haven't done much work validating their performance yet. Feedback from intrepid early adopters would be very welcome. The `UnstableContainersPreview` trait has gained several new protocols and algorithm implementations, working towards one possible working model of a coherent, ownership-aware container/iteration model. - [`BidirectionalContainer`][BidirectionalContainer] defines a container that allows iterating over spans backwards, and provides decrement operations on indices -- an analogue of the classic `BidirectionalCollection` protocol. - [`RandomAccessContainer`][RandomAccessContainer] models containers that allow constant-time repositioning of their indices, like `RandomAccessCollection`. - [`MutableContainer`][MutableContainer] is the ownership-aware analogue of `MutableCollection` -- it models a container type that allows its elements to be arbitrarily reordered and mutated/reassigned without changing the shape of the data structure (that is to say, without invalidating any indices). - [`PermutableContainer`][PermutableContainer] is an experimental new spinoff of `MutableContainer`, focusing on reordering items without allowing arbitrary mutations. - [`RangeReplaceableContainer`][RangeReplaceableContainer] is a partial, ownership-aware analogue of `RangeReplaceableCollection`, providing a full set of insertion/append/removal/consumption operations, with support for fixed-capacity conforming types. - [`DynamicContainer`][DynamicContainer] rounds out the range-replacement operations with initializer and capacity reservation requirements that can only be implemented by dynamically sized containers. [BidirectionalContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/BidirectionalContainer.swift [RandomAccessContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/RandomAccessContainer.swift [MutableContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/MutableContainer.swift [PermutableContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/PermutableContainer.swift [RangeReplaceableContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/RangeReplaceableContainer.swift [DynamicContainer]: https://redirect.github.com/apple/swift-collections/blob/main/Sources/ContainersPreview/Protocols/Container/DynamicContainer.swift - We now have [working reference implementations](https://redirect.github.com/apple/swift-collections/tree/main/Sources/ContainersPreview/Protocols) of lazy `map`, `reduce` and `filter` operations on borrowing iterators, producers and drains, as well a `collect(into:)` family of methods to supply "greedy" variants, generating items into a container of the user's choice. Importantly, the algorithms tend to be defined on the iterator types, rather than directly on some sequence/container -- going this way has some interesting benefits (explicitness, no confusion between the various flavors or the existing `Sequence` algorithms), but they also have notable drawbacks (minor design issues with the borrowing iterator protocol, unknowns on how the pattern would apply to container algorithms, etc.). ```swift let items: RigidArray<Int> = ... let transformed = items.makeBorrowingIterator() // obviously we'd want a better name here, like `borrow()` .map { 2 * $0 } .collect(into: UniqueArray.self) // `transformed` is a UniqueArray instance holding all values in `items`, doubled up ``` ```swift let items: RigidArray = ... let transformed = items.makeBorrowingIterator() .filter { !$0.isMultiple(of: 7) } .copy() .collect(into: UniqueArray.self) // `transformed` holds a copy of all values in `items` that aren't a multiple of 7 ``` ```swift let items: RigidArray = ... let transformed = items.consumeAll() .filter { !$0.isMultiple(of: 7) } .collect(into: UniqueArray.self) // `transformed` holds all values that were previously in `items` that aren't a multiple of 7. `items` is now empty. ``` Like before, these are highly experimental, and they will definitely change in dramatic/radical ways on the way to stabilization. Note that there is no project- or team-wide consensus on any of these constructs. I'm publishing them primarily as a crucial reference point, and to gain a level of shared understanding of the actual problems that need to be resolved, and the consequences of the design path we are on. #### What's Changed - Add some decorative badges in the README by [@​lorentey](https://redirect.github.com/lorentey) in [#​591](https://redirect.github.com/apple/swift-collections/pull/591) - \[Dequemodule, OrderedCollections] Avoid using floating point arithmetic by [@​lorentey](https://redirect.github.com/lorentey) in [#​592](https://redirect.github.com/apple/swift-collections/pull/592) - Enforce dress code for license headers by [@​lorentey](https://redirect.github.com/lorentey) in [#​593](https://redirect.github.com/apple/swift-collections/pull/593) - Bump swiftlang/github-workflows/.github/workflows/soundness.yml from 0.0.7 to 0.0.8 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​595](https://redirect.github.com/apple/swift-collections/pull/595) - Documentation updates for latest DocC by [@​lorentey](https://redirect.github.com/lorentey) in [#​596](https://redirect.github.com/apple/swift-collections/pull/596) - \[BasicContainers] Allow standalone use of the UnstableHashedContainers trait by [@​lorentey](https://redirect.github.com/lorentey) in [#​597](https://redirect.github.com/apple/swift-collections/pull/597) - Bump swiftlang/github-workflows/.github/workflows/swift\_package\_test.yml from 0.0.7 to 0.0.8 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​594](https://redirect.github.com/apple/swift-collections/pull/594) - \[ContainersPreview] Rename Producer.generateNext() to next() by [@​lorentey](https://redirect.github.com/lorentey) in [#​599](https://redirect.github.com/apple/swift-collections/pull/599) - \[ContainersPreview] Remove BorrowingSequence.first by [@​lorentey](https://redirect.github.com/lorentey) in [#​598](https://redirect.github.com/apple/swift-collections/pull/598) - \[CI] Enable Android testing by [@​marcprux](https://redirect.github.com/marcprux) in [#​558](https://redirect.github.com/apple/swift-collections/pull/558) - \[BasicContainers] Assorted hashed container fixes and improvements by [@​lorentey](https://redirect.github.com/lorentey) in [#​601](https://redirect.github.com/apple/swift-collections/pull/601) - Flesh out BorrowingSequence/Container/Producer model a little more by [@​lorentey](https://redirect.github.com/lorentey) in [#​603](https://redirect.github.com/apple/swift-collections/pull/603) - More exploration of ownership-aware container/iterator algorithms by [@​lorentey](https://redirect.github.com/lorentey) in [#​605](https://redirect.github.com/apple/swift-collections/pull/605) #### New Contributors - [@​marcprux](https://redirect.github.com/marcprux) made their first contribution in [#​558](https://redirect.github.com/apple/swift-collections/pull/558) **Full Changelog**: <https://github.com/apple/swift-collections/compare/1.4.0...1.4.1> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
f47ee2bc8a |
feat(server): improve indexer (#14698)
fix #13862 #### PR Dependency Tree * **PR #14698** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Enhanced search support for Chinese, Japanese, and Korean languages with improved text segmentation and character matching. * Added index management capabilities with table recreation functionality. * **Bug Fixes** * Improved search accuracy for non-Latin scripts through updated morphology and n-gram configuration. * **Chores** * Added database migration for search index optimization. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
bcf2a51d41 |
feat(native): record encoding (#14188)
fix #13784 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Start/stop system or meeting recordings with Ogg/Opus artifacts and native start/stop APIs; workspace backup recovery. * **Refactor** * Simplified recording lifecycle and UI flows; native runtime now orchestrates recording/processing and reporting. * **Bug Fixes** * Stronger path validation, safer import/export dialogs, consistent error handling/logging, and retry-safe recording processing. * **Chores** * Added cross-platform native audio capture and Ogg/Opus encoding support. * **Tests** * New unit, integration, and e2e tests for recording, path guards, dialogs, and workspace recovery. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
6a93566422 |
chore: bump deps (#14690)
#### PR Dependency Tree * **PR #14690** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated package manager and development tooling to latest compatible versions. * Updated backend framework and monitoring dependencies to latest minor/patch releases. <!-- end of auto-generated comment: release notes by coderabbit.ai -->v2026.3.20-canary.913 |
||
|
|
7ac8b14b65 |
feat(editor): migrate typst mermaid to native (#14499)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Native/WASM Mermaid and Typst SVG preview rendering on desktop and mobile, plus cross-platform Preview plugin integrations. * **Improvements** * Centralized, sanitized rendering bridge with automatic Typst font-directory handling and configurable native renderer selection. * More consistent and robust error serialization and worker-backed preview flows for improved stability and performance. * **Tests** * Extensive unit and integration tests for preview rendering, font discovery, sanitization, and error serialization. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
16a8f17717 |
feat(server): improve oidc compatibility (#14686)
fix #13938 fix #14683 fix #14532 #### PR Dependency Tree * **PR #14686** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Flexible OIDC claim mapping for email/name, automatic OIDC discovery retry with exponential backoff, and explicit OAuth flow modes (popup vs redirect) propagated through the auth flow. * **Bug Fixes** * Stricter OIDC email validation, clearer error messages listing attempted claim candidates, and improved callback redirect handling for various flow scenarios. * **Tests** * Added unit tests covering OIDC behaviors, backoff scheduler/promise utilities, and frontend OAuth flow parsing/redirect logic. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
1ffb8c922c | fix(native): cleanup deleted docs and blobs (#14689) | ||
|
|
daf536f77a |
fix(native): misalignment between index clock and snapshot clock (#14688)
fix #14191 #### PR Dependency Tree * **PR #14688** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved indexer synchronization timing for clock persistence to prevent premature completion signals * Enhanced document-level indexing status tracking accuracy * Optimized refresh behavior for better state consistency * **Chores** * Updated indexer versioning system <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
0d2d4bb6a1 |
fix(editor): note-edgeless-block loses edit state during shift-click range selection (#14675)
### Problem ●In edgeless mode, when using Shift + click to perform range selection inside an editing `note-edgeless-block` (click at the starting point, then hold Shift and click at the end point), the block will unexpectedly lose its editing and selection state. As a result, subsequent operations on the selection - such as deleting and moving - no longer work. ●The following video demonstrates this issue: https://github.com/user-attachments/assets/82c68683-e002-4a58-b011-fe59f7fc9f02 ### Solution ●The reason is that this "Shift + click" behavior is being handled by the default multi-selection logic, which toggles selection mode and exits the editing state. So I added an `else-if` branch to match this case. ### After ●The video below shows the behavior after this fix. https://github.com/user-attachments/assets/18d61108-2089-4def-b2dc-ae13fc5ac333 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved selection behavior during note editing in multi-select mode to provide more intuitive interaction when using range selection during active editing. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
cb9897d493 |
fix(i18n): support Arabic comma separator in date-picker weekDays and monthNames (#14663)
## Problem
The Arabic locale strings in `ar.json` use the Arabic comma `،` (U+060C)
as separator:
```json
"com.affine.calendar-date-picker.week-days": "أ،إث،ث،أر،خ،ج،س"
```
But `day-picker.tsx` splits on ASCII comma only — causing all
weekday/month names to render as a single unsplit string in Arabic
locale.
## Fix
Change `.split(',')` to `.split(/[,،]/)` in two call sites — matches
both ASCII and Arabic comma.
## Impact
One-line fix per call site. No other functionality affected. All
non-Arabic locales unchanged.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Date picker rendering updated to correctly handle both ASCII and
Arabic/Persian comma formats when determining month and weekday labels.
This fixes inconsistent header and month-name displays in locales using
different comma characters while preserving existing interactions and
behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
|
||
|
|
8ca8333cd6 |
chore(server): update exa search tool description (#14682)
Updated the Exa search tool description to better reflect what Exa does. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Clarified the web search tool description to state it uses Exa, a web search API optimized for AI applications to improve labeling and user understanding. * No functional or behavioral changes to the tool; this update affects only the displayed description users see. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: ishan <ishan@exa.ai> |
||
|
|
3bf2503f55 |
fix(tools): improve sed error handling in set-version script (#14684)
## Summary Replace post-command status checks with inline failure handling around `sed` calls. In the stream update path, ensure the two `sed` operations are treated as one success/failure unit. Keep behavior and file outputs the same on success, while making failure handling explicit. ## Why When `set -e` is enabled (which the script itself enables) command failures cause the script to exit, making error handling by checking `$?` not work. ## Files affected - `set-version.sh` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Enhanced error handling in version management script with improved failure reporting and context information. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
59fd942f40 |
fix(editor): database detail style (#14680)
fix #13923 #### PR Dependency Tree * **PR #14680** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Refined styling and alignment for number field displays in the database view component. <!-- end of auto-generated comment: release notes by coderabbit.ai -->v2026.3.18-canary.918 |
||
|
|
d6d5ae6182 | fix(electron): create doc shortcut should follow default type in settings (#14678) | ||
|
|
c1a09b951f |
chore: bump up fast-xml-parser version to v5.5.6 [SECURITY] (#14676)
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [fast-xml-parser](https://redirect.github.com/NaturalIntelligence/fast-xml-parser) | [`5.4.1` → `5.5.6`](https://renovatebot.com/diffs/npm/fast-xml-parser/5.4.1/5.5.6) |  |  | ### GitHub Vulnerability Alerts #### [CVE-2026-33036](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/security/advisories/GHSA-8gc5-j5rx-235r) ## Summary The fix for CVE-2026-26278 added entity expansion limits (`maxTotalExpansions`, `maxExpandedLength`, `maxEntityCount`, `maxEntitySize`) to prevent XML entity expansion Denial of Service. However, these limits are only enforced for DOCTYPE-defined entities. **Numeric character references** (`&#NNN;` and `&#xHH;`) and standard XML entities (`<`, `>`, etc.) are processed through a separate code path that does NOT enforce any expansion limits. An attacker can use massive numbers of numeric entity references to completely bypass all configured limits, causing excessive memory allocation and CPU consumption. ## Affected Versions fast-xml-parser v5.x through v5.5.3 (and likely v5.5.5 on npm) ## Root Cause In `src/xmlparser/OrderedObjParser.js`, the `replaceEntitiesValue()` function has two separate entity replacement loops: 1. **Lines 638-670**: DOCTYPE entities — expansion counting with `entityExpansionCount` and `currentExpandedLength` tracking. This was the CVE-2026-26278 fix. 2. **Lines 674-677**: `lastEntities` loop — replaces standard entities including `num_dec` (`/&#([0-9]{1,7});/g`) and `num_hex` (`/&#x([0-9a-fA-F]{1,6});/g`). **This loop has NO expansion counting at all.** The numeric entity regex replacements at lines 97-98 are part of `lastEntities` and go through the uncounted loop, completely bypassing the CVE-2026-26278 fix. ## Proof of Concept ```javascript const { XMLParser } = require('fast-xml-parser'); // Even with strict explicit limits, numeric entities bypass them const parser = new XMLParser({ processEntities: { enabled: true, maxTotalExpansions: 10, maxExpandedLength: 100, maxEntityCount: 1, maxEntitySize: 10 } }); // 100K numeric entity references — should be blocked by maxTotalExpansions=10 const xml = `<root>${'&#​65;'.repeat(100000)}</root>`; const result = parser.parse(xml); // Output: 500,000 chars — bypasses maxExpandedLength=100 completely console.log('Output length:', result.root.length); // 500000 console.log('Expected max:', 100); // limit was 100 ``` **Results:** - 100K `&#​65;` references → 500,000 char output (5x default maxExpandedLength of 100,000) - 1M references → 5,000,000 char output, ~147MB memory consumed - Even with `maxTotalExpansions=10` and `maxExpandedLength=100`, 10K references produce 50,000 chars - Hex entities (`A`) exhibit the same bypass ## Impact **Denial of Service** — An attacker who can provide XML input to applications using fast-xml-parser can cause: - Excessive memory allocation (147MB+ for 1M entity references) - CPU consumption during regex replacement - Potential process crash via OOM This is particularly dangerous because the application developer may have explicitly configured strict entity expansion limits believing they are protected, while numeric entities silently bypass all of them. ## Suggested Fix Apply the same `entityExpansionCount` and `currentExpandedLength` tracking to the `lastEntities` loop (lines 674-677) and the HTML entities loop (lines 680-686), similar to how DOCTYPE entities are tracked at lines 638-670. ## Workaround Set `htmlEntities:false` --- ### Release Notes <details> <summary>NaturalIntelligence/fast-xml-parser (fast-xml-parser)</summary> ### [`v5.5.6`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/e54155f53048e9d58e27f170d3ccff15176b6671...870043e75e78545192bc70950c6286d36c7cdf23) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6) ### [`v5.5.5`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/ea07bb2e8435a88136c0e46d7ee8a345107b7582...e54155f53048e9d58e27f170d3ccff15176b6671) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.4...v5.5.5) ### [`v5.5.4`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...ea07bb2e8435a88136c0e46d7ee8a345107b7582) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.4) ### [`v5.5.3`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.2...v5.5.3) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.2...v5.5.3) ### [`v5.5.2`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...e0a14f7d15a293732e630ce1b7faa39924de2359) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2) ### [`v5.5.1`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/releases/tag/v5.5.1): integrate path-expression-matcher [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.0...v5.5.1) - support path-expression-matcher - fix: stopNode should not be parsed - performance improvement for stopNode checking ### [`v5.5.0`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.2...ce017923460f92861e8fc94c91e52f9f5bd6a1b0) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.2...v5.5.0) ### [`v5.4.2`](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.4.2) [Compare Source](https://redirect.github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.4.2) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
4ce68d74f1 |
fix(editor): chat cannot scroll on windows (#14677)
fix #14529 fix #14612 replace #14614 #14657 #### PR Dependency Tree * **PR #14677** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Added test coverage for scroll position tracking and pinned scroll behavior in AI chat * Added test suite verifying scroll-to-end and scroll-to-position functionality * **New Features** * Introduced configurable scrollable option for text rendering in AI chat components, allowing control over scroll behavior <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
fbfcc01d14 |
fix(core): reserve space for auth input error to avoid layout shift (#14670)
Prevents layout shift when showing auth input errors by reserving space for the error message. Improves visual stability and avoids UI jumps when validation errors appear. ### Before https://github.com/user-attachments/assets/7439aa5e-069d-42ac-8963-e5cdee341ad9 ### After https://github.com/user-attachments/assets/8e758452-5323-4807-8a0d-38913303020d <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Improved error message display mechanism in authentication components for more consistent rendering. * **Style** * Enhanced vertical spacing for error messages in form inputs to ensure better visual consistency and readability. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
1112a06623 | fix: ci | ||
|
|
bbcb7e69fe |
fix: correct "has accept" to "has accepted" (#14669)
fixes #14407 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Corrected grammar in the notification message displayed when an invitation is accepted. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
cc2f23339e |
feat(i18n): update German translation (#14674)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Enhanced German language support with new translations for Obsidian import, MCP server integration, and Copilot features. Improved error message translations for better clarity and consistency. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
31101a69e7 |
fix: Refine verify email dialog for verify and change email flows (#14671)
### Summary This PR improves the verify email dialog by giving the verify-email and change-email flows distinct messaging instead of reusing the same generic copy. ### What changed * Use flow-specific body copy in the verify email dialog * Keep the existing action-specific subtitle behavior for: * Verify email * Change email * Update the English i18n strings so each flow explains the correct intent: * Verify email focuses on confirming email ownership * Change email focuses on securely starting the email-change process ### Why The previous dialog message was shared across both flows, which made the change-email experience feel ambiguous. This update makes the intent clearer for users and better matches the action they are taking. https://www.loom.com/share/c64c20570a8242358bd178a2ac50e413 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved clarity in email verification and email change dialog messages to better explain the confirmation process and link purpose. * Enhanced distinction between email verification and email change workflows with context-specific messaging. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
0b1a44863f |
feat(editor): add obsidian vault import support (#14593)
fix #14592 ### Description > 🤖 **Note:** The code in this Pull Request were developed with the assistance of AI, but have been thoroughly reviewed and manually tested. > I noticed there's a check when opening an issue that asks _"Is your content generated by AI?"_, so I mention it here in case it's a deal breaker. If so I understand, you can close the PR, just wanted to share this in case it's useful anyways. This PR introduces **Obsidian Vault Import Support** to AFFiNE. Previously, users migrating from Obsidian had to rely on the generic Markdown importer, which often resulted in broken cross-links, missing directory structures, and metadata conflicts because Obsidian relies heavily on proprietary structures not supported by standard Markdown. This completely new feature makes migrating to AFFiNE easy. **Key Features & Implementations:** 1. **Vault (Directory) Selection** - Utilizes the `openDirectory` blocksuite utility in the import modal to allow users to select an entire folder directly from their filesystem, maintaining file context rather than forcing `.zip` uploads. 2. **Wikilink Resolution (Two-Pass Import)** - Restructured the `importObsidianVault` process into a two-pass architecture. - **Pass 1:** Discovers all files, assigns new AFFiNE document IDs, and maps them efficiently (by title, alias, and filename) into a high-performance hash map. - **Pass 2:** Processes the generic markdown AST and correctly maps custom `[[wikilinks]]` to the actual pre-registered AFFiNE blocksuite document IDs via `obsidianWikilinkToDeltaMatcher`. - Safely strips leading emojis from wikilink aliases to prevent duplicated page icons rendering mid-sentence. 3. **Emoji Metadata & State Fixes** - Implemented an aggressive, single-pass RegExp to extract multiple leading/combining emojis (`Emoji_Presentation` / `\ufe0f`) from H1 headers and Frontmatter. Emojis are assigned specifically to the page icon metadata property and cleanly stripped from the visual document title. - Fixed a core mutation bug where the loop iterating over existing `docMetas` was aggressively overwriting newly minted IDs for the current import batch. This fully resolves the issue where imported pages (especially re-imports) were incorrectly flagged as `trashed`. - Enforces explicit `trash: false` patch instructions. 4. **Syntax Conversion** - Implemented conversion of Obsidian-style Callouts (`> [!NOTE] Title`) into native AFFiNE block formats (`> 💡 **Title**`). - Hardened the `blockquote` parser so that nested structures (like `> - list items`) are fully preserved instead of discarded. ### UI Changes - Updated the Import Modal to include the "Import Obsidian Vault" flow utilizing the native filesystem directory picker. - Regenerated and synced `i18n-completenesses.json` correctly up to 100% across all supported locales for the new modal string additions. ### Testing Instructions 1. Navigate to the Workspace sidebar and click "Import". 2. Select "Obsidian" and use the directory picker to define a comprehensive Vault folder. 3. Validate that cross-links between documents automatically resolve to their specific AFFiNE instances. 4. Validate documents containing leading Emojis display exactly one Emoji (in the page icon area), and none duplicated in the actual title header. 5. Validate Callouts are rendered cleanly and correctly, and no documents are incorrectly marked as "Trash". <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Import Obsidian vaults with wikilink resolution, emoji/title preservation, asset handling, and automatic document creation. * Folder-based imports via a Directory Picker (with hidden-input fallback) integrated into the import dialog. * **Localization** * Added Obsidian import label and tooltip translations. * **Tests** * Added end-to-end tests validating Obsidian vault import and asset handling. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com> Co-authored-by: DarkSky <darksky2048@gmail.com> |
||
|
|
8406f9656e |
perf(editor): improve bounding box calc caching (#14668)
#### PR Dependency Tree * **PR #14668** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) |
||
|
|
121c0d172d |
feat(server): improve doc tools error handle (#14662)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Centralized sync/status messages for cloud document sync and explicit user-facing error types. * Frontend helpers to detect and display tool errors with friendly names. * **Bug Fixes** * Consistent, actionable error reporting for document and attachment reads instead of silent failures. * Search and semantic tools now validate workspace sync and permissions and return clear responses. * **Tests** * Added comprehensive tests covering document/blob reads, search tools, and sync/error paths. <!-- end of auto-generated comment: release notes by coderabbit.ai -->v2026.3.16-canary.924 |
||
|
|
8f03090780 |
chore: bump up Lakr233/MarkdownView version to from: "3.8.2" (#14658)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [Lakr233/MarkdownView](https://redirect.github.com/Lakr233/MarkdownView) | minor | `from: "3.6.3"` → `from: "3.8.2"` | --- ### Release Notes <details> <summary>Lakr233/MarkdownView (Lakr233/MarkdownView)</summary> ### [`v3.8.2`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.8.1...3.8.2) [Compare Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.8.1...3.8.2) ### [`v3.8.1`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.8.0...3.8.1) [Compare Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.8.0...3.8.1) ### [`v3.8.0`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.7.0...3.8.0) [Compare Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.7.0...3.8.0) ### [`v3.7.0`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.6.3...3.7.0) [Compare Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.6.3...3.7.0) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
8125cc0e75 |
chore: bump up Lakr233/ListViewKit version to from: "1.2.0" (#14617)
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [Lakr233/ListViewKit](https://redirect.github.com/Lakr233/ListViewKit) | minor | `from: "1.1.8"` → `from: "1.2.0"` | --- ### Release Notes <details> <summary>Lakr233/ListViewKit (Lakr233/ListViewKit)</summary> ### [`v1.2.0`](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.8...1.2.0) [Compare Source](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.8...1.2.0) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>v2026.3.15-canary.910 |
||
|
|
f537a75f01 |
chore: bump up file-type version to v21.3.2 [SECURITY] (#14655)
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [file-type](https://redirect.github.com/sindresorhus/file-type) | [`21.3.1` → `21.3.2`](https://renovatebot.com/diffs/npm/file-type/21.3.1/21.3.2) |  |  | ### GitHub Vulnerability Alerts #### [CVE-2026-31808](https://redirect.github.com/sindresorhus/file-type/security/advisories/GHSA-5v7r-6r5c-r473) ### Impact A denial of service vulnerability exists in the ASF (WMV/WMA) file type detection parser. When parsing a crafted input where an ASF sub-header has a `size` field of zero, the parser enters an infinite loop. The `payload` value becomes negative (-24), causing `tokenizer.ignore(payload)` to move the read position backwards, so the same sub-header is read repeatedly forever. Any application that uses `file-type` to detect the type of untrusted/attacker-controlled input is affected. An attacker can stall the Node.js event loop with a 55-byte payload. ### Patches Fixed in version 21.3.1. Users should upgrade to >= 21.3.1. ### Workarounds Validate or limit the size of input buffers before passing them to `file-type`, or run file type detection in a worker thread with a timeout. ### References - Fix commit: 319abf871b50ba2fa221b4a7050059f1ae096f4f ### Reporter crnkovic@lokvica.com #### [CVE-2026-32630](https://redirect.github.com/sindresorhus/file-type/security/advisories/GHSA-j47w-4g3g-c36v) ## Summary A crafted ZIP file can trigger excessive memory growth during type detection in `file-type` when using `fileTypeFromBuffer()`, `fileTypeFromBlob()`, or `fileTypeFromFile()`. In affected versions, the ZIP inflate output limit is enforced for stream-based detection, but not for known-size inputs. As a result, a small compressed ZIP can cause `file-type` to inflate and process a much larger payload while probing ZIP-based formats such as OOXML. In testing on `file-type` `21.3.1`, a ZIP of about `255 KB` caused about `257 MB` of RSS growth during `fileTypeFromBuffer()`. This is an availability issue. Applications that use these APIs on untrusted uploads can be forced to consume large amounts of memory and may become slow or crash. ## Root Cause The ZIP detection logic applied different limits depending on whether the tokenizer had a known file size. For stream inputs, ZIP probing was bounded by `maximumZipEntrySizeInBytes` (`1 MiB`). For known-size inputs such as buffers, blobs, and files, the code instead used `Number.MAX_SAFE_INTEGER` in two relevant places: ```js const maximumContentTypesEntrySize = hasUnknownFileSize(tokenizer) ? maximumZipEntrySizeInBytes : Number.MAX_SAFE_INTEGER; ``` and: ```js const maximumLength = hasUnknownFileSize(this.tokenizer) ? maximumZipEntrySizeInBytes : Number.MAX_SAFE_INTEGER; ``` Together, these checks allowed a crafted ZIP to bypass the intended inflate limit for known-size APIs and force large decompression during detection of entries such as `[Content_Types].xml`. ## Proof of Concept ```js import {fileTypeFromBuffer} from 'file-type'; import archiver from 'archiver'; import {Writable} from 'node:stream'; async function createZipBomb(sizeInMegabytes) { return new Promise((resolve, reject) => { const chunks = []; const writable = new Writable({ write(chunk, encoding, callback) { chunks.push(chunk); callback(); }, }); const archive = archiver('zip', {zlib: {level: 9}}); archive.pipe(writable); writable.on('finish', () => { resolve(Buffer.concat(chunks)); }); archive.on('error', reject); const xmlPrefix = '<?xml version="1.0"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'; const padding = Buffer.alloc(sizeInMegabytes * 1024 * 1024 - xmlPrefix.length, 0x20); archive.append(Buffer.concat([Buffer.from(xmlPrefix), padding]), {name: '[Content_Types].xml'}); archive.finalize(); }); } const zip = await createZipBomb(256); console.log('ZIP size (KB):', (zip.length / 1024).toFixed(0)); const before = process.memoryUsage().rss; await fileTypeFromBuffer(zip); const after = process.memoryUsage().rss; console.log('RSS growth (MB):', ((after - before) / 1024 / 1024).toFixed(0)); ``` Observed on `file-type` `21.3.1`: - ZIP size: about `255 KB` - RSS growth during detection: about `257 MB` ## Affected APIs Affected: - `fileTypeFromBuffer()` - `fileTypeFromBlob()` - `fileTypeFromFile()` Not affected: - `fileTypeFromStream()`, which already enforced the ZIP inflate limit for unknown-size inputs ## Impact Applications that inspect untrusted uploads with `fileTypeFromBuffer()`, `fileTypeFromBlob()`, or `fileTypeFromFile()` can be forced to consume excessive memory during ZIP-based type detection. This can degrade service or lead to process termination in memory-constrained environments. ## Cause The issue was introduced in 399b0f1 --- ### Release Notes <details> <summary>sindresorhus/file-type (file-type)</summary> ### [`v21.3.2`](https://redirect.github.com/sindresorhus/file-type/releases/tag/v21.3.2) [Compare Source](https://redirect.github.com/sindresorhus/file-type/compare/v21.3.1...v21.3.2) - Fix ZIP bomb in known-size ZIP probing (GHSA-j47w-4g3g-c36v) [`a155cd7`](https://redirect.github.com/sindresorhus/file-type/commit/a155cd7) - Fix bound recursive BOM and ID3 detection [`370ed91`](https://redirect.github.com/sindresorhus/file-type/commit/370ed91) *** </details> --- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
9456a07889 |
chore: migrate Renovate config (#14656)
The Renovate config in this repository needs migrating. Typically this is because one or more configuration options you are using have been renamed. You don't need to merge this PR right away, because Renovate will continue to migrate these fields internally each time it runs. But later some of these fields may be fully deprecated and the migrations removed. So it's a good idea to merge this migration PR soon. 🔕 **Ignore**: Close this PR and you won't be reminded about config migration again, but one day your current config may no longer be valid. ❓ Got questions? Does something look wrong to you? Please don't hesitate to [request help here](https://redirect.github.com/renovatebot/renovate/discussions). --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> |
||
|
|
8f571ddc30 |
fix: ensure images load correctly when printing to PDF (#14618)
Fixes #14304 ## Summary This PR resolves an issue where images sometimes fail to appear when exporting or printing AFFiNE pages to PDF. The issue occurs because images may not finish loading inside the hidden print iframe before `window.print()` is triggered. ## Changes - Avoid using `display: none` for the print iframe and instead keep it hidden while remaining in the rendering tree to ensure resources load correctly. - Remove `loading="lazy"` from all images before printing to prevent viewport-based lazy loading from blocking image fetches. - Force image reload by reassigning the `src` attribute after removing lazy loading. - Add a `waitForImages` helper to ensure all images (including those inside Shadow DOM) finish loading before calling `window.print()`. - Improve reliability by checking both `img.complete` and `img.naturalWidth` to confirm successful image loading. - Wait for fonts using `document.fonts.ready` before triggering the print dialog. ## Verification 1. Run AFFiNE in development mode: npm run dev 2. Open a page containing multiple images. 3. Click **Print** and select **Save as PDF** (or any PDF printer). 4. Verify that all images appear correctly in the generated PDF. ## Notes This change focuses only on improving the reliability of the existing print-to-PDF workflow without altering any feature flags or export behavior. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved PDF export reliability by waiting for all images (including inside shadow content) and fonts to load before printing. * Removed lazy-loading interference so images reliably appear in exports. * Ensured styles and light-theme attributes are consistently applied to the print document. * **Improvements** * More robust print preparation using a hidden-but-rendering iframe document, deep-cloning content (flattening shadow DOM), and preserved canvas mapping for accurate renders. <!-- end of auto-generated comment: release notes by coderabbit.ai -->v2026.3.13-canary.913 |
||
|
|
13ad1beb10 |
feat(i18n): automatic RTL layout for Arabic, Persian, and Urdu + complete Arabic translations (#14624)
## Changes ### RTL Support (automatic, locale-driven) - Add `rtl?: boolean` metadata to locale definitions in `SUPPORTED_LANGUAGES` - Set `rtl: true` for Arabic (`ar`), Persian (`fa`), and Urdu (`ur`) - Automatically set `document.documentElement.dir` based on locale RTL metadata on language change - Remove hardcoded `lang="en"` from HTML template — JS now controls both `lang` and `dir` ### Arabic Translations - Add 100 missing keys to `ar.json` (Calendar integration, Doc Analytics, MCP Server, AI Chat, and more) - Arabic locale now has 2,313/2,313 keys (100% coverage, matches `en.json` exactly) ## Testing Switching to Arabic/Persian/Urdu now automatically flips the entire UI layout to RTL without any manual feature flag. Fixes #7099 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added Right-to-Left (RTL) support for Arabic, Persian, and Urdu with automatic document direction and language attributes when a language is selected. * **Refactor** * Centralized and reordered internal language handling so document language and direction are applied earlier and consistently. * **Chore** * Set a default text direction attribute on the base HTML template. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
9844ca4d54 |
fix(editor): ensure code and quote blocks render correctly in print (#14613)
Fixes #14608 ## Summary Fix printing issues when exporting documents while using the dark theme. Previously, when printing or saving a document as PDF in dark mode, text color was forced to black while some block containers (such as code blocks and quotes) retained their dark backgrounds. This resulted in **black text on dark backgrounds**, making the content unreadable in the exported PDF. ## Changes * Reset relevant CSS variables in the `@media print` section of `print-to-pdf.ts`. * Ensure block containers such as **code blocks and quotes** render with light backgrounds during printing. * Maintain readable text colors by forcing text color to black for print output. This approach updates the **CSS variables used by BlockSuite components**, ensuring that elements relying on variables like `--affine-background-code-block` and `--affine-quote-color` correctly switch to light backgrounds in print mode. ## Result Documents printed or exported as PDF from dark mode now render correctly with: * readable text * proper light backgrounds for code blocks and quotes * consistent formatting in print output <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Enhanced print-to-PDF styling for improved visual presentation of code blocks, quotes, and borders when exporting or printing documents to maintain better readability and consistency. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: sahilkhan09k <sahilkhan392005@gmail.com>v2026.3.11-canary.915 |