import { DefaultTool } from '@blocksuite/affine-block-surface'; import { toast } from '@blocksuite/affine-components/toast'; import { EmptyTool } from '@blocksuite/affine-gfx-pointer'; import type { MindmapStyle } from '@blocksuite/affine-model'; import { EditPropsStore, FeatureFlagService, TelemetryProvider, } from '@blocksuite/affine-shared/services'; import { EdgelessDraggableElementController, EdgelessToolbarToolMixin, } from '@blocksuite/affine-widget-edgeless-toolbar'; import { ErrorCode } from '@blocksuite/global/exceptions'; import type { Bound } from '@blocksuite/global/gfx'; import { SignalWatcher } from '@blocksuite/global/lit'; import type { BlockStdScope } from '@blocksuite/std'; import { modelContext, stdContext } from '@blocksuite/std'; import type { BlockModel } from '@blocksuite/store'; import { consume } from '@lit/context'; import { computed } from '@preact/signals-core'; import { css, html, LitElement, nothing, type TemplateResult } from 'lit'; import { property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { getMindMaps, type ToolbarMindmapItem } from './assets.js'; import { mediaRender, textRender } from './basket-elements.js'; import { importMindMapIcon, mindmapMenuMediaIcon, textIcon } from './icons.js'; import { MindMapPlaceholder } from './mindmap-importing-placeholder.js'; type TextItem = { type: 'text'; icon: TemplateResult; render: typeof textRender; }; type MediaItem = { type: 'media'; icon: TemplateResult; render: typeof mediaRender; }; type ImportItem = { type: 'import'; icon: TemplateResult; }; const textItem: TextItem = { type: 'text', icon: textIcon, render: textRender }; const mediaItem: MediaItem = { type: 'media', icon: mindmapMenuMediaIcon, render: mediaRender, }; export class EdgelessMindmapMenu extends EdgelessToolbarToolMixin( SignalWatcher(LitElement) ) { static override styles = css` :host { display: flex; z-index: -1; justify-content: flex-end; } .text-and-mindmap { display: flex; gap: 10px; padding: 8px 0px; box-sizing: border-box; } .thin-divider { width: 1px; transform: scaleX(0.5); height: 48px; background: var(--affine-border-color); } .text-item, .media-item { width: 60px; } .mindmap-item { width: 64px; } .text-item, .media-item, .mindmap-item { border-radius: 4px; height: 48px; position: relative; display: flex; align-items: center; justify-content: center; } .text-item > button, .media-item > button, .mindmap-item > button { position: absolute; border-radius: inherit; border: none; background: none; cursor: grab; padding: 0; } .text-item:hover, .media-item:hover, .mindmap-item[data-is-active='true'], .mindmap-item:hover { background: var(--affine-hover-color); } .text-item > button.next, .media-item > button.next, .mindmap-item > button.next { transition: transform 0.3s ease-in-out; } `; private readonly _style$ = computed(() => { const { style } = this.edgeless.std.get(EditPropsStore).lastProps$.value.mindmap; return style; }); draggableController!: EdgelessDraggableElementController< ToolbarMindmapItem | TextItem | ImportItem | MediaItem >; override type = EmptyTool; get mindMaps() { return getMindMaps(this.theme); } private _importMindMapEntry() { const { draggingElement } = this.draggableController?.states || {}; const isBeingDragged = draggingElement?.data.type === 'import'; return html`