Cập nhật
Mọi thay đổi đáng kể của Image Optimizer được ghi lại tại đây. Định dạng theo Keep a Changelog.
- v0.4.0Landing & SEO
Thêm mới
- Static Site Generation (SSG) với @angular/ssr — 9 routes prerendered.
- Routing đa ngôn ngữ path-based: /vi/, /en/, /vi/optimize, /vi/about, /vi/changelog, /vi/blog.
- Landing page hoàn chỉnh với 6 sections: Hero, Features (8 cards), How-it-works (3 bước), Comparison (vs TinyPNG/Squoosh), FAQ (8 câu), CTA.
- Marketing chrome: sticky header với nav + theme/lang switcher + CTA "Mở app"; footer với liên kết + copyright.
- About page: project story, tech stack, cam kết quyền riêng tư, open source, Support CTA, contact.
- Changelog page (trang này) với timeline theo phiên bản.
- SeoService trung tâm: title, description, OG/Twitter cards, canonical, hreflang × 3 (vi/en/x-default), JSON-LD.
- JSON-LD: SoftwareApplication, FAQPage, BreadcrumbList, AboutPage.
- OG image SVG 1200×630 với branding.
- Theme-color meta tags cho mobile chrome (light + dark).
- Script `npm run verify:seo` validate prerendered HTML.
Cải tiến
- Nút Settings (bánh răng) chuyển từ FAB nổi trong app sang inline button trong header — chỉ hiện ở /optimize.
- Theme toggle + Lang switcher dời từ image-uploader sang shared/ui — dùng chung header marketing + app shell.
- Lang switcher giờ navigate qua Router (giữ path hiện tại) thay vì chỉ update signal.
- Support modal chuyển sang CDK Dialog — accessible focus trap + Esc đóng + outside click đóng.
- AppShellLayout lazy-load qua loadComponent — marketing routes không bundle CDK Dialog/PresetManager.
- v0.3.0Presets & Watermarks
Thêm mới
- Lưu nhiều bộ cấu hình (preset name + format + resize + watermark + naming).
- Export / Import preset qua file JSON — dùng lại trên máy khác.
- Tối đa 5 watermark cho mỗi ảnh (text hoặc PNG logo).
- Watermark có vị trí, opacity, kích thước % theo chiều rộng ảnh.
- Drag-reorder watermark + drag-reorder file trước khi xuất zip.
- Bulk naming: prefix, suffix, đánh số tự động với start index tuỳ chọn.
Cải tiến
- Watermark refactor sang discriminated union (TextWatermarkConfig | ImageWatermarkConfig) — type-safe hơn.
- MAX_WATERMARKS = 5 áp dụng cả khi import preset để phòng DoS client-side.
- v0.2.0Polish & Locale
Thêm mới
- i18n: Tiếng Việt + English. Default theo navigator.language, lưu localStorage.
- Dark mode với CSS variables — auto theo prefers-color-scheme, có thể toggle thủ công.
- Hỗ trợ đọc HEIC (ảnh từ iPhone) qua heic2any.
- Tuỳ chọn giữ metadata EXIF (GPS, ngày chụp) khi nén JPEG → JPEG.
- Phím tắt: Ctrl/⌘ + O mở file picker, Ctrl/⌘ + S tải zip, Esc đóng modal.
- Tooltip xem kích thước file chính xác đến từng byte.
Sửa lỗi
- Memory leak: revoke ObjectURL khi clear list hoặc remove file.
- Trùng tên file khi xuất zip — auto append (1), (2), ...
- v0.1.0Initial release
Thêm mới
- Drag-drop nhiều ảnh hoặc click chọn từ file picker.
- 3 preset nén: Nén nhẹ (chất lượng cao), Nén vừa (cân bằng), Nén tối đa (tiết kiệm).
- Format đầu ra: JPEG hoặc WebP.
- Resize: Auto (theo preset), Chiều ngang, Chiều cao, hoặc Phần trăm.
- Xử lý đồng thời tối đa 3 ảnh qua RxJS mergeMap — không treo trình duyệt.
- Modal so sánh chất lượng gốc vs nén bằng slider.
- Real-time progress mỗi file qua Angular Signals.
- Tải từng ảnh hoặc đóng gói toàn bộ thành .zip qua JSZip.