diff --git a/docker/frontend/src/Landing.tsx b/docker/frontend/src/Landing.tsx index 50dd5b5..31c3be2 100644 --- a/docker/frontend/src/Landing.tsx +++ b/docker/frontend/src/Landing.tsx @@ -194,6 +194,63 @@ const FAQ = [ { q: { en: 'Is there an export watermark?', vi: 'Ảnh xuất có watermark không?' }, a: { en: 'No watermarks on your own exports. Only the free guest tier on the web adds a small corner mark; sign in and it disappears.', vi: 'Ảnh bạn xuất không có watermark. Chỉ khách chưa đăng nhập trên web mới có một vết nhỏ ở góc; đăng nhập là mất.' } }, ]; +// The About copy — the source is the About RecipesCam brief, kept here as one +// bilingual block rather than a route of its own: the landing is a one-pager +// with anchor nav, and this way the section carries the same nav, theme and +// language switches as the rest of the page for free. +type AboutBlock = { title: Txt; body: Txt[]; list?: { label: Txt; items: { title: Txt; text: Txt }[] } }; +const ABOUT: { + lead: Txt; + welcome: Txt; + blocks: AboutBlock[]; + contact: Txt; + email: string; + closing: Txt; +} = { + lead: { en: 'Where computational photography meets the analog film era.', vi: 'Nơi nhiếp ảnh tính toán gặp vẻ đẹp của phim analog.' }, + welcome: { en: 'Welcome to RecipesCam — the power of modern computational photography meeting the timeless artistic beauty of the analog film era.', vi: 'Chào mừng đến với RecipesCam — sức mạnh của nhiếp ảnh tính toán hiện đại hoà cùng vẻ đẹp nghệ thuật vượt thời gian của thời đại phim analog.' }, + blocks: [ + { + title: { en: 'Our Vision', vi: 'Tầm nhìn' }, + body: [ + { en: 'In the digital age, as smartphone cameras increasingly try to smooth, brighten and “perfect” every shot with AI, we quietly lose authentic emotion. The imperfections, the natural film grain and the soft colour transitions of a roll of film are exactly what give a photograph its soul.', vi: 'Thời đại số, khi camera điện thoại ngày càng cố làm mịn, làm sáng và “hoàn hảo hoá” mọi khung hình bằng AI, chúng ta dần đánh mất cảm xúc thật. Chính những khiếm khuyết, hạt phim tự nhiên và chuyển màu mềm mại của một cuộn phim mới là thứ cho bức ảnh một linh hồn.' }, + { en: 'RecipesCam was born with a single mission: to hand the control of colour and emotion back to the photographer — right on an Android phone.', vi: 'RecipesCam ra đời với một sứ mệnh duy nhất: trả lại quyền kiểm soát màu sắc và cảm xúc cho người chụp — ngay trên chiếc điện thoại Android.' }, + ], + }, + { + title: { en: 'The RecipesCam Android App', vi: 'Ứng dụng RecipesCam cho Android' }, + body: [ + { en: 'Not just another post-processing filter app. RecipesCam is a real-time camera engine that puts the GPU of your Android device to work.', vi: 'Không chỉ là một app filter hậu kỳ. RecipesCam là engine máy ảnh thời gian thực, tận dụng sức mạnh GPU của thiết bị Android.' }, + ], + list: { + label: { en: 'App Highlights', vi: 'Điểm nổi bật' }, + items: [ + { title: { en: 'Live Viewfinder:', vi: 'Ngắm trực tiếp:' }, text: { en: 'shader technology shows the exact colour, contrast and film grain of a colour recipe (Recipe) on screen at 60FPS, before you press the shutter.', vi: 'công nghệ shader hiển thị đúng màu, tương phản và hạt phim của công thức màu (Recipe) ngay trên màn hình ở 60FPS, trước khi bạn bấm máy.' } }, + { title: { en: 'Pristine Image Quality:', vi: 'Chất lượng ảnh nguyên bản:' }, text: { en: 'the pipeline interfaces deeply with the camera hardware — highlight detail protected, natural sharpness retained, artificial noise reduction replaced by procedural film grain simulation.', vi: 'pipeline giao tiếp sâu với phần cứng camera — giữ chi tiết vùng sáng, giữ độ nét tự nhiên, thay thuật toán khử nhiễu nhân tạo bằng mô phỏng hạt phim thủ tục.' } }, + { title: { en: 'Diverse Recipes Library:', vi: 'Thư viện công thức đa dạng:' }, text: { en: 'the feeling of shooting with renowned cameras, through meticulously crafted colour recipes.', vi: 'cảm giác chụp bằng những chiếc máy ảnh nổi tiếng, qua các công thức màu được chăm chút tỉ mỉ.' } }, + ], + }, + }, + { + title: { en: 'About the RecipesCam Website', vi: 'Về website RecipesCam' }, + body: [ + { en: 'The official RecipesCam website (at this address) was built with three core purposes:', vi: 'Website chính thức của RecipesCam (tại địa chỉ này) được dựng với ba mục đích chính:' }, + ], + list: { + label: { en: 'Core Purposes', vi: 'Mục đích chính' }, + items: [ + { title: { en: 'Official Information Portal:', vi: 'Cổng thông tin chính thức:' }, text: { en: 'where new features are introduced, colour recipes updated and photography knowledge shared with the RecipesCam community.', vi: 'nơi giới thiệu tính năng mới, cập nhật công thức màu và chia sẻ kiến thức nhiếp ảnh với cộng đồng RecipesCam.' } }, + { title: { en: 'Download & Support Center:', vi: 'Trung tâm tải & hỗ trợ:' }, text: { en: 'installation guides and optimisation tips for the range of Android devices.', vi: 'hướng dẫn cài đặt và mẹo tối ưu cho nhiều dòng thiết bị Android.' } }, + { title: { en: 'Legal & License:', vi: 'Pháp lý & bản quyền:' }, text: { en: 'the official publication of our Terms of Service, EULA and software licensing rules; every individual and organisation using the app follows what is listed here.', vi: 'nơi công bố chính thức Điều khoản dịch vụ, EULA và quy định cấp phép phần mềm; mọi cá nhân và tổ chức dùng app đều tuân theo những gì công bố ở đây.' } }, + ], + }, + }, + ], + contact: { en: 'Technical inquiries, partnerships, bug reports or licensing — email the development team at', vi: 'Thắc mắc kỹ thuật, hợp tác, báo lỗi hay vấn đề bản quyền — gửi email cho đội ngũ phát triển tại' }, + email: 'recipescam.app@gmail.com', + closing: { en: 'Thank you for choosing RecipesCam to tell your story through every frame.', vi: 'Cảm ơn bạn đã chọn RecipesCam để kể câu chuyện của mình qua từng khung hình.' }, +}; + function Icon({ name }: { name: Feature['icon'] }) { const common = { width: 26, height: 26, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const }; switch (name) { @@ -457,6 +514,7 @@ export function Landing() { { href: '#features', label: { en: 'Features', vi: 'Tính năng' } }, { href: '#qr', label: { en: 'QR Code', vi: 'Mã QR' } }, { href: '#pricing', label: { en: 'Pricing', vi: 'Bảng giá' } }, + { href: '#about', label: { en: 'About', vi: 'Giới thiệu' } }, ]; const toastStore: Txt = { en: 'The App Store listing arrives with the public release — use the web studio in the meantime.', vi: 'App Store sẽ mở khi phát hành chính thức — trong lúc chờ, hãy dùng web studio.' }; @@ -1078,7 +1136,44 @@ export function Landing() { - {/* 9 — testimonials + FAQ */} + {/* 9 — about */} +
+
+
+ {c({ en: 'About', vi: 'Giới thiệu' })} +

{c(ABOUT.lead)}

+

{c(ABOUT.welcome)}

+
+
+ {ABOUT.blocks.map((b) => ( +
+

{c(b.title)}

+ {b.body.map((p) =>

{c(p)}

)} + {b.list ? ( + <> +

{c(b.list.label)}

+
+ {b.list.items.map((item, i) => ( +
+ {i + 1} +

{c(item.title)} {c(item.text)}

+
+ ))} +
+ + ) : null} +
+ ))} +
+

+ {c(ABOUT.contact)}{' '} + {ABOUT.email} +

+

{c(ABOUT.closing)}

+
+
+ + {/* 10 — testimonials + FAQ */}
@@ -1108,7 +1203,7 @@ export function Landing() {
- {/* 10 — final CTA + footer */} + {/* 11 — final CTA + footer */}