import '../../panel/one-row-color-panel.js'; import '../common/slide-menu.js'; import { css, html, LitElement, nothing } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { ConnectorCWithArrowIcon, ConnectorLWithArrowIcon, ConnectorXWithArrowIcon, } from '../../../../../_common/icons/index.js'; import { type EdgelessTool } from '../../../../../_common/utils/index.js'; import { ConnectorMode } from '../../../../../surface-block/index.js'; import type { EdgelessPageBlockComponent } from '../../../edgeless-page-block.js'; import type { ColorEvent } from '../../panel/color-panel.js'; import type { LineWidthEvent } from '../../panel/line-width-panel.js'; import { getTooltipWithShortcut } from '../../utils.js'; const CONNECTOR_SUBMENU_WIDTH = 474; function ConnectorModeButtonGroup( mode: ConnectorMode, setConnectorMode: (props: Record) => void ) { const straightLineTooltip = getTooltipWithShortcut('Straight', 'L'); const orthogonalTooltip = getTooltipWithShortcut('Elbowed', 'X'); const curveTooltip = getTooltipWithShortcut('Curve', 'C'); /** * There is little hacky on rendering tooltip. * We don't want either tooltip overlap the top button or tooltip on left. * So we put the lower button's tooltip as the first element of the button group container */ return html`
setConnectorMode({ mode: ConnectorMode.Straight })} > ${ConnectorLWithArrowIcon} setConnectorMode({ mode: ConnectorMode.Curve })} > ${ConnectorCWithArrowIcon} setConnectorMode({ mode: ConnectorMode.Orthogonal })} > ${ConnectorXWithArrowIcon}
`; } @customElement('edgeless-connector-menu') export class EdgelessConnectorMenu extends LitElement { static override styles = css` :host { position: absolute; display: flex; z-index: -1; } .connector-submenu-content { display: flex; height: 24px; align-items: center; justify-content: center; } .connector-mode-button-group { display: flex; justify-content: center; align-items: center; gap: 14px; } .connector-mode-button-group > edgeless-tool-icon-button svg { fill: var(--affine-icon-color); } .submenu-divider { width: 1px; height: 24px; margin: 0 16px; background-color: var(--affine-border-color); display: inline-block; } `; @property({ attribute: false }) edgeless!: EdgelessPageBlockComponent; @property({ attribute: false }) mode!: ConnectorMode; @property({ attribute: false }) stroke!: string; @property({ attribute: false }) strokeWidth!: number; @property({ attribute: false }) onChange!: (props: Record) => void; private get edgelessTool(): EdgelessTool { return this.edgeless.edgelessTool; } override render() { if (this.edgelessTool.type !== 'connector') return nothing; const { stroke, strokeWidth } = this; const connectorModeButtonGroup = ConnectorModeButtonGroup( this.mode, this.onChange ); return html`
${connectorModeButtonGroup} this.onChange({ strokeWidth: e.detail })} > this.onChange({ stroke: e.detail })} >
`; } } declare global { interface HTMLElementTagNameMap { 'edgeless-connector-menu': EdgelessConnectorMenu; } }