mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 20:38:52 +00:00
### Changed
- Refactored BlockSuite drag-and-drop using @atlaskit/pragmatic-drag-and-drop/element/adapter.
- Updated block dragging to use the new drag-and-drop infrastructure.
### BlockSuite DND API
Access the BlockSuite drag-and-drop API via `std.dnd`. This is a lightweight wrapper around pragmatic-drag-and-drop, offering convenient generic types and more intuitive option names.
#### Drag payload structure
There's some constrain about drag payload. The whole drag payload looks like this:
```typescript
type DragPayload = {
entity: {
type: string
},
from: {
at: 'blocksuite',
docId: string
}
}
```
- The `from` field is auto-generated—no need for manual handling.
- The `entity` field is customizable, but it must include a `type`.
All drag-and-drop methods accept a generic type for entity, ensuring more accurate payloads in event handlers.
```typescript
type BlockEntity = {
type: 'blocks',
blockIds: string[]
}
dnd.draggable<BlockEntity>({
element: someElement,
setDragData: () => {
// the return type must satisfy the generic type
// in this case, it's BlockEntity
return {
type: 'blocks',
blockIds: []
}
}
});
dnd.monitor<BlockEntity>({
// the arguments is same for other event handler
onDrag({ source }) {
// the type of this is BlockEntity
source.data.entity
}
})
```
#### Drop payload
When hover on droppable target. You can set drop payload as well. All drag-and-drop methods accept a second generic type for drop payload.
The drop payload is customizable. Additionally, the DND system will add an `edge` field to the final payload object, indicating the nearest edge of the drop target relative to the current drag position.
```typescript
type DropPayload = {
blockId: string;
}
dnd.dropTarget<BlockEntity, DropPayload>({
getData() {
// the type should be DropPayload
return {
blockId: 'someId'
}
}
});
dnd.monitor<BlockEntity, DropPayload>({
// drag over on drop target
onDrag({ location }) {
const target = location.current.dropTargets[0];
// the type is DropPayload
target.data;
// retrieve the nearest edge of the drop target relative to the current drop position.
target.data.edge;
}
})
```
53 lines
1.3 KiB
JSON
53 lines
1.3 KiB
JSON
{
|
|
"name": "@blocksuite/block-std",
|
|
"description": "Std for blocksuite blocks",
|
|
"type": "module",
|
|
"scripts": {
|
|
"build": "tsc",
|
|
"test:unit": "nx vite:test --run",
|
|
"test:unit:coverage": "nx vite:test --run --coverage",
|
|
"test:unit:ui": "nx vite:test --ui",
|
|
"test": "yarn test:unit"
|
|
},
|
|
"sideEffects": false,
|
|
"keywords": [],
|
|
"author": "toeverything",
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.4.0",
|
|
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
|
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
|
|
"@blocksuite/global": "workspace:*",
|
|
"@blocksuite/inline": "workspace:*",
|
|
"@blocksuite/store": "workspace:*",
|
|
"@lit/context": "^1.1.2",
|
|
"@preact/signals-core": "^1.8.0",
|
|
"@types/hast": "^3.0.4",
|
|
"dompurify": "^3.1.6",
|
|
"fractional-indexing": "^3.2.0",
|
|
"lib0": "^0.2.97",
|
|
"lit": "^3.2.0",
|
|
"lz-string": "^1.5.0",
|
|
"rehype-parse": "^9.0.0",
|
|
"unified": "^11.0.5",
|
|
"w3c-keyname": "^2.2.8",
|
|
"yjs": "^13.6.21",
|
|
"zod": "^3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"vitest": "2.1.8"
|
|
},
|
|
"exports": {
|
|
".": "./src/index.ts",
|
|
"./gfx": "./src/gfx/index.ts",
|
|
"./effects": "./src/effects.ts"
|
|
},
|
|
"files": [
|
|
"src",
|
|
"dist",
|
|
"!src/__tests__",
|
|
"!dist/__tests__"
|
|
],
|
|
"version": "0.19.0"
|
|
}
|