refactor(editor): gfx text package (#10738)
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
"@blocksuite/affine-fragment-doc-title": "workspace:*",
|
"@blocksuite/affine-fragment-doc-title": "workspace:*",
|
||||||
"@blocksuite/affine-fragment-frame-panel": "workspace:*",
|
"@blocksuite/affine-fragment-frame-panel": "workspace:*",
|
||||||
"@blocksuite/affine-fragment-outline": "workspace:*",
|
"@blocksuite/affine-fragment-outline": "workspace:*",
|
||||||
|
"@blocksuite/affine-gfx-text": "workspace:*",
|
||||||
"@blocksuite/affine-model": "workspace:*",
|
"@blocksuite/affine-model": "workspace:*",
|
||||||
"@blocksuite/affine-rich-text": "workspace:*",
|
"@blocksuite/affine-rich-text": "workspace:*",
|
||||||
"@blocksuite/affine-shared": "workspace:*",
|
"@blocksuite/affine-shared": "workspace:*",
|
||||||
@@ -104,6 +105,7 @@
|
|||||||
"./fragments/doc-title": "./src/fragments/doc-title.ts",
|
"./fragments/doc-title": "./src/fragments/doc-title.ts",
|
||||||
"./fragments/frame-panel": "./src/fragments/frame-panel.ts",
|
"./fragments/frame-panel": "./src/fragments/frame-panel.ts",
|
||||||
"./fragments/outline": "./src/fragments/outline.ts",
|
"./fragments/outline": "./src/fragments/outline.ts",
|
||||||
|
"./gfx/text": "./src/gfx/text.ts",
|
||||||
"./components/block-selection": "./src/components/block-selection.ts",
|
"./components/block-selection": "./src/components/block-selection.ts",
|
||||||
"./components/block-zero-width": "./src/components/block-zero-width.ts",
|
"./components/block-zero-width": "./src/components/block-zero-width.ts",
|
||||||
"./components/caption": "./src/components/caption.ts",
|
"./components/caption": "./src/components/caption.ts",
|
||||||
|
|||||||
1
blocksuite/affine/all/src/gfx/text.ts
Normal file
1
blocksuite/affine/all/src/gfx/text.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from '@blocksuite/affine-gfx-text';
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
"@blocksuite/affine-block-table": "workspace:*",
|
"@blocksuite/affine-block-table": "workspace:*",
|
||||||
"@blocksuite/affine-components": "workspace:*",
|
"@blocksuite/affine-components": "workspace:*",
|
||||||
"@blocksuite/affine-fragment-doc-title": "workspace:*",
|
"@blocksuite/affine-fragment-doc-title": "workspace:*",
|
||||||
|
"@blocksuite/affine-gfx-text": "workspace:*",
|
||||||
"@blocksuite/affine-model": "workspace:*",
|
"@blocksuite/affine-model": "workspace:*",
|
||||||
"@blocksuite/affine-rich-text": "workspace:*",
|
"@blocksuite/affine-rich-text": "workspace:*",
|
||||||
"@blocksuite/affine-shared": "workspace:*",
|
"@blocksuite/affine-shared": "workspace:*",
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
EdgelessCRUDIdentifier,
|
EdgelessCRUDIdentifier,
|
||||||
} from '@blocksuite/affine-block-surface';
|
} from '@blocksuite/affine-block-surface';
|
||||||
import { FontFamilyIcon } from '@blocksuite/affine-components/icons';
|
import { FontFamilyIcon } from '@blocksuite/affine-components/icons';
|
||||||
|
import { mountTextElementEditor } from '@blocksuite/affine-gfx-text';
|
||||||
import type {
|
import type {
|
||||||
Connection,
|
Connection,
|
||||||
ConnectorElementModel,
|
ConnectorElementModel,
|
||||||
@@ -56,10 +57,7 @@ import {
|
|||||||
SHAPE_OVERLAY_HEIGHT,
|
SHAPE_OVERLAY_HEIGHT,
|
||||||
SHAPE_OVERLAY_WIDTH,
|
SHAPE_OVERLAY_WIDTH,
|
||||||
} from '../../utils/consts.js';
|
} from '../../utils/consts.js';
|
||||||
import {
|
import { mountShapeTextEditor } from '../../utils/text.js';
|
||||||
mountShapeTextEditor,
|
|
||||||
mountTextElementEditor,
|
|
||||||
} from '../../utils/text.js';
|
|
||||||
import { ShapeComponentConfig } from '../toolbar/shape/shape-menu-config.js';
|
import { ShapeComponentConfig } from '../toolbar/shape/shape-menu-config.js';
|
||||||
import {
|
import {
|
||||||
type AUTO_COMPLETE_TARGET_TYPE,
|
type AUTO_COMPLETE_TARGET_TYPE,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { addAttachments } from '@blocksuite/affine-block-attachment';
|
|||||||
import { insertEdgelessTextCommand } from '@blocksuite/affine-block-edgeless-text';
|
import { insertEdgelessTextCommand } from '@blocksuite/affine-block-edgeless-text';
|
||||||
import { addImages } from '@blocksuite/affine-block-image';
|
import { addImages } from '@blocksuite/affine-block-image';
|
||||||
import { CanvasElementType } from '@blocksuite/affine-block-surface';
|
import { CanvasElementType } from '@blocksuite/affine-block-surface';
|
||||||
|
import { mountTextElementEditor } from '@blocksuite/affine-gfx-text';
|
||||||
import {
|
import {
|
||||||
MAX_IMAGE_WIDTH,
|
MAX_IMAGE_WIDTH,
|
||||||
type MindmapStyle,
|
type MindmapStyle,
|
||||||
@@ -18,7 +19,6 @@ import * as Y from 'yjs';
|
|||||||
|
|
||||||
import type { EdgelessRootBlockComponent } from '../../../edgeless-root-block.js';
|
import type { EdgelessRootBlockComponent } from '../../../edgeless-root-block.js';
|
||||||
import type { EdgelessRootService } from '../../../edgeless-root-service.js';
|
import type { EdgelessRootService } from '../../../edgeless-root-service.js';
|
||||||
import { mountTextElementEditor } from '../../../utils/text.js';
|
|
||||||
|
|
||||||
export type ConfigProperty = 'x' | 'y' | 'r' | 's' | 'z' | 'o';
|
export type ConfigProperty = 'x' | 'y' | 'r' | 's' | 'z' | 'o';
|
||||||
export type ConfigState = 'default' | 'active' | 'hover' | 'next';
|
export type ConfigState = 'default' | 'active' | 'hover' | 'next';
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
PresentTool,
|
PresentTool,
|
||||||
} from '@blocksuite/affine-block-frame';
|
} from '@blocksuite/affine-block-frame';
|
||||||
import { ConnectionOverlay } from '@blocksuite/affine-block-surface';
|
import { ConnectionOverlay } from '@blocksuite/affine-block-surface';
|
||||||
|
import { TextTool } from '@blocksuite/affine-gfx-text';
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
|
|
||||||
import { EdgelessRootBlockSpec } from './edgeless-root-spec.js';
|
import { EdgelessRootBlockSpec } from './edgeless-root-spec.js';
|
||||||
@@ -19,7 +20,6 @@ import { NoteTool } from './gfx-tool/note-tool.js';
|
|||||||
import { PanTool } from './gfx-tool/pan-tool.js';
|
import { PanTool } from './gfx-tool/pan-tool.js';
|
||||||
import { ShapeTool } from './gfx-tool/shape-tool.js';
|
import { ShapeTool } from './gfx-tool/shape-tool.js';
|
||||||
import { TemplateTool } from './gfx-tool/template-tool.js';
|
import { TemplateTool } from './gfx-tool/template-tool.js';
|
||||||
import { TextTool } from './gfx-tool/text-tool.js';
|
|
||||||
import { EditPropsMiddlewareBuilder } from './middlewares/base.js';
|
import { EditPropsMiddlewareBuilder } from './middlewares/base.js';
|
||||||
import { SnapManager } from './utils/snap-manager.js';
|
import { SnapManager } from './utils/snap-manager.js';
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
isNoteBlock,
|
isNoteBlock,
|
||||||
OverlayIdentifier,
|
OverlayIdentifier,
|
||||||
} from '@blocksuite/affine-block-surface';
|
} from '@blocksuite/affine-block-surface';
|
||||||
|
import { addText, mountTextElementEditor } from '@blocksuite/affine-gfx-text';
|
||||||
import type {
|
import type {
|
||||||
EdgelessTextBlockModel,
|
EdgelessTextBlockModel,
|
||||||
FrameBlockModel,
|
FrameBlockModel,
|
||||||
@@ -55,12 +56,10 @@ import { calPanDelta } from '../utils/panning-utils.js';
|
|||||||
import { isCanvasElement, isEdgelessTextBlock } from '../utils/query.js';
|
import { isCanvasElement, isEdgelessTextBlock } from '../utils/query.js';
|
||||||
import type { SnapManager } from '../utils/snap-manager.js';
|
import type { SnapManager } from '../utils/snap-manager.js';
|
||||||
import {
|
import {
|
||||||
addText,
|
|
||||||
mountConnectorLabelEditor,
|
mountConnectorLabelEditor,
|
||||||
mountFrameTitleEditor,
|
mountFrameTitleEditor,
|
||||||
mountGroupTitleEditor,
|
mountGroupTitleEditor,
|
||||||
mountShapeTextEditor,
|
mountShapeTextEditor,
|
||||||
mountTextElementEditor,
|
|
||||||
} from '../utils/text.js';
|
} from '../utils/text.js';
|
||||||
import { CanvasElementEventExt } from './default-tool-ext/event-ext.js';
|
import { CanvasElementEventExt } from './default-tool-ext/event-ext.js';
|
||||||
import type { DefaultToolExt } from './default-tool-ext/ext.js';
|
import type { DefaultToolExt } from './default-tool-ext/ext.js';
|
||||||
|
|||||||
@@ -9,4 +9,3 @@ export { NoteTool, type NoteToolOption } from './note-tool.js';
|
|||||||
export { PanTool, type PanToolOption } from './pan-tool.js';
|
export { PanTool, type PanToolOption } from './pan-tool.js';
|
||||||
export { ShapeTool, type ShapeToolOption } from './shape-tool.js';
|
export { ShapeTool, type ShapeToolOption } from './shape-tool.js';
|
||||||
export { TemplateTool } from './template-tool.js';
|
export { TemplateTool } from './template-tool.js';
|
||||||
export { TextTool } from './text-tool.js';
|
|
||||||
|
|||||||
@@ -1,16 +1,10 @@
|
|||||||
import {
|
import { EdgelessCRUDIdentifier } from '@blocksuite/affine-block-surface';
|
||||||
CanvasElementType,
|
|
||||||
EdgelessCRUDIdentifier,
|
|
||||||
type IModelCoord,
|
|
||||||
TextUtils,
|
|
||||||
} from '@blocksuite/affine-block-surface';
|
|
||||||
import type {
|
import type {
|
||||||
ConnectorElementModel,
|
ConnectorElementModel,
|
||||||
FrameBlockModel,
|
FrameBlockModel,
|
||||||
GroupElementModel,
|
GroupElementModel,
|
||||||
} from '@blocksuite/affine-model';
|
} from '@blocksuite/affine-model';
|
||||||
import { ShapeElementModel, TextElementModel } from '@blocksuite/affine-model';
|
import { ShapeElementModel } from '@blocksuite/affine-model';
|
||||||
import type { PointerEventState } from '@blocksuite/block-std';
|
|
||||||
import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions';
|
import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions';
|
||||||
import type { IVec } from '@blocksuite/global/gfx';
|
import type { IVec } from '@blocksuite/global/gfx';
|
||||||
import { Bound } from '@blocksuite/global/gfx';
|
import { Bound } from '@blocksuite/global/gfx';
|
||||||
@@ -20,47 +14,8 @@ import { EdgelessConnectorLabelEditor } from '../components/text/edgeless-connec
|
|||||||
import { EdgelessFrameTitleEditor } from '../components/text/edgeless-frame-title-editor.js';
|
import { EdgelessFrameTitleEditor } from '../components/text/edgeless-frame-title-editor.js';
|
||||||
import { EdgelessGroupTitleEditor } from '../components/text/edgeless-group-title-editor.js';
|
import { EdgelessGroupTitleEditor } from '../components/text/edgeless-group-title-editor.js';
|
||||||
import { EdgelessShapeTextEditor } from '../components/text/edgeless-shape-text-editor.js';
|
import { EdgelessShapeTextEditor } from '../components/text/edgeless-shape-text-editor.js';
|
||||||
import { EdgelessTextEditor } from '../components/text/edgeless-text-editor.js';
|
|
||||||
import type { EdgelessRootBlockComponent } from '../edgeless-root-block.js';
|
import type { EdgelessRootBlockComponent } from '../edgeless-root-block.js';
|
||||||
|
|
||||||
export function mountTextElementEditor(
|
|
||||||
textElement: TextElementModel,
|
|
||||||
edgeless: EdgelessRootBlockComponent,
|
|
||||||
focusCoord?: IModelCoord
|
|
||||||
) {
|
|
||||||
if (!edgeless.mountElm) {
|
|
||||||
throw new BlockSuiteError(
|
|
||||||
ErrorCode.ValueNotExists,
|
|
||||||
"edgeless block's mount point does not exist"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let cursorIndex = textElement.text.length;
|
|
||||||
if (focusCoord) {
|
|
||||||
cursorIndex = Math.min(
|
|
||||||
TextUtils.getCursorByCoord(textElement, focusCoord),
|
|
||||||
cursorIndex
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const textEditor = new EdgelessTextEditor();
|
|
||||||
textEditor.edgeless = edgeless;
|
|
||||||
textEditor.element = textElement;
|
|
||||||
|
|
||||||
edgeless.append(textEditor);
|
|
||||||
textEditor.updateComplete
|
|
||||||
.then(() => {
|
|
||||||
textEditor.inlineEditor?.focusIndex(cursorIndex);
|
|
||||||
})
|
|
||||||
.catch(console.error);
|
|
||||||
|
|
||||||
edgeless.gfx.tool.setTool('default');
|
|
||||||
edgeless.gfx.selection.set({
|
|
||||||
elements: [textElement.id],
|
|
||||||
editing: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mountShapeTextEditor(
|
export function mountShapeTextEditor(
|
||||||
shapeElement: ShapeElementModel,
|
shapeElement: ShapeElementModel,
|
||||||
edgeless: EdgelessRootBlockComponent
|
edgeless: EdgelessRootBlockComponent
|
||||||
@@ -145,39 +100,6 @@ export function mountGroupTitleEditor(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*
|
|
||||||
* Canvas Text has been deprecated
|
|
||||||
*/
|
|
||||||
export function addText(
|
|
||||||
edgeless: EdgelessRootBlockComponent,
|
|
||||||
event: PointerEventState
|
|
||||||
) {
|
|
||||||
const [x, y] = edgeless.service.viewport.toModelCoord(event.x, event.y);
|
|
||||||
const selected = edgeless.service.gfx.getElementByPoint(x, y);
|
|
||||||
|
|
||||||
if (!selected) {
|
|
||||||
const [modelX, modelY] = edgeless.service.viewport.toModelCoord(
|
|
||||||
event.x,
|
|
||||||
event.y
|
|
||||||
);
|
|
||||||
const id = edgeless.std
|
|
||||||
.get(EdgelessCRUDIdentifier)
|
|
||||||
.addElement(CanvasElementType.TEXT, {
|
|
||||||
xywh: new Bound(modelX, modelY, 32, 32).serialize(),
|
|
||||||
text: new Y.Text(),
|
|
||||||
});
|
|
||||||
if (!id) return;
|
|
||||||
edgeless.doc.captureSync();
|
|
||||||
const textElement = edgeless.service.crud.getElementById(id);
|
|
||||||
if (!textElement) return;
|
|
||||||
if (textElement instanceof TextElementModel) {
|
|
||||||
mountTextElementEditor(textElement, edgeless);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mountConnectorLabelEditor(
|
export function mountConnectorLabelEditor(
|
||||||
connector: ConnectorElementModel,
|
connector: ConnectorElementModel,
|
||||||
edgeless: EdgelessRootBlockComponent,
|
edgeless: EdgelessRootBlockComponent,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { effects as gfxCanvasTextEffects } from '@blocksuite/affine-gfx-text/effects';
|
||||||
|
|
||||||
import { EdgelessAutoCompletePanel } from './edgeless/components/auto-complete/auto-complete-panel.js';
|
import { EdgelessAutoCompletePanel } from './edgeless/components/auto-complete/auto-complete-panel.js';
|
||||||
import { EdgelessAutoComplete } from './edgeless/components/auto-complete/edgeless-auto-complete.js';
|
import { EdgelessAutoComplete } from './edgeless/components/auto-complete/edgeless-auto-complete.js';
|
||||||
import { EdgelessToolIconButton } from './edgeless/components/buttons/tool-icon-button.js';
|
import { EdgelessToolIconButton } from './edgeless/components/buttons/tool-icon-button.js';
|
||||||
@@ -36,7 +38,6 @@ import { EdgelessConnectorLabelEditor } from './edgeless/components/text/edgeles
|
|||||||
import { EdgelessFrameTitleEditor } from './edgeless/components/text/edgeless-frame-title-editor.js';
|
import { EdgelessFrameTitleEditor } from './edgeless/components/text/edgeless-frame-title-editor.js';
|
||||||
import { EdgelessGroupTitleEditor } from './edgeless/components/text/edgeless-group-title-editor.js';
|
import { EdgelessGroupTitleEditor } from './edgeless/components/text/edgeless-group-title-editor.js';
|
||||||
import { EdgelessShapeTextEditor } from './edgeless/components/text/edgeless-shape-text-editor.js';
|
import { EdgelessShapeTextEditor } from './edgeless/components/text/edgeless-shape-text-editor.js';
|
||||||
import { EdgelessTextEditor } from './edgeless/components/text/edgeless-text-editor.js';
|
|
||||||
import { EdgelessBrushMenu } from './edgeless/components/toolbar/brush/brush-menu.js';
|
import { EdgelessBrushMenu } from './edgeless/components/toolbar/brush/brush-menu.js';
|
||||||
import { EdgelessBrushToolButton } from './edgeless/components/toolbar/brush/brush-tool-button.js';
|
import { EdgelessBrushToolButton } from './edgeless/components/toolbar/brush/brush-tool-button.js';
|
||||||
import { EdgelessSlideMenu } from './edgeless/components/toolbar/common/slide-menu.js';
|
import { EdgelessSlideMenu } from './edgeless/components/toolbar/common/slide-menu.js';
|
||||||
@@ -122,6 +123,7 @@ export function effects() {
|
|||||||
|
|
||||||
// Register components by category
|
// Register components by category
|
||||||
registerRootComponents();
|
registerRootComponents();
|
||||||
|
registerGfxEffects();
|
||||||
registerWidgets();
|
registerWidgets();
|
||||||
registerEdgelessToolbarComponents();
|
registerEdgelessToolbarComponents();
|
||||||
registerEdgelessPanelComponents();
|
registerEdgelessPanelComponents();
|
||||||
@@ -139,6 +141,10 @@ function registerRootComponents() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function registerGfxEffects() {
|
||||||
|
gfxCanvasTextEffects();
|
||||||
|
}
|
||||||
|
|
||||||
function registerWidgets() {
|
function registerWidgets() {
|
||||||
customElements.define(AFFINE_INNER_MODAL_WIDGET, AffineInnerModalWidget);
|
customElements.define(AFFINE_INNER_MODAL_WIDGET, AffineInnerModalWidget);
|
||||||
customElements.define(AFFINE_MODAL_WIDGET, AffineModalWidget);
|
customElements.define(AFFINE_MODAL_WIDGET, AffineModalWidget);
|
||||||
@@ -258,7 +264,6 @@ function registerEdgelessEditorComponents() {
|
|||||||
'edgeless-frame-title-editor',
|
'edgeless-frame-title-editor',
|
||||||
EdgelessFrameTitleEditor
|
EdgelessFrameTitleEditor
|
||||||
);
|
);
|
||||||
customElements.define('edgeless-text-editor', EdgelessTextEditor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function registerMiscComponents() {
|
function registerMiscComponents() {
|
||||||
@@ -348,7 +353,6 @@ declare global {
|
|||||||
'edgeless-frame-title-editor': EdgelessFrameTitleEditor;
|
'edgeless-frame-title-editor': EdgelessFrameTitleEditor;
|
||||||
'edgeless-group-title-editor': EdgelessGroupTitleEditor;
|
'edgeless-group-title-editor': EdgelessGroupTitleEditor;
|
||||||
'edgeless-shape-text-editor': EdgelessShapeTextEditor;
|
'edgeless-shape-text-editor': EdgelessShapeTextEditor;
|
||||||
'edgeless-text-editor': EdgelessTextEditor;
|
|
||||||
'edgeless-toolbar-widget': EdgelessToolbarWidget;
|
'edgeless-toolbar-widget': EdgelessToolbarWidget;
|
||||||
'presentation-toolbar': PresentationToolbar;
|
'presentation-toolbar': PresentationToolbar;
|
||||||
'edgeless-brush-menu': EdgelessBrushMenu;
|
'edgeless-brush-menu': EdgelessBrushMenu;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
{ "path": "../block-table" },
|
{ "path": "../block-table" },
|
||||||
{ "path": "../../components" },
|
{ "path": "../../components" },
|
||||||
{ "path": "../../fragments/fragment-doc-title" },
|
{ "path": "../../fragments/fragment-doc-title" },
|
||||||
|
{ "path": "../../gfx/text" },
|
||||||
{ "path": "../../model" },
|
{ "path": "../../model" },
|
||||||
{ "path": "../../rich-text" },
|
{ "path": "../../rich-text" },
|
||||||
{ "path": "../../shared" },
|
{ "path": "../../shared" },
|
||||||
|
|||||||
48
blocksuite/affine/gfx/text/package.json
Normal file
48
blocksuite/affine/gfx/text/package.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "@blocksuite/affine-gfx-text",
|
||||||
|
"description": "Gfx text for BlockSuite.",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"test:unit": "nx vite:test --run --passWithNoTests",
|
||||||
|
"test:unit:coverage": "nx vite:test --run --coverage",
|
||||||
|
"test:e2e": "playwright test"
|
||||||
|
},
|
||||||
|
"sideEffects": false,
|
||||||
|
"keywords": [],
|
||||||
|
"author": "toeverything",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@blocksuite/affine-block-edgeless-text": "workspace:*",
|
||||||
|
"@blocksuite/affine-block-surface": "workspace:*",
|
||||||
|
"@blocksuite/affine-components": "workspace:*",
|
||||||
|
"@blocksuite/affine-model": "workspace:*",
|
||||||
|
"@blocksuite/affine-rich-text": "workspace:*",
|
||||||
|
"@blocksuite/affine-shared": "workspace:*",
|
||||||
|
"@blocksuite/block-std": "workspace:*",
|
||||||
|
"@blocksuite/global": "workspace:*",
|
||||||
|
"@blocksuite/icons": "^2.2.1",
|
||||||
|
"@blocksuite/inline": "workspace:*",
|
||||||
|
"@blocksuite/store": "workspace:*",
|
||||||
|
"@lit/context": "^1.1.2",
|
||||||
|
"@preact/signals-core": "^1.8.0",
|
||||||
|
"@toeverything/theme": "^1.1.12",
|
||||||
|
"@types/lodash-es": "^4.17.12",
|
||||||
|
"lit": "^3.2.0",
|
||||||
|
"lodash-es": "^4.17.21",
|
||||||
|
"minimatch": "^10.0.1",
|
||||||
|
"yjs": "^13.6.21",
|
||||||
|
"zod": "^3.23.8"
|
||||||
|
},
|
||||||
|
"exports": {
|
||||||
|
".": "./src/index.ts",
|
||||||
|
"./effects": "./src/effects.ts"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"dist",
|
||||||
|
"!src/__tests__",
|
||||||
|
"!dist/__tests__"
|
||||||
|
],
|
||||||
|
"version": "0.20.0"
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
EdgelessCRUDIdentifier,
|
EdgelessCRUDIdentifier,
|
||||||
|
getSurfaceBlock,
|
||||||
TextUtils,
|
TextUtils,
|
||||||
} from '@blocksuite/affine-block-surface';
|
} from '@blocksuite/affine-block-surface';
|
||||||
import type { TextElementModel } from '@blocksuite/affine-model';
|
import type { TextElementModel } from '@blocksuite/affine-model';
|
||||||
@@ -7,21 +8,26 @@ import type { RichText } from '@blocksuite/affine-rich-text';
|
|||||||
import { ThemeProvider } from '@blocksuite/affine-shared/services';
|
import { ThemeProvider } from '@blocksuite/affine-shared/services';
|
||||||
import { getSelectedRect } from '@blocksuite/affine-shared/utils';
|
import { getSelectedRect } from '@blocksuite/affine-shared/utils';
|
||||||
import {
|
import {
|
||||||
|
type BlockStdScope,
|
||||||
RANGE_SYNC_EXCLUDE_ATTR,
|
RANGE_SYNC_EXCLUDE_ATTR,
|
||||||
ShadowlessElement,
|
ShadowlessElement,
|
||||||
|
stdContext,
|
||||||
} from '@blocksuite/block-std';
|
} from '@blocksuite/block-std';
|
||||||
|
import { GfxControllerIdentifier } from '@blocksuite/block-std/gfx';
|
||||||
import { Bound, toRadian, Vec } from '@blocksuite/global/gfx';
|
import { Bound, toRadian, Vec } from '@blocksuite/global/gfx';
|
||||||
import { WithDisposable } from '@blocksuite/global/lit';
|
import { WithDisposable } from '@blocksuite/global/lit';
|
||||||
|
import { consume } from '@lit/context';
|
||||||
import { css, html, nothing } from 'lit';
|
import { css, html, nothing } from 'lit';
|
||||||
import { property, query } from 'lit/decorators.js';
|
import { property, query } from 'lit/decorators.js';
|
||||||
import { styleMap } from 'lit/directives/style-map.js';
|
import { styleMap } from 'lit/directives/style-map.js';
|
||||||
|
|
||||||
import type { EdgelessRootBlockComponent } from '../../edgeless-root-block.js';
|
|
||||||
import { deleteElements } from '../../utils/crud.js';
|
|
||||||
|
|
||||||
export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
||||||
get crud() {
|
get crud() {
|
||||||
return this.edgeless.std.get(EdgelessCRUDIdentifier);
|
return this.std.get(EdgelessCRUDIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
get gfx() {
|
||||||
|
return this.std.get(GfxControllerIdentifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BORDER_WIDTH = 1;
|
static BORDER_WIDTH = 1;
|
||||||
@@ -71,10 +77,9 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
private _keeping = false;
|
private _keeping = false;
|
||||||
|
|
||||||
private readonly _updateRect = () => {
|
private readonly _updateRect = () => {
|
||||||
const edgeless = this.edgeless;
|
|
||||||
const element = this.element;
|
const element = this.element;
|
||||||
|
|
||||||
if (!edgeless || !element || !this.inlineEditorContainer) return;
|
if (!element || !this.inlineEditorContainer) return;
|
||||||
|
|
||||||
const newWidth = this.inlineEditorContainer.scrollWidth;
|
const newWidth = this.inlineEditorContainer.scrollWidth;
|
||||||
const newHeight = this.inlineEditorContainer.scrollHeight;
|
const newHeight = this.inlineEditorContainer.scrollHeight;
|
||||||
@@ -153,10 +158,6 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
|
|
||||||
override connectedCallback(): void {
|
override connectedCallback(): void {
|
||||||
super.connectedCallback();
|
super.connectedCallback();
|
||||||
if (!this.edgeless) {
|
|
||||||
console.error('edgeless is not set.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!this.element) {
|
if (!this.element) {
|
||||||
console.error('text element is not set.');
|
console.error('text element is not set.');
|
||||||
return;
|
return;
|
||||||
@@ -166,9 +167,13 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override firstUpdated(): void {
|
override firstUpdated(): void {
|
||||||
const edgeless = this.edgeless;
|
|
||||||
const element = this.element;
|
const element = this.element;
|
||||||
const { dispatcher } = this.edgeless;
|
const dispatcher = this.std.event;
|
||||||
|
const surface = getSurfaceBlock(this.std.store);
|
||||||
|
if (!surface) {
|
||||||
|
console.error('surface block is not found.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.updateComplete
|
this.updateComplete
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -179,13 +184,13 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.disposables.add(
|
this.disposables.add(
|
||||||
edgeless.service.surface.elementUpdated.on(({ id }) => {
|
surface.elementUpdated.on(({ id }) => {
|
||||||
if (id === element.id) this.requestUpdate();
|
if (id === element.id) this.requestUpdate();
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
this.disposables.add(
|
this.disposables.add(
|
||||||
edgeless.service.viewport.viewportUpdated.on(() => {
|
this.gfx.viewport.viewportUpdated.on(() => {
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -197,10 +202,10 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
element.display = true;
|
element.display = true;
|
||||||
|
|
||||||
if (element.text.length === 0) {
|
if (element.text.length === 0) {
|
||||||
deleteElements(edgeless, [element]);
|
this.crud.deleteElements([element]);
|
||||||
}
|
}
|
||||||
|
|
||||||
edgeless.service.selection.set({
|
this.gfx.selection.set({
|
||||||
elements: [],
|
elements: [],
|
||||||
editing: false,
|
editing: false,
|
||||||
});
|
});
|
||||||
@@ -346,7 +351,7 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
);
|
);
|
||||||
const rect = getSelectedRect([this.element]);
|
const rect = getSelectedRect([this.element]);
|
||||||
|
|
||||||
const { translateX, translateY, zoom } = this.edgeless.service.viewport;
|
const { translateX, translateY, zoom } = this.gfx.viewport;
|
||||||
const [visualX, visualY] = this.getVisualPosition(this.element);
|
const [visualX, visualY] = this.getVisualPosition(this.element);
|
||||||
const containerOffset = this.getContainerOffset();
|
const containerOffset = this.getContainerOffset();
|
||||||
const transformOperation = [
|
const transformOperation = [
|
||||||
@@ -358,7 +363,7 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
const isEmpty = !text.length && !this._isComposition;
|
const isEmpty = !text.length && !this._isComposition;
|
||||||
const color = this.edgeless.std
|
const color = this.std
|
||||||
.get(ThemeProvider)
|
.get(ThemeProvider)
|
||||||
.generateColorProperty(this.element.color, '#000000');
|
.generateColorProperty(this.element.color, '#000000');
|
||||||
|
|
||||||
@@ -404,8 +409,8 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
|
|||||||
this._keeping = keeping;
|
this._keeping = keeping;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property({ attribute: false })
|
@consume({ context: stdContext })
|
||||||
accessor edgeless!: EdgelessRootBlockComponent;
|
accessor std!: BlockStdScope;
|
||||||
|
|
||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
accessor element!: TextElementModel;
|
accessor element!: TextElementModel;
|
||||||
11
blocksuite/affine/gfx/text/src/effects.ts
Normal file
11
blocksuite/affine/gfx/text/src/effects.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { EdgelessTextEditor } from './edgeless-text-editor';
|
||||||
|
|
||||||
|
export function effects() {
|
||||||
|
customElements.define('edgeless-text-editor', EdgelessTextEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
'edgeless-text-editor': EdgelessTextEditor;
|
||||||
|
}
|
||||||
|
}
|
||||||
3
blocksuite/affine/gfx/text/src/index.ts
Normal file
3
blocksuite/affine/gfx/text/src/index.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './edgeless-text-editor';
|
||||||
|
export * from './mount-text-editor';
|
||||||
|
export * from './tool';
|
||||||
77
blocksuite/affine/gfx/text/src/mount-text-editor.ts
Normal file
77
blocksuite/affine/gfx/text/src/mount-text-editor.ts
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
import {
|
||||||
|
CanvasElementType,
|
||||||
|
EdgelessCRUDIdentifier,
|
||||||
|
type IModelCoord,
|
||||||
|
TextUtils,
|
||||||
|
} from '@blocksuite/affine-block-surface';
|
||||||
|
import { TextElementModel } from '@blocksuite/affine-model';
|
||||||
|
import type { BlockComponent, PointerEventState } from '@blocksuite/block-std';
|
||||||
|
import { GfxControllerIdentifier } from '@blocksuite/block-std/gfx';
|
||||||
|
import { Bound } from '@blocksuite/global/gfx';
|
||||||
|
import * as Y from 'yjs';
|
||||||
|
|
||||||
|
import { EdgelessTextEditor } from './edgeless-text-editor';
|
||||||
|
|
||||||
|
export function mountTextElementEditor(
|
||||||
|
textElement: TextElementModel,
|
||||||
|
edgeless: BlockComponent,
|
||||||
|
focusCoord?: IModelCoord
|
||||||
|
) {
|
||||||
|
let cursorIndex = textElement.text.length;
|
||||||
|
if (focusCoord) {
|
||||||
|
cursorIndex = Math.min(
|
||||||
|
TextUtils.getCursorByCoord(textElement, focusCoord),
|
||||||
|
cursorIndex
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const textEditor = new EdgelessTextEditor();
|
||||||
|
textEditor.element = textElement;
|
||||||
|
|
||||||
|
edgeless.append(textEditor);
|
||||||
|
textEditor.updateComplete
|
||||||
|
.then(() => {
|
||||||
|
textEditor.inlineEditor?.focusIndex(cursorIndex);
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
|
||||||
|
const gfx = edgeless.std.get(GfxControllerIdentifier);
|
||||||
|
|
||||||
|
// @ts-expect-error TODO: refactor gfx tool
|
||||||
|
gfx.tool.setTool('default');
|
||||||
|
gfx.selection.set({
|
||||||
|
elements: [textElement.id],
|
||||||
|
editing: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*
|
||||||
|
* Canvas Text has been deprecated
|
||||||
|
*/
|
||||||
|
export function addText(edgeless: BlockComponent, event: PointerEventState) {
|
||||||
|
const gfx = edgeless.std.get(GfxControllerIdentifier);
|
||||||
|
const crud = edgeless.std.get(EdgelessCRUDIdentifier);
|
||||||
|
const [x, y] = gfx.viewport.toModelCoord(event.x, event.y);
|
||||||
|
const selected = gfx.getElementByPoint(x, y);
|
||||||
|
|
||||||
|
if (!selected) {
|
||||||
|
const [modelX, modelY] = gfx.viewport.toModelCoord(event.x, event.y);
|
||||||
|
|
||||||
|
const id = edgeless.std
|
||||||
|
.get(EdgelessCRUDIdentifier)
|
||||||
|
.addElement(CanvasElementType.TEXT, {
|
||||||
|
xywh: new Bound(modelX, modelY, 32, 32).serialize(),
|
||||||
|
text: new Y.Text(),
|
||||||
|
});
|
||||||
|
if (!id) return;
|
||||||
|
|
||||||
|
edgeless.doc.captureSync();
|
||||||
|
const textElement = crud.getElementById(id);
|
||||||
|
if (!textElement) return;
|
||||||
|
if (textElement instanceof TextElementModel) {
|
||||||
|
mountTextElementEditor(textElement, edgeless);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,10 +9,9 @@ import { BaseTool, type GfxController } from '@blocksuite/block-std/gfx';
|
|||||||
import { Bound } from '@blocksuite/global/gfx';
|
import { Bound } from '@blocksuite/global/gfx';
|
||||||
import * as Y from 'yjs';
|
import * as Y from 'yjs';
|
||||||
|
|
||||||
import type { EdgelessRootBlockComponent } from '../edgeless-root-block.js';
|
import { mountTextElementEditor } from './mount-text-editor';
|
||||||
import { mountTextElementEditor } from '../utils/text.js';
|
|
||||||
|
|
||||||
export function addText(gfx: GfxController, event: PointerEventState) {
|
function addText(gfx: GfxController, event: PointerEventState) {
|
||||||
const [x, y] = gfx.viewport.toModelCoord(event.x, event.y);
|
const [x, y] = gfx.viewport.toModelCoord(event.x, event.y);
|
||||||
const selected = gfx.getElementByPoint(x, y);
|
const selected = gfx.getElementByPoint(x, y);
|
||||||
|
|
||||||
@@ -31,10 +30,11 @@ export function addText(gfx: GfxController, event: PointerEventState) {
|
|||||||
gfx.doc.captureSync();
|
gfx.doc.captureSync();
|
||||||
const textElement = gfx.getElementById(id) as TextElementModel;
|
const textElement = gfx.getElementById(id) as TextElementModel;
|
||||||
const edgelessView = gfx.std.view.getBlock(gfx.std.store.root!.id);
|
const edgelessView = gfx.std.view.getBlock(gfx.std.store.root!.id);
|
||||||
mountTextElementEditor(
|
if (!edgelessView) {
|
||||||
textElement,
|
console.error('edgeless view is not found.');
|
||||||
edgelessView as EdgelessRootBlockComponent
|
return;
|
||||||
);
|
}
|
||||||
|
mountTextElementEditor(textElement, edgelessView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +49,7 @@ export class TextTool extends BaseTool {
|
|||||||
if (textFlag) {
|
if (textFlag) {
|
||||||
const [x, y] = this.gfx.viewport.toModelCoord(e.x, e.y);
|
const [x, y] = this.gfx.viewport.toModelCoord(e.x, e.y);
|
||||||
this.gfx.std.command.exec(insertEdgelessTextCommand, { x, y });
|
this.gfx.std.command.exec(insertEdgelessTextCommand, { x, y });
|
||||||
|
// @ts-expect-error TODO: refactor gfx tool
|
||||||
this.gfx.tool.setTool('default');
|
this.gfx.tool.setTool('default');
|
||||||
} else {
|
} else {
|
||||||
addText(this.gfx, e);
|
addText(this.gfx, e);
|
||||||
21
blocksuite/affine/gfx/text/tsconfig.json
Normal file
21
blocksuite/affine/gfx/text/tsconfig.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"rootDir": "./src",
|
||||||
|
"outDir": "./dist",
|
||||||
|
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
|
||||||
|
},
|
||||||
|
"include": ["./src"],
|
||||||
|
"references": [
|
||||||
|
{ "path": "../../blocks/block-edgeless-text" },
|
||||||
|
{ "path": "../../blocks/block-surface" },
|
||||||
|
{ "path": "../../components" },
|
||||||
|
{ "path": "../../model" },
|
||||||
|
{ "path": "../../rich-text" },
|
||||||
|
{ "path": "../../shared" },
|
||||||
|
{ "path": "../../../framework/block-std" },
|
||||||
|
{ "path": "../../../framework/global" },
|
||||||
|
{ "path": "../../../framework/inline" },
|
||||||
|
{ "path": "../../../framework/store" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -297,6 +297,7 @@ export const PackageList = [
|
|||||||
'blocksuite/affine/blocks/block-table',
|
'blocksuite/affine/blocks/block-table',
|
||||||
'blocksuite/affine/components',
|
'blocksuite/affine/components',
|
||||||
'blocksuite/affine/fragments/fragment-doc-title',
|
'blocksuite/affine/fragments/fragment-doc-title',
|
||||||
|
'blocksuite/affine/gfx/text',
|
||||||
'blocksuite/affine/model',
|
'blocksuite/affine/model',
|
||||||
'blocksuite/affine/rich-text',
|
'blocksuite/affine/rich-text',
|
||||||
'blocksuite/affine/shared',
|
'blocksuite/affine/shared',
|
||||||
@@ -429,6 +430,22 @@ export const PackageList = [
|
|||||||
'blocksuite/framework/store',
|
'blocksuite/framework/store',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
location: 'blocksuite/affine/gfx/text',
|
||||||
|
name: '@blocksuite/affine-gfx-text',
|
||||||
|
workspaceDependencies: [
|
||||||
|
'blocksuite/affine/blocks/block-edgeless-text',
|
||||||
|
'blocksuite/affine/blocks/block-surface',
|
||||||
|
'blocksuite/affine/components',
|
||||||
|
'blocksuite/affine/model',
|
||||||
|
'blocksuite/affine/rich-text',
|
||||||
|
'blocksuite/affine/shared',
|
||||||
|
'blocksuite/framework/block-std',
|
||||||
|
'blocksuite/framework/global',
|
||||||
|
'blocksuite/framework/inline',
|
||||||
|
'blocksuite/framework/store',
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
location: 'blocksuite/affine/model',
|
location: 'blocksuite/affine/model',
|
||||||
name: '@blocksuite/affine-model',
|
name: '@blocksuite/affine-model',
|
||||||
@@ -923,6 +940,7 @@ export type PackageName =
|
|||||||
| '@blocksuite/affine-fragment-doc-title'
|
| '@blocksuite/affine-fragment-doc-title'
|
||||||
| '@blocksuite/affine-fragment-frame-panel'
|
| '@blocksuite/affine-fragment-frame-panel'
|
||||||
| '@blocksuite/affine-fragment-outline'
|
| '@blocksuite/affine-fragment-outline'
|
||||||
|
| '@blocksuite/affine-gfx-text'
|
||||||
| '@blocksuite/affine-model'
|
| '@blocksuite/affine-model'
|
||||||
| '@blocksuite/affine-rich-text'
|
| '@blocksuite/affine-rich-text'
|
||||||
| '@blocksuite/affine-shared'
|
| '@blocksuite/affine-shared'
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
{ "path": "./blocksuite/affine/fragments/fragment-doc-title" },
|
{ "path": "./blocksuite/affine/fragments/fragment-doc-title" },
|
||||||
{ "path": "./blocksuite/affine/fragments/fragment-frame-panel" },
|
{ "path": "./blocksuite/affine/fragments/fragment-frame-panel" },
|
||||||
{ "path": "./blocksuite/affine/fragments/fragment-outline" },
|
{ "path": "./blocksuite/affine/fragments/fragment-outline" },
|
||||||
|
{ "path": "./blocksuite/affine/gfx/text" },
|
||||||
{ "path": "./blocksuite/affine/model" },
|
{ "path": "./blocksuite/affine/model" },
|
||||||
{ "path": "./blocksuite/affine/rich-text" },
|
{ "path": "./blocksuite/affine/rich-text" },
|
||||||
{ "path": "./blocksuite/affine/shared" },
|
{ "path": "./blocksuite/affine/shared" },
|
||||||
|
|||||||
29
yarn.lock
29
yarn.lock
@@ -2617,6 +2617,7 @@ __metadata:
|
|||||||
"@blocksuite/affine-block-table": "workspace:*"
|
"@blocksuite/affine-block-table": "workspace:*"
|
||||||
"@blocksuite/affine-components": "workspace:*"
|
"@blocksuite/affine-components": "workspace:*"
|
||||||
"@blocksuite/affine-fragment-doc-title": "workspace:*"
|
"@blocksuite/affine-fragment-doc-title": "workspace:*"
|
||||||
|
"@blocksuite/affine-gfx-text": "workspace:*"
|
||||||
"@blocksuite/affine-model": "workspace:*"
|
"@blocksuite/affine-model": "workspace:*"
|
||||||
"@blocksuite/affine-rich-text": "workspace:*"
|
"@blocksuite/affine-rich-text": "workspace:*"
|
||||||
"@blocksuite/affine-shared": "workspace:*"
|
"@blocksuite/affine-shared": "workspace:*"
|
||||||
@@ -2841,6 +2842,33 @@ __metadata:
|
|||||||
languageName: unknown
|
languageName: unknown
|
||||||
linkType: soft
|
linkType: soft
|
||||||
|
|
||||||
|
"@blocksuite/affine-gfx-text@workspace:*, @blocksuite/affine-gfx-text@workspace:blocksuite/affine/gfx/text":
|
||||||
|
version: 0.0.0-use.local
|
||||||
|
resolution: "@blocksuite/affine-gfx-text@workspace:blocksuite/affine/gfx/text"
|
||||||
|
dependencies:
|
||||||
|
"@blocksuite/affine-block-edgeless-text": "workspace:*"
|
||||||
|
"@blocksuite/affine-block-surface": "workspace:*"
|
||||||
|
"@blocksuite/affine-components": "workspace:*"
|
||||||
|
"@blocksuite/affine-model": "workspace:*"
|
||||||
|
"@blocksuite/affine-rich-text": "workspace:*"
|
||||||
|
"@blocksuite/affine-shared": "workspace:*"
|
||||||
|
"@blocksuite/block-std": "workspace:*"
|
||||||
|
"@blocksuite/global": "workspace:*"
|
||||||
|
"@blocksuite/icons": "npm:^2.2.1"
|
||||||
|
"@blocksuite/inline": "workspace:*"
|
||||||
|
"@blocksuite/store": "workspace:*"
|
||||||
|
"@lit/context": "npm:^1.1.2"
|
||||||
|
"@preact/signals-core": "npm:^1.8.0"
|
||||||
|
"@toeverything/theme": "npm:^1.1.12"
|
||||||
|
"@types/lodash-es": "npm:^4.17.12"
|
||||||
|
lit: "npm:^3.2.0"
|
||||||
|
lodash-es: "npm:^4.17.21"
|
||||||
|
minimatch: "npm:^10.0.1"
|
||||||
|
yjs: "npm:^13.6.21"
|
||||||
|
zod: "npm:^3.23.8"
|
||||||
|
languageName: unknown
|
||||||
|
linkType: soft
|
||||||
|
|
||||||
"@blocksuite/affine-model@workspace:*, @blocksuite/affine-model@workspace:blocksuite/affine/model":
|
"@blocksuite/affine-model@workspace:*, @blocksuite/affine-model@workspace:blocksuite/affine/model":
|
||||||
version: 0.0.0-use.local
|
version: 0.0.0-use.local
|
||||||
resolution: "@blocksuite/affine-model@workspace:blocksuite/affine/model"
|
resolution: "@blocksuite/affine-model@workspace:blocksuite/affine/model"
|
||||||
@@ -3108,6 +3136,7 @@ __metadata:
|
|||||||
"@blocksuite/affine-fragment-doc-title": "workspace:*"
|
"@blocksuite/affine-fragment-doc-title": "workspace:*"
|
||||||
"@blocksuite/affine-fragment-frame-panel": "workspace:*"
|
"@blocksuite/affine-fragment-frame-panel": "workspace:*"
|
||||||
"@blocksuite/affine-fragment-outline": "workspace:*"
|
"@blocksuite/affine-fragment-outline": "workspace:*"
|
||||||
|
"@blocksuite/affine-gfx-text": "workspace:*"
|
||||||
"@blocksuite/affine-model": "workspace:*"
|
"@blocksuite/affine-model": "workspace:*"
|
||||||
"@blocksuite/affine-rich-text": "workspace:*"
|
"@blocksuite/affine-rich-text": "workspace:*"
|
||||||
"@blocksuite/affine-shared": "workspace:*"
|
"@blocksuite/affine-shared": "workspace:*"
|
||||||
|
|||||||
Reference in New Issue
Block a user