- Reset button clears all images and crops without page refresh
- Remove button on active image preview (bottom-left, hover turns red)
- Remove buttons in thumbnail strip were already present but now active image can also be deleted individually
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- AuthGate: full-screen branded layout with left panel (scissors icon,
tagline) and MS-branded sign-in button (official colors/logo)
- Index: show signed-in user name + LogOut button in header via useMsal
- Fix: show engine toggle + Generate button as soon as an image is
uploaded; disable Generate until a ratio is selected instead of hiding
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The script runs as a non-root user; only the ownership change requires
elevated privileges. Using sudo chown instead of running the whole
script as root follows least-privilege principle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removed no-op `cp "$ENV_FILE" "$REPO_DIR/.env"` — both paths resolve to
the same file, causing cp to exit with code 1 under `set -euo pipefail`,
which aborted the script before npm ci or npm run build could run.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Integrate MSAL (Azure AD) login gating the entire app
- Add deploy.sh for building and serving via Apache on Ubuntu
- Set Vite base path to /smartcrop26/ for subpath deployment
- Add .env.example with required environment variables
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- React + Vite + TypeScript + Tailwind + shadcn/ui
- AI crop engine (Google Gemini 2.5 Flash) + local edge-detection engine
- Pixel size outputs with configurable dimensions per ratio
- Import/export config (backward compatible with old Python SmartCrop configs)
- Crop editor with fixed-frame zoom/pan
- ZIP export with multi-size scaling
- Montserrat font, #FFC407 gold theme
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>