将企业主题色融入WPS365产品界面,使之与企业风格更为统一

如何为文档中心定制主题皮肤?

本定制方案仅适用于私有化WPS365版本

1. 方案概述

主题皮肤就是文档中心提供的界面颜色,下图为文档中心标准产品的主题皮肤:

主题皮肤

出于以下需求的考虑,客户可能会需要定制个性化的主题皮肤:

  1. 优化办公体验:不同员工对光线敏感度不同(如深色模式减少眼睛疲劳,浅色模式提升清晰度),个性化选择可提升使用舒适度。
  2. 情绪管理:颜色心理学影响情绪(如蓝色提升专注、绿色缓解压力),员工可选择能激发积极状态的主题。
  3. 增强企业文化认同感:企业主题色(如LOGO色)融入软件界面,强化员工和客户对品牌的日常感知。
实现效果4ZEQN4Q6ADACM深色模式4JYQN4Q6ACQAU浅色模式TPCQN4Q6AAAAO护眼模式2YRBR4Q6ABQHE跟随系统模式注:以上展示的【深色】【浅色】【护眼】模式的具体颜色效果由客户自己定义,上图仅作参考示例
依赖端文档中心PC端
依赖版本23.0907(含)以上
依赖操作系统支持X86、XC

2. 使用指南

👉自定义用户头像悬浮面板菜单

能力

sdk.kdrive.header.rightPanel.userPanel.menu

方法

onChange

头部-搜索框右侧区域-鼠标悬浮用户头像-用户面板-菜单区域-改变事件

信息内容
支持版本23.0907
是否支持多插件true
是否支持异步false
兼容性说明

参数

参数名称必选类型描述
listener(props: UserPanelMenuChangeAdapter) => IUserPanelMenu[]export type IUserPanelMenu = {key: string;name: string;icon: any;execute?: (key?: string) => void;children?: {key: string;name: string;check?: boolean;}[];};export class UserPanelMenuChangeAdapter extends ObjectAdapter {get operationList() {}set operationList(value) {}get userInfo() {}get execute() {}}

示例

sdk.kdrive.header.rightPanel.userPanel.menu.onChange((data)=>{
  console.log(data, 'menus')
  data.operationList.add({key:'xx',name:'xx'})
})

👉主题皮肤切换功能实现

引入kdesgin 主题样式文件

import '@kdocs/kdesign-theme/dark.css'      // 深色模式
import '@kdocs/kdesign-theme/default.css'   // 浅色模式
ZZP7L4I6ACQGY

也可以自己定义新主题

// index.css
/* 新定义的主题 护眼模式*/
:root[theme-mode=green] {
  --kd-color-background-base: #88c5b1;
  --kd-color-background-bottom: #90d1c6;
}

通过theme-mode属性控制主题样式

document.documentElement.setAttribute('theme-mode', 'dark');
document.documentElement.setAttribute('theme-mode', 'green');

👉详细代码示例

目录结构

ecis-frontend-plugin-custom-frame/
├── src/
│   ├── libs/
│   │   ├── i18n/
│   │   │   ├── locales/
│   │   │   │   ├── zh-CN.json  // 包含中文语言的翻译键值对
│   │   │   │   ├── zh-HK.json  // 包含繁体语言的翻译键值对
│   │   │   │   ├── en-US.json  // 包含英文语言的翻译键值对
│   ├── plugin/
│   │   ├── plugin.tsx   // 插件功能具体实现

插件实现plugin.tsx

import React, { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import '@kdocs/kdesign-theme/dark.css';
import '@kdocs/kdesign-theme/default.css';
import './index.css';
import sdk from '../libs/sdk';

const Plugin = () => {
  const { t } = useTranslation();
  const themeList = [
    { key: 'light', name: t('theme.light') },
    { key: 'dark', name: t('theme.dark') },
    { key: 'green', name: t('theme.green') },
    { key: 'system', name: t('theme.system') },
  ];

  const isCheck = (key: string) => {
    const theme = window.localStorage.getItem('colorTheme') || themeList[0].key;
    return theme === key;
  };

  // 检测系统主题
  const systemTheme = window.matchMedia('(prefers-color-scheme: dark)');
  let isSystemListen = false;

  const setCurrentTheme = (theme: string) => {
    document.documentElement.setAttribute('theme-mode', theme);
    localStorage.setItem('colorTheme', theme);
  };

  const setTheme = (theme: string) => {
    if (theme === 'system') {
      handleSystemThemeChange(systemTheme);
      addSystemListener();
    } else {
      removeSystemListener();
      setCurrentTheme(theme);
    }
  };

  const handleSystemThemeChange = (e: MediaQueryListEvent | MediaQueryList) => {
    const theme = e.matches ? 'dark' : 'light';
    setCurrentTheme(theme);
  };

  // 添加系统主题监听
  function addSystemListener() {
    if (!isSystemListen) {
      systemTheme.addEventListener('change', handleSystemThemeChange);
      isSystemListen = true;
    }
  }

  // 移除系统主题监听
  function removeSystemListener() {
    if (isSystemListen) {
      systemTheme.removeEventListener('change', handleSystemThemeChange);
      isSystemListen = false;
    }
  }

  const addEntrance = async () => {
    // 这里插件按需异步加载资源报引入sdk.xxx
    const kdrive = await sdk.kdrive;

   // 头部头像悬浮面板新增自定义菜单
    kdrive.header.rightPanel.userPanel.menu.onChange((data: any) => {
      console.warn('userPanel.data', data);
      if (~data.operationList.items().findIndex((item: IUserPanelMenu) => item.key === 'theme')) return;
      // add方法第二个参数代表你要插入位置的索引
      data.operationList.add({
        key: 'theme',
        name: t('theme.title'),
        children: themeList.map((item) => ({ key: item.key, name: item.name, check: isCheck(item.key) })),
        execute: (key: string) => {
          // 设置当前主题
          setTheme(key);
          // 更新主题菜单选中状态
          data.operationList.items().forEach((item: any) => {
            if (item.key === 'theme') {
              item.children.items().forEach((child: any) => {
                child.check = child.key === key;
              });
            }
          });
          // 更新menu data
          data.execute(data.operationList._data, 'theme');
        },
      });
    });
  };

  useEffect(() => {
    addEntrance();
  }, []);

  return null;
};

export default React.memo(Plugin);

👉效果截图

深色模式4ZEQN4Q6ADACM
浅色模式4JYQN4Q6ACQAU
跟随系统2YRBR4Q6ABQHE
护眼模式TPCQN4Q6AAAAO

相关新闻

  • 双因子认证

    双因子认证

    企业出于安全考虑,需要在修改功能或登录密级较高的页面时,对成员进行二次身份校验 企业需要双因子认证时,可以怎么操作? 该组件仅适用于私有化WPS365版本 1. 方案概述 一般来讲,用户登录的安全认证分为两种: 文档中心使用的是单因子认证的方式。 出于安全考虑,企业需要在修改定制应用功能前,比如修改消息审计、全局配置前。 或登录密级较高的页面时,对成员进行二次身份校验。 针对这种情况,我们可以使用文档中心管理后台的开放能力,定制双因子认证 实现效果 用户登录管理后台时,页面会跳出窗口,提醒用户绑…

    最佳实践 2025年12月11日
  • 告别Excel乱崩+电话催办!WPS 365,一键搭建任务预警平台,进度可视化、协作不内耗

    告别Excel乱崩+电话催办!WPS 365,一键搭建任务预警平台,进度可视化、协作不内耗

    “任务太多没人交?3张表搞定进度监控!告别手动催办、Excel崩溃,用多维表格搭建动态预警平台,实时掌握谁交了、谁没交,让任务管理从‘被动催’变‘主动看’!零代码低成本,精准解决大型软件没覆盖的边缘需求。”

    企业数智化转型 2026年1月2日
  • 自定义文件传输面板

    自定义文件传输面板

    自定义文件传输面板,解决将文件从邮件、OA等系统中拉取文件上传到云文档过程中,传输进度无法跟踪的问题 定制导致文档上传逻辑改变,传输面板无法正常唤起,怎么办? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 用户上传文件时,文档中心页面会出现一个显示“文件上传进度”的面板,这就是传输面板。 上传文件时 这里会显示上传进度,这就是“传输面板” 当企业在WPS文档中心上做了某些定制能力,可能导致WPS文档中心原有的上传逻辑被改变,影响传输面板的正常唤起,使得企业用户上传文件时,无从得知“文…

    最佳实践 2025年12月11日
  • 新增自定义侧边栏菜单

    新增自定义侧边栏菜单

    企业想把文档中心上定制的新功能放在文档中心上,可以将入口放在文档中心左侧Tab栏

    最佳实践 2025年12月11日
  • 限制企业用户上传特定文件

    限制企业用户上传特定文件

    有些企业出于文档安全、带宽分配等原因,需要限制或全面杜绝文件上传。文档中心开放能力支持企业定制上传功能。 如何限制企业用户上传特定文件? 本定制方案仅适用于私有化WPS365版本 1. 方案概述 有些企业出于文档安全、带宽分配等原因,需要限制文件上传: 有些企业希望完全杜绝以上风险,全面禁止企业用户上传文件。 针对这两种情况,我们可以使用文档中心服务端、Web端(PC端)、H5端(移动端)的开放能力,定制上传功能: 实现方式&效果 方案一需禁止特定文件类型 通过修改文件上传接口的策略并进行校验,…

    最佳实践 2025年12月11日
  • 应用中心增加常用应用

    应用中心增加常用应用

    出于使用便捷的考虑,企业需要将常用应用放在统一入口 如何在应用中心添加常用应用入口? 该组件仅适用于私有化WPS365版本 1. 插件概述 出于使用便捷的考虑,企业需要将常用应用放在统一入口里。 比如,企业会将自己的OA、ERP等常用应用地址放到应用中心里,变成一个能找到所需应用的快捷入口。 包含三类应用:WPS自带应用、第三方应用和企业自研应用。 针对这种需求,我们可以使用文档中心PC端的开放能力,定制应用中心入口 实现效果 企业可以将第三方应用或自研应用加入应用中心。比如:将WPS Offi…

    最佳实践 2025年12月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

立即咨询 企业版试用 上门服务

请您留言

感谢您的关注,你可留下联系方式,我们将第一时间与您联系。