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
英文地址,請注明出處:http://en.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;能讓數據篩選更加精準高效。本文將系統講解這些運算符…