feat: add dark mode support, accordion UI, and current combination display

- Update Theme Studio sidebar to use DaisyUI theme-aware classes for dark mode
- Convert Customise accordion to native details/summary elements for proper interaction
- Add "Current combination" card showing active theme settings
- Add SVG recolorer for logo color customization
- Add image controller for serving uploaded images
- Implement header background image controls (zoom, position)
- Add toggle_customise event handler to preserve accordion state across re-renders

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-31 18:55:44 +00:00
parent 0dada968aa
commit 1ca703e548
20 changed files with 1477 additions and 318 deletions

View File

@@ -15,12 +15,16 @@ defmodule SimpleshopTheme.Settings.ThemeSettings do
field :accent_color, :string, default: "#f97316"
# Branding
field :site_name, :string, default: "Store Name"
field :logo_mode, :string, default: "text-only"
field :logo_image_id, :binary_id
field :header_image_id, :binary_id
field :logo_size, :integer, default: 36
field :logo_recolor, :boolean, default: false
field :logo_color, :string, default: "#171717"
# Header Background
field :header_background_enabled, :boolean, default: false
field :header_image_id, :binary_id
field :header_zoom, :integer, default: 100
field :header_position_x, :integer, default: 50
field :header_position_y, :integer, default: 50
@@ -58,12 +62,14 @@ defmodule SimpleshopTheme.Settings.ThemeSettings do
:grid_columns,
:header_layout,
:accent_color,
:site_name,
:logo_mode,
:logo_image_id,
:header_image_id,
:logo_size,
:logo_recolor,
:logo_color,
:header_background_enabled,
:header_image_id,
:header_zoom,
:header_position_x,
:header_position_y,
@@ -92,7 +98,7 @@ defmodule SimpleshopTheme.Settings.ThemeSettings do
|> validate_inclusion(:density, ~w(spacious balanced compact))
|> validate_inclusion(:grid_columns, ~w(2 3 4))
|> validate_inclusion(:header_layout, ~w(standard centered minimal))
|> validate_inclusion(:logo_mode, ~w(text-only logo-text logo-only header-image logo-header))
|> validate_inclusion(:logo_mode, ~w(text-only logo-text logo-only))
|> validate_number(:logo_size, greater_than_or_equal_to: 24, less_than_or_equal_to: 120)
|> validate_number(:header_zoom, greater_than_or_equal_to: 100, less_than_or_equal_to: 200)
|> validate_number(:header_position_x, greater_than_or_equal_to: 0, less_than_or_equal_to: 100)