npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@pixie-ui/theme

v1.1.0

Published

Pixie UI组件库主题

Readme

Pixie UI 主题系统

Pixie UI 提供了强大而灵活的主题系统,支持亮色/暗色主题切换、自定义主题配置和颜色调色板。

特性

  • 🎨 完整的颜色系统:支持颜色调色板和语义化颜色
  • 🌓 主题模式切换:支持亮色、暗色和自动模式
  • 🔧 自定义主题:支持部分或完全自定义主题配置
  • 📱 响应式设计:自动适配系统主题偏好
  • 🎯 向后兼容:保持与现有组件的完全兼容

基础使用

1. 基本主题提供者

import React from 'react';
import { ThemeProvider } from '@pixie-ui/theme';
import { Button } from '@pixie-ui/core';

const App = () => (
  <ThemeProvider>
    <Button variant="primary">使用默认主题</Button>
  </ThemeProvider>
);

2. 自定义主题

import React from 'react';
import { ThemeProvider } from '@pixie-ui/theme';
import { Button } from '@pixie-ui/core';

const customTheme = {
  colors: {
    primary: '#1890ff',
    secondary: '#722ed1',
    success: '#52c41a',
    warning: '#faad14',
    error: '#f5222d',
  },
  radii: {
    sm: '6px',
    md: '8px',
    lg: '12px',
  },
};

const App = () => (
  <ThemeProvider theme={customTheme}>
    <Button variant="primary">自定义主题按钮</Button>
  </ThemeProvider>
);

3. 主题模式切换

import React from 'react';
import { ThemeProvider, ThemeToggle } from '@pixie-ui/theme';
import { Button } from '@pixie-ui/core';

const App = () => (
  <ThemeProvider mode="auto">
    <div>
      <ThemeToggle variant="icon" />
      <ThemeToggle variant="button" showLabels />
      <Button variant="primary">主题切换按钮</Button>
    </div>
  </ThemeProvider>
);

高级功能

1. 使用主题上下文

import React from 'react';
import { useThemeContext } from '@pixie-ui/theme';

const ThemeInfo = () => {
  const { theme, mode, isDark, toggleMode } = useThemeContext();
  
  return (
    <div>
      <p>当前模式: {mode}</p>
      <p>是否为暗色主题: {isDark ? '是' : '否'}</p>
      <p>主色调: {theme.colors.primary}</p>
      <button onClick={toggleMode}>切换主题</button>
    </div>
  );
};

2. 使用颜色调色板

import React from 'react';
import { useTheme } from '@pixie-ui/theme';

const ColorPaletteDemo = () => {
  const theme = useTheme();
  
  return (
    <div>
      <h3>蓝色调色板</h3>
      <div style={{ display: 'flex', gap: '8px' }}>
        {theme.colors.palette?.blue && Object.entries(theme.colors.palette.blue).map(([key, color]) => (
          <div
            key={key}
            style={{
              width: '40px',
              height: '40px',
              backgroundColor: color,
              border: '1px solid #ccc',
            }}
            title={`blue.${key}: ${color}`}
          />
        ))}
      </div>
    </div>
  );
};

3. 使用语义化颜色

import React from 'react';
import { useTheme } from '@pixie-ui/theme';

const SemanticColorsDemo = () => {
  const theme = useTheme();
  
  return (
    <div>
      <h3>语义化颜色</h3>
      <div style={{ display: 'flex', gap: '16px' }}>
        {theme.colors.semantic && Object.entries(theme.colors.semantic).map(([key, colors]) => (
          <div key={key}>
            <h4>{key}</h4>
            <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
              <div style={{ backgroundColor: colors.main, color: colors.contrast, padding: '8px' }}>
                Main
              </div>
              <div style={{ backgroundColor: colors.light, color: colors.contrast, padding: '8px' }}>
                Light
              </div>
              <div style={{ backgroundColor: colors.dark, color: colors.contrast, padding: '8px' }}>
                Dark
              </div>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
};

主题工具函数

1. 生成颜色调色板

import { generateColorPalette } from '@pixie-ui/theme';

const bluePalette = generateColorPalette('#3182ce');
console.log(bluePalette);
// 输出: { 50: '#3182ce0a', 100: '#3182ce1a', ... }

2. 生成语义化颜色

import { generateSemanticColors } from '@pixie-ui/theme';

const primaryColors = generateSemanticColors('#3182ce', false);
console.log(primaryColors);
// 输出: { main: '#3182ce', light: '#3182ce80', dark: '#3182cecc', contrast: '#ffffff' }

3. 获取主题颜色

import { getThemeColor, useTheme } from '@pixie-ui/theme';

const ColorDemo = () => {
  const theme = useTheme();
  
  const primaryColor = getThemeColor(theme, 'primary');
  const semanticPrimary = getThemeColor(theme, 'semantic.primary.main');
  
  return (
    <div>
      <p>主色调: {primaryColor}</p>
      <p>语义化主色调: {semanticPrimary}</p>
    </div>
  );
};

4. 验证主题配置

import { validateTheme } from '@pixie-ui/theme';

const customTheme = {
  colors: {
    primary: '#1890ff',
    // 缺少其他必需颜色
  },
};

const validation = validateTheme(customTheme);
console.log(validation);
// 输出: { isValid: false, errors: ['Missing required color: secondary', ...] }

主题配置参考

完整的主题接口

interface Theme {
  colors: {
    // 基础颜色
    primary: string;
    secondary: string;
    success: string;
    warning: string;
    error: string;
    info: string;
    
    // 背景和表面
    background: {
      default: string;
      paper: string;
    };
    surface: string;
    
    // 文本颜色
    text: {
      primary: string;
      secondary: string;
      disabled: string;
    };
    
    // 边框和分割线
    border: string;
    divider: string;
    mask: string;
    
    // 状态颜色
    hover: {
      primary: string;
      secondary: string;
      text: string;
    };
    disabled: {
      background: string;
      foreground: string;
    };
    
    // 可选:颜色调色板
    palette?: {
      gray: ColorPalette;
      blue: ColorPalette;
      green: ColorPalette;
      red: ColorPalette;
      yellow: ColorPalette;
      purple: ColorPalette;
    };
    
    // 可选:语义化颜色
    semantic?: {
      primary: SemanticColors;
      secondary: SemanticColors;
      success: SemanticColors;
      warning: SemanticColors;
      error: SemanticColors;
      info: SemanticColors;
    };
    
    // 可选:状态颜色
    state?: {
      hover: string;
      active: string;
      focus: string;
      selected: string;
    };
  };
  
  // 其他设计令牌
  shadows: ThemeShadows;
  spacing: ThemeSpacing;
  breakpoints: ThemeBreakpoints;
  fontSizes: ThemeFontSizes;
  typography: ThemeTypography;
  radii: ThemeRadii;
  controlSizes: ThemeControlSizes;
}

最佳实践

  1. 渐进式采用:新功能都是可选的,可以逐步采用
  2. 语义化命名:使用语义化颜色名称而不是具体的颜色值
  3. 一致性:在整个应用中保持颜色使用的一致性
  4. 可访问性:确保颜色对比度符合可访问性标准
  5. 性能优化:避免在渲染过程中动态生成主题

迁移指南

现有的组件代码无需修改,新功能完全向后兼容:

// 现有代码继续工作
const theme = useTheme();
const primaryColor = theme.colors.primary; // ✅ 正常工作

// 新功能可选使用
const semanticPrimary = theme.colors.semantic?.primary.main; // ✅ 新功能
const bluePalette = theme.colors.palette?.blue; // ✅ 新功能