颜色高亮按钮

Available for free

一个完全无障碍且可定制的颜色高亮按钮,适用于 Tiptap 编辑器。使用键盘快捷键或 UI 为选中文本应用背景色,支持动态颜色集、自定义渲染和无障碍功能。

安装

通过 Tiptap CLI 添加此组件:

npx @tiptap/cli@latest add color-highlight-button

组件

<ColorHighlightButton />

一个可以直接使用的 React 按钮,用于在 Tiptap 编辑器中给选中文本应用颜色高亮。

使用示例

import { EditorContent, EditorContext, useEditor } from '@tiptap/react'

// --- Tiptap 核心扩展 ---
import { StarterKit } from '@tiptap/starter-kit'
import { Highlight } from '@tiptap/extension-highlight'

// --- Tiptap UI ---
import { ColorHighlightButton } from '@/components/tiptap-ui/color-highlight-button'

// --- UI 原语 ---
import { ButtonGroup } from '@/components/tiptap-ui-primitive/button'

// --- 节点样式 ---
import '@/components/tiptap-node/code-block-node/code-block-node.scss'
import '@/components/tiptap-node/paragraph-node/paragraph-node.scss'

export default function MyEditor() {
  const editor = useEditor({
    immediatelyRender: false,
    extensions: [StarterKit, Highlight.configure({ multicolor: true })],
    content: `
      <h2>颜色高亮按钮演示</h2>
      <p>欢迎使用颜色高亮按钮!此演示展示了相关功能。</p>
      <h3>使用方法:</h3>
      <p>1. <strong>选择你想高亮的任意文本</strong></p>
      <p>2. <strong>点击颜色按钮</strong>以应用该 <mark data-color="oklch(88.5% 0.062 18.334)" style="background-color: oklch(88.5% 0.062 18.334); color: inherit">高亮</mark></p>
    `,
  })

  return (
    <EditorContext.Provider value={{ editor }}>
      <ButtonGroup orientation="horizontal">
        <ColorHighlightButton tooltip="红色" highlightColor="oklch(88.5% 0.062 18.334)" />
        <ColorHighlightButton
          editor={editor}
          tooltip="橙色"
          highlightColor="oklch(90.1% 0.076 70.697)"
          text="高亮"
          hideWhenUnavailable={true}
          showShortcut={true}
          onApplied={({ color, label }) => console.log(`应用了 ${label} 高亮: ${color}`)}
        />
      </ButtonGroup>

      <EditorContent editor={editor} role="presentation" />
    </EditorContext.Provider>
  )
}

属性说明

名称类型默认值描述
editorEditor | nullundefinedTiptap 编辑器实例
highlightColorstring必填要应用的高亮颜色(CSS 颜色值)
textstringundefined按钮的可选文本标签
hideWhenUnavailablebooleanfalse当高亮不可用时隐藏按钮
onApplied({ color, label }) => voidundefined应用高亮后触发的回调
showShortcutbooleanfalse显示键盘快捷键标记(如果有)

Hooks

useColorHighlight(config)

一个强大的 Hook,可帮助你构建自定义颜色高亮按钮,完全控制行为和渲染。

使用示例

import { useColorHighlight } from '@/components/tiptap-ui/color-highlight-button'
import { Badge } from '@/components/tiptap-ui-primitive/badge'
import { parseShortcutKeys } from '@/lib/tiptap-utils'

function MyColorHighlightButton() {
  const { isVisible, isActive, canColorHighlight, handleColorHighlight, label, shortcutKeys } =
    useColorHighlight({
      editor: myEditor,
      highlightColor: 'var(--tt-color-highlight-blue)',
      label: '蓝色高亮',
      hideWhenUnavailable: true,
      onApplied: ({ color, label }) => console.log(`已应用:${label}`),
    })

  if (!isVisible) return null

  return (
    <button
      onClick={handleColorHighlight}
      disabled={!canColorHighlight}
      aria-label={label}
      aria-pressed={isActive}
      style={{ backgroundColor: isActive ? highlightColor : 'transparent' }}
    >
      {label}
      {shortcutKeys && <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>}
    </button>
  )
}

属性说明

名称类型默认值描述
editorEditor | nullundefinedTiptap 编辑器实例
highlightColorstring必填要应用的高亮颜色
labelstring可选按钮的无障碍标签
hideWhenUnavailablebooleanfalse如果无法应用高亮,隐藏按钮
mode"mark" | "node""mark"高亮模式(标记或节点背景)
onApplied({ color, label, mode }) => voidundefined应用高亮后触发的回调

返回值说明

名称类型描述
isVisibleboolean是否应渲染按钮
isActiveboolean高亮当前是否激活
canColorHighlightboolean是否可以应用高亮
handleColorHighlight() => boolean应用颜色高亮的函数
handleRemoveHighlight() => boolean移除高亮的函数
labelstring按钮的无障碍标签文本
shortcutKeysstring键盘快捷键(Cmd/Ctrl + Shift + H)
IconReact.FC使用的图标组件(HighlighterIcon)
mode"mark" | "node"使用的高亮模式

工具函数

canColorHighlight(editor, mode?)

检测当前编辑器状态是否可以应用颜色高亮。

参数说明

参数名类型默认值描述
editorEditor | null必填Tiptap 编辑器实例
mode"mark" | "node""mark"高亮模式(标记或节点背景)

返回值

boolean - 是否可以应用高亮

使用示例

import { canColorHighlight } from '@/components/tiptap-ui/color-highlight-button'

const canApply = canColorHighlight(editor)
const canApplyNode = canColorHighlight(editor, 'node')

isColorHighlightActive(editor, highlightColor?, mode?)

检测当前选区中是否激活了颜色高亮。

参数说明

参数名类型默认值描述
editorEditor | null必填Tiptap 编辑器实例
highlightColorstringundefined指定检查的颜色
mode"mark" | "node""mark"高亮模式(标记或节点背景)

返回值

boolean - 高亮是否激活

使用示例

import { isColorHighlightActive } from '@/components/tiptap-ui/color-highlight-button'

const isActive = isColorHighlightActive(editor) // 是否有任何高亮激活
const isYellowActive = isColorHighlightActive(editor, 'var(--tt-color-highlight-yellow)') // 是否激活指定颜色
const isNodeHighlight = isColorHighlightActive(editor, 'var(--tt-color-highlight-blue)', 'node')

removeHighlight(editor, mode?)

从选区中移除当前高亮。

参数说明

参数名类型默认值描述
editorEditor | null必填Tiptap 编辑器实例
mode"mark" | "node""mark"高亮模式(标记或节点背景)

返回值

boolean - 是否成功移除高亮

使用示例

import { removeHighlight } from '@/components/tiptap-ui/color-highlight-button'

const success = removeHighlight(editor)
const successNode = removeHighlight(editor, 'node')

pickHighlightColorsByValue(values)

根据颜色值过滤默认的高亮颜色列表。

参数说明

参数名类型描述
valuesstring[]要过滤的颜色值数组

返回值

HighlightColor[] - 匹配的高亮颜色对象数组

使用示例

import { pickHighlightColorsByValue } from '@/components/tiptap-ui/color-highlight-button'

const colors = pickHighlightColorsByValue([
  'var(--tt-color-highlight-yellow)',
  'var(--tt-color-highlight-blue)',
])
// 返回包含标签、值和边框属性的完整颜色对象数组

键盘快捷键

颜色高亮按钮支持以下键盘快捷键:

  • Cmd/Ctrl + Shift + H:应用颜色高亮

使用 ColorHighlightButton 组件或 useColorHighlight() Hook 时,会自动注册此快捷键,并将配置的高亮颜色应用到当前选区。

需求

依赖项

  • @tiptap/react - Tiptap React 核心集成
  • @tiptap/extension-highlight - 文本高亮扩展
  • react-hotkeys-hook - 键盘快捷键管理

关联组件

  • use-tiptap-editor(Hook)
  • button(原语)
  • badge(原语)
  • tiptap-utils(库)
  • highlighter-icon(图标)