diff --git a/.gitignore b/.gitignore index 89f2fd3..015891c 100644 --- a/.gitignore +++ b/.gitignore @@ -45,11 +45,20 @@ simpleshop_theme-*.tar /priv/static/*.gz # Digested fonts have 32-char hash before extension /priv/static/fonts/*-????????????????????????????????.woff2 -/priv/static/mockups/*-*.jpg /priv/static/images/*-*.svg /priv/static/images/*-*.svg.gz /priv/static/images/*.gz +# Generated mockup variants (auto-generated on startup via Oban) +# Source .webp files are tracked, variants are regenerated +/priv/static/mockups/*-400.* +/priv/static/mockups/*-800.* +/priv/static/mockups/*-1200.* +/priv/static/mockups/*-thumb.jpg + +# Generated image variants cache (regenerated from source images) +/priv/static/image_cache/ + # In case you use Node.js/npm, you want to ignore these. npm-debug.log /assets/node_modules/ diff --git a/lib/simpleshop_theme/images/optimize_worker.ex b/lib/simpleshop_theme/images/optimize_worker.ex new file mode 100644 index 0000000..a5d033a --- /dev/null +++ b/lib/simpleshop_theme/images/optimize_worker.ex @@ -0,0 +1,53 @@ +defmodule SimpleshopTheme.Images.OptimizeWorker do + @moduledoc """ + Oban worker for processing image variants in the background. + Handles both database images and filesystem mockups. + """ + use Oban.Worker, queue: :images, max_attempts: 3 + + alias SimpleshopTheme.Images.Optimizer + + @impl Oban.Worker + def perform(%Oban.Job{args: %{"type" => "mockup", "source_path" => source_path}}) do + output_dir = Path.dirname(source_path) + basename = Path.basename(source_path, Path.extname(source_path)) + + case File.read(source_path) do + {:ok, data} -> + case Optimizer.process_file(data, basename, output_dir) do + {:ok, _} -> :ok + {:error, reason} -> {:error, reason} + end + + {:error, reason} -> + {:error, reason} + end + end + + def perform(%Oban.Job{args: %{"image_id" => image_id}}) do + case Optimizer.process_for_image(image_id) do + {:ok, _} -> :ok + {:error, :not_found} -> {:cancel, :image_not_found} + {:error, :no_data} -> {:cancel, :no_image_data} + {:error, reason} -> {:error, reason} + end + end + + @doc """ + Enqueue a database image for optimization. + """ + def enqueue(image_id) do + %{image_id: image_id} + |> new() + |> Oban.insert() + end + + @doc """ + Enqueue a mockup file for variant generation. + """ + def enqueue_mockup(source_path) when is_binary(source_path) do + %{type: "mockup", source_path: source_path} + |> new() + |> Oban.insert() + end +end diff --git a/lib/simpleshop_theme/images/variant_cache.ex b/lib/simpleshop_theme/images/variant_cache.ex new file mode 100644 index 0000000..ee62d33 --- /dev/null +++ b/lib/simpleshop_theme/images/variant_cache.ex @@ -0,0 +1,101 @@ +defmodule SimpleshopTheme.Images.VariantCache do + @moduledoc """ + Ensures all image variants exist on startup. + + This GenServer runs at startup and checks for: + 1. Database images with incomplete variants_status or missing disk files + 2. Mockup source files missing their generated variants + + For any images missing variants, it enqueues Oban jobs to regenerate them. + """ + + use GenServer + require Logger + + alias SimpleshopTheme.Repo + alias SimpleshopTheme.Media.Image, as: ImageSchema + alias SimpleshopTheme.Images.{Optimizer, OptimizeWorker} + import Ecto.Query + + @mockup_dir "priv/static/mockups" + + def start_link(opts) do + GenServer.start_link(__MODULE__, opts, name: __MODULE__) + end + + @impl true + def init(_opts) do + Task.start(fn -> ensure_all_variants() end) + {:ok, %{}} + end + + defp ensure_all_variants do + Logger.info("[VariantCache] Checking image variant cache...") + File.mkdir_p!(Optimizer.cache_dir()) + + ensure_database_image_variants() + ensure_mockup_variants() + end + + defp ensure_database_image_variants do + incomplete = + ImageSchema + |> where([i], i.variants_status != "complete" or is_nil(i.variants_status)) + |> where([i], i.is_svg == false) + |> Repo.all() + + complete_missing = + ImageSchema + |> where([i], i.variants_status == "complete") + |> where([i], i.is_svg == false) + |> where([i], not is_nil(i.source_width)) + |> Repo.all() + |> Enum.reject(fn img -> + Optimizer.disk_variants_exist?(img.id, img.source_width) + end) + + to_process = incomplete ++ complete_missing + + if to_process == [] do + Logger.info("[VariantCache] All database image variants up to date") + else + Logger.info("[VariantCache] Enqueueing #{length(to_process)} database images for processing") + + Enum.each(to_process, fn image -> + image + |> ImageSchema.changeset(%{variants_status: "pending"}) + |> Repo.update!() + + OptimizeWorker.enqueue(image.id) + end) + end + end + + defp ensure_mockup_variants do + if File.dir?(@mockup_dir) do + sources = + Path.wildcard(Path.join(@mockup_dir, "*.webp")) + |> Enum.reject(&is_variant?/1) + + missing = Enum.reject(sources, &mockup_variants_exist?/1) + + if missing == [] do + Logger.info("[VariantCache] All mockup variants up to date") + else + Logger.info("[VariantCache] Enqueueing #{length(missing)} mockups for processing") + Enum.each(missing, &OptimizeWorker.enqueue_mockup/1) + end + end + end + + defp is_variant?(path) do + basename = Path.basename(path) |> Path.rootname() + String.match?(basename, ~r/-(400|800|1200|thumb)$/) + end + + defp mockup_variants_exist?(source_path) do + basename = Path.basename(source_path) |> Path.rootname() + dir = Path.dirname(source_path) + File.exists?(Path.join(dir, "#{basename}-800.webp")) + end +end diff --git a/lib/simpleshop_theme/printify/mockup_generator.ex b/lib/simpleshop_theme/printify/mockup_generator.ex index 8f1a794..8f8954f 100644 --- a/lib/simpleshop_theme/printify/mockup_generator.ex +++ b/lib/simpleshop_theme/printify/mockup_generator.ex @@ -328,20 +328,35 @@ defmodule SimpleshopTheme.Printify.MockupGenerator do end @doc """ - Download mockup images to the output directory. + Download mockup images, save as WebP source, and generate variants. + Sources are saved for regeneration on startup via VariantCache. """ def download_mockups(product_slug, mockup_urls) do + alias SimpleshopTheme.Images.Optimizer + File.mkdir_p!(@output_dir) mockup_urls |> Enum.with_index(1) |> Enum.map(fn {url, index} -> - output_path = Path.join(@output_dir, "#{product_slug}-#{index}.jpg") - IO.puts(" Downloading mockup #{index} to #{output_path}...") + basename = "#{product_slug}-#{index}" + source_path = Path.join(@output_dir, "#{basename}.webp") + IO.puts(" Processing mockup #{index}...") - case Client.download_file(url, output_path) do - {:ok, path} -> {:ok, path} - {:error, reason} -> {:error, {url, reason}} + temp_path = Path.join(System.tmp_dir!(), "#{basename}-temp.jpg") + + with {:ok, _} <- Client.download_file(url, temp_path), + {:ok, image_data} <- File.read(temp_path), + {:ok, webp_data, source_width, _} <- Optimizer.to_optimized_webp(image_data), + :ok <- File.write(source_path, webp_data), + {:ok, _} <- Optimizer.process_file(webp_data, basename, @output_dir) do + File.rm(temp_path) + IO.puts(" Saved source + variants for #{basename} (#{source_width}px)") + {:ok, basename, source_width} + else + {:error, reason} -> + File.rm(temp_path) + {:error, {url, reason}} end end) end diff --git a/priv/static/mockups/autumn-leaves-notebook-1.jpg b/priv/static/mockups/autumn-leaves-notebook-1.jpg deleted file mode 100644 index 4261f2d..0000000 Binary files a/priv/static/mockups/autumn-leaves-notebook-1.jpg and /dev/null differ diff --git a/priv/static/mockups/autumn-leaves-notebook-1.webp b/priv/static/mockups/autumn-leaves-notebook-1.webp new file mode 100644 index 0000000..9425c84 Binary files /dev/null and b/priv/static/mockups/autumn-leaves-notebook-1.webp differ diff --git a/priv/static/mockups/autumn-leaves-notebook-2.jpg b/priv/static/mockups/autumn-leaves-notebook-2.jpg deleted file mode 100644 index 750c819..0000000 Binary files a/priv/static/mockups/autumn-leaves-notebook-2.jpg and /dev/null differ diff --git a/priv/static/mockups/autumn-leaves-notebook-2.webp b/priv/static/mockups/autumn-leaves-notebook-2.webp new file mode 100644 index 0000000..86ceb79 Binary files /dev/null and b/priv/static/mockups/autumn-leaves-notebook-2.webp differ diff --git a/priv/static/mockups/autumn-leaves-notebook-3.jpg b/priv/static/mockups/autumn-leaves-notebook-3.jpg deleted file mode 100644 index a91a4ad..0000000 Binary files a/priv/static/mockups/autumn-leaves-notebook-3.jpg and /dev/null differ diff --git a/priv/static/mockups/autumn-leaves-notebook-3.webp b/priv/static/mockups/autumn-leaves-notebook-3.webp new file mode 100644 index 0000000..5ab1058 Binary files /dev/null and b/priv/static/mockups/autumn-leaves-notebook-3.webp differ diff --git a/priv/static/mockups/autumn-leaves-notebook-4.jpg b/priv/static/mockups/autumn-leaves-notebook-4.jpg deleted file mode 100644 index 9fb2a2b..0000000 Binary files a/priv/static/mockups/autumn-leaves-notebook-4.jpg and /dev/null differ diff --git a/priv/static/mockups/autumn-leaves-notebook-4.webp b/priv/static/mockups/autumn-leaves-notebook-4.webp new file mode 100644 index 0000000..f9301f5 Binary files /dev/null and b/priv/static/mockups/autumn-leaves-notebook-4.webp differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-1.jpg b/priv/static/mockups/blue-waves-laptop-sleeve-1.jpg deleted file mode 100644 index 5ed9a05..0000000 Binary files a/priv/static/mockups/blue-waves-laptop-sleeve-1.jpg and /dev/null differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-1.webp b/priv/static/mockups/blue-waves-laptop-sleeve-1.webp new file mode 100644 index 0000000..70c9a5d Binary files /dev/null and b/priv/static/mockups/blue-waves-laptop-sleeve-1.webp differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-2.jpg b/priv/static/mockups/blue-waves-laptop-sleeve-2.jpg deleted file mode 100644 index 65fca76..0000000 Binary files a/priv/static/mockups/blue-waves-laptop-sleeve-2.jpg and /dev/null differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-2.webp b/priv/static/mockups/blue-waves-laptop-sleeve-2.webp new file mode 100644 index 0000000..aefb552 Binary files /dev/null and b/priv/static/mockups/blue-waves-laptop-sleeve-2.webp differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-3.jpg b/priv/static/mockups/blue-waves-laptop-sleeve-3.jpg deleted file mode 100644 index effd843..0000000 Binary files a/priv/static/mockups/blue-waves-laptop-sleeve-3.jpg and /dev/null differ diff --git a/priv/static/mockups/blue-waves-laptop-sleeve-3.webp b/priv/static/mockups/blue-waves-laptop-sleeve-3.webp new file mode 100644 index 0000000..488570a Binary files /dev/null and b/priv/static/mockups/blue-waves-laptop-sleeve-3.webp differ diff --git a/priv/static/mockups/botanical-illustration-print-1.jpg b/priv/static/mockups/botanical-illustration-print-1.jpg deleted file mode 100644 index fe0b384..0000000 Binary files a/priv/static/mockups/botanical-illustration-print-1.jpg and /dev/null differ diff --git a/priv/static/mockups/botanical-illustration-print-1.webp b/priv/static/mockups/botanical-illustration-print-1.webp new file mode 100644 index 0000000..22fd326 Binary files /dev/null and b/priv/static/mockups/botanical-illustration-print-1.webp differ diff --git a/priv/static/mockups/botanical-illustration-print-2.jpg b/priv/static/mockups/botanical-illustration-print-2.jpg deleted file mode 100644 index 8f117a4..0000000 Binary files a/priv/static/mockups/botanical-illustration-print-2.jpg and /dev/null differ diff --git a/priv/static/mockups/botanical-illustration-print-2.webp b/priv/static/mockups/botanical-illustration-print-2.webp new file mode 100644 index 0000000..39690ea Binary files /dev/null and b/priv/static/mockups/botanical-illustration-print-2.webp differ diff --git a/priv/static/mockups/botanical-illustration-print-3.jpg b/priv/static/mockups/botanical-illustration-print-3.jpg deleted file mode 100644 index 7dfc7f0..0000000 Binary files a/priv/static/mockups/botanical-illustration-print-3.jpg and /dev/null differ diff --git a/priv/static/mockups/botanical-illustration-print-3.webp b/priv/static/mockups/botanical-illustration-print-3.webp new file mode 100644 index 0000000..e06c7de Binary files /dev/null and b/priv/static/mockups/botanical-illustration-print-3.webp differ diff --git a/priv/static/mockups/fern-leaf-mug-1.jpg b/priv/static/mockups/fern-leaf-mug-1.jpg deleted file mode 100644 index 2466c0a..0000000 Binary files a/priv/static/mockups/fern-leaf-mug-1.jpg and /dev/null differ diff --git a/priv/static/mockups/fern-leaf-mug-1.webp b/priv/static/mockups/fern-leaf-mug-1.webp new file mode 100644 index 0000000..bdce60c Binary files /dev/null and b/priv/static/mockups/fern-leaf-mug-1.webp differ diff --git a/priv/static/mockups/fern-leaf-mug-2.jpg b/priv/static/mockups/fern-leaf-mug-2.jpg deleted file mode 100644 index 3e0f053..0000000 Binary files a/priv/static/mockups/fern-leaf-mug-2.jpg and /dev/null differ diff --git a/priv/static/mockups/fern-leaf-mug-2.webp b/priv/static/mockups/fern-leaf-mug-2.webp new file mode 100644 index 0000000..ae4ccf1 Binary files /dev/null and b/priv/static/mockups/fern-leaf-mug-2.webp differ diff --git a/priv/static/mockups/fern-leaf-mug-3.jpg b/priv/static/mockups/fern-leaf-mug-3.jpg deleted file mode 100644 index a86deb6..0000000 Binary files a/priv/static/mockups/fern-leaf-mug-3.jpg and /dev/null differ diff --git a/priv/static/mockups/fern-leaf-mug-3.webp b/priv/static/mockups/fern-leaf-mug-3.webp new file mode 100644 index 0000000..15c77a7 Binary files /dev/null and b/priv/static/mockups/fern-leaf-mug-3.webp differ diff --git a/priv/static/mockups/fern-leaf-mug-4.jpg b/priv/static/mockups/fern-leaf-mug-4.jpg deleted file mode 100644 index e174841..0000000 Binary files a/priv/static/mockups/fern-leaf-mug-4.jpg and /dev/null differ diff --git a/priv/static/mockups/fern-leaf-mug-4.webp b/priv/static/mockups/fern-leaf-mug-4.webp new file mode 100644 index 0000000..0490e3b Binary files /dev/null and b/priv/static/mockups/fern-leaf-mug-4.webp differ diff --git a/priv/static/mockups/forest-light-hoodie-1.jpg b/priv/static/mockups/forest-light-hoodie-1.jpg deleted file mode 100644 index fcab0e7..0000000 Binary files a/priv/static/mockups/forest-light-hoodie-1.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-light-hoodie-1.webp b/priv/static/mockups/forest-light-hoodie-1.webp new file mode 100644 index 0000000..f322fde Binary files /dev/null and b/priv/static/mockups/forest-light-hoodie-1.webp differ diff --git a/priv/static/mockups/forest-light-hoodie-2.jpg b/priv/static/mockups/forest-light-hoodie-2.jpg deleted file mode 100644 index 7539831..0000000 Binary files a/priv/static/mockups/forest-light-hoodie-2.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-light-hoodie-2.webp b/priv/static/mockups/forest-light-hoodie-2.webp new file mode 100644 index 0000000..697c8c5 Binary files /dev/null and b/priv/static/mockups/forest-light-hoodie-2.webp differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-1.jpg b/priv/static/mockups/forest-silhouette-tshirt-1.jpg deleted file mode 100644 index 9e33564..0000000 Binary files a/priv/static/mockups/forest-silhouette-tshirt-1.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-1.webp b/priv/static/mockups/forest-silhouette-tshirt-1.webp new file mode 100644 index 0000000..1203775 Binary files /dev/null and b/priv/static/mockups/forest-silhouette-tshirt-1.webp differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-2.jpg b/priv/static/mockups/forest-silhouette-tshirt-2.jpg deleted file mode 100644 index 1d6f01c..0000000 Binary files a/priv/static/mockups/forest-silhouette-tshirt-2.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-2.webp b/priv/static/mockups/forest-silhouette-tshirt-2.webp new file mode 100644 index 0000000..fad2a9d Binary files /dev/null and b/priv/static/mockups/forest-silhouette-tshirt-2.webp differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-3.jpg b/priv/static/mockups/forest-silhouette-tshirt-3.jpg deleted file mode 100644 index db7ebab..0000000 Binary files a/priv/static/mockups/forest-silhouette-tshirt-3.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-3.webp b/priv/static/mockups/forest-silhouette-tshirt-3.webp new file mode 100644 index 0000000..c8ff3b4 Binary files /dev/null and b/priv/static/mockups/forest-silhouette-tshirt-3.webp differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-4.jpg b/priv/static/mockups/forest-silhouette-tshirt-4.jpg deleted file mode 100644 index ebca7a7..0000000 Binary files a/priv/static/mockups/forest-silhouette-tshirt-4.jpg and /dev/null differ diff --git a/priv/static/mockups/forest-silhouette-tshirt-4.webp b/priv/static/mockups/forest-silhouette-tshirt-4.webp new file mode 100644 index 0000000..5e11b17 Binary files /dev/null and b/priv/static/mockups/forest-silhouette-tshirt-4.webp differ diff --git a/priv/static/mockups/geometric-abstract-print-1.jpg b/priv/static/mockups/geometric-abstract-print-1.jpg deleted file mode 100644 index 55f0b28..0000000 Binary files a/priv/static/mockups/geometric-abstract-print-1.jpg and /dev/null differ diff --git a/priv/static/mockups/geometric-abstract-print-1.webp b/priv/static/mockups/geometric-abstract-print-1.webp new file mode 100644 index 0000000..6510cc4 Binary files /dev/null and b/priv/static/mockups/geometric-abstract-print-1.webp differ diff --git a/priv/static/mockups/geometric-abstract-print-2.jpg b/priv/static/mockups/geometric-abstract-print-2.jpg deleted file mode 100644 index fb0c35b..0000000 Binary files a/priv/static/mockups/geometric-abstract-print-2.jpg and /dev/null differ diff --git a/priv/static/mockups/geometric-abstract-print-2.webp b/priv/static/mockups/geometric-abstract-print-2.webp new file mode 100644 index 0000000..3985bb8 Binary files /dev/null and b/priv/static/mockups/geometric-abstract-print-2.webp differ diff --git a/priv/static/mockups/geometric-abstract-print-3.jpg b/priv/static/mockups/geometric-abstract-print-3.jpg deleted file mode 100644 index 1dec96e..0000000 Binary files a/priv/static/mockups/geometric-abstract-print-3.jpg and /dev/null differ diff --git a/priv/static/mockups/geometric-abstract-print-3.webp b/priv/static/mockups/geometric-abstract-print-3.webp new file mode 100644 index 0000000..554c782 Binary files /dev/null and b/priv/static/mockups/geometric-abstract-print-3.webp differ diff --git a/priv/static/mockups/monstera-leaf-notebook-1.jpg b/priv/static/mockups/monstera-leaf-notebook-1.jpg deleted file mode 100644 index 73ab16b..0000000 Binary files a/priv/static/mockups/monstera-leaf-notebook-1.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-notebook-1.webp b/priv/static/mockups/monstera-leaf-notebook-1.webp new file mode 100644 index 0000000..3863093 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-notebook-1.webp differ diff --git a/priv/static/mockups/monstera-leaf-notebook-2.jpg b/priv/static/mockups/monstera-leaf-notebook-2.jpg deleted file mode 100644 index af4a121..0000000 Binary files a/priv/static/mockups/monstera-leaf-notebook-2.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-notebook-2.webp b/priv/static/mockups/monstera-leaf-notebook-2.webp new file mode 100644 index 0000000..c4e5102 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-notebook-2.webp differ diff --git a/priv/static/mockups/monstera-leaf-notebook-3.jpg b/priv/static/mockups/monstera-leaf-notebook-3.jpg deleted file mode 100644 index 102f882..0000000 Binary files a/priv/static/mockups/monstera-leaf-notebook-3.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-notebook-3.webp b/priv/static/mockups/monstera-leaf-notebook-3.webp new file mode 100644 index 0000000..b0ddcfe Binary files /dev/null and b/priv/static/mockups/monstera-leaf-notebook-3.webp differ diff --git a/priv/static/mockups/monstera-leaf-notebook-4.jpg b/priv/static/mockups/monstera-leaf-notebook-4.jpg deleted file mode 100644 index a658a1b..0000000 Binary files a/priv/static/mockups/monstera-leaf-notebook-4.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-notebook-4.webp b/priv/static/mockups/monstera-leaf-notebook-4.webp new file mode 100644 index 0000000..a379224 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-notebook-4.webp differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-1.jpg b/priv/static/mockups/monstera-leaf-phone-case-1.jpg deleted file mode 100644 index 3fd485b..0000000 Binary files a/priv/static/mockups/monstera-leaf-phone-case-1.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-1.webp b/priv/static/mockups/monstera-leaf-phone-case-1.webp new file mode 100644 index 0000000..e7ffd84 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-phone-case-1.webp differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-2.jpg b/priv/static/mockups/monstera-leaf-phone-case-2.jpg deleted file mode 100644 index 06b23b4..0000000 Binary files a/priv/static/mockups/monstera-leaf-phone-case-2.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-2.webp b/priv/static/mockups/monstera-leaf-phone-case-2.webp new file mode 100644 index 0000000..afcc302 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-phone-case-2.webp differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-3.jpg b/priv/static/mockups/monstera-leaf-phone-case-3.jpg deleted file mode 100644 index 7e50f1a..0000000 Binary files a/priv/static/mockups/monstera-leaf-phone-case-3.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-3.webp b/priv/static/mockups/monstera-leaf-phone-case-3.webp new file mode 100644 index 0000000..c08bfa9 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-phone-case-3.webp differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-4.jpg b/priv/static/mockups/monstera-leaf-phone-case-4.jpg deleted file mode 100644 index 6d41b08..0000000 Binary files a/priv/static/mockups/monstera-leaf-phone-case-4.jpg and /dev/null differ diff --git a/priv/static/mockups/monstera-leaf-phone-case-4.webp b/priv/static/mockups/monstera-leaf-phone-case-4.webp new file mode 100644 index 0000000..994b773 Binary files /dev/null and b/priv/static/mockups/monstera-leaf-phone-case-4.webp differ diff --git a/priv/static/mockups/mountain-sunrise-print-1.jpg b/priv/static/mockups/mountain-sunrise-print-1.jpg deleted file mode 100644 index 28bc9de..0000000 Binary files a/priv/static/mockups/mountain-sunrise-print-1.jpg and /dev/null differ diff --git a/priv/static/mockups/mountain-sunrise-print-1.webp b/priv/static/mockups/mountain-sunrise-print-1.webp new file mode 100644 index 0000000..e44ab67 Binary files /dev/null and b/priv/static/mockups/mountain-sunrise-print-1.webp differ diff --git a/priv/static/mockups/mountain-sunrise-print-2.jpg b/priv/static/mockups/mountain-sunrise-print-2.jpg deleted file mode 100644 index e3efab1..0000000 Binary files a/priv/static/mockups/mountain-sunrise-print-2.jpg and /dev/null differ diff --git a/priv/static/mockups/mountain-sunrise-print-2.webp b/priv/static/mockups/mountain-sunrise-print-2.webp new file mode 100644 index 0000000..631201f Binary files /dev/null and b/priv/static/mockups/mountain-sunrise-print-2.webp differ diff --git a/priv/static/mockups/mountain-sunrise-print-3.jpg b/priv/static/mockups/mountain-sunrise-print-3.jpg deleted file mode 100644 index 5a45026..0000000 Binary files a/priv/static/mockups/mountain-sunrise-print-3.jpg and /dev/null differ diff --git a/priv/static/mockups/mountain-sunrise-print-3.webp b/priv/static/mockups/mountain-sunrise-print-3.webp new file mode 100644 index 0000000..d601c58 Binary files /dev/null and b/priv/static/mockups/mountain-sunrise-print-3.webp differ diff --git a/priv/static/mockups/night-sky-blanket-1.jpg b/priv/static/mockups/night-sky-blanket-1.jpg deleted file mode 100644 index 77774bf..0000000 Binary files a/priv/static/mockups/night-sky-blanket-1.jpg and /dev/null differ diff --git a/priv/static/mockups/night-sky-blanket-1.webp b/priv/static/mockups/night-sky-blanket-1.webp new file mode 100644 index 0000000..0370ca8 Binary files /dev/null and b/priv/static/mockups/night-sky-blanket-1.webp differ diff --git a/priv/static/mockups/night-sky-blanket-2.jpg b/priv/static/mockups/night-sky-blanket-2.jpg deleted file mode 100644 index 890b200..0000000 Binary files a/priv/static/mockups/night-sky-blanket-2.jpg and /dev/null differ diff --git a/priv/static/mockups/night-sky-blanket-2.webp b/priv/static/mockups/night-sky-blanket-2.webp new file mode 100644 index 0000000..42968d4 Binary files /dev/null and b/priv/static/mockups/night-sky-blanket-2.webp differ diff --git a/priv/static/mockups/night-sky-blanket-3.jpg b/priv/static/mockups/night-sky-blanket-3.jpg deleted file mode 100644 index 99b4ecd..0000000 Binary files a/priv/static/mockups/night-sky-blanket-3.jpg and /dev/null differ diff --git a/priv/static/mockups/night-sky-blanket-3.webp b/priv/static/mockups/night-sky-blanket-3.webp new file mode 100644 index 0000000..b628ed5 Binary files /dev/null and b/priv/static/mockups/night-sky-blanket-3.webp differ diff --git a/priv/static/mockups/night-sky-blanket-4.jpg b/priv/static/mockups/night-sky-blanket-4.jpg deleted file mode 100644 index b9f2eca..0000000 Binary files a/priv/static/mockups/night-sky-blanket-4.jpg and /dev/null differ diff --git a/priv/static/mockups/night-sky-blanket-4.webp b/priv/static/mockups/night-sky-blanket-4.webp new file mode 100644 index 0000000..cbae2b5 Binary files /dev/null and b/priv/static/mockups/night-sky-blanket-4.webp differ diff --git a/priv/static/mockups/ocean-waves-cushion-1.jpg b/priv/static/mockups/ocean-waves-cushion-1.jpg deleted file mode 100644 index 39fb1b1..0000000 Binary files a/priv/static/mockups/ocean-waves-cushion-1.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-cushion-1.webp b/priv/static/mockups/ocean-waves-cushion-1.webp new file mode 100644 index 0000000..7403dc3 Binary files /dev/null and b/priv/static/mockups/ocean-waves-cushion-1.webp differ diff --git a/priv/static/mockups/ocean-waves-cushion-2.jpg b/priv/static/mockups/ocean-waves-cushion-2.jpg deleted file mode 100644 index 882dca1..0000000 Binary files a/priv/static/mockups/ocean-waves-cushion-2.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-cushion-2.webp b/priv/static/mockups/ocean-waves-cushion-2.webp new file mode 100644 index 0000000..683500c Binary files /dev/null and b/priv/static/mockups/ocean-waves-cushion-2.webp differ diff --git a/priv/static/mockups/ocean-waves-cushion-3.jpg b/priv/static/mockups/ocean-waves-cushion-3.jpg deleted file mode 100644 index 1e693ac..0000000 Binary files a/priv/static/mockups/ocean-waves-cushion-3.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-cushion-3.webp b/priv/static/mockups/ocean-waves-cushion-3.webp new file mode 100644 index 0000000..bb9de43 Binary files /dev/null and b/priv/static/mockups/ocean-waves-cushion-3.webp differ diff --git a/priv/static/mockups/ocean-waves-print-1.jpg b/priv/static/mockups/ocean-waves-print-1.jpg deleted file mode 100644 index 0f56b7c..0000000 Binary files a/priv/static/mockups/ocean-waves-print-1.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-print-1.webp b/priv/static/mockups/ocean-waves-print-1.webp new file mode 100644 index 0000000..30bdcf3 Binary files /dev/null and b/priv/static/mockups/ocean-waves-print-1.webp differ diff --git a/priv/static/mockups/ocean-waves-print-2.jpg b/priv/static/mockups/ocean-waves-print-2.jpg deleted file mode 100644 index a4e4c58..0000000 Binary files a/priv/static/mockups/ocean-waves-print-2.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-print-2.webp b/priv/static/mockups/ocean-waves-print-2.webp new file mode 100644 index 0000000..96f7fd1 Binary files /dev/null and b/priv/static/mockups/ocean-waves-print-2.webp differ diff --git a/priv/static/mockups/ocean-waves-print-3.jpg b/priv/static/mockups/ocean-waves-print-3.jpg deleted file mode 100644 index 5b4f63b..0000000 Binary files a/priv/static/mockups/ocean-waves-print-3.jpg and /dev/null differ diff --git a/priv/static/mockups/ocean-waves-print-3.webp b/priv/static/mockups/ocean-waves-print-3.webp new file mode 100644 index 0000000..8494caf Binary files /dev/null and b/priv/static/mockups/ocean-waves-print-3.webp differ diff --git a/priv/static/mockups/sunset-gradient-tote-1.jpg b/priv/static/mockups/sunset-gradient-tote-1.jpg deleted file mode 100644 index 4a607f2..0000000 Binary files a/priv/static/mockups/sunset-gradient-tote-1.jpg and /dev/null differ diff --git a/priv/static/mockups/sunset-gradient-tote-1.webp b/priv/static/mockups/sunset-gradient-tote-1.webp new file mode 100644 index 0000000..26549bd Binary files /dev/null and b/priv/static/mockups/sunset-gradient-tote-1.webp differ diff --git a/priv/static/mockups/sunset-gradient-tote-2.jpg b/priv/static/mockups/sunset-gradient-tote-2.jpg deleted file mode 100644 index 35ba975..0000000 Binary files a/priv/static/mockups/sunset-gradient-tote-2.jpg and /dev/null differ diff --git a/priv/static/mockups/sunset-gradient-tote-2.webp b/priv/static/mockups/sunset-gradient-tote-2.webp new file mode 100644 index 0000000..dcb5e85 Binary files /dev/null and b/priv/static/mockups/sunset-gradient-tote-2.webp differ diff --git a/priv/static/mockups/sunset-gradient-tote-3.jpg b/priv/static/mockups/sunset-gradient-tote-3.jpg deleted file mode 100644 index 3635144..0000000 Binary files a/priv/static/mockups/sunset-gradient-tote-3.jpg and /dev/null differ diff --git a/priv/static/mockups/sunset-gradient-tote-3.webp b/priv/static/mockups/sunset-gradient-tote-3.webp new file mode 100644 index 0000000..ed18e24 Binary files /dev/null and b/priv/static/mockups/sunset-gradient-tote-3.webp differ diff --git a/priv/static/mockups/sunset-gradient-tote-4.jpg b/priv/static/mockups/sunset-gradient-tote-4.jpg deleted file mode 100644 index 20627a2..0000000 Binary files a/priv/static/mockups/sunset-gradient-tote-4.jpg and /dev/null differ diff --git a/priv/static/mockups/sunset-gradient-tote-4.webp b/priv/static/mockups/sunset-gradient-tote-4.webp new file mode 100644 index 0000000..2096349 Binary files /dev/null and b/priv/static/mockups/sunset-gradient-tote-4.webp differ diff --git a/priv/static/mockups/wildflower-meadow-print-1.jpg b/priv/static/mockups/wildflower-meadow-print-1.jpg deleted file mode 100644 index 23b6a5e..0000000 Binary files a/priv/static/mockups/wildflower-meadow-print-1.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-print-1.webp b/priv/static/mockups/wildflower-meadow-print-1.webp new file mode 100644 index 0000000..04e4b86 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-print-1.webp differ diff --git a/priv/static/mockups/wildflower-meadow-print-2.jpg b/priv/static/mockups/wildflower-meadow-print-2.jpg deleted file mode 100644 index 6604a0b..0000000 Binary files a/priv/static/mockups/wildflower-meadow-print-2.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-print-2.webp b/priv/static/mockups/wildflower-meadow-print-2.webp new file mode 100644 index 0000000..b9c23f6 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-print-2.webp differ diff --git a/priv/static/mockups/wildflower-meadow-print-3.jpg b/priv/static/mockups/wildflower-meadow-print-3.jpg deleted file mode 100644 index 2b8e3ea..0000000 Binary files a/priv/static/mockups/wildflower-meadow-print-3.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-print-3.webp b/priv/static/mockups/wildflower-meadow-print-3.webp new file mode 100644 index 0000000..583b743 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-print-3.webp differ diff --git a/priv/static/mockups/wildflower-meadow-tote-1.jpg b/priv/static/mockups/wildflower-meadow-tote-1.jpg deleted file mode 100644 index 73ba092..0000000 Binary files a/priv/static/mockups/wildflower-meadow-tote-1.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-tote-1.webp b/priv/static/mockups/wildflower-meadow-tote-1.webp new file mode 100644 index 0000000..098e69c Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-tote-1.webp differ diff --git a/priv/static/mockups/wildflower-meadow-tote-2.jpg b/priv/static/mockups/wildflower-meadow-tote-2.jpg deleted file mode 100644 index 58977f5..0000000 Binary files a/priv/static/mockups/wildflower-meadow-tote-2.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-tote-2.webp b/priv/static/mockups/wildflower-meadow-tote-2.webp new file mode 100644 index 0000000..dcb5e85 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-tote-2.webp differ diff --git a/priv/static/mockups/wildflower-meadow-tote-3.jpg b/priv/static/mockups/wildflower-meadow-tote-3.jpg deleted file mode 100644 index 7264ae2..0000000 Binary files a/priv/static/mockups/wildflower-meadow-tote-3.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-tote-3.webp b/priv/static/mockups/wildflower-meadow-tote-3.webp new file mode 100644 index 0000000..440ee60 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-tote-3.webp differ diff --git a/priv/static/mockups/wildflower-meadow-tote-4.jpg b/priv/static/mockups/wildflower-meadow-tote-4.jpg deleted file mode 100644 index 4242e8e..0000000 Binary files a/priv/static/mockups/wildflower-meadow-tote-4.jpg and /dev/null differ diff --git a/priv/static/mockups/wildflower-meadow-tote-4.webp b/priv/static/mockups/wildflower-meadow-tote-4.webp new file mode 100644 index 0000000..d162ca1 Binary files /dev/null and b/priv/static/mockups/wildflower-meadow-tote-4.webp differ