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 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; } }