New layout:
src/script/app/ Python package (was app/)
src/assets/img/ SVGs (was static/*.svg)
src/assets/css/ stylesheet (was static/style.css)
src/templates/ HTML templates (was templates/)
illustration/ README screenshot (was screenshots/), kept at
the repo root since it's a doc asset, not
something the app serves
main.py, jobs/, VERSION, docker/ unchanged locations
main.py stays at the repo root as the entry point (matches how
Docker and local runs already invoke it) and prepends src/script to
sys.path before importing app, rather than moving into src/script/
itself and needing every entry point updated to match.
config.py's path constants are recomputed for app/config.py's new
depth (src/script/app/), with SRC_DIR and REPO_ROOT resolved
explicitly rather than a single ambiguous BASE_DIR, since "templates
and assets live under src/" and "jobs and VERSION live at the repo
root" are no longer the same directory. Flask's static_folder now
points at src/assets, which serves img/ and css/ under it at
whatever URL prefix Flask derives from the folder name (/assets, not
/static); templates already reference assets via the "static"
endpoint name through url_for, so this needed the url_for() calls'
filename argument updated with the img/ or css/ prefix, not a
hardcoded URL change.
Docker copies src/ into the image preserving this same internal
structure, so the path arithmetic in config.py resolves identically
in both a local checkout and the container, no --chdir or other
container-specific path handling needed.
Verified end to end after the move: local Flask dev server, a full
Docker rebuild, and a real HTTP conversion request through the
running container (TIFF HDR pipeline, numpy/tifffile imports
included) all succeed.
Reworked static/style.css to follow the same visual language as
lumeex's back office (near-black background, cyan accent, gradient
pill buttons, translucent bordered panels) instead of the previous
generic dark-teal theme. Dropzones now use a dashed border while
empty, turning solid once a file is picked. Also fixes a stale CSS
selector (.dropzone label.tag) that never matched the actual markup
(a <span>), so the SDR/HDR tag labels were unstyled before.
Adds Gitea and GitHub repo links in the footer, using the same icons
and link pattern as lumeex.
Some users want the assembled HDR JPEG for somewhere other than
Instagram, where the exact 1080x1080/1080x1350/1080x566 match isn't
relevant. A checkbox on the form now lets the whole batch skip that
specific check. The SDR/HDR dimension-match check still always
applies, since that's a technical requirement for the gain map to
align, not an Instagram-specific rule.