:navigation-title: Asset Handling .. _assetHandling: ================================ How to handle Assets (JS/CSS) in Storybook ================================ Option 1: Import JS/CSS in your template ----------------------------- The best option is to use the AssetCollector eg. f:asset.* in your components HTML. This allows you to integrate your JavaScript and CSS files directly into your components without needing to import them in your stories file. .. code-block:: html :caption: Component/Card/Card.js Option 2: Integrate JS/CSS in your template ----------------------------- Alternative is to import your JavaScript and CSS files directly in your stories file. .. code-block:: js :caption: Component/Card/Card.js .your-css-class { color: red; } console.log('This is a script for the Card component an is only once in the HTML'); Option 3: Auto import JS/CSS in your ComponentCollection ----------------------------- Alternatively, you can also auto import your JavaScript and CSS files inside your ComponentCollection class: .. code-block:: php :caption: Classes/ComponentCollection.php :emphasize-lines: 4,11-27 #[Autoconfigure(public: true)] final class ComponentCollection extends AbstractComponentCollection { public function __construct(private readonly AssetCollector $assetCollector) { } #[Override] public function getAdditionalVariables(string $viewHelperName): array { $templateName = $this->resolveTemplateName($viewHelperName); $fileName = $this->getTemplatePaths()->resolveTemplateFileForControllerAndActionAndFormat('Default', $templateName); $jsFile = str_replace('.html', '.js', $fileName); if (file_exists($jsFile)) { $this->assetCollector->addInlineJavaScript( self::class . ':' . $viewHelperName, file_get_contents($jsFile), ['type' => 'module'], ); } $cssFile = str_replace('.html', '.css', $fileName); if (file_exists($cssFile)) { $this->assetCollector->addInlineStyleSheet( self::class . ':' . $viewHelperName, file_get_contents($cssFile), ); } return []; } }