docs: def copy_assets(self, output_path):
          """Copies all asset files from the source path to the destination
          path. If no such source path exists, no asset copying will be performed.
          """
          src_paths = []
  
          # if we have a theme
          if self.config.theme is not None:
              # assume it's in the folder: "themes/theme_name/assets"
              src_paths.append(os.path.join(
                  self.path,
                  StatikProject.THEMES_DIR,
                  self.config.theme,
                  StatikProject.ASSETS_DIR
              ))
              # NOTE: Adding the theme's assets directory *before* the project's internal assets
              #       directory always ensures that the project's own assets are copied *after* the
              #       theme's, thereby ensuring that the project's assets folder takes precedence
              #       over the theme's.
  
          # always attempt to copy from our base assets folder
          if os.path.isabs(self.config.assets_src_path):
              src_paths.append(self.config.assets_src_path)
          else:
              src_paths.append(os.path.join(self.path, self.config.assets_src_path))
  
          for src_path in src_paths:
              if os.path.exists(src_path) and os.path.isdir(src_path):
                  dest_path = self.config.assets_dest_path
                  if not os.path.isabs(dest_path):
                      dest_path = os.path.join(output_path, dest_path)
  
                  asset_count = copy_tree(src_path, dest_path)
                  logger.info("Copied %s asset(s) from %s to %s", asset_count, src_path, dest_path)
              else:
                  logger.info(
                      "Missing assets source path - skipping copying of assets: %s",
                      src_path
                  )