> */ protected array $alpineComponents = []; /** * @var array> */ protected array $cssVariables = []; /** * @var array> */ protected array $scriptData = []; /** * @var array> */ protected array $scripts = []; /** * @var array> */ protected array $styles = []; /** * @var array */ protected array $themes = []; protected ?string $appVersion = null; public function appVersion(?string $version): void { $this->appVersion = $version; } public function getAppVersion(): ?string { return $this->appVersion; } /** * @param array $assets */ public function register(array $assets, string $package = 'app'): void { foreach ($assets as $asset) { $asset->package($package); match (true) { $asset instanceof Theme => $this->themes[$asset->getId()] = $asset, $asset instanceof AlpineComponent => $this->alpineComponents[$package][] = $asset, $asset instanceof Css => $this->styles[$package][] = $asset, $asset instanceof Js => $this->scripts[$package][] = $asset, default => null, }; } } /** * @param array $variables */ public function registerCssVariables(array $variables, ?string $package = null): void { $this->cssVariables[$package] = [ ...($this->cssVariables[$package] ?? []), ...$variables, ]; } /** * @param array $data */ public function registerScriptData(array $data, ?string $package = null): void { $this->scriptData[$package] = [ ...($this->scriptData[$package] ?? []), ...$data, ]; } /** * @param array | null $packages * @return array */ public function getAlpineComponents(?array $packages = null): array { return $this->getAssets($this->alpineComponents, $packages); } public function getAlpineComponentSrc(string $id, string $package = 'app'): string { /** @var array $components */ $components = $this->getAlpineComponents([$package]); foreach ($components as $component) { if ($component->getId() !== $id) { continue; } return $component->getSrc(); } throw new Exception("Alpine component with ID [{$id}] not found for package [{$package}]."); } /** * @param array | null $packages * @return array */ public function getScriptData(?array $packages = null): array { $data = []; foreach ($this->scriptData as $package => $packageData) { if ( ($packages !== null) && ($package !== null) && (! in_array($package, $packages)) ) { continue; } $data = [ ...$data, ...$packageData, ]; } return $data; } public function getScriptSrc(string $id, string $package = 'app'): string { /** @var array $scripts */ $scripts = $this->getScripts([$package]); foreach ($scripts as $script) { if ($script->getId() !== $id) { continue; } return $script->getSrc(); } throw new Exception("Script with ID [{$id}] not found for package [{$package}]."); } /** * @param array | null $packages * @return array */ public function getScripts(?array $packages = null, bool $withCore = true): array { /** @var array $assets */ $assets = $this->getAssets($this->scripts, $packages); if (! $withCore) { $assets = array_filter( $assets, fn (Js $asset): bool => ! $asset->isCore(), ); } return $assets; } /** * @param array | null $packages */ public function renderScripts(?array $packages = null, bool $withCore = false): string { /** @var array $assets */ $assets = $this->getScripts($packages, $withCore); if ($withCore) { usort( $assets, fn (Js $asset): int => $asset->isCore() ? 1 : -1, ); } return view('filament::assets', [ 'assets' => $assets, 'data' => $this->getScriptData($packages), ])->render(); } /** * @param array | null $packages * @return array */ public function getStyles(?array $packages = null): array { return $this->getAssets($this->styles, $packages); } public function getStyleHref(string $id, string $package = 'app'): string { /** @var array $styles */ $styles = $this->getStyles([$package]); foreach ($styles as $style) { if ($style->getId() !== $id) { continue; } return $style->getHref(); } throw new Exception("Stylesheet with ID [{$id}] not found for package [{$package}]."); } /** * @param array | null $packages * @return array */ public function getCssVariables(?array $packages = null): array { $variables = []; foreach ($this->cssVariables as $package => $packageVariables) { if ( ($packages !== null) && ($package !== null) && (! in_array($package, $packages)) ) { continue; } $variables = [ ...$variables, ...$packageVariables, ]; } return $variables; } /** * @param array | null $packages */ public function renderStyles(?array $packages = null): string { $variables = $this->getCssVariables($packages); foreach (FilamentColor::getColors() as $name => $shades) { foreach ($shades as $shade => $color) { $variables["{$name}-{$shade}"] = $color; } } return view('filament::assets', [ 'assets' => $this->getStyles($packages), 'cssVariables' => $variables, ])->render(); } public function getTheme(?string $id): ?Theme { return $this->getThemes()[$id] ?? null; } /** * @return array */ public function getThemes(): array { return $this->themes; } /** * @param array> $assets * @param array | null $packages * @return array */ protected function getAssets(array $assets, ?array $packages = null): array { if ($packages !== null) { $assets = Arr::only($assets, $packages); } return Arr::flatten($assets); } }