mirror of
https://gitee.com/dapppp/ruoyi-plus-vben5.git
synced 2026-03-08 07:31:09 +08:00
feat(theme): 集成快乐工作主题的按钮波纹效果
从 @antdv-next/happy-work-theme 引入 DotEffect 组件,替换原有的自定义快乐波纹效果实现。这提升了波纹动画的视觉效果和一致性,并遵循了该主题库的推荐用法。 - 在 pnpm-workspace.yaml 和 package.json 中添加 @antdv-next/happy-work-theme 依赖 - 更新按钮波纹模式选择器的类型定义以匹配 ThemePreferences - 重写 showHappyEffect 函数,使用 createApp 动态挂载 DotEffect 组件
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
"dependencies": {
|
||||
"@alova/adapter-axios": "catalog:",
|
||||
"@antdv-next/auto-import-resolver": "catalog:",
|
||||
"@antdv-next/happy-work-theme": "catalog:",
|
||||
"@antdv-next/icons": "catalog:",
|
||||
"@tinymce/tinymce-vue": "catalog:",
|
||||
"@vben/access": "workspace:*",
|
||||
|
||||
@@ -2,6 +2,10 @@ import type { ConfigProviderProps } from 'antdv-next';
|
||||
|
||||
import type { ThemePreferences } from '@vben/preferences';
|
||||
|
||||
import { createApp, h } from 'vue';
|
||||
|
||||
import { DotEffect } from '@antdv-next/happy-work-theme';
|
||||
|
||||
const createHolder = (node: HTMLElement) => {
|
||||
const { borderWidth } = getComputedStyle(node);
|
||||
const borderWidthNum = Number.parseInt(borderWidth, 10);
|
||||
@@ -104,30 +108,33 @@ const showShakeEffect: WaveConfig['showEffect'] = (node, { component }) => {
|
||||
loop();
|
||||
};
|
||||
|
||||
const showHappyEffect: WaveConfig['showEffect'] = (
|
||||
node,
|
||||
{ event, component },
|
||||
) => {
|
||||
if (component !== 'Button') {
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* copy from https://github.com/antdv-next/happy-work-theme?tab=readme-ov-file#advanced-usage-with-doteffect
|
||||
*/
|
||||
const showHappyEffect: WaveConfig['showEffect'] = (target, info) => {
|
||||
const { token, hashId } = info;
|
||||
|
||||
const holder = createHolder(node);
|
||||
const rect = holder.getBoundingClientRect();
|
||||
const left = event.clientX - rect.left;
|
||||
const top = event.clientY - rect.top;
|
||||
const color = `hsl(${Math.floor(Math.random() * 360)}, 80%, 70%)`;
|
||||
const holder = document.createElement('div');
|
||||
holder.style.position = 'absolute';
|
||||
holder.style.left = '0px';
|
||||
holder.style.top = '0px';
|
||||
document.body.append(holder);
|
||||
|
||||
const dot = createDot(holder, color, left, top, 16);
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
dot.addEventListener('transitionend', () => {
|
||||
holder.remove();
|
||||
});
|
||||
dot.style.width = '220px';
|
||||
dot.style.height = '220px';
|
||||
dot.style.opacity = '0';
|
||||
const app = createApp({
|
||||
render() {
|
||||
return h(DotEffect, {
|
||||
target,
|
||||
token,
|
||||
hashId,
|
||||
onFinish: () => {
|
||||
app.unmount();
|
||||
holder.remove();
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
app.mount(holder);
|
||||
};
|
||||
|
||||
export const waveConfigs: Array<{
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import type { ThemePreferences } from '@vben/preferences';
|
||||
|
||||
import { ToggleGroup, ToggleGroupItem } from '@vben-core/shadcn-ui';
|
||||
|
||||
defineOptions({
|
||||
@@ -9,7 +11,11 @@ const modelValue = defineModel<string>('themeButtonWaveMode', {
|
||||
default: 'default',
|
||||
});
|
||||
|
||||
const items = [
|
||||
type ButtonWaveModeItem = {
|
||||
label: ThemePreferences['buttonWaveMode'];
|
||||
value: ThemePreferences['buttonWaveMode'];
|
||||
};
|
||||
const items: ButtonWaveModeItem[] = [
|
||||
{ label: 'Default', value: 'Default' },
|
||||
{ label: 'Disabled', value: 'Disabled' },
|
||||
{ label: 'Happy', value: 'Happy' },
|
||||
|
||||
@@ -23,6 +23,7 @@ overrides:
|
||||
catalog:
|
||||
'@alova/adapter-axios': ^2.0.17
|
||||
'@antdv-next/auto-import-resolver': 1.0.0-rc.1
|
||||
'@antdv-next/happy-work-theme': ^1.0.0
|
||||
'@antdv-next/icons': 1.0.0-beta.1
|
||||
'@ast-grep/napi': ^0.39.9
|
||||
'@changesets/changelog-github': ^0.5.2
|
||||
|
||||
Reference in New Issue
Block a user