import '../../buttons/toolbar-button.js'; import './connector-menu.js'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; import { ArrowUpIcon, ConnectorIcon, } from '../../../../../_common/icons/index.js'; import { LineWidth } from '../../../../../_common/utils/index.js'; import { ConnectorMode } from '../../../../../surface-block/index.js'; import { GET_DEFAULT_LINE_COLOR } from '../../panel/color-panel.js'; import { createPopper } from '../common/create-popper.js'; import { EdgelessToolButton } from '../edgeless-toolbar-button.js'; import type { EdgelessConnectorMenu } from './connector-menu.js'; @customElement('edgeless-connector-tool-button') export class EdgelessConnectorToolButton extends EdgelessToolButton< EdgelessConnectorMenu, 'connector', readonly ['mode', 'stroke', 'strokeWidth'] > { static override styles = css` :host { display: flex; } .edgeless-connector-button { display: flex; position: relative; } .arrow-up-icon { position: absolute; top: 4px; right: 2px; font-size: 0; } `; @state() mode: ConnectorMode = ConnectorMode.Curve; @state() stroke = GET_DEFAULT_LINE_COLOR(); @state() strokeWidth = LineWidth.LINE_WIDTH_TWO; protected override _type = 'connector' as const; protected override readonly _states = [ 'mode', 'stroke', 'strokeWidth', ] as const; private _toggleMenu() { if (this._menu) { this._disposeMenu(); this.requestUpdate(); } else { this._menu = createPopper('edgeless-connector-menu', this, { x: 50, y: -40, }); this._menu.element.edgeless = this.edgeless; this.updateMenu(); this._menu.element.onChange = (props: Record) => { this.edgeless.service.editSession.record(this._type, props); }; } } override updated(changedProperties: Map) { if (this._states.some(key => changedProperties.has(key))) { if (this._menu) { this.updateMenu(); this.edgeless.slots.edgelessToolUpdated.emit({ type: this._type, mode: this.mode, }); } } } override render() { const { active } = this; const arrowColor = active ? 'currentColor' : '#77757D'; return html` { this.edgeless.tools.setEdgelessTool({ type: 'connector', mode: this.mode, }); this._toggleMenu(); }} > ${ConnectorIcon} ${ArrowUpIcon} `; } } declare global { interface HTMLElementTagNameMap { 'edgeless-connector-tool-button': EdgelessConnectorToolButton; } }