Skip to content

主题定制

ExUI 提供了灵活的主题系统,让你可以轻松定制组件的外观以匹配你的品牌风格。

默认主题

ExUI 内置了多个赛博朋克风格主题:

  • neon-blue - 霓虹蓝主题(默认)
  • neon-purple - 霓虹紫主题
  • dark - 纯黑暗主题
  • high-contrast - 高对比度主题

切换主题

使用 ConfigProvider

推荐使用 ExConfigProvider 组件来配置主题:

vue
<script setup>
import { ref } from 'vue'
import { ExConfigProvider } from 'vue-ex-ui'

const theme = ref('neon-blue')
</script>

<template>
  <ExConfigProvider :theme="theme">
    <div class="theme-switcher">
      <button @click="theme = 'neon-blue'">霓虹蓝</button>
      <button @click="theme = 'neon-pink'">霓虹粉</button>
      <button @click="theme = 'dark'">暗黑</button>
      <button @click="theme = 'high-contrast'">高对比度</button>
    </div>
    
    <App />
  </ExConfigProvider>
</template>

使用组合式 API

在组件中使用 useTheme 获取和切换主题:

vue
<script setup>
import { useTheme } from 'vue-ex-ui'

const theme = useTheme()

// 获取当前主题
console.log(theme.value) // 'neon-blue'

// 切换主题(需要在 ConfigProvider 内部)
const switchTheme = (newTheme) => {
  // 通过更新 ConfigProvider 的 theme prop 来切换
}
</script>

自定义主题

CSS 变量覆盖

你可以通过覆盖 CSS 变量来自定义主题:

css
:root {
  /* 主色调 */
  --ex-primary: #ff6b35;
  --ex-secondary: #f7931e;
  
  /* 背景色 */
  --ex-bg-primary: #1a1a2e;
  --ex-bg-secondary: #16213e;
  
  /* 文本色 */
  --ex-text-primary: #ffffff;
  --ex-text-secondary: #b8b8b8;
}

SCSS 主题文件

创建自定义主题文件:

scss
// themes/custom.scss
:root[data-theme="custom"] {
  --ex-primary: #ff6b35;
  --ex-primary-hover: #ff5722;
  --ex-primary-active: #e64a19;
  
  --ex-secondary: #f7931e;
  --ex-accent: #4caf50;
  
  --ex-bg-primary: #1a1a2e;
  --ex-bg-secondary: #16213e;
  --ex-bg-elevated: #0f3460;
  
  --ex-text-primary: #ffffff;
  --ex-text-secondary: #b8b8b8;
  --ex-text-disabled: #666666;
  
  --ex-border: #333333;
  --ex-shadow: rgba(255, 107, 53, 0.2);
}

然后在应用中引入:

typescript
import './themes/custom.scss'

// 使用自定义主题
setTheme('custom')

主题变量参考

颜色变量

scss
// 主色调
--ex-primary: #29ABE2;
--ex-primary-hover: #1e8bb8;
--ex-primary-active: #1a7ba3;

--ex-secondary: #a86bff;
--ex-accent: #ff3bd1;

// 背景色
--ex-bg-primary: #0b0f14;
--ex-bg-secondary: #0f1720;
--ex-bg-elevated: #1a2332;

// 文本色
--ex-text-primary: #e6f0ff;
--ex-text-secondary: #8fa3b8;
--ex-text-disabled: #4a5568;

// 边框和阴影
--ex-border: #2d3748;
--ex-shadow: rgba(41, 171, 226, 0.15);

间距变量

scss
--ex-space-xs: 4px;
--ex-space-sm: 8px;
--ex-space-md: 16px;
--ex-space-lg: 24px;
--ex-space-xl: 32px;
--ex-space-xxl: 48px;

字体变量

scss
--ex-font-family-base: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
--ex-font-family-mono: 'JetBrains Mono', 'Fira Code', monospace;

--ex-font-size-xs: 12px;
--ex-font-size-sm: 14px;
--ex-font-size-md: 16px;
--ex-font-size-lg: 18px;
--ex-font-size-xl: 20px;

动画变量

scss
--ex-duration-fast: 150ms;
--ex-duration-normal: 300ms;
--ex-duration-slow: 500ms;

--ex-ease-in: cubic-bezier(0.4, 0, 1, 1);
--ex-ease-out: cubic-bezier(0, 0, 0.2, 1);
--ex-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);

响应式主题

ExUI 支持基于屏幕尺寸的响应式主题:

scss
// 移动端主题调整
@media (max-width: 768px) {
  :root {
    --ex-font-size-md: 14px;
    --ex-space-md: 12px;
  }
}

// 大屏幕主题调整
@media (min-width: 1200px) {
  :root {
    --ex-font-size-md: 18px;
    --ex-space-md: 20px;
  }
}

暗色模式

ExUI 自动支持系统暗色模式:

scss
@media (prefers-color-scheme: dark) {
  :root {
    --ex-bg-primary: #000000;
    --ex-text-primary: #ffffff;
  }
}

你也可以使用 ConfigProvider 手动控制暗色模式:

vue
<script setup>
import { ref, onMounted } from 'vue'
import { ExConfigProvider } from 'vue-ex-ui'

const theme = ref('neon-blue')

// 检测系统暗色模式偏好
onMounted(() => {
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
  if (prefersDark) {
    theme.value = 'dark'
  }
  
  // 监听系统主题变化
  window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
    theme.value = e.matches ? 'dark' : 'neon-blue'
  })
})
</script>

<template>
  <ExConfigProvider :theme="theme">
    <App />
  </ExConfigProvider>
</template>

持久化主题

将用户选择的主题保存到 localStorage:

vue
<script setup>
import { ref, watch, onMounted } from 'vue'
import { ExConfigProvider } from 'vue-ex-ui'

const theme = ref('neon-blue')

// 从 localStorage 恢复主题
onMounted(() => {
  const savedTheme = localStorage.getItem('ex-ui-theme')
  if (savedTheme) {
    theme.value = savedTheme
  }
})

// 保存主题到 localStorage
watch(theme, (newTheme) => {
  localStorage.setItem('ex-ui-theme', newTheme)
})
</script>

<template>
  <ExConfigProvider :theme="theme">
    <App />
  </ExConfigProvider>
</template>

更多配置

查看 ConfigProvider 文档 了解更多全局配置选项,包括:

  • 语言切换
  • 全局尺寸
  • 霓虹效果控制
  • 动画控制
  • 命名空间自定义
  • z-index 管理