Closes: [BS-2909](https://linear.app/affine-design/issue/BS-2909/新增highlighter)
### What's Changed!
Currently the highlighter tool is very similar to brush, but for the future, it's a standalone module.
* Added `Highlighter` element model
* Added `Highlighter` tool
* Added `Highlighter` entry to the global toolbar
# Refactor Turbo Renderer State Management to Use RxJS
### TL;DR
Refactored the TurboRenderer state management to use RxJS observables instead of direct state mutations, improving state transitions and reactivity.
### What changed?
- Replaced the public `state` property with a private `state$` BehaviorSubject in `ViewportTurboRendererExtension`
- Added proper state transition logging using RxJS operators
- Combined multiple event subscriptions using `merge` operator for better organization
- Improved state transition logic in the `refresh()` method
- Updated the `zooming$` and `panning$` signals in the Viewport
### Why make this change?
This refactoring improves the codebase by:
1. Using a more consistent reactive programming model with RxJS
2. Making state transitions more explicit and traceable
3. Reducing potential bugs from manual state management
4. Improving code organization by combining related event streams
5. Ensuring proper cleanup of resources when components are disposed
The change maintains the same functionality while making the code more maintainable and the state management more robust.
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@googleapis/androidpublisher](https://redirect.github.com/googleapis/google-api-nodejs-client) | [`^24.0.0` -> `^26.0.0`](https://renovatebot.com/diffs/npm/@googleapis%2fandroidpublisher/24.0.0/26.0.0) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Release Notes
<details>
<summary>googleapis/google-api-nodejs-client (@​googleapis/androidpublisher)</summary>
### [`v26.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#12600-2023-08-17)
[Compare Source](https://redirect.github.com/googleapis/google-api-nodejs-client/compare/v25.0.0...v26.0.0)
##### ⚠ BREAKING CHANGES
- **vmmigration:** This release has breaking changes.
- **contentwarehouse:** This release has breaking changes.
- **assuredworkloads:** This release has breaking changes.
- **aiplatform:** This release has breaking changes.
##### Features
- **admin:** update the API ([ebfb777](ebfb777684))
- **aiplatform:** update the API ([146712c](146712c48e))
- **androidpublisher:** update the API ([2d7c2b4](2d7c2b4247))
- **assuredworkloads:** update the API ([6547ea1](6547ea1ef1))
- **contactcenterinsights:** update the API ([1f2e6eb](1f2e6eb4ab))
- **containeranalysis:** update the API ([7acf09f](7acf09fc53))
- **contentwarehouse:** update the API ([c44aeaf](c44aeafdd3))
- **discoveryengine:** update the API ([bca2665](bca26655ef))
- regenerate index files ([751227d](751227d392))
- **serviceconsumermanagement:** update the API ([336b645](336b645dbb))
- **serviceusage:** update the API ([6f08362](6f0836293a))
- **testing:** update the API ([9c06a45](9c06a45890))
- **vmmigration:** update the API ([75cbb15](75cbb1513e))
##### Bug Fixes
- **contactcenteraiplatform:** update the API ([e4bfff0](e4bfff0b61))
- **content:** update the API ([6e9f31f](6e9f31fdff))
- **dns:** update the API ([2e49df0](2e49df0707))
- **eventarc:** update the API ([b7a0e5a](b7a0e5a26e))
- **gameservices:** update the API ([8733a48](8733a48c00))
- **metastore:** update the API ([26f97a2](26f97a259e))
- **privateca:** update the API ([b50c176](b50c176656))
- **recommendationengine:** update the API ([fd203b4](fd203b411f))
- **vision:** update the API ([2593341](2593341f5b))
- **vpcaccess:** update the API ([b740cac](b740cacf6f))
### [`v25.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#12500-2023-08-15)
##### ⚠ BREAKING CHANGES
- **gkehub:** This release has breaking changes.
- **contentwarehouse:** This release has breaking changes.
- **bigquery:** This release has breaking changes.
- **beyondcorp:** This release has breaking changes.
- **assuredworkloads:** This release has breaking changes.
##### Features
- **analyticsadmin:** update the API ([3bed127](3bed127d4e))
- **appengine:** update the API ([a8d4c48](a8d4c48bd1))
- **artifactregistry:** update the API ([2d1257d](2d1257d9ac))
- **assuredworkloads:** update the API ([f58a85a](f58a85a1ac))
- **beyondcorp:** update the API ([270693a](270693ad48))
- **bigquery:** update the API ([b0bc1f1](b0bc1f15a8))
- **binaryauthorization:** update the API ([2175fab](2175fab3e4))
- **cloudbuild:** update the API ([2413746](2413746386))
- **composer:** update the API ([d2322c2](d2322c2a50))
- **container:** update the API ([3ab84ca](3ab84caea9))
- **contentwarehouse:** update the API ([73f5d69](73f5d69b1d))
- **dataform:** update the API ([1f0c739](1f0c739684))
- **dataproc:** update the API ([1fc81ab](1fc81abff8))
- **dialogflow:** update the API ([6aba841](6aba841302))
- **discoveryengine:** update the API ([57a6bdd](57a6bdd926))
- **documentai:** update the API ([ae0e266](ae0e2664ae))
- **firebaseappcheck:** update the API ([13f8c86](13f8c865f8))
- **gkehub:** update the API ([7c7c561](7c7c5611a6))
- **healthcare:** update the API ([9dc7235](9dc723542d))
- **identitytoolkit:** update the API ([f15458e](f15458e813))
- **migrationcenter:** update the API ([43d3a7e](43d3a7e351))
- **monitoring:** update the API ([d6ab1de](d6ab1de97a))
- **networkmanagement:** update the API ([b00b4c3](b00b4c39b0))
- **paymentsresellersubscription:** update the API ([fa9bc92](fa9bc92c28))
- **redis:** update the API ([633a71b](633a71b75e))
- regenerate index files ([1b979cb](1b979cb4bd))
- **run:** update the API ([2dc654e](2dc654e314))
- **vmmigration:** update the API ([433922a](433922ae81))
##### Bug Fixes
- **accesscontextmanager:** update the API ([37483a5](37483a53c3))
- **advisorynotifications:** update the API ([5d47fbd](5d47fbd05f))
- **analyticsdata:** update the API ([fcd31de](fcd31debbc))
- **analyticshub:** update the API ([028a8f2](028a8f2845))
- **androidmanagement:** update the API ([b6e3344](b6e33442cb))
- **apigateway:** update the API ([28a0c2b](28a0c2b909))
- **apigeeregistry:** update the API ([f4b44ce](f4b44ce7ff))
- **batch:** update the API ([c0f6c8e](c0f6c8ebae))
- **bigqueryconnection:** update the API ([238464d](238464d37e))
- **chat:** update the API ([9bebe9d](9bebe9d01a))
- **cloudbilling:** update the API ([0a0d5e9](0a0d5e9f35))
- **clouddeploy:** update the API ([8efff9d](8efff9d26e))
- **cloudidentity:** update the API ([01762af](01762affc9))
- **cloudkms:** update the API ([3499c39](3499c393ef))
- **cloudsearch:** update the API ([25771c7](25771c752c))
- **cloudshell:** update the API ([dd761cd](dd761cdec6))
- **connectors:** update the API ([2a03080](2a03080ff2))
- **containeranalysis:** update the API ([4de5705](4de5705559))
- **datacatalog:** update the API ([c823e38](c823e38315))
- **datamigration:** update the API ([0b476bb](0b476bb46f))
- **dataplex:** update the API ([07737a9](07737a9c0b))
- **datastore:** update the API ([f5f7e0e](f5f7e0e81b))
- **datastream:** update the API ([d1efe13](d1efe137ee))
- **deps:** update dependency [@​google-cloud/local-auth](https://redirect.github.com/google-cloud/local-auth) to v3 ([b9e0f13](b9e0f133df))
- **dlp:** update the API ([66720df](66720df286))
- **eventarc:** update the API ([2a475fa](2a475faaef))
- **file:** update the API ([16d1c38](16d1c381e4))
- **firestore:** update the API ([25dd82f](25dd82f85c))
- **iam:** update the API ([df42895](df428953ea))
- **language:** update the API ([86d4072](86d4072801))
- **logging:** update the API ([5ce9916](5ce99164a4))
- **memcache:** update the API ([1c738c4](1c738c4e5f))
- **metastore:** update the API ([3045ac9](3045ac9077))
- **networkconnectivity:** update the API ([db2c560](db2c5609b8))
- **networkservices:** update the API ([c2ca6b5](c2ca6b5b29))
- **ondemandscanning:** update the API ([b5da2fb](b5da2fbde7))
- **osconfig:** update the API ([926f83d](926f83d571))
- **policysimulator:** update the API ([337d6d9](337d6d9bc2))
- **prod_tt_sasportal:** update the API ([cad4560](cad45600a1))
- **pubsublite:** update the API ([383264c](383264cadb))
- **pubsub:** update the API ([6c41abf](6c41abf474))
- **recommender:** update the API ([b7e0460](b7e04605e7))
- **sasportal:** update the API ([cd8a38c](cd8a38c750))
- **script:** update the API ([09d1558](09d1558a81))
- **secretmanager:** update the API ([fe01e40](fe01e40054))
- **securitycenter:** update the API ([0d66358](0d66358f76))
- **servicecontrol:** update the API ([ceadea7](ceadea74b3))
- **servicedirectory:** update the API ([c52f8c3](c52f8c3386))
- **servicemanagement:** update the API ([c5c135d](c5c135da55))
- **sheets:** update the API ([19e06a7](19e06a7c92))
- **speech:** update the API ([b75b27e](b75b27e0ad))
- **storagetransfer:** update the API ([29b6593](29b6593955))
- **tpu:** update the API ([e396d7e](e396d7e10d))
- **translate:** update the API ([5789f48](5789f485ea))
- **vault:** update the API ([6f14118](6f1411871c))
- **vision:** update the API ([8fd1995](8fd19953a1))
- **vpcaccess:** update the API ([6641889](6641889146))
- **workflows:** update the API ([5e9374a](5e9374afdc))
- **workstations:** update the API ([fefd54a](fefd54ada1))
</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
### What Changes
- Fixed incorrect edgeless viewport display in peek view
- Moved page block viewport fit animation logic from `EdgelessRootBlockComponent` to note config extension
- Disabled page block viewport fit animation in peek view, using default `fitToScreen` instead
- @doodlewind Fixed viewport resizing issues by adding a immediate update mechanism to ensure proper rendering during peek view operations. The setViewportByBound is only called once during peek view initialization, so there are barely perf overhead.
- Updated related test cases
- Refactored peek view test cases to make them clearer and more reliable
- Added new test helper function `getViewportBound` for getting viewport boundary information