Skip to content

Watermark

npm versionnpm monthly downloadsnpm sizenpm license

Add watermark to your site. Pure client-side implementation, no node-side configuration required.

Installation

sh
pnpm add vitepress-plugin-watermark
sh
npm install vitepress-plugin-watermark
sh
bun add vitepress-plugin-watermark
sh
deno add vitepress-plugin-watermark
sh
yarn add vitepress-plugin-watermark

Usage

This plugin only provides a client-side setupWatermark function, which must be called inside the <script setup> block of a Layout wrapper component.

Create a custom Layout wrapper component:

.vitepress/theme/Layout.vue
vue
<script setup lang="ts">
import { setupWatermark } from 'vitepress-plugin-watermark'
import Theme from 'vitepress/theme'
import { h, useAttrs, useSlots } from 'vue'

const slots = useSlots()
const attrs = useAttrs()

const Layout = () => h(Theme.Layout, attrs, slots)

setupWatermark()
</script>

<template>
  <Layout />
</template>

Then register this Layout in your theme:

.vitepress/theme/index.ts
ts
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import Layout from './Layout.vue'

export default {
  extends: DefaultTheme,
  Layout,
} satisfies Theme

Configuration

setupWatermark accepts an optional configuration object:

ts
setupWatermark({
  enabled: true,
  content: 'My Watermark',
  fontColor: '#76747f',
  globalAlpha: 0.165,
  width: 200,
  height: 200,
  rotate: -22,
  fontSize: '16px',
  fontFamily: 'sans-serif',
})
OptionTypeDefaultDescription
enabledboolean | ((pageData: PageData) => boolean)trueEnable watermark; supports a function for dynamic control
contentstringSite titleWatermark text content
fontColorstring'#76747f'Font color
globalAlphanumber0.165 (normal) / 0.005 (blind mode)Opacity
mode'default' | 'blind''default'Watermark mode: 'blind' for blind watermark
widthnumberWidth of each watermark cell
heightnumberHeight of each watermark cell
rotatenumberRotation angle in degrees
fontSizestringFont size
fontFamilystringFont family
fontStylestringFont style
fontWeightstringFont weight
imagestringImage watermark URL
layout'default' | 'grid'Layout mode
zIndexnumberCSS z-index
mutationObservebooleanEnable DOM mutation observer protection
monitorProtectionbooleanEnable monitoring protection
movablebooleanAllow dragging the watermark
parentElement | stringMount target element

For more options, see the watermark-js-plus documentation.

Per-Page Watermark

Control watermark on individual pages via frontmatter:

Enable Watermark

yaml
---
watermark: true
---

Custom Text

yaml
---
watermark: CONFIDENTIAL
---

Full Customization

yaml
---
watermark:
  content: DRAFT
  fontColor: '#ff0000'
  globalAlpha: 0.3
  rotate: 30
---

Disable on Specific Pages

yaml
---
watermark: false
---

Dynamic Enable via Function

Use an enabled function to dynamically control watermark based on the page path:

ts
setupWatermark({
  enabled: (pageData) => {
    // Only enable on pages under guide/
    return pageData.relativePath.startsWith('guide/')
  },
})

Released under the MIT License