162 lines
3.7 KiB
PHP
Executable File
162 lines
3.7 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Modules\Stylist\Theme;
|
|
|
|
final class Theme
|
|
{
|
|
public function __construct(
|
|
private readonly string $key,
|
|
private readonly string $name,
|
|
private readonly string $path,
|
|
private readonly string $stylesheet = 'css/theme.css',
|
|
private readonly string $script = 'js/app.js',
|
|
private readonly array $variables = [],
|
|
private readonly array $meta = [],
|
|
) {}
|
|
|
|
public function key(): string
|
|
{
|
|
return $this->key;
|
|
}
|
|
|
|
public function name(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function path(): string
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
public function stylesheet(): string
|
|
{
|
|
return $this->stylesheet;
|
|
}
|
|
|
|
public function script(): string
|
|
{
|
|
return $this->script;
|
|
}
|
|
|
|
public function variables(): array
|
|
{
|
|
return $this->variables;
|
|
}
|
|
|
|
public function meta(): array
|
|
{
|
|
return $this->meta;
|
|
}
|
|
|
|
public function manifestVersion(): int
|
|
{
|
|
return (int) ($this->meta['manifest_version'] ?? 1);
|
|
}
|
|
|
|
public function version(): string
|
|
{
|
|
return (string) ($this->meta['version'] ?? '1.0.0');
|
|
}
|
|
|
|
public function description(): string
|
|
{
|
|
return (string) ($this->meta['description'] ?? '');
|
|
}
|
|
|
|
public function type(): string
|
|
{
|
|
return (string) ($this->meta['type'] ?? 'frontend');
|
|
}
|
|
|
|
public function author(): string
|
|
{
|
|
return (string) ($this->meta['author'] ?? '');
|
|
}
|
|
|
|
public function parent(): ?string
|
|
{
|
|
$parent = $this->meta['extends'] ?? null;
|
|
|
|
return is_string($parent) && $parent !== '' ? $parent : null;
|
|
}
|
|
|
|
public function preview(): ?string
|
|
{
|
|
$preview = $this->meta['preview'] ?? null;
|
|
|
|
return is_string($preview) && $preview !== '' ? $preview : null;
|
|
}
|
|
|
|
public function variants(): array
|
|
{
|
|
return (array) ($this->meta['variants'] ?? []);
|
|
}
|
|
|
|
public function appearances(): array
|
|
{
|
|
return (array) ($this->meta['appearances'] ?? []);
|
|
}
|
|
|
|
public function accents(): array
|
|
{
|
|
return (array) ($this->meta['accents'] ?? []);
|
|
}
|
|
|
|
public function defaultAppearance(): string
|
|
{
|
|
return (string) ($this->meta['default_appearance'] ?? array_key_first($this->appearances()) ?? '');
|
|
}
|
|
|
|
public function defaultAccent(): string
|
|
{
|
|
return (string) ($this->meta['default_accent'] ?? array_key_first($this->accents()) ?? '');
|
|
}
|
|
|
|
public function settingsSchema(): array
|
|
{
|
|
return (array) ($this->meta['settings'] ?? []);
|
|
}
|
|
|
|
public function seo(): array
|
|
{
|
|
return (array) ($this->meta['seo'] ?? []);
|
|
}
|
|
|
|
public function entryView(): string
|
|
{
|
|
return (string) ($this->meta['entry_view'] ?? 'home');
|
|
}
|
|
|
|
public function capabilities(): array
|
|
{
|
|
return (array) ($this->meta['capabilities'] ?? []);
|
|
}
|
|
|
|
public function hasCapability(string $feature): bool
|
|
{
|
|
return (bool) ($this->capabilities()[$feature] ?? false);
|
|
}
|
|
|
|
public function supports(string $feature): bool
|
|
{
|
|
return (bool) data_get($this->meta, 'supports.'.$feature, $this->hasCapability($feature));
|
|
}
|
|
|
|
public function has(string $relativePath): bool
|
|
{
|
|
return is_file($this->path.DIRECTORY_SEPARATOR.ltrim($relativePath, '/'));
|
|
}
|
|
|
|
public function absolutePath(string $relativePath): string
|
|
{
|
|
return $this->path.DIRECTORY_SEPARATOR.ltrim($relativePath, '/');
|
|
}
|
|
|
|
/** @deprecated Theme assets are served through UrlGenerator. */
|
|
public function assetsPath(): string
|
|
{
|
|
return 'stylist/theme-assets/'.$this->key;
|
|
}
|
|
}
|