Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新增 watermark 组件 #921

Merged
merged 6 commits into from
Jun 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions examples/watermark/demos/base.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<template>
<t-watermark
:watermark-content="{
text: '文字水印',
}"
:y="120"
:x="80"
>
<div style="height: 300px" />
</t-watermark>
</template>
15 changes: 15 additions & 0 deletions examples/watermark/demos/graylevel.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<template>
<t-watermark
:watermark-content="{
url: 'https://tdesign.gtimg.com/starter/brand-logo-light.png',
isGrayscale: true,
}"
:x="100"
:y="140"
:width="158"
:height="22"
:alpha="0.3"
>
<div style="height: 300px" />
</t-watermark>
</template>
15 changes: 15 additions & 0 deletions examples/watermark/demos/image.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<template>
<t-watermark
:watermark-content="{
url: 'https://tdesign.gtimg.com/site/logo-watermark.svg',
}"
:width="104"
:height="65.5"
:x="90"
:y="100"
:rotate="0"
:removable="false"
>
<div style="height: 300px" />
</t-watermark>
</template>
12 changes: 12 additions & 0 deletions examples/watermark/demos/movingImage.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<template>
<t-watermark
:watermark-content="{
url: 'https://tdesign.gtimg.com/starter/brand-logo-light.png',
}"
movable
:width="158"
:height="22"
>
<div style="height: 300px" />
</t-watermark>
</template>
10 changes: 10 additions & 0 deletions examples/watermark/demos/movingText.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<template>
<t-watermark
:watermark-content="{
text: '文字水印',
}"
movable
>
<div style="height: 300px" />
</t-watermark>
</template>
16 changes: 16 additions & 0 deletions examples/watermark/demos/multiline.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<template>
<t-watermark
:watermark-content="[
{ text: '水印文本', fontColor: 'black' },
{ url: 'https://tdesign.gtimg.com/starter/brand-logo-light.png' },
]"
:line-space="24"
:x="100"
:y="120"
:width="158"
:height="22"
:alpha="0.3"
>
<div style="height: 300px" />
</t-watermark>
</template>
35 changes: 35 additions & 0 deletions examples/watermark/usage/index.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!-- 该脚本为自动生成,如有需要请在 /script/generate-usage/index.js 中调整 -->
<template>
<base-usage :code="usageCode" :config-list="configList" :panel-list="panelList" @PanelChange="onPanelChange">
<template #watermark="{ configProps }"
><t-watermark
v-bind="configProps"
:watermark-content="{
text: '文字水印',
}"
:y="120"
:x="80"
>
<div style="height: 300px" /> </t-watermark
></template>
</base-usage>
</template>

<script setup lang="jsx">
/* eslint-disable */
import { ref, onMounted } from 'vue';
import configJson from './props.json';

const configList = ref(configJson);
const panelList = [{ label: 'watermark', value: 'watermark' }];

const usageCodeMap = {
watermark:
'\n <t-watermark\n v-bind="configProps"\n :watermark-content="{\n text: \'文字水印\',\n }"\n :y="120"\n :x="80"\n >\n <div style="height: 300px" />\n </t-watermark>\n ',
};
const usageCode = ref(`<template>${usageCodeMap[panelList[0].value].trim()}</template>`);

function onPanelChange(panel) {
usageCode.value = `<template>${usageCodeMap[panel].trim()}</template>`;
}
</script>
20 changes: 20 additions & 0 deletions examples/watermark/usage/props.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"name": "removable",
"type": "Boolean",
"defaultValue": true,
"options": []
},
{
"name": "movable",
"type": "Boolean",
"defaultValue": false,
"options": []
},
{
"name": "isRepeat",
"type": "Boolean",
"defaultValue": true,
"options": []
}
]
40 changes: 40 additions & 0 deletions examples/watermark/watermark.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
:: BASE_DOC ::

## API

### Watermark Props

名称 | 类型 | 默认值 | 说明 | 必传
-- | -- | -- | -- | --
alpha | Number | 1 | 水印整体透明度,取值范围 [0-1] | N
content | String / Slot / Function | - | 水印所覆盖的内容节点。TS 类型:`string | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue-next/blob/develop/src/common.ts) | N
default | String / Slot / Function | - | 水印所覆盖的内容节点,同 `content`。TS 类型:`string | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue-next/blob/develop/src/common.ts) | N
height | Number | - | 水印高度 | N
isRepeat | Boolean | true | 水印是否重复出现 | N
lineSpace | Number | 16 | 行间距,只作用在多行(`content` 配置为数组)情况下 | N
movable | Boolean | false | 水印是否可移动 | N
moveInterval | Number | 3000 | 水印发生运动位移的间隙,单位:毫秒 | N
offset | Array | - | 水印在画布上绘制的水平和垂直偏移量,正常情况下水印绘制在中间位置,即 `offset = [gapX / 2, gapY / 2]`。TS 类型:`Array<number>` | N
removable | Boolean | true | 水印是否可被删除,默认会开启水印节点防删 | N
rotate | Number | -22 | 水印旋转的角度,单位 ° | N
watermarkContent | Object / Array | - | 水印内容,需要显示多行情况下可配置为数组。TS 类型:`WatermarkText|WatermarkImage|Array<WatermarkText|WatermarkImage>` | N
width | Number | - | 水印宽度 | N
x | Number | - | 水印之间的水平间距 | N
y | Number | - | 水印之间的垂直间距 | N
zIndex | Number | - | 水印元素的 `z-index`,默认值写在 CSS 中 | N

### WatermarkText

名称 | 类型 | 默认值 | 说明 | 必传
-- | -- | -- | -- | --
fontColor | String | rgba(0,0,0,0.1) | 水印文本文字颜色 | N
fontSize | Number | 16 | 水印文本文字大小 | N
fontWeight | String | normal | 水印文本文字粗细。可选项:normal/lighter/bold/bolder | N
text | String | - | 水印文本内容 | N

### WatermarkImage

名称 | 类型 | 默认值 | 说明 | 必传
-- | -- | -- | -- | --
isGrayscale | Boolean | false | 水印图片是否需要灰阶显示 | N
url | String | - | 水印图片源地址,为了显示清楚,建议导出 2 倍或 3 倍图 | N
16 changes: 16 additions & 0 deletions script/generate-usage/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,22 @@ module.exports = {
`,
},
},
watermark: {
panelStr: `const panelList = [{label: 'watermark', value: 'watermark'}];`,
render: {
watermark: `
<t-watermark
v-bind="configProps"
:watermark-content="{
text: '文字水印',
}"
:y="120"
:x="80"
><div style="width:height: 200px" /></t-watermark>
`,
},
},

dialog: {
panelStr: `const panelList = [{label: 'dialog', value: 'dialog'}];`,
script: `
Expand Down
7 changes: 7 additions & 0 deletions site/site.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,13 @@ export default {
path: '/vue-next/components/tree',
component: () => import('@/examples/tree/tree.md'),
},
{
title: 'Watermark 水印',
name: 'watermark',
docType: 'data',
path: '/vue-next/components/watermark',
component: () => import('@/examples/watermark/watermark.md'),
},
],
},
{
Expand Down
1 change: 1 addition & 0 deletions src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export * from './tag';
export * from './tooltip';
export * from './tree';
export * from './collapse';
export * from './watermark';

// 消息提醒

Expand Down
75 changes: 75 additions & 0 deletions src/watermark/hooks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import type { ComponentPublicInstance, Ref } from 'vue';
import { unref, watch, getCurrentScope, onScopeDispose } from 'vue';

export const defaultWindow = typeof window !== 'undefined' ? window : undefined;
export interface ConfigurableWindow {
window?: Window;
}
// eslint-disable-next-line no-undef
export interface MutationObserverOptions extends MutationObserverInit, ConfigurableWindow {}
export type MaybeRef<T> = T | Ref<T>;
export type VueInstance = ComponentPublicInstance;
export type MaybeElementRef<T extends MaybeElement = MaybeElement> = MaybeRef<T>;
export type MaybeElement = HTMLElement | SVGElement | VueInstance | undefined | null;
export type UnRefElementReturn<T extends MaybeElement = MaybeElement> = T extends VueInstance
? Exclude<MaybeElement, VueInstance>
: T | undefined;

export type Fn = () => void;

export function unrefElement<T extends MaybeElement>(elRef: MaybeElementRef<T>): UnRefElementReturn<T> {
const plain = unref(elRef);
return (plain as VueInstance)?.$el ?? plain;
}
export function tryOnScopeDispose(fn: Fn) {
if (getCurrentScope()) {
onScopeDispose(fn);
return true;
}
return false;
}

export function useMutationObserver(
target: MaybeElementRef,
// eslint-disable-next-line no-undef
callback: MutationCallback,
samhou1988 marked this conversation as resolved.
Show resolved Hide resolved
options: MutationObserverOptions = {},
) {
const { window = defaultWindow, ...mutationOptions } = options;
let observer: MutationObserver | undefined;
const isSupported = window && 'MutationObserver' in window;

const cleanup = () => {
if (observer) {
observer.disconnect();
observer = undefined;
}
};

const stopWatch = watch(
() => unrefElement(target),
(el) => {
cleanup();

if (isSupported && window && el) {
observer = new MutationObserver(callback);
observer.observe(el, mutationOptions);
}
},
{ immediate: true },
);

const stop = () => {
cleanup();
stopWatch();
};

tryOnScopeDispose(stop);

return {
isSupported,
stop,
};
}

export type UseMutationObserverReturn = ReturnType<typeof useMutationObserver>;
7 changes: 7 additions & 0 deletions src/watermark/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import _Watermark from './watermark';
import withInstall from '../utils/withInstall';

export * from './type';

export const Watermark = withInstall(_Watermark);
export default Watermark;
79 changes: 79 additions & 0 deletions src/watermark/props.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/* eslint-disable */

/**
* 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
* */

import { TdWatermarkProps } from './type';
import { PropType } from 'vue';

export default {
/** 水印整体透明度,取值范围 [0-1] */
alpha: {
type: Number,
default: 1,
},
/** 水印所覆盖的内容节点 */
content: {
type: [String, Function] as PropType<TdWatermarkProps['content']>,
},
/** 水印所覆盖的内容节点,同 `content` */
default: {
type: [String, Function] as PropType<TdWatermarkProps['default']>,
},
/** 水印高度 */
height: {
type: Number,
},
/** 水印是否重复出现 */
isRepeat: {
type: Boolean,
default: true,
},
/** 行间距,只作用在多行(`content` 配置为数组)情况下 */
lineSpace: {
type: Number,
default: 16,
},
/** 水印是否可移动 */
movable: Boolean,
/** 水印发生运动位移的间隙,单位:毫秒 */
moveInterval: {
type: Number,
default: 3000,
},
/** 水印在画布上绘制的水平和垂直偏移量,正常情况下水印绘制在中间位置,即 `offset = [gapX / 2, gapY / 2]` */
offset: {
type: Array as PropType<TdWatermarkProps['offset']>,
},
/** 水印是否可被删除,默认会开启水印节点防删 */
removable: {
type: Boolean,
default: true,
},
/** 水印旋转的角度,单位 ° */
rotate: {
type: Number,
default: -22,
},
/** 水印内容,需要显示多行情况下可配置为数组 */
watermarkContent: {
type: [Object, Array] as PropType<TdWatermarkProps['watermarkContent']>,
},
/** 水印宽度 */
width: {
type: Number,
},
/** 水印之间的水平间距 */
x: {
type: Number,
},
/** 水印之间的垂直间距 */
y: {
type: Number,
},
/** 水印元素的 `z-index`,默认值写在 CSS 中 */
zIndex: {
type: Number,
},
};
Loading