🧩 Content editing tech stack for the web - BlockSuite is a toolkit for building editors and collaborative applications.
This report summarizes scanner evidence for toeverything/blocksuite, a TypeScript project with 6,080 GitHub stars. SynthScan examined 286,480 lines of code across 2928 source files, recording 198 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 1.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 169 finding(s).
Are imports declared and package/API names verified? 29 finding(s).
Are wrappers, guards, and repeated structures necessary? 110 finding(s).
Which changes need focused human review? 198 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 198 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …kages/playground/apps/_common/components/docs-panel.ts | 111 | this.editor.doc.workspace.slots.docListUpdated.subscribe(() => { | CODE |
| CRITICAL | …ages/framework/std/src/view/element/block-component.ts | 219 | const disposable = this.std.store.slots.blockUpdated.subscribe( | CODE |
| CRITICAL | …/affine/blocks/bookmark/src/bookmark-edgeless-block.ts | 35 | this.gfx.selection.slots.updated.subscribe(() => { | CODE |
| CRITICAL | …c/src/embed-linked-doc-block/embed-linked-doc-block.ts | 525 | this.store.workspace.slots.docListUpdated.subscribe(() => { | CODE |
| CRITICAL | …c/src/embed-synced-doc-block/embed-synced-doc-block.ts | 522 | this.store.workspace.slots.docListUpdated.subscribe(() => { | CODE |
| CRITICAL | …oc/src/embed-synced-doc-block/init-height-extension.ts | 15 | this.std.store.slots.blockUpdated.subscribe(payload => { | CODE |
| CRITICAL | …affine/blocks/root/src/edgeless/edgeless-root-block.ts | 160 | this.gfx.layer.slots.layerUpdated.subscribe(() => updateLayers()) | CODE |
| CRITICAL | …blocks/root/src/preview/edgeless-root-preview-block.ts | 119 | this._gfx.layer.slots.layerUpdated.subscribe(() => updateLayers()) | CODE |
| CRITICAL | packages/affine/fragments/outline/src/outline-viewer.ts | 205 | this.editor.store.workspace.meta.docMetaUpdated.subscribe(() => { | CODE |
| CRITICAL | …s/affine/fragments/outline/src/card/outline-preview.ts | 55 | const refMeta = block.store.workspace.meta.docMetas.find( | CODE |
| CRITICAL | …affine/shared/src/services/doc-display-meta-service.ts | 171 | const disposable = this.std.workspace.slots.docListUpdated.subscribe( | CODE |
| CRITICAL | …s/affine/inlines/comment/src/inline-comment-manager.ts | 54 | this.std.selection.slots.changed.subscribe(this._handleSelectionChanged) | CODE |
| CRITICAL | packages/affine/gfx/note/src/toolbar/note-menu.ts | 69 | const [_, { insertedLinkType }] = this.edgeless.service.std.command.exec( | CODE |
| CRITICAL | packages/affine/gfx/mindmap/src/view/view.ts | 150 | this.gfx.selection.slots.updated.subscribe(() => { | CODE |
| CRITICAL | …dgets/remote-selection/src/doc/doc-remote-selection.ts | 280 | this.std.store.slots.blockUpdated.subscribe(() => { | CODE |
| CRITICAL | packages/affine/widgets/toolbar/src/toolbar.ts | 409 | context.gfx.selection.slots.updated.subscribe(selections => { | CODE |
| CRITICAL | …ffine/widgets/scroll-anchoring/src/scroll-anchoring.ts | 102 | this.std.store.slots.blockUpdated.subscribe(v => { | CODE |
| CRITICAL | …ffine/widgets/scroll-anchoring/src/scroll-anchoring.ts | 157 | const subscription = this.std.store.slots.blockUpdated.subscribe(v => { | CODE |
| CRITICAL | …s/edgeless-selected-rect/src/edgeless-auto-complete.ts | 688 | this.gfx.selection.slots.updated.subscribe(() => { | CODE |
| CRITICAL | …es/affine/widgets/linked-doc/src/linked-doc-popover.ts | 204 | this.context.inlineEditor.slots.renderComplete.subscribe(() => { | CODE |
| CRITICAL | …es/affine/widgets/linked-doc/src/linked-doc-popover.ts | 224 | this.context.inlineEditor.slots.renderComplete.subscribe(() => { | CODE |
| CRITICAL | …widgets/drag-handle/src/watchers/drag-event-watcher.ts | 1229 | this.std.store.workspace.docs.has(sourceDocId) && | CODE |
| CRITICAL | packages/affine/widgets/frame-title/src/frame-title.ts | 226 | this.model.props.title.yText.unobserve(updateTitle); | CODE |
| CRITICAL | packages/affine/widgets/frame-title/src/frame-title.ts | 228 | this.model.props.title.yText.observe(updateTitle); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/playground/apps/_common/mock-services.ts | 155 | export function mockGenerateDocUrlService(collection: Workspace) { | CODE |
| LOW | packages/playground/apps/starter/utils/collection.ts | 26 | export function createStarterDocCollection( | CODE |
| LOW | …ges/framework/std/src/inline/utils/point-conversion.ts | 159 | function getTextPointRoughlyFromElement(element: Element): TextPoint | null { | CODE |
| LOW | …ges/framework/std/src/inline/utils/point-conversion.ts | 166 | function getTextPointRoughlyFromElementByOffset( | CODE |
| LOW | packages/framework/std/src/inline/utils/query.ts | 4 | export function getInlineEditorInsideRoot( | CODE |
| LOW | packages/framework/std/src/__tests__/inline/utils.ts | 19 | export async function enterInlineEditorPlayground(page: Page) { | CODE |
| LOW | packages/framework/std/src/__tests__/inline/utils.ts | 41 | export async function getDeltaFromInlineRichText( | CODE |
| LOW | packages/framework/std/src/__tests__/inline/utils.ts | 60 | export async function getInlineRangeFromInlineRichText( | CODE |
| LOW | …kages/framework/std/src/clipboard/clipboard-adapter.ts | 22 | export function ClipboardAdapterConfigExtension( | CODE |
| LOW | packages/framework/global/src/gfx/bound.ts | 20 | export function getPointsFromBoundWithRotation( | CODE |
| LOW | packages/framework/global/src/gfx/bound.ts | 108 | export function getCommonBoundWithRotation(bounds: IBound[]): Bound { | CODE |
| LOW | packages/framework/global/src/gfx/math.ts | 504 | export function getPointFromBoundsWithRotation( | CODE |
| LOW | packages/framework/global/src/gfx/curve.ts | 155 | export function getBezierCurveBoundingBox(values: BezierCurveParameters) { | CODE |
| LOW | …kages/framework/store/src/extension/store-extension.ts | 57 | export function isStoreExtensionConstructor( | CODE |
| LOW | packages/framework/store/src/test/index.ts | 7 | export function createAutoIncrementIdGenerator(): IdGenerator { | CODE |
| LOW | …/framework/store/src/__tests__/collection.unit.spec.ts | 72 | function requestIdleCallbackPolyfill( | CODE |
| LOW | packages/framework/store/src/model/store/query.ts | 72 | function setAncestorsToDisplayIfHidden(mode: QueryMode, block: Block) { | CODE |
| LOW | packages/affine/blocks/embed/src/types.ts | 14 | export function isExternalEmbedBlockComponent( | CODE |
| LOW | …s/affine/blocks/embed/src/embed-youtube-block/utils.ts | 61 | export async function refreshEmbedYoutubeUrlData( | CODE |
| LOW | …es/affine/blocks/embed/src/common/render-linked-doc.ts | 80 | export function getDocContentWithMaxLength(doc: Store, maxlength = 500) { | CODE |
| LOW | …es/affine/blocks/embed/src/common/render-linked-doc.ts | 115 | export function getTitleFromSelectedModels(selectedModels: DraftModel[]) { | CODE |
| LOW | …es/affine/blocks/embed/src/common/render-linked-doc.ts | 150 | export async function convertSelectedBlocksToLinkedDoc( | CODE |
| LOW | …affine/blocks/embed/src/common/adapters/notion-html.ts | 7 | export function createEmbedBlockNotionHtmlAdapterMatcher( | CODE |
| LOW | …es/affine/blocks/embed/src/common/adapters/markdown.ts | 3 | export function createEmbedBlockMarkdownAdapterMatcher( | CODE |
| LOW | …/affine/blocks/embed/src/common/adapters/plain-text.ts | 3 | export function createEmbedBlockPlainTextAdapterMatcher( | CODE |
| LOW | …ckages/affine/blocks/embed/src/common/adapters/html.ts | 3 | export function createEmbedBlockHtmlAdapterMatcher( | CODE |
| LOW | …c/embed-iframe-block/configs/providers/google-drive.ts | 36 | function isValidGoogleDriveFileUrl(parsedUrl: URL): boolean { | CODE |
| LOW | …c/embed-iframe-block/configs/providers/google-drive.ts | 51 | function isValidGoogleDriveFolderUrl(parsedUrl: URL): boolean { | CODE |
| LOW | …c/embed-iframe-block/configs/providers/google-drive.ts | 65 | function isValidGoogleDrivePathUrl(parsedUrl: URL): boolean { | CODE |
| LOW | …c/embed-iframe-block/configs/providers/google-drive.ts | 121 | function buildGoogleDriveFileEmbedUrl(fileId: string): string | undefined { | CODE |
| LOW | …c/embed-iframe-block/configs/providers/google-drive.ts | 135 | function buildGoogleDriveFolderEmbedUrl(folderId: string): string | undefined { | CODE |
| LOW | packages/affine/blocks/embed/src/configs/toolbar.ts | 86 | function createBuiltinToolbarConfigForExternal( | CODE |
| LOW | …es/affine/blocks/embed/src/embed-github-block/utils.ts | 76 | export async function refreshEmbedGithubUrlData( | CODE |
| LOW | packages/affine/blocks/attachment/src/utils.ts | 144 | export async function addSiblingAttachmentBlocks( | CODE |
| LOW | packages/affine/blocks/attachment/src/embed.ts | 66 | export function AttachmentEmbedConfigExtension( | CODE |
| LOW | …kages/affine/blocks/code/src/code-preview-extension.ts | 18 | export function CodeBlockPreviewExtension( | CODE |
| LOW | packages/affine/blocks/code/src/clipboard/index.ts | 28 | export function CodeClipboardAdapterConfigExtension( | CODE |
| LOW | packages/affine/blocks/code/src/clipboard/index.ts | 166 | export function getCodeClipboardExtensions(): ExtensionType[] { | CODE |
| LOW | …fine/blocks/surface/src/utils/points-on-curve/index.ts | 55 | function getPointsOnBezierCurveWithSplitting( | CODE |
| LOW | …ne/blocks/surface/src/extensions/surface-middleware.ts | 12 | export function surfaceMiddlewareExtension( | CODE |
| LOW | …/surface/src/adapters/markdown/element-adapter/type.ts | 17 | export function ElementToMarkdownAdapterExtension( | CODE |
| LOW | …urface/src/adapters/plain-text/element-adapter/type.ts | 17 | export function ElementToPlainTextAdapterExtension( | CODE |
| LOW | …ckages/affine/blocks/image/src/image-resize-manager.ts | 103 | function getClosestRootBlockComponent(el: HTMLElement): BlockComponent | null { | CODE |
| LOW | packages/affine/blocks/table/src/table-data-manager.ts | 8 | export class TableDataManager { | CODE |
| LOW | packages/affine/blocks/list/src/commands/utils.ts | 14 | export function correctNumberedListsOrderToPrev( | CODE |
| LOW | …root/src/edgeless/configs/toolbar/render-linked-doc.ts | 50 | export function createLinkedDocFromEdgelessElements( | CODE |
| LOW | …ges/affine/blocks/root/src/edgeless/clipboard/utils.ts | 24 | export function createNewPresentationIndexes( | CODE |
| LOW | …ges/affine/blocks/root/src/edgeless/clipboard/utils.ts | 107 | export function edgelessElementsBoundFromRawData( | CODE |
| LOW | …ges/affine/blocks/root/src/edgeless/clipboard/utils.ts | 128 | function getBoundFromSerializedElement(element: SerializedElement) { | CODE |
| LOW | …ges/affine/blocks/root/src/edgeless/clipboard/utils.ts | 137 | function getBoundFromGfxBlockSnapshot(snapshot: BlockSnapshot) { | CODE |
| LOW | …s/affine/blocks/root/src/edgeless/clipboard/command.ts | 172 | function updatePastedElementsIndex( | CODE |
| LOW | packages/affine/fragments/outline/src/utils/scroll.ts | 34 | export function isBlockBeforeViewportCenter( | CODE |
| LOW | packages/affine/fragments/outline/src/utils/scroll.ts | 156 | export async function scrollToBlockWithHighlight( | CODE |
| LOW | packages/affine/all/src/extensions/view.ts | 60 | export function getInternalViewExtensions() { | CODE |
| LOW | packages/affine/all/src/extensions/store.ts | 34 | export function getInternalStoreExtensions() { | CODE |
| LOW | packages/affine/shared/src/utils/fractional-indexing.ts | 15 | export function generateFractionalIndexingKeyBetween( | CODE |
| LOW | packages/affine/shared/src/utils/reference.ts | 37 | export function cloneReferenceInfoWithoutAliases({ | CODE |
| LOW | packages/affine/shared/src/utils/event.ts | 43 | export function isControlledKeyboardEvent(e: KeyboardEvent) { | CODE |
| LOW⚡ | …/affine/shared/src/utils/dnd/get-drop-rect-by-point.ts | 117 | function getDatabaseBlockTableElement(element: Element) { | CODE |
| LOW⚡ | …/affine/shared/src/utils/dnd/get-drop-rect-by-point.ts | 124 | function getDatabaseBlockColumnHeaderElement(element: Element) { | CODE |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | packages/framework/std/src/gfx/viewport-element.ts | 85 | // Step 1: Activate all the blocks that should be visible | COMMENT |
| LOW⚡ | packages/framework/std/src/gfx/viewport-element.ts | 92 | // Step 2: Hide all the blocks that should not be visible | COMMENT |
| LOW | packages/framework/sync/src/doc/engine.ts | 127 | // Step 1: start main sync peer | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/engine.ts | 145 | // Step 2: wait for main sync complete | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/engine.ts | 148 | // Step 3: start shadow sync peer | COMMENT |
| LOW | packages/framework/sync/src/doc/engine.ts | 170 | // Step 4: continuously sync main and shadow | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/peer.ts | 243 | // Step 1: load root doc | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/peer.ts | 246 | // Step 2: load subdocs | COMMENT |
| LOW | packages/framework/store/src/extension/extension.ts | 20 | * ## Step 1: Define the interfaces | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 33 | * ## Step 2: Create a service identifier | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 41 | * ## Step 3: Create implementations | COMMENT |
| LOW | packages/framework/store/src/extension/extension.ts | 59 | * ## Step 4: Create an extension factory | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 74 | * ## Step 5: Create concrete extensions | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 81 | * ## Step 6: Use the extensions | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 25 | ## Step 1: Define the interfaces | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 38 | ## Step 2: Create a service identifier | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 46 | ## Step 3: Create implementations | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 64 | ## Step 4: Create an extension factory | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 79 | ## Step 5: Create concrete extensions | COMMENT |
| LOW | …ckages/docs/api/@blocksuite/store/classes/Extension.md | 86 | ## Step 6: Use the extensions | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 634 | // Step 1: Handle elements whose models are deleted from the surface | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 650 | // Step 2: Render elements in the current viewport | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 686 | // Step 3: Remove DOM elements that are in _elementsMap but were not processed in Step 2 | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 701 | // Step 4: Notify about changes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | packages/framework/std/src/gfx/viewport-element.ts | 85 | // Step 1: Activate all the blocks that should be visible | COMMENT |
| LOW⚡ | packages/framework/std/src/gfx/viewport-element.ts | 92 | // Step 2: Hide all the blocks that should not be visible | COMMENT |
| LOW | packages/framework/sync/src/doc/engine.ts | 127 | // Step 1: start main sync peer | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/engine.ts | 145 | // Step 2: wait for main sync complete | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/engine.ts | 148 | // Step 3: start shadow sync peer | COMMENT |
| LOW | packages/framework/sync/src/doc/engine.ts | 170 | // Step 4: continuously sync main and shadow | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/peer.ts | 243 | // Step 1: load root doc | COMMENT |
| LOW⚡ | packages/framework/sync/src/doc/peer.ts | 246 | // Step 2: load subdocs | COMMENT |
| LOW | packages/framework/store/src/extension/extension.ts | 20 | * ## Step 1: Define the interfaces | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 33 | * ## Step 2: Create a service identifier | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 41 | * ## Step 3: Create implementations | COMMENT |
| LOW | packages/framework/store/src/extension/extension.ts | 59 | * ## Step 4: Create an extension factory | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 74 | * ## Step 5: Create concrete extensions | COMMENT |
| LOW⚡ | packages/framework/store/src/extension/extension.ts | 81 | * ## Step 6: Use the extensions | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 634 | // Step 1: Handle elements whose models are deleted from the surface | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 650 | // Step 2: Render elements in the current viewport | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 686 | // Step 3: Remove DOM elements that are in _elementsMap but were not processed in Step 2 | COMMENT |
| LOW | …ges/affine/blocks/surface/src/renderer/dom-renderer.ts | 701 | // Step 4: Notify about changes | COMMENT |
| LOW | packages/affine/components/src/peek/peekable.ts | 61 | * In edgeless mode, we need to check if the click target is not covered by | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/framework/global/src/di/stable-hash.ts | 1 | // copied from https://github.com/shuding/stable-hash | COMMENT |
| LOW | packages/framework/global/src/lit/watch.ts | 41 | this.__dispose?.(); | COMMENT |
| LOW | packages/framework/global/src/lit/signal-watcher.ts | 41 | if (this.isUpdatePending === false || this.isConnected === false) { | COMMENT |
| LOW | packages/affine/blocks/frame/src/frame-manager.ts | 241 | surfaceModel.elementAdded.subscribe(({ id, local }) => { | COMMENT |
| LOW | packages/affine/shared/src/utils/figma-squircle/draw.ts | 21 | // The original code by MartinRGB | COMMENT |
| LOW | …es/affine/components/src/color-picker/custom-button.ts | 41 | content-box, | COMMENT |
| LOW | …/view-presets/table/pc-virtual/controller/selection.ts | 721 | const newSelection = this.focusToArea(selection); | COMMENT |
| LOW | …/view-presets/table/pc-virtual/controller/selection.ts | 761 | // inline: 'nearest', | COMMENT |
| LOW | …/view-presets/table/pc-virtual/controller/selection.ts | 821 | newSelection.rowsSelection.start - 1 | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 1 | // related component | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 21 | // | undefined | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 41 | // } | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 61 | // } | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 141 | // // const event = context.get('pointerState').raw; | COMMENT |
| LOW | …w/src/view-presets/table/pc-virtual/controller/drag.ts | 161 | COMMENT | |
| LOW | …get-presets/tools/presets/view-options/view-options.ts | 321 | return html` <div style="display: flex">${result}</div>`; | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/integration-test/src/__tests__/utils/doc-generator.ts | 14 | 'Hello World! Lorem ipsum dolor sit amet. Consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW | …/integration-test/src/__tests__/utils/doc-generator.ts | 14 | 'Hello World! Lorem ipsum dolor sit amet. Consectetur adipiscing elit. Sed do eiusmod tempor incididunt.' | CODE |
| LOW | …es/affine/fragments/frame-panel/src/card/frame-card.ts | 244 | accessor status: 'selected' | 'dragging' | 'placeholder' | 'none' = 'none'; | CODE |
| LOW | …ine/fragments/frame-panel/src/body/frame-panel-body.ts | 273 | ? 'placeholder' | CODE |
| LOW | …ages/affine/inlines/latex/src/latex-node/latex-node.ts | 136 | html`<span class="placeholder">Equation</span>`, | CODE |