/* eslint-disable @typescript-eslint/no-restricted-imports */ import '@shoelace-style/shoelace/dist/components/tab-panel/tab-panel.js'; import { ShadowlessElement } from '@blocksuite/block-std'; import { defaultImageProxyMiddleware, docLinkBaseURLMiddlewareBuilder, embedSyncedDocMiddleware, type HtmlAdapter, HtmlAdapterFactoryIdentifier, type MarkdownAdapter, MarkdownAdapterFactoryIdentifier, type PlainTextAdapter, PlainTextAdapterFactoryIdentifier, titleMiddleware, } from '@blocksuite/blocks'; import { WithDisposable } from '@blocksuite/global/utils'; import type { AffineEditorContainer } from '@blocksuite/presets'; import { type DocSnapshot, Job } from '@blocksuite/store'; import { effect } from '@preact/signals-core'; import type SlTabPanel from '@shoelace-style/shoelace/dist/components/tab-panel/tab-panel.js'; import { css, html, type PropertyValues } from 'lit'; import { customElement, property, query, state } from 'lit/decorators.js'; @customElement('adapters-panel') export class AdaptersPanel extends WithDisposable(ShadowlessElement) { static override styles = css` adapters-panel { width: 36vw; } .adapters-container { border: 1px solid var(--affine-border-color, #e3e2e4); background-color: var(--affine-background-primary-color); box-sizing: border-box; position: relative; } .adapter-container { padding: 0px 16px; width: 100%; height: calc(100vh - 80px); white-space: pre-wrap; color: var(--affine-text-primary-color); overflow: auto; } .update-button { position: absolute; top: 8px; right: 12px; padding: 8px 12px; border-radius: 4px; font-size: 12px; font-weight: 500; cursor: pointer; border: 1px solid var(--affine-border-color); font-family: var(--affine-font-family); color: var(--affine-text-primary-color); background-color: var(--affine-background-primary-color); } .update-button:hover { background-color: var(--affine-hover-color); } .html-panel { display: flex; gap: 8px; flex-direction: column; } .html-preview-container, .html-panel-content { width: 100%; flex: 1; border: none; box-sizing: border-box; color: var(--affine-text-primary-color); overflow: auto; } .html-panel-footer { width: 100%; height: 32px; display: flex; justify-content: flex-end; span { cursor: pointer; padding: 4px 8px; font-size: 12px; font-weight: 500; border: 1px solid var(--affine-border-color); font-family: var(--affine-font-family); color: var(--affine-text-primary-color); background-color: var(--affine-background-primary-color); line-height: 20px; } span[active] { background-color: var(--affine-hover-color); } } `; get doc() { return this.editor.doc; } private _createJob() { return new Job({ collection: this.doc.collection, middlewares: [ docLinkBaseURLMiddlewareBuilder('https://example.com').get(), titleMiddleware, embedSyncedDocMiddleware('content'), defaultImageProxyMiddleware, ], }); } private _getDocSnapshot() { const job = this._createJob(); const result = job.docToSnapshot(this.doc); return result; } private async _getHtmlContent() { const job = this._createJob(); const htmlAdapterFactory = this.editor.std.provider.get( HtmlAdapterFactoryIdentifier ); const htmlAdapter = htmlAdapterFactory.get(job) as HtmlAdapter; const result = await htmlAdapter.fromDoc(this.doc); return result?.file; } private async _getMarkdownContent() { const job = this._createJob(); const markdownAdapterFactory = this.editor.std.provider.get( MarkdownAdapterFactoryIdentifier ); const markdownAdapter = markdownAdapterFactory.get(job) as MarkdownAdapter; const result = await markdownAdapter.fromDoc(this.doc); return result?.file; } private async _getPlainTextContent() { const job = this._createJob(); const plainTextAdapterFactory = this.editor.std.provider.get( PlainTextAdapterFactoryIdentifier ); const plainTextAdapter = plainTextAdapterFactory.get( job ) as PlainTextAdapter; const result = await plainTextAdapter.fromDoc(this.doc); return result?.file; } private async _handleTabShow(name: string) { switch (name) { case 'markdown': this._markdownContent = (await this._getMarkdownContent()) || ''; break; case 'html': this._htmlContent = (await this._getHtmlContent()) || ''; break; case 'plaintext': this._plainTextContent = (await this._getPlainTextContent()) || ''; break; case 'snapshot': this._docSnapshot = this._getDocSnapshot() || null; break; } } private _renderHtmlPanel() { return html` ${this._isHtmlPreview ? html`` : html`