Compare commits

4 Commits

9 changed files with 548 additions and 40 deletions

View File

@@ -4,14 +4,14 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Rosetta - Secure & Private Messaging | End-to-End Encrypted Chat</title> <title>Rosetta - Secure & Private Messaging | End-to-End Encrypted Chat</title>
<meta name="description" content="Rosetta is a secure, fast, and private messaging app with military-grade end-to-end encryption. Download for macOS, Windows, and Linux. No phone number required." /> <meta name="description" content="Rosetta is a secure, fast, and private messaging app with military-grade end-to-end encryption. Download for Windows, Linux, and Android. No phone number required." />
<meta name="keywords" content="secure messaging, encrypted chat, private messenger, end-to-end encryption, secure communication" /> <meta name="keywords" content="secure messaging, encrypted chat, private messenger, end-to-end encryption, secure communication" />
<meta name="author" content="Rosetta Team" /> <meta name="author" content="Rosetta Team" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://rosetta.im/" /> <meta property="og:url" content="https://rosetta.im/" />
<meta property="og:title" content="Rosetta - Secure Messaging for Everyone" /> <meta property="og:title" content="Rosetta - Secure Messaging for Everyone" />
<meta property="og:description" content="End-to-end encrypted messaging app with zero-knowledge architecture. Download for macOS, Windows, Linux." /> <meta property="og:description" content="End-to-end encrypted messaging app with zero-knowledge architecture. Download for Windows, Linux, and Android." />
<meta property="og:image" content="/og-image.png" /> <meta property="og:image" content="/og-image.png" />
<meta property="og:site_name" content="Rosetta" /> <meta property="og:site_name" content="Rosetta" />
<meta property="og:locale" content="en_US" /> <meta property="og:locale" content="en_US" />
@@ -34,7 +34,7 @@
"description": "Secure end-to-end encrypted messaging application", "description": "Secure end-to-end encrypted messaging application",
"url": "https://rosetta.im", "url": "https://rosetta.im",
"applicationCategory": "CommunicationApplication", "applicationCategory": "CommunicationApplication",
"operatingSystem": ["Windows", "macOS", "Linux", "Android"], "operatingSystem": ["Windows", "Linux", "Android"],
"offers": { "offers": {
"@type": "Offer", "@type": "Offer",
"price": "0", "price": "0",

227
public/privacy/index.html Normal file
View File

@@ -0,0 +1,227 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Privacy Policy for Rosetta</title>
<meta
name="description"
content="Privacy Policy for Rosetta by ROSETTA CLOUD SERVICES LIMITED: how data is handled in the end-to-end encrypted messenger."
/>
<link rel="canonical" href="https://rosetta.im/privacy/" />
<style>
:root {
color-scheme: light dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
color: #1f2937;
background: #ffffff;
}
body {
margin: 0;
background: linear-gradient(180deg, rgba(0, 102, 255, 0.04), rgba(255, 255, 255, 0));
}
main {
width: min(880px, calc(100% - 40px));
margin: 0 auto;
padding: 56px 0 72px;
}
a {
color: #0066ff;
}
h1 {
margin: 0 0 8px;
font-size: clamp(32px, 5vw, 48px);
line-height: 1.1;
}
h2 {
margin-top: 36px;
font-size: 22px;
line-height: 1.25;
}
p,
li {
font-size: 16px;
}
.muted {
color: #6b7280;
}
.back {
display: inline-block;
margin-bottom: 28px;
text-decoration: none;
}
.address {
white-space: pre-line;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f3f4f6;
background: #101113;
}
body {
background: linear-gradient(180deg, rgba(0, 102, 255, 0.12), rgba(16, 17, 19, 0));
}
.muted {
color: #a1a1aa;
}
}
</style>
</head>
<body>
<main>
<a class="back" href="/">Back to home</a>
<h1>Privacy Policy for Rosetta</h1>
<p class="muted">Last updated: May 22, 2026</p>
<p>
Rosetta IM is operated by ROSETTA CLOUD SERVICES LIMITED ("Rosetta",
"we", "us", or "our"). This Privacy Policy explains how we handle
information when you use Rosetta, our end-to-end encrypted messaging
application, and our website at https://rosetta.im.
</p>
<h2>1. Information We Collect</h2>
<p>
Rosetta is designed to minimize data collection. Registration does not
require a phone number, email address, or real name. The app uses
cryptographic keys and technical identifiers needed to operate the
service.
</p>
<ul>
<li>
Account and cryptographic data: public keys, account identifiers, and
related technical data needed to identify users and deliver encrypted
messages. Private keys are intended to remain on your device.
</li>
<li>
Encrypted messages and media in transit: message text, files, and
media are encrypted before they are sent. Our servers are designed to
relay encrypted payloads and encrypted message keys, not to read
message contents.
</li>
<li>
Device and app data: app version, operating system, platform,
architecture, update request data, IP address, timestamps, and server
logs needed for security, reliability, abuse prevention, and update
delivery.
</li>
<li>
Support communications: if you contact us, we may process your email
address, message content, and any information you choose to provide.
</li>
</ul>
<h2>2. Information We Do Not Collect for Advertising</h2>
<p>
We do not use third-party advertising SDKs, advertising trackers, or
cross-app tracking. We do not sell your personal information.
</p>
<h2>3. How We Use Information</h2>
<p>We use information only to:</p>
<ul>
<li>provide, maintain, and secure Rosetta;</li>
<li>route encrypted messages between users;</li>
<li>deliver app updates and downloads;</li>
<li>detect abuse, prevent fraud, and protect service integrity;</li>
<li>respond to support requests;</li>
<li>comply with legal obligations.</li>
</ul>
<h2>4. End-to-End Encryption</h2>
<p>
Rosetta is designed so that message content is encrypted before it
reaches our servers. Our servers are not intended to have access to
decrypted message contents or decrypted media. Messages are stored on
users' devices rather than as readable message history on our servers.
</p>
<h2>5. Sharing of Information</h2>
<p>We may share limited information only with:</p>
<ul>
<li>infrastructure and hosting providers that help us operate Rosetta;</li>
<li>professional advisers, if necessary;</li>
<li>
authorities or other parties when required by law or to protect rights,
safety, and security.
</li>
</ul>
<p>
Any service provider that processes user data for us must protect it
consistently with this Privacy Policy.
</p>
<h2>6. Retention</h2>
<p>
Encrypted message data in transit is processed only as needed to deliver
the service. Technical logs and support communications are retained only
for as long as reasonably necessary for security, reliability, support,
legal, and operational purposes.
</p>
<h2>7. Your Choices and Rights</h2>
<p>
Depending on where you live, you may have rights to access, correct,
delete, or object to certain processing of your personal information. To
make a request, contact us at admin@rosetta.im.
</p>
<p>
Because Rosetta minimizes account data and uses cryptographic
identifiers, some requests may require you to provide information that
helps us verify control of the relevant account or keys.
</p>
<h2>8. Children</h2>
<p>
Rosetta is not directed to children under 13, or the minimum age required
in your jurisdiction. If we learn that we have collected personal
information from a child without required consent, we will take
appropriate steps to delete it.
</p>
<h2>9. International Transfers</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED may process information in countries other
than where you live. Where required, we use appropriate safeguards for
international transfers.
</p>
<h2>10. Security</h2>
<p>
We use technical and organizational measures designed to protect
information. No system is perfectly secure, and users are responsible for
protecting their devices, private keys, and account access.
</p>
<h2>11. Changes to This Policy</h2>
<p>
We may update this Privacy Policy from time to time. If we make material
changes, we will update the "Last updated" date and, where appropriate,
provide additional notice.
</p>
<h2>12. Contact</h2>
<p class="address">ROSETTA CLOUD SERVICES LIMITED
Registered address:
UNIT 704C 7/F BLK 3 NAN FUNG IND CITY
18 TIN HAU RD
TUEN MUN
HONG KONG</p>
<p>Email: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a></p>
<p>Phone: <a href="tel:+85228910030">+852 2891 0030</a></p>
</main>
</body>
</html>

257
public/terms/index.html Normal file
View File

@@ -0,0 +1,257 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Terms of Use for Rosetta</title>
<meta
name="description"
content="Terms of Use and End User License Agreement for Rosetta by ROSETTA CLOUD SERVICES LIMITED."
/>
<link rel="canonical" href="https://rosetta.im/terms/" />
<style>
:root {
color-scheme: light dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
color: #1f2937;
background: #ffffff;
}
body {
margin: 0;
background: linear-gradient(180deg, rgba(0, 102, 255, 0.04), rgba(255, 255, 255, 0));
}
main {
width: min(880px, calc(100% - 40px));
margin: 0 auto;
padding: 56px 0 72px;
}
a {
color: #0066ff;
}
h1 {
margin: 0 0 8px;
font-size: clamp(32px, 5vw, 48px);
line-height: 1.1;
}
h2 {
margin-top: 36px;
font-size: 22px;
line-height: 1.25;
}
p,
li {
font-size: 16px;
}
.muted {
color: #6b7280;
}
.back {
display: inline-block;
margin-bottom: 28px;
text-decoration: none;
}
.address {
white-space: pre-line;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f3f4f6;
background: #101113;
}
body {
background: linear-gradient(180deg, rgba(0, 102, 255, 0.12), rgba(16, 17, 19, 0));
}
.muted {
color: #a1a1aa;
}
}
</style>
</head>
<body>
<main>
<a class="back" href="/">Back to home</a>
<h1>Terms of Use for Rosetta</h1>
<p class="muted">Last updated: May 22, 2026</p>
<p>
These Terms of Use and End User License Agreement ("Terms") govern your
use of Rosetta, an end-to-end encrypted messaging application operated by
ROSETTA CLOUD SERVICES LIMITED ("Rosetta", "we", "us", or "our").
</p>
<p>
By downloading, installing, or using Rosetta, you agree to these Terms.
</p>
<h2>1. Agreement Between You and Rosetta</h2>
<p>
These Terms are concluded between you and ROSETTA CLOUD SERVICES LIMITED
only, and not with Apple. We, not Apple, are solely responsible for
Rosetta and its content.
</p>
<h2>2. License</h2>
<p>
We grant you a limited, non-exclusive, non-transferable, revocable
license to use Rosetta for personal or lawful business communication on
Apple-branded products that you own or control, as permitted by the Apple
Media Services Terms and Conditions, including applicable Family Sharing,
volume purchasing, or Legacy Contacts rules.
</p>
<p>
You may not copy, modify, reverse engineer, decompile, resell,
sublicense, rent, lease, or distribute Rosetta except as permitted by
applicable law.
</p>
<h2>3. Privacy</h2>
<p>
Your use of Rosetta is also governed by our Privacy Policy, available at
<a href="/privacy/">https://rosetta.im/privacy/</a>.
</p>
<h2>4. Encrypted Messaging</h2>
<p>
Rosetta is designed for end-to-end encrypted communication. You are
responsible for protecting your device, private keys, and access
credentials. If you lose access to your device or keys, we may not be
able to restore your messages or account data.
</p>
<h2>5. Acceptable Use</h2>
<p>You agree not to use Rosetta to:</p>
<ul>
<li>violate any law or regulation;</li>
<li>infringe the rights of others;</li>
<li>send spam, malware, scams, threats, harassment, or unlawful content;</li>
<li>
attempt to disrupt, overload, reverse engineer, or compromise Rosetta
or its infrastructure;
</li>
<li>impersonate another person or misrepresent your identity;</li>
<li>use Rosetta for any prohibited or sanctioned activity.</li>
</ul>
<h2>6. No Emergency Use</h2>
<p>
Rosetta is not designed for emergency calls, emergency messaging, or
communications where failure or delay could cause death, personal injury,
or serious damage. Use official emergency channels when needed.
</p>
<h2>7. User Content</h2>
<p>
You retain ownership of the content you create or send through Rosetta.
You grant us the limited rights necessary to operate the service, such as
routing encrypted messages and maintaining service security. We do not
claim ownership of your messages or files.
</p>
<h2>8. Updates and Availability</h2>
<p>
We may update, modify, suspend, or discontinue Rosetta or parts of the
service at any time. Some features may require an internet connection or
a compatible device and operating system.
</p>
<h2>9. Fees</h2>
<p>
Rosetta is currently offered as a free application unless stated
otherwise. If paid features, subscriptions, or in-app purchases are
introduced through Apple, Apple's payment and subscription terms will
apply.
</p>
<h2>10. Maintenance and Support</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED is solely responsible for providing
maintenance and support for Rosetta. Apple has no obligation to provide
maintenance or support services for Rosetta.
</p>
<p>Support contact: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a></p>
<h2>11. Warranty</h2>
<p>
Rosetta is provided "as is" and "as available" to the maximum extent
permitted by law. If Rosetta fails to conform to any applicable warranty,
you may notify Apple, and Apple may refund the purchase price, if any,
for the app. To the maximum extent permitted by law, Apple has no other
warranty obligation for Rosetta.
</p>
<h2>12. Product Claims</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED, not Apple, is responsible for addressing
any claims relating to Rosetta, including product liability claims, legal
or regulatory claims, and claims under consumer protection or similar
laws.
</p>
<h2>13. Intellectual Property Claims</h2>
<p>
If a third party claims that Rosetta or your use of Rosetta infringes
intellectual property rights, ROSETTA CLOUD SERVICES LIMITED, not Apple,
is responsible for the investigation, defense, settlement, and discharge
of that claim.
</p>
<h2>14. Legal Compliance</h2>
<p>
You represent that you are not located in a country subject to a U.S.
Government embargo or designated by the U.S. Government as a "terrorist
supporting" country, and that you are not listed on any U.S. Government
list of prohibited or restricted parties.
</p>
<h2>15. Third-Party Beneficiary</h2>
<p>
Apple and Apple's subsidiaries are third-party beneficiaries of these
Terms. Upon your acceptance of these Terms, Apple has the right to
enforce these Terms against you as a third-party beneficiary.
</p>
<h2>16. Termination</h2>
<p>
We may suspend or terminate access to Rosetta if you violate these Terms,
create risk for other users, or use the service unlawfully. You may stop
using Rosetta at any time.
</p>
<h2>17. Limitation of Liability</h2>
<p>
To the maximum extent permitted by law, ROSETTA CLOUD SERVICES LIMITED
will not be liable for indirect, incidental, special, consequential, or
punitive damages, or for loss of data, profits, goodwill, or business
opportunities arising from your use of Rosetta.
</p>
<h2>18. Governing Law</h2>
<p>
These Terms are governed by the laws of Hong Kong, unless local consumer
protection law requires otherwise.
</p>
<h2>19. Contact</h2>
<p class="address">ROSETTA CLOUD SERVICES LIMITED
Registered address:
UNIT 704C 7/F BLK 3 NAN FUNG IND CITY
18 TIN HAU RD
TUEN MUN
HONG KONG</p>
<p>Email: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a></p>
<p>Phone: <a href="tel:+85228910030">+852 2891 0030</a></p>
</main>
</body>
</html>

View File

@@ -7,6 +7,7 @@ import { FeaturesGrid } from './components/FeaturesGrid/FeaturesGrid';
import { SEO } from './components/SEO/SEO'; import { SEO } from './components/SEO/SEO';
import './style.css' import './style.css'
import { MessageSteps } from './components/MessageSteps/MessageSteps'; import { MessageSteps } from './components/MessageSteps/MessageSteps';
import { Footer } from './components/Footer/Footer';
export default function App() { export default function App() {
@@ -17,6 +18,7 @@ export default function App() {
<FeaturesGrid></FeaturesGrid> <FeaturesGrid></FeaturesGrid>
<MessageSteps></MessageSteps> <MessageSteps></MessageSteps>
<DownloadCenter></DownloadCenter> <DownloadCenter></DownloadCenter>
<Footer></Footer>
</MantineProvider> </MantineProvider>
) )
} }

View File

@@ -5,13 +5,12 @@ import {
Flex, Flex,
Text, Text,
Title, Title,
useComputedColorScheme,
useMantineTheme, useMantineTheme,
} from '@mantine/core'; } from '@mantine/core';
import classes from './DownloadCenter.module.css'; import classes from './DownloadCenter.module.css';
import { RosettaLogo } from '../RosettaLogo/RosettaLogo'; import { RosettaLogo } from '../RosettaLogo/RosettaLogo';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { FaApple, FaWindows } from 'react-icons/fa'; import { FaWindows } from 'react-icons/fa';
import { FcAndroidOs, FcLinux } from 'react-icons/fc'; import { FcAndroidOs, FcLinux } from 'react-icons/fc';
import { Switch } from '../Switch/Switch'; import { Switch } from '../Switch/Switch';
import { IconDownload } from '@tabler/icons-react'; import { IconDownload } from '@tabler/icons-react';
@@ -33,15 +32,15 @@ interface UpdateItem {
const fetchUpdates = async (): Promise<DownloadFeature[]> => { const fetchUpdates = async (): Promise<DownloadFeature[]> => {
try { try {
const response = await fetch('https://sdu.rosetta.im/updates/all'); const response = await fetch('https://sdu.rosetta.im/updates/all');
const data = await response.json(); const data = (await response.json()) as { items?: UpdateItem[] };
return (data.items || []).map((item: UpdateItem) => ({ return (data.items || []).map((item) => ({
platform: item.platform, platform: item.platform,
arch: item.arch, arch: item.arch,
version: item.version, version: item.version,
link: new URL(item.downloadUrl, 'https://sdu.rosetta.im').toString(), link: new URL(item.downloadUrl, 'https://sdu.rosetta.im').toString(),
})).sort((a : any, b : any) => { })).sort((a, b) => {
const platformOrder = ['darwin', 'linux', 'win32', 'android']; const platformOrder = ['linux', 'win32', 'android'];
const archOrder = ['arm64', 'x64', 'universal'] const archOrder = ['arm64', 'x64', 'universal']
const platformComparison = platformOrder.indexOf(a.platform) - platformOrder.indexOf(b.platform); const platformComparison = platformOrder.indexOf(a.platform) - platformOrder.indexOf(b.platform);
if (platformComparison !== 0) { if (platformComparison !== 0) {
@@ -57,9 +56,8 @@ const fetchUpdates = async (): Promise<DownloadFeature[]> => {
export function DownloadCenter() { export function DownloadCenter() {
const theme = useMantineTheme(); const theme = useMantineTheme();
const colorScheme = useComputedColorScheme();
const [kernels, setKernels] = useState<DownloadFeature[]>([]); const [kernels, setKernels] = useState<DownloadFeature[]>([]);
const [targetPlatforms, setTargetPlatforms] = useState<string[]>(['darwin', 'linux', 'win32', 'android']); const [targetPlatforms, setTargetPlatforms] = useState<string[]>(['linux', 'win32', 'android']);
useEffect(() => { useEffect(() => {
fetchUpdates().then(setKernels); fetchUpdates().then(setKernels);
@@ -69,14 +67,11 @@ export function DownloadCenter() {
let targetPlatforms: string[] = []; let targetPlatforms: string[] = [];
switch(value){ switch(value){
case 'All': case 'All':
targetPlatforms = ['darwin', 'linux', 'win32', 'android']; targetPlatforms = ['linux', 'win32', 'android'];
break; break;
case 'Windows': case 'Windows':
targetPlatforms = ['win32']; targetPlatforms = ['win32'];
break; break;
case 'macOS':
targetPlatforms = ['darwin'];
break;
case 'Android': case 'Android':
targetPlatforms = ['android']; targetPlatforms = ['android'];
break; break;
@@ -89,8 +84,6 @@ export function DownloadCenter() {
const translatePlatformToOsName = (platform: string) => { const translatePlatformToOsName = (platform: string) => {
switch(platform){ switch(platform){
case 'darwin':
return 'macOS';
case 'linux': case 'linux':
return 'Linux'; return 'Linux';
case 'win32': case 'win32':
@@ -104,8 +97,6 @@ export function DownloadCenter() {
const translatePlatformAndArchToCpuName = (platform : string, arch: string) => { const translatePlatformAndArchToCpuName = (platform : string, arch: string) => {
switch(platform){ switch(platform){
case 'darwin':
return arch === 'arm64' ? 'Apple Silicon' : 'Intel';
case 'linux': case 'linux':
return arch === 'arm64' ? 'ARM64' : 'x64'; return arch === 'arm64' ? 'ARM64' : 'x64';
case 'win32': case 'win32':
@@ -121,9 +112,6 @@ export function DownloadCenter() {
const features = kernels.filter((v) => targetPlatforms.includes(v.platform)).map((feature) => ( const features = kernels.filter((v) => targetPlatforms.includes(v.platform)).map((feature) => (
<Card key={feature.link} radius="md" className={classes.card} padding="xl"> <Card key={feature.link} radius="md" className={classes.card} padding="xl">
<Flex direction={'column'} align="center" justify={'center'}> <Flex direction={'column'} align="center" justify={'center'}>
{feature.platform === 'darwin' && <FaApple size={50} color={
colorScheme == 'dark' ? 'white' : 'black'
} />}
{feature.platform === 'linux' && <FcLinux size={50} />} {feature.platform === 'linux' && <FcLinux size={50} />}
{feature.platform === 'win32' && <FaWindows size={50} color={theme.colors.blue[6]} />} {feature.platform === 'win32' && <FaWindows size={50} color={theme.colors.blue[6]} />}
{feature.platform === 'android' && <FcAndroidOs size={50} />} {feature.platform === 'android' && <FcAndroidOs size={50} />}
@@ -131,14 +119,6 @@ export function DownloadCenter() {
{translatePlatformToOsName(feature.platform)} - {translatePlatformAndArchToCpuName(feature.platform, feature.arch)} {translatePlatformToOsName(feature.platform)} - {translatePlatformAndArchToCpuName(feature.platform, feature.arch)}
</Text> </Text>
<Text c="dimmed" fz="sm" ta={'center'} mt="xs"> <Text c="dimmed" fz="sm" ta={'center'} mt="xs">
{feature.platform == 'darwin' && <>
{feature.arch == 'arm64' && <>
Download this version if you have a Mac with Apple Silicon (M1, M2 chips).
</>}
{feature.arch == 'x64' && <>
Download this version if you have a Mac with an Intel processor, which was most likely manufactured before 2020.
</>}
</>}
{feature.platform == 'linux' && <>This version is for Linux and comes as an AppImage for the GUI versions.</>} {feature.platform == 'linux' && <>This version is for Linux and comes as an AppImage for the GUI versions.</>}
{feature.platform == 'win32' && <>Download this version of you have computer on Windows 10 or later.</>} {feature.platform == 'win32' && <>Download this version of you have computer on Windows 10 or later.</>}
{feature.platform == 'android' && <>This version is for Android devices and all architectures.</>} {feature.platform == 'android' && <>This version is for Android devices and all architectures.</>}
@@ -165,7 +145,7 @@ export function DownloadCenter() {
</Text> </Text>
<Flex justify={'center'} mt={'lg'}> <Flex justify={'center'} mt={'lg'}>
<Switch onChange={switchTarget} data={['All', 'Windows', 'macOS', 'Linux', 'Android']}></Switch> <Switch onChange={switchTarget} data={['All', 'Windows', 'Linux', 'Android']}></Switch>
</Flex> </Flex>
<Flex gap="xl" justify={'center'} wrap={'wrap'} align={'center'} mt={50}> <Flex gap="xl" justify={'center'} wrap={'wrap'} align={'center'} mt={50}>
@@ -174,4 +154,4 @@ export function DownloadCenter() {
</Container> </Container>
</div> </div>
); );
} }

View File

@@ -1,9 +1,10 @@
import { IconGauge, IconLock, IconMessage2, IconServer, IconUser, IconUsersGroup } from '@tabler/icons-react'; import { IconGauge, IconLock, IconMessage2, IconServer, IconUser, IconUsersGroup, type TablerIcon } from '@tabler/icons-react';
import { Container, Flex, SimpleGrid, Text, ThemeIcon, Title } from '@mantine/core'; import { Container, Flex, SimpleGrid, Text, ThemeIcon, Title } from '@mantine/core';
import type { ReactNode } from 'react';
import classes from './FeaturesGrid.module.css'; import classes from './FeaturesGrid.module.css';
import { RosettaLogo } from '../RosettaLogo/RosettaLogo'; import { RosettaLogo } from '../RosettaLogo/RosettaLogo';
export const MOCKDATA = [ const MOCKDATA = [
{ {
icon: IconGauge, icon: IconGauge,
title: 'Performance', title: 'Performance',
@@ -43,9 +44,9 @@ export const MOCKDATA = [
]; ];
interface FeatureProps { interface FeatureProps {
icon: React.FC<any>; icon: TablerIcon;
title: React.ReactNode; title: ReactNode;
description: React.ReactNode; description: ReactNode;
} }
export function Feature({ icon: Icon, title, description }: FeatureProps) { export function Feature({ icon: Icon, title, description }: FeatureProps) {
@@ -94,4 +95,4 @@ export function FeaturesGrid() {
</Container> </Container>
</div> </div>
); );
} }

View File

@@ -0,0 +1,17 @@
.footer {
padding: var(--mantine-spacing-xl) var(--mantine-spacing-md);
border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5));
}
.legal {
max-width: 720px;
margin: 0 auto;
}
.links {
display: flex;
justify-content: center;
gap: var(--mantine-spacing-md);
flex-wrap: wrap;
margin-top: var(--mantine-spacing-xs);
}

View File

@@ -0,0 +1,24 @@
import { Anchor, Text } from '@mantine/core';
import classes from './Footer.module.css';
const LEGAL_NAME = 'ROSETTA CLOUD SERVICES LIMITED';
export function Footer() {
const currentYear = new Date().getFullYear();
return (
<footer className={classes.footer}>
<Text c="dimmed" fz="sm" ta="center" className={classes.legal}>
&copy; {currentYear} {LEGAL_NAME}. All rights reserved.
</Text>
<nav className={classes.links} aria-label="Legal information">
<Anchor href="/privacy/" size="sm" c="dimmed">
Privacy Policy
</Anchor>
<Anchor href="/terms/" size="sm" c="dimmed">
Terms of Use
</Anchor>
</nav>
</footer>
);
}

View File

@@ -9,7 +9,7 @@ interface SEOProps {
export function SEO({ export function SEO({
title = 'Rosetta - Secure Messaging for Everyone', title = 'Rosetta - Secure Messaging for Everyone',
description = 'End-to-end encrypted messaging app with military-grade security. Download for macOS, Windows, Linux.', description = 'End-to-end encrypted messaging app with military-grade security. Download for Windows, Linux, and Android.',
ogImage = '/og-image.png', ogImage = '/og-image.png',
keywords = 'secure messaging, encrypted chat, private messenger' keywords = 'secure messaging, encrypted chat, private messenger'
}: SEOProps) { }: SEOProps) {