diff --git a/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts b/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts index 1df0ce912d..3fd19d5b9c 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts +++ b/blocksuite/affine/blocks/root/src/edgeless/edgeless-keyboard.ts @@ -88,6 +88,9 @@ export class EdgelessPageKeyboardManager extends PageKeyboardManager { p: () => { this._setEdgelessTool('brush'); }, + 'Shift-p': () => { + this._setEdgelessTool('highlighter'); + }, e: () => { this._setEdgelessTool('eraser'); }, diff --git a/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts b/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts index 730fc07afb..a46483d8ef 100644 --- a/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts +++ b/blocksuite/affine/components/src/tooltip-content-with-shortcut/index.ts @@ -1,5 +1,6 @@ import { css, html, LitElement } from 'lit'; import { property } from 'lit/decorators.js'; +import { repeat } from 'lit-html/directives/repeat.js'; export class TooltipContentWithShortcut extends LitElement { static override styles = css` @@ -9,6 +10,10 @@ export class TooltipContentWithShortcut extends LitElement { align-items: center; gap: 10px; } + .tooltip__shortcuts { + display: flex; + gap: 2px; + } .tooltip__shortcut { font-size: 12px; position: relative; @@ -28,19 +33,30 @@ export class TooltipContentWithShortcut extends LitElement { opacity: 0.2; } .tooltip__label { + display: flex; + flex: 1; white-space: pre; } `; + get shortcuts() { + let shortcut = this.shortcut; + if (!shortcut) return []; + return shortcut.split(' '); + } + override render() { - const { tip, shortcut, postfix } = this; + const { tip, shortcuts, postfix } = this; return html`
${tip} - ${shortcut - ? html`${shortcut}` - : ''} +
+ ${repeat( + shortcuts, + shortcut => html`${shortcut}` + )} +
${postfix ? html`${postfix}` : ''}
`; diff --git a/blocksuite/affine/gfx/brush/src/toolbar/components/pen/consts.ts b/blocksuite/affine/gfx/brush/src/toolbar/components/pen/consts.ts new file mode 100644 index 0000000000..2e1df31d8a --- /dev/null +++ b/blocksuite/affine/gfx/brush/src/toolbar/components/pen/consts.ts @@ -0,0 +1,29 @@ +import { + EdgelessBrushDarkIcon, + EdgelessBrushLightIcon, + EdgelessHighlighterDarkIcon, + EdgelessHighlighterLightIcon, +} from './icons'; +import type { Pen } from './types'; + +export const penIconMap = { + dark: { + brush: EdgelessBrushDarkIcon, + highlighter: EdgelessHighlighterDarkIcon, + }, + light: { + brush: EdgelessBrushLightIcon, + highlighter: EdgelessHighlighterLightIcon, + }, +}; + +export const penInfoMap: { [k in Pen]: { tip: string; shortcut: string } } = { + brush: { + tip: 'Pen', + shortcut: 'P', + }, + highlighter: { + tip: 'Highlighter', + shortcut: '⇧ P', + }, +}; diff --git a/blocksuite/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts b/blocksuite/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts index 5bc6a922b8..92c5e74706 100644 --- a/blocksuite/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts +++ b/blocksuite/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts @@ -7,11 +7,16 @@ import { import type { ColorEvent } from '@blocksuite/affine-shared/utils'; import { EdgelessToolbarToolMixin } from '@blocksuite/affine-widget-edgeless-toolbar'; import { SignalWatcher } from '@blocksuite/global/lit'; -import { computed, type Signal } from '@preact/signals-core'; +import { + computed, + type ReadonlySignal, + type Signal, +} from '@preact/signals-core'; import { css, html, LitElement, type TemplateResult } from 'lit'; import { property } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; +import { penInfoMap } from './consts'; import type { Pen, PenMap } from './types'; export class EdgelessPenMenu extends EdgelessToolbarToolMixin( @@ -26,8 +31,14 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( .pens { display: flex; + height: 100%; padding: 0 4px; - align-items: center; + align-items: flex-end; + + edgeless-tool-icon-button { + display: flex; + align-self: flex-start; + } .pen-wrapper { display: flex; @@ -36,7 +47,7 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( align-items: flex-end; justify-content: center; position: relative; - transform: translateY(10px); + transform: translateY(-2px); transition-property: color, transform; transition-duration: 300ms; transition-timing-function: ease-in-out; @@ -46,7 +57,7 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( .pen-wrapper:hover, .pen-wrapper:active, .pen-wrapper[data-active] { - transform: translateY(-10px); + transform: translateY(-22px); } } @@ -56,6 +67,8 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( } menu-divider { + display: flex; + align-self: center; height: 24px; margin: 0 9px; } @@ -83,42 +96,64 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( override render() { const { _theme$: { value: theme }, - color$: { value: currentColor }, colors$: { value: { brush: brushColor, highlighter: highlighterColor }, }, - pen$: { value: pen }, penIconMap$: { value: { brush: brushIcon, highlighter: highlighterIcon }, }, + penInfo$: { + value: { type, color }, + }, } = this; return html`
-
`} + .tooltipOffset=${20} + .hover=${false} @click=${() => this._onPickPen('brush')} > - ${brushIcon} -
-
+ ${brushIcon} +
+ + + `} + .tooltipOffset=${20} + .hover=${false} @click=${() => this._onPickPen('highlighter')} > - ${highlighterIcon} -
+
+ ${highlighterIcon} +
+