bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十三)

主题定制

📖 阅读时间:7 分钟 | 🎯 等级:进阶

前言

Robot_Admin应用程序具有灵活的主题系统,支持浅色、深色和基于系统的模式,以及程序化的主题定制。本指南介绍了如何在开发工作中使用和扩展主题功能。

一、主题系统概述

Robot_Admin的主题系统建立在NaiveUI的主题功能之上,并进行了自定义扩展。它由以下几个关键组件组成:

  • 主题配置 - 定义主题颜色、样式和特定组件的覆盖
  • 主题存储 - 管理主题状态、持久性和过渡
  • 主题UI组件 - 提供用于切换主题的用户界面
  • 全局主题提供者 - 在整个应用程序中应用主题

系统支持三种主题模式:

  1. 浅色模式 - 默认浅色外观
  2. 深色模式 - 适用于低光环境的深色外观
  3. 系统模式 - 自动与用户的系统偏好同步

来源:theme.ts, App.vue

二、使用主题切换器

应用程序包含一个内置的主题切换器组件,允许用户循环切换可用的主题模式。该组件默认包含在应用程序头部:

<!-- 主题切换器自动循环切换模式 -->
<C_Theme />

主题切换器根据当前模式显示不同的图标:

  • 🌞 浅色模式 - 太阳图标
  • 🌙 深色模式 - 月亮和星星图标
  • ☀️🌙 系统模式 - 太阳-月亮-星星图标

来源:C_Theme/index.vue, C_Header/index.vue

三、主题配置结构

主题配置在src/config/theme.ts中定义,遵循扩展NaiveUI主题系统的结构化格式。

基本主题结构

interface GlobalThemeOverrides {// 应用到整个主题的通用属性common?: {primaryColor?: stringprimaryColorHover?: string// 其他通用属性}// 特定组件的主题属性Menu?: {itemTextColor?: stringitemColorActive?: string// 其他菜单属性}Button?: {// 按钮特定属性}// 其他组件覆盖
}

此结构允许您自定义全局主题属性和特定组件的样式。

来源:theme.ts

默认主题

应用程序附带了预配置的浅色和深色主题:

// 浅色主题示例(简化)
export const themeOverrides: GlobalThemeOverrides = {common: {primaryColor: '#2080f0',primaryColorHover: '#4098fc',// 其他通用属性bodyColor: '#0d1425',},Menu: lightMenuConfig,
}// 深色主题示例(简化)
export const darkThemeOverrides: GlobalThemeOverrides = {common: {primaryColor: '#2080f0',primaryColorHover: '#4098fc',// 其他通用属性},Menu: darkMenuConfig,
}

来源:theme.ts

四、程序化主题管理

您可以使用主题存储来程序化管理主题。这在您需要自定义主题或响应组件中的用户偏好时非常有用。

访问主题存储

import { useThemeStore } from '@/stores/theme'// 在您的组件设置中
const themeStore = useThemeStore()

读取主题信息

// 检查是否为深色模式
const isDarkMode = themeStore.isDark// 获取当前主题模式('light'、'dark'或'system')
const currentMode = themeStore.mode// 访问主题覆盖
const themeConfig = themeStore.themeOverrides

更改主题模式

// 切换到深色模式
themeStore.setMode('dark')// 切换到浅色模式
themeStore.setMode('light')// 跟随系统偏好
themeStore.setMode('system')

setMode方法包括主题之间的平滑过渡,以增强用户体验。

来源:theme/index.ts

自定义主题

您可以在运行时自定义主题属性:

// 更新主颜色
themeStore.updateThemeOverrides({common: {primaryColor: '#ff0000',  // 更改为红色primaryColorHover: '#ff3333'}
})// 重置为默认主题
themeStore.resetThemeOverrides()

自定义主题设置会自动持久化到localStorage,因此当用户返回时会被恢复。

来源:theme/index.ts

五、全局主题应用

主题通过NaiveUI的NConfigProvider在应用程序根目录应用:

<template><NConfigProvider:theme="themeStore.currentTheme":theme-overrides="themeStore.themeOverrides":locale="zhCN":date-locale="dateZhCN"class="global-config-provider"><!-- 应用程序内容 --></NConfigProvider>
</template>

这确保了所有组件之间的一致性主题。

来源:App.vue

六、主题过渡

主题存储包括内置过渡,以实现平滑的主题切换。调用setMode()时,它会自动:

  1. 为相关元素添加过渡样式
  2. 应用不透明度过渡以减少视觉闪烁
  3. 等待过渡完成后再清理
// 主题过渡代码(简化)
const setMode = async (newMode: ThemeMode) => {// 创建过渡样式const transitionStyle = document.createElement('style')transitionStyle.textContent = `/* 全局过渡效果 */.layout-container :deep(.n-layout .n-layout-scroll-container),.layout-sider, .n-menu, .layout-header, .layout-footer {transition: background-color 0.35s cubic-bezier(0.4, 0, 0.2, 1) !important;}`document.head.appendChild(transitionStyle)// 设置新模式mode.value = newModelocalStorage.setItem(THEME_MODE_KEY, newMode)// 过渡后清理setTimeout(() => {document.head.removeChild(transitionStyle)}, 750)
}

来源:theme/index.ts

七、扩展主题系统

为了进行更多自定义,您可以:

1. 添加新的主题属性

更新theme.ts中的GlobalThemeOverrides接口,以包含您的自定义属性:

export interface GlobalThemeOverrides {common?: {// 现有属性primaryColor?: string// 您的自定义属性accentColor?: stringcardBackground?: string}// 添加新的组件覆盖YourComponent?: {backgroundColor?: stringtextColor?: string}
}

2. 创建主题定制UI

您可以创建一个专用的主题定制组件,允许用户调整主题属性:

<template><div class="theme-customizer"><h3>主题定制器</h3><div class="color-picker-group"><label>主颜色</label><input type="color" v-model="primaryColor"@change="updateTheme"/></div><!-- 其他定制控件 --><button @click="resetTheme">重置为默认</button></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import { useThemeStore } from '@/stores/theme'const themeStore = useThemeStore()
const primaryColor = ref('#2080f0')onMounted(() => {// 初始化当前主题值primaryColor.value = themeStore.themeOverrides.common?.primaryColor || '#2080f0'
})const updateTheme = () => {themeStore.updateThemeOverrides({common: {primaryColor: primaryColor.value,// 自动派生其他颜色primaryColorHover: lightenColor(primaryColor.value, 10),primaryColorPressed: darkenColor(primaryColor.value, 10)}})
}const resetTheme = () => {themeStore.resetThemeOverrides()primaryColor.value = '#2080f0'
}
</script>

结论

Robot_Admin主题系统为创建视觉吸引力和可定制的用户界面提供了坚实的基础。通过利用内置的主题存储和配置系统,您可以创建尊重用户偏好的应用程序,同时保持一致的设计语言。

对于大多数用例,默认主题模式(浅色/深色/系统)将足够。对于更高级的场景,程序化API允许完全自定义主题属性,以满足您的特定需求。


💡 提示:如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和关注,我会持续分享更多前端开发的实战经验。

🏷️ 标签:#前端开发 #Vue3 #NaiveUI #主题定制 #暗黑模式
 

  期待共建!

如果这套组件系统对你的开发工作有所启发或帮助,请不要吝啬你的 Star!每一个 ⭐ 都是对我最大的鼓励和支持。

👉 点击这里 Star 支持项目 (🧧行大运摸大票💰)

🔗 探索更多资源

📋 资源类型

🔗 链接

📝 说明

🎯 在线预览

robotadmin.cn

体验完整功能演示

📚 详细文档

tzagileteam.com

深入了解实现细节

💻 源码仓库

https:/github.com/ChenyCHENYU/Robot_Admin

获取完整源代码

非常期待听到你的想法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93538.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检测pytorch是否安装好

如果pytorch安装成功即可导入。import torch查看cuda是否可用&#xff0c;可用的话返回“ture”。print(torch.cuda.is_available())查看可用的cuda数量。print(torch.cuda.device_count())查看cuda的版本号。print(torch.version.cuda)

java八股文-(spring cloud)微服务篇-参考回答

一. 面试官&#xff1a;Spring Cloud 5大组件有哪些&#xff1f;Spring Cloud 的五大核心组件包括&#xff1a;注册中心&#xff1a;第一代使用 Eureka&#xff0c;第二代使用 Nacos。负载均衡&#xff1a;第一代使用 Ribbon&#xff0c;第二代使用 Spring Cloud LoadBalancer。…

发布npmjs组件库

一.初始化项目1.用Vite创建空项目2.安装打包与声明文件插件pnpm i -D vite-plugin-dts sass二.首先修改项目内容// src\index.ts import { type App } from vue; import oneComponent from "./components/oneComponent/index.vue"; import twoComponent from ".…

【C语言16天强化训练】从基础入门到进阶:Day 2

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人…

【学习笔记】面向AI安全的26个缓解措施

一、Mitre Atlas矩阵概述 ATLAS 矩阵从左到右以列形式显示了攻击中使用的策略的进展&#xff0c;ML 技术属于上面的每种策略。& 表示从 ATT&CK 改编而来。 详见&#xff1a;ATLAS Matrix | MITRE ATLAS™ 注&#xff1a;机翻的效果不是太好&#xff0c;对照理解用吧。 …

AI出题人给出的Java后端面经(十八)(日更)

链接双端链表 前一篇&#xff1a;AI出题人给出的Java后端面经&#xff08;十七&#xff09;&#xff08;日更&#xff09; 后一篇&#xff1a;null 目录 &#x1f535; 一、Java基础&#xff08;Java 17&#xff09; 答案&#xff1a; &#x1f5c3;️ 二、持久化层&…

【音视频】瑞芯微、全志芯片在运动相机和行车记录仪产品分析

文章目录开头总结详细分析**1. 瑞芯微芯片的典型型号及特性****2. 运动相机场景的适用性****优势****劣势****3. 行车记录仪场景的适用性****优势****劣势****4. 与竞品芯片对比****5. 推荐方案选择****总结****1. 全志芯片的典型型号及特性****2. 运动相机场景的适用性****优势…

《清华级防护,了解一下?》

前言讲到渗透&#xff0c;我们不可避免会遇到有waf拦截咱们的攻击许多朋友在渗透测试中因为遇到WAF而束手无策&#xff0c;实际上所谓的BYPASS WAF实际上是去寻找位于WAF设备之后处理应用层数据包的硬件/软件的特性。利用特性构造WAF不能命中&#xff0c;但是在应用程序能够执行…

CANDB++中的CAN_DBC快速编辑方法,使用文本编辑器(如notepad++和VScode)

前言:在做工程机械CAN协议相关的软件开发与调试时&#xff0c;经常接触到DBC的使用&#xff0c;可以在CAN分析仪中加载DBC文件从而快速查看某条CAN报文或信号的含义&#xff0c;以及使用图形化的调试。而编辑DBC文件&#xff0c;正常是用CANDB来一条条添加&#xff0c;比较费时…

Tmux Xftp及Xshell的服务器使用方法

Tmux&#xff1a; Tmux是什么&#xff1a; 会话与进程&#xff1a; 命令行的典型使用方式是&#xff0c;打开一个终端窗口&#xff0c;在里面输入命令。用户与计算机的这种临时的交互&#xff0c;称为一次“会话”&#xff08;session&#xff09;。 会话的一个重要特点是&…

微服务远程调用完全透传实现:响应式与非响应式解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Kotlin集合概述

Kotlin 的集合类同样由两个接口派生&#xff1a; Collection 和 Map&#xff0c; Collection 和 Map 是 Java 集合框架的根接口&#xff0c;这两个接口又包含了 一些子接口或实现类Kotlin 集合与 Java 集合不同&#xff0c; Java 集合都是可变集合一一开发者可以向集合中添加、…

Mysql核心框架知识

Mysql核心框架 本文旨在梳理和理解 MySQL 的一些核心知识点&#xff0c;并结合常见面试题进行思考和总结。这些内容主要来源于我的个人学习与理解。 1. 事务 概念 事务指的是满足 ACID 特性的一组操作&#xff0c;可以通过 Commit 提交一个事务&#xff0c;也可以使用 Rollback…

C# NX二次开发:字符串控件StringBlock讲解

大家好&#xff0c;今天介绍ug二次开发过程中的一个叫字符串的控件&#xff0c;这个控件在块UI编辑器中可以使用。 下面是这个控件中的一些属性和方法&#xff1a; 1、 protected internal StringBlock(); // // 摘要: // Returns or sets the WideValue.…

【datawhale组队学习】n8n TASK01

教程地址&#xff1a;https://github.com/datawhalechina/handy-n8n/ 文章目录n8n节点的类别local-pc-deployn8n n8n 意思是 nodemation&#xff0c;是 node 与 automation 的组合词&#xff0c;读作 n-eight-n。 n8n 是一个开源的、基于节点的自动化工具&#xff0c;官方站点…

海洋牧场项目融资新曙光:绿色金融赋能蓝色经济发展

在海洋经济蓬勃发展的时代浪潮中&#xff0c;海洋牧场作为新兴的海洋产业模式&#xff0c;承载着保障国家粮食安全、促进海洋生态保护与可持续利用的重要使命。然而&#xff0c;海洋牧场项目的建设是一项庞大而复杂的系统工程&#xff0c;从前期的基础设施搭建、种苗培育&#…

51c大模型~合集170

自己的原文哦~ https://blog.51cto.com/whaosoft/14132244 #4DNeX 一张图&#xff0c;开启四维时空&#xff1a;4DNeX让动态世界 「活」起来 仅凭一张照片&#xff0c;能否让行人继续行走、汽车继续飞驰、云朵继续流动&#xff0c;并让你从任意视角自由观赏&#…

深入剖析以太坊虚拟机(EVM):区块链世界的计算引擎

引言&#xff1a;EVM——区块链世界的"计算引擎" 以太坊虚拟机&#xff08;Ethereum Virtual Machine&#xff0c;EVM&#xff09;是以太坊网络的核心创新&#xff0c;它不仅仅是一个执行环境&#xff0c;更是整个区块链生态系统的"计算引擎"。作为智能合…

深入分析 Linux PCI Express 子系统

深入分析 Linux PCI Express 子系统 一、PCI Express 工作原理 PCIe 是一种高速串行点对点互连协议&#xff0c;采用分层架构&#xff1a; #mermaid-svg-rsh0SW87JPR0aUxA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid…

MySQL 运算符详解:逻辑、位运算与正则表达式应用

MySQL 运算符详解&#xff1a;逻辑、位运算与正则表达式应用 在 MySQL 中&#xff0c;运算符是构建复杂查询条件的基础。除了基础的算术和比较运算符&#xff0c;逻辑运算符、位运算符以及正则表达式的灵活运用&#xff0c;能让数据筛选更加精准高效。本文将系统讲解这些运算符…