diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index 491a5507b..7fa3df492 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -131,6 +131,7 @@ "./components/toggle-switch": "./src/components/toggle-switch.ts", "./components/toolbar": "./src/components/toolbar.ts", "./components/view-dropdown-menu": "./src/components/view-dropdown-menu.ts", + "./components/tooltip-content-with-shortcut": "./src/components/tooltip-content-with-shortcut.ts", "./rich-text": "./src/rich-text/index.ts", "./rich-text/effects": "./src/rich-text/effects.ts", "./shared/adapters": "./src/shared/adapters.ts", diff --git a/blocksuite/affine/all/src/components/tooltip-content-with-shortcut.ts b/blocksuite/affine/all/src/components/tooltip-content-with-shortcut.ts new file mode 100644 index 000000000..16ccb4466 --- /dev/null +++ b/blocksuite/affine/all/src/components/tooltip-content-with-shortcut.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-components/tooltip-content-with-shortcut'; diff --git a/blocksuite/affine/all/src/effects.ts b/blocksuite/affine/all/src/effects.ts index d2696d759..80dd5b8ed 100644 --- a/blocksuite/affine/all/src/effects.ts +++ b/blocksuite/affine/all/src/effects.ts @@ -36,6 +36,7 @@ import { SmoothCorner } from '@blocksuite/affine-components/smooth-corner'; import { effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button'; import { ToggleSwitch } from '@blocksuite/affine-components/toggle-switch'; import { effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar'; +import { effects as componentTooltipContentWithShortcutEffects } from '@blocksuite/affine-components/tooltip-content-with-shortcut'; import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu'; import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects'; import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects'; @@ -145,6 +146,7 @@ export function effects() { componentCardStyleDropdownMenuEffects(); componentHighlightDropdownMenuEffects(); componentViewDropdownMenuEffects(); + componentTooltipContentWithShortcutEffects(); widgetScrollAnchoringEffects(); widgetFrameTitleEffects(); diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/brush/brush-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/brush/brush-tool-button.ts index 3840ca82a..51c7b8cee 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/brush/brush-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/brush/brush-tool-button.ts @@ -7,7 +7,6 @@ import { computed } from '@preact/signals-core'; import { css, html, LitElement } from 'lit'; import { styleMap } from 'lit/directives/style-map.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import { EdgelessPenDarkIcon, EdgelessPenLightIcon } from './icons.js'; @@ -78,7 +77,12 @@ export class EdgelessBrushToolButton extends EdgelessToolbarToolMixin( return html` `} .tooltipOffset=${4} .active=${active} .withHover=${true} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/connector/connector-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/connector/connector-tool-button.ts index 5d3330de5..5645acc4b 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/connector/connector-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/connector/connector-tool-button.ts @@ -9,7 +9,6 @@ import { import { computed } from '@preact/signals-core'; import { css, html, LitElement } from 'lit'; -import { getTooltipWithShortcut } from '../../utils.js'; import { QuickToolMixin } from '../mixins/quick-tool.mixin.js'; const IcomMap = { @@ -55,7 +54,10 @@ export class EdgelessConnectorToolButton extends QuickToolMixin( class="edgeless-connector-button" .tooltip=${this.popper ? '' - : getTooltipWithShortcut(getConnectorModeName(mode), 'C')} + : html``} .tooltipOffset=${17} .active=${active} .iconContainerPadding=${6} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts index 136d80813..a687f577a 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts @@ -4,7 +4,6 @@ import { effect } from '@preact/signals-core'; import { css, html, LitElement } from 'lit'; import { query } from 'lit/decorators.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { QuickToolMixin } from '../mixins/quick-tool.mixin.js'; export class EdgelessDefaultToolButton extends QuickToolMixin(LitElement) { static override styles = css` @@ -74,12 +73,17 @@ export class EdgelessDefaultToolButton extends QuickToolMixin(LitElement) { override render() { const type = this.edgelessTool?.type; const { active } = this; + const tipInfo = + type === 'pan' + ? { tip: 'Hand', shortcut: 'H' } + : { tip: 'Select', shortcut: 'V' }; return html` `} .tooltipOffset=${17} .active=${active} .iconContainerPadding=${6} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/eraser/eraser-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/eraser/eraser-tool-button.ts index c4373a68c..d54933885 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/eraser/eraser-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/eraser/eraser-tool-button.ts @@ -2,7 +2,6 @@ import { ThemeProvider } from '@blocksuite/affine-shared/services'; import type { GfxToolsFullOptionValue } from '@blocksuite/block-std/gfx'; import { css, html, LitElement } from 'lit'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import { EdgelessEraserDarkIcon, EdgelessEraserLightIcon } from './icons.js'; @@ -60,7 +59,10 @@ export class EdgelessEraserToolButton extends EdgelessToolbarToolMixin( return html` `} .tooltipOffset=${4} .active=${type === 'eraser'} @click=${() => this.setEdgelessTool({ type: 'eraser' })} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/frame/frame-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/frame/frame-tool-button.ts index 00467c4ba..e16541238 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/frame/frame-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/frame/frame-tool-button.ts @@ -2,7 +2,6 @@ import type { GfxToolsFullOptionValue } from '@blocksuite/block-std/gfx'; import { FrameIcon } from '@blocksuite/icons/lit'; import { css, html, LitElement } from 'lit'; -import { getTooltipWithShortcut } from '../../../components/utils.js'; import { QuickToolMixin } from '../mixins/quick-tool.mixin.js'; export class EdgelessFrameToolButton extends QuickToolMixin(LitElement) { @@ -26,7 +25,12 @@ export class EdgelessFrameToolButton extends QuickToolMixin(LitElement) { return html` `} .tooltipOffset=${17} .iconSize=${'24px'} .active=${type === 'frame'} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/lasso/lasso-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/lasso/lasso-tool-button.ts index f49ffa99f..b951f062b 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/lasso/lasso-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/lasso/lasso-tool-button.ts @@ -4,7 +4,6 @@ import { effect } from '@preact/signals-core'; import { css, html, LitElement } from 'lit'; import { query, state } from 'lit/decorators.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { QuickToolMixin } from '../mixins/quick-tool.mixin.js'; import { LassoFreeHandIcon, LassoPolygonalIcon } from './icons.js'; @@ -72,7 +71,10 @@ export class EdgelessLassoToolButton extends QuickToolMixin( return html` `} .tooltipOffset=${17} .active=${type === 'lasso'} .iconContainerPadding=${6} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts index ec010f5d4..22b639a6f 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts @@ -3,7 +3,6 @@ import { LinkIcon } from '@blocksuite/affine-components/icons'; import { TelemetryProvider } from '@blocksuite/affine-shared/services'; import { css, html, LitElement } from 'lit'; -import { getTooltipWithShortcut } from '../../utils.js'; import { QuickToolMixin } from '../mixins/quick-tool.mixin.js'; export class EdgelessLinkToolButton extends QuickToolMixin(LitElement) { @@ -53,7 +52,10 @@ export class EdgelessLinkToolButton extends QuickToolMixin(LitElement) { override render() { return html``}" .tooltipOffset=${17} class="edgeless-link-tool-button" @click=${this._onClick} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/mindmap/mindmap-menu.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/mindmap/mindmap-menu.ts index 17577b1c8..304929cb8 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/mindmap/mindmap-menu.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/mindmap/mindmap-menu.ts @@ -18,7 +18,6 @@ import { property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import type { EdgelessRootBlockComponent } from '../../../index.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessDraggableElementController } from '../common/draggable/draggable-element.controller.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import { getMindMaps, type ToolbarMindmapItem } from './assets.js'; @@ -174,7 +173,9 @@ export class EdgelessMindmapMenu extends EdgelessToolbarToolMixin( ${importMindMapIcon} - ${getTooltipWithShortcut('Support import of FreeMind,OPML.')} + `; } @@ -292,7 +293,9 @@ export class EdgelessMindmapMenu extends EdgelessToolbarToolMixin( ${mediaItem.icon} - ${getTooltipWithShortcut('Add media')} +
@@ -321,7 +324,10 @@ export class EdgelessMindmapMenu extends EdgelessToolbarToolMixin( ${textItem.icon} - ${getTooltipWithShortcut('Edgeless Text', 'T')} +
@@ -364,7 +370,10 @@ export class EdgelessMindmapMenu extends EdgelessToolbarToolMixin( ${mindMap.icon} - ${getTooltipWithShortcut('Mind Map', 'M')} + `; diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-menu.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-menu.ts index 05fd9374c..28f688fb3 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-menu.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-menu.ts @@ -16,7 +16,6 @@ import { property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import type { NoteToolOption } from '../../../gfx-tool/note-tool.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import { NOTE_MENU_ITEMS } from './note-menu-config.js'; @@ -123,7 +122,10 @@ export class EdgelessNoteMenu extends EdgelessToolbarToolMixin(LitElement) { `} @click=${() => { this._onHandleLinkButtonClick(); }} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-senior-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-senior-button.ts index 7a3c4f1c5..abcbc09c9 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-senior-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/note/note-senior-button.ts @@ -13,7 +13,6 @@ import { css, html, LitElement } from 'lit'; import { state } from 'lit/decorators.js'; import type { NoteToolOption } from '../../../gfx-tool/note-tool.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import { toShapeNotToAdapt } from './icon.js'; @@ -187,7 +186,12 @@ export class EdgelessNoteSeniorButton extends EdgelessToolbarToolMixin( return html``} .tooltipOffset=${5} >
`} .tooltipOffset=${17} .active=${active} .iconContainerPadding=${6} diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/shape/shape-tool-button.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/shape/shape-tool-button.ts index f6b58c13a..95f7c0926 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/shape/shape-tool-button.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/toolbar/shape/shape-tool-button.ts @@ -3,7 +3,6 @@ import { SignalWatcher } from '@blocksuite/global/lit'; import { css, html, LitElement } from 'lit'; import { ShapeTool } from '../../../gfx-tool/shape-tool.js'; -import { getTooltipWithShortcut } from '../../utils.js'; import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js'; import type { DraggableShape } from './utils.js'; @@ -68,7 +67,12 @@ export class EdgelessShapeToolButton extends EdgelessToolbarToolMixin( return html` `} .tooltipOffset=${5} .active=${active} > diff --git a/blocksuite/affine/blocks/block-root/src/edgeless/components/utils.ts b/blocksuite/affine/blocks/block-root/src/edgeless/components/utils.ts index a3995dddb..3d36639e0 100644 --- a/blocksuite/affine/blocks/block-root/src/edgeless/components/utils.ts +++ b/blocksuite/affine/blocks/block-root/src/edgeless/components/utils.ts @@ -1,7 +1,6 @@ import type { CursorType, StandardCursor } from '@blocksuite/block-std/gfx'; import type { IVec } from '@blocksuite/global/gfx'; import { normalizeDegAngle, Vec } from '@blocksuite/global/gfx'; -import { css, html } from 'lit'; export function generateCursorUrl( angle = 0, @@ -25,53 +24,6 @@ export function getCommonRectStyle( }; } -export function getTooltipWithShortcut( - tip: string, - shortcut?: string, - postfix?: string -) { - // style for shortcut tooltip - const styles = css` - .tooltip-with-shortcut { - display: flex; - flex-wrap: nowrap; - align-items: center; - gap: 10px; - } - .tooltip__shortcut { - font-size: 12px; - position: relative; - - display: flex; - align-items: center; - justify-content: center; - height: 16px; - min-width: 16px; - } - .tooltip__shortcut::before { - content: ''; - border-radius: 4px; - position: absolute; - inset: 0; - background: currentColor; - opacity: 0.2; - } - .tooltip__label { - white-space: pre; - } - `; - return html` -
- ${tip} - ${shortcut - ? html`${shortcut}` - : ''} - ${postfix ? html`${postfix}` : ''} -
`; -} - const RESIZE_CURSORS: CursorType[] = [ 'ew-resize', 'nwse-resize', diff --git a/blocksuite/affine/blocks/block-root/src/widgets/element-toolbar/change-note-button.ts b/blocksuite/affine/blocks/block-root/src/widgets/element-toolbar/change-note-button.ts index 6f86073e8..1f908bdf0 100644 --- a/blocksuite/affine/blocks/block-root/src/widgets/element-toolbar/change-note-button.ts +++ b/blocksuite/affine/blocks/block-root/src/widgets/element-toolbar/change-note-button.ts @@ -54,7 +54,6 @@ import { type LineStyleEvent, LineStylesPanel, } from '../../edgeless/components/panel/line-styles-panel.js'; -import { getTooltipWithShortcut } from '../../edgeless/components/utils.js'; import type { EdgelessRootBlockComponent } from '../../edgeless/edgeless-root-block.js'; import { SmallArrowDownIcon } from './icons.js'; import * as styles from './styles.css'; @@ -522,7 +521,10 @@ export class EdgelessChangeNoteButton extends WithDisposable(LitElement) { ? html` `} .active=${this.enableNoteSlicer} .iconSize=${'20px'} @click=${() => this._handleNoteSlicerButtonClick()} diff --git a/blocksuite/affine/components/package.json b/blocksuite/affine/components/package.json index 52faa28b8..712243870 100644 --- a/blocksuite/affine/components/package.json +++ b/blocksuite/affine/components/package.json @@ -66,7 +66,8 @@ "./linked-doc-title": "./src/linked-doc-title/index.ts", "./view-dropdown-menu": "./src/view-dropdown-menu/index.ts", "./card-style-dropdown-menu": "./src/card-style-dropdown-menu/index.ts", - "./highlight-dropdown-menu": "./src/highlight-dropdown-menu/index.ts" + "./highlight-dropdown-menu": "./src/highlight-dropdown-menu/index.ts", + "./tooltip-content-with-shortcut": "./src/tooltip-content-with-shortcut/index.ts" }, "files": [ "src", diff --git a/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts b/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts new file mode 100644 index 000000000..730fc07af --- /dev/null +++ b/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts @@ -0,0 +1,70 @@ +import { css, html, LitElement } from 'lit'; +import { property } from 'lit/decorators.js'; + +export class TooltipContentWithShortcut extends LitElement { + static override styles = css` + .tooltip-with-shortcut { + display: flex; + flex-wrap: nowrap; + align-items: center; + gap: 10px; + } + .tooltip__shortcut { + font-size: 12px; + position: relative; + + display: flex; + align-items: center; + justify-content: center; + height: 16px; + min-width: 16px; + } + .tooltip__shortcut::before { + content: ''; + border-radius: 4px; + position: absolute; + inset: 0; + background: currentColor; + opacity: 0.2; + } + .tooltip__label { + white-space: pre; + } + `; + + override render() { + const { tip, shortcut, postfix } = this; + + return html` +
+ ${tip} + ${shortcut + ? html`${shortcut}` + : ''} + ${postfix ? html`${postfix}` : ''} +
+ `; + } + + @property({ attribute: 'data-tip' }) + accessor tip!: string; + + @property({ attribute: 'data-shortcut' }) + accessor shortcut: string | undefined = undefined; + + @property({ attribute: 'data-postfix' }) + accessor postfix: string | undefined = undefined; +} + +export function effects() { + customElements.define( + 'affine-tooltip-content-with-shortcut', + TooltipContentWithShortcut + ); +} + +declare global { + interface HTMLElementTagNameMap { + 'affine-tooltip-content-with-shortcut': TooltipContentWithShortcut; + } +}