// +----------------------------------------------------------------------
namespace ywxapp\library;
/**
* 皮肤变量/配色层(Discuz 式风格变量,无需改 HTML)。
*
* 模板在 template.json 声明 variables(如主色/背景/字体),后台可覆盖并写入
* config/template.php 的 settings.variables[<模板名>]。渲染时由 Addon 基类的
* fetch 钩子把变量注入为 ,
* 皮肤 CSS 用 var(--primary) 即可生效,无需改动任何视图文件。
*/
class SkinVariables
{
/**
* 读取模板声明的变量定义(已归一化为 {key:{label,default,type}})。
* 支持简写:variables: { "primary": "#2d8cf0" } 等价于 { "primary": {"default":"#2d8cf0"} }。
*/
public static function definitions(string $name): array
{
$file = root_path() . 'templates' . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR . 'template.json';
if (! is_file($file)) {
return [];
}
$meta = json_decode(file_get_contents($file), true) ?? [];
$vars = $meta['variables'] ?? [];
if (! is_array($vars)) {
return [];
}
$out = [];
foreach ($vars as $key => $def) {
if (is_string($def)) {
$def = ['default' => $def];
}
if (! is_array($def)) {
continue;
}
$out[$key] = [
'label' => $def['label'] ?? $key,
'default' => $def['default'] ?? '',
'type' => $def['type'] ?? 'color',
];
}
return $out;
}
/**
* 当前生效的变量值(默认 + 后台覆盖)。
* 返回带 -- 前缀的 CSS 变量名 => 值(仅返回非空值)。
*/
public static function values(string $name): array
{
$defs = self::definitions($name);
$settings = TemplateManager::getSettings();
$overrides = $settings['variables'][$name] ?? [];
if (! is_array($overrides)) {
$overrides = [];
}
$out = [];
foreach ($defs as $key => $d) {
$val = $overrides[$key] ?? $d['default'];
if ($val === '' || $val === null) {
continue;
}
$out['--' . ltrim($key, '-')] = (string) $val;
}
return $out;
}
/**
* 生成 :root 内的 CSS 变量声明字符串(不含 :root{} 包裹),如无变量返回空串。
*/
public static function declaration(string $name): string
{
$vals = self::values($name);
$parts = [];
foreach ($vals as $k => $v) {
$parts[] = $k . ':' . $v;
}
return implode(';', $parts);
}
/**
* 针对某插件/区域,返回可直接注入页面的 ';
}
}