跳到主要内容

积木主题

积木主题控制工作区中编码积木的颜色和外观。它们位于 src/lib/themes/blocks/

可用主题

Bilup 包含多个内置积木主题:

  • three: 默认 Scratch 3.0 颜色
  • dark: 深色优化积木颜色
  • high-contrast: 可访问性专注的高对比度颜色
  • custom: 插件修改的颜色

结构

积木主题导出 blockColors 对象,包含每个积木类别的颜色:

// src/lib/themes/blocks/three.js
const blockColors = {
motion: {
primary: '#4C97FF', // 主积木颜色
secondary: '#4280D7', // 积木轮廓/边框
tertiary: '#3373CC' // 深色变体
},
looks: {
primary: '#9966FF',
secondary: '#855CD6',
tertiary: '#774DCB'
},
sounds: {
primary: '#CF63CF',
secondary: '#C94FC9',
tertiary: '#BD42BD'
},
control: {
primary: '#FFAB19',
secondary: '#EC9C13',
tertiary: '#CF8B17'
},
event: {
primary: '#FFBF00',
secondary: '#E6AC00',
tertiary: '#CC9900'
},
sensing: {
primary: '#5CB1D6',
secondary: '#47A8D1',
tertiary: '#2E8EB8'
},
operators: {
primary: '#59C059',
secondary: '#46B946',
tertiary: '#389438'
},
data: {
primary: '#FF8C1A',
secondary: '#FF8000',
tertiary: '#DB6E00'
},
// 特殊元素
insertionMarker: '#000000',
fieldBackground: '#ffffff'
};

export { blockColors };

积木类别

核心类别

  • motion: 运动和方向积木
  • looks: 外观和造型积木
  • sounds: 音乐积木
  • control: 流程控制(循环、条件)
  • event: 事件处理积木
  • sensing: 输入和检测积木
  • operators: 数学和逻辑运算
  • data: 变量和列表

特殊颜色

  • insertionMarker: 积木插入指示器的颜色
  • fieldBackground: 输入字段的背景颜色
  • text: 积木内的文本颜色
  • workspace: 工作区背景颜色

创建自定义积木主题

1. 创建主题文件

创建 src/lib/themes/blocks/custom.js

const blockColors = {
motion: {
primary: '#FF6B6B', // 自定义红色用于运动
secondary: '#FF5252',
tertiary: '#F44336'
},
looks: {
primary: '#4ECDC4', // 自定义蓝绿色用于外观
secondary: '#26A69A',
tertiary: '#00796B'
},
sounds: {
primary: '#FFD93D', // 自定义黄色用于声音
secondary: '#FFC107',
tertiary: '#FF8F00'
},
control: {
primary: '#A8E6CF', // 自定义绿色用于控制
secondary: '#81C784',
tertiary: '#4CAF50'
},
event: {
primary: '#FFB74D', // 自定义橙色用于事件
secondary: '#FF9800',
tertiary: '#F57C00'
},
sensing: {
primary: '#BA68C8', // 自定义紫色用于侦测
secondary: '#9C27B0',
tertiary: '#7B1FA2'
},
operators: {
primary: '#64B5F6', // 自定义蓝色用于运算
secondary: '#2196F3',
tertiary: '#1976D2'
},
data: {
primary: '#F06292', // 自定义粉色用于数据
secondary: '#E91E63',
tertiary: '#C2185B'
},

// 特殊元素
insertionMarker: '#333333',
fieldBackground: '#ffffff',
text: '#ffffff'
};

const extensions = {
// 可以在此定义扩展特定颜色
pen: {
primary: '#0FBD8C',
secondary: '#0DA57A',
tertiary: '#0B8E69'
}
};

export { blockColors, extensions };

2. 在索引中注册

添加到 src/lib/themes/index.js

import * as blocksCustom from './blocks/custom';

const BLOCKS_CUSTOM_NEW = 'custom-new';
const BLOCKS_MAP = {
[BLOCKS_THREE]: {
blocksMediaFolder: 'blocks-media/default',
colors: blocksThree.blockColors,
extensions: blocksThree.extensions,
customExtensionColors: {},
useForStage: true
},
// ...现有主题...
[BLOCKS_CUSTOM_NEW]: {
blocksMediaFolder: 'blocks-media/default',
colors: blocksCustom.blockColors,
extensions: blocksCustom.extensions || {},
customExtensionColors: {},
useForStage: true
}
};

高对比度主题

高对比度主题专为可访问性设计:

// src/lib/themes/blocks/high-contrast.js
const blockColors = {
motion: {
primary: '#000080', // 深蓝色
secondary: '#000070',
tertiary: '#000060'
},
looks: {
primary: '#800080', // 深紫色
secondary: '#700070',
tertiary: '#600060'
},
// 使用高对比度颜色,清晰区分
};

深色积木主题

深色主题优化了深色 GUI 主题的颜色:

// src/lib/themes/blocks/dark.js
const blockColors = {
motion: {
primary: '#6BB3FF', // 深色背景上更亮的蓝色
secondary: '#5AA3EF',
tertiary: '#4993DF'
},
// 颜色为深色背景而增亮和调整
insertionMarker: '#ffffff', // 深色背景上的白色标记
fieldBackground: '#2e2e2e' // 深色字段背景
};

扩展颜色

积木主题可以为扩展定义颜色:

const extensions = {
pen: {
primary: '#0FBD8C',
secondary: '#0DA57A',
tertiary: '#0B8E69'
},
music: {
primary: '#D65CD6',
secondary: '#BD42BD',
tertiary: '#A428A4'
}
};

const customExtensionColors = {
// 特定扩展 ID 的颜色
'my-custom-extension': {
primary: '#FF6B6B',
secondary: '#FF5252',
tertiary: '#F44336'
}
};

舞台集成

某些积木主题针对舞台区域优化:

const BLOCKS_MAP = {
[BLOCKS_THREE]: {
// ...
useForStage: true // 对舞台积木使用此主题
},
[BLOCKS_DARK]: {
// ...
useForStage: false // 不在舞台上使用(改用浅色主题)
}
};

颜色应用

积木颜色通过 CSS 变量应用:

.block-motion {
background-color: var(--motion-primary);
border-color: var(--motion-secondary);
}

.block-motion:hover {
background-color: var(--motion-tertiary);
}

测试积木颜色

测试您的积木主题:

import { Theme } from './index';

const testTheme = new Theme('red', 'light', 'custom');
const blockColors = testTheme.getBlockColors();
console.log(blockColors.motion.primary); // 应显示您的自定义颜色