Move legal pages to React Router

This commit is contained in:
rosetta
2026-07-30 16:34:18 -07:00
parent 4daf0ffba9
commit 856fb60579
17 changed files with 857 additions and 805 deletions

3
.openai/hosting.json Normal file
View File

@@ -0,0 +1,3 @@
{
"project_id": "appgprj_6a6bdf07874c81919af23407be23ff1a"
}

View File

@@ -12,14 +12,14 @@
<meta property="og:url" content="https://rosetta.im/" />
<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 Windows, Linux, and Android." />
<meta property="og:image" content="/og-image.png" />
<meta property="og:image" content="/og.png" />
<meta property="og:site_name" content="Rosetta" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://rosetta.im/" />
<meta name="twitter:title" content="Rosetta - Secure Messaging for Everyone" />
<meta name="twitter:description" content="End-to-end encrypted messaging app with zero-knowledge architecture." />
<meta name="twitter:image" content="/og-image.png" />
<meta name="twitter:image" content="/og.png" />
<link rel="canonical" href="https://rosetta.im/" />
<link rel="icon" href="favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
@@ -45,7 +45,7 @@
"ratingValue": "4.8",
"ratingCount": "1500"
},
"image": "/og-image.png"
"image": "/og.png"
}
</script>
</head>

60
package-lock.json generated
View File

@@ -17,7 +17,8 @@
"events": "^3.3.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-icons": "^5.5.0"
"react-icons": "^5.5.0",
"react-router-dom": "^7.18.2"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
@@ -2132,6 +2133,19 @@
"dev": true,
"license": "MIT"
},
"node_modules/cookie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
"integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -3286,6 +3300,44 @@
}
}
},
"node_modules/react-router": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz",
"integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==",
"license": "MIT",
"dependencies": {
"cookie": "^1.0.1",
"set-cookie-parser": "^2.6.0"
},
"engines": {
"node": ">=20.0.0"
},
"peerDependencies": {
"react": ">=18",
"react-dom": ">=18"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
}
}
},
"node_modules/react-router-dom": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz",
"integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==",
"license": "MIT",
"dependencies": {
"react-router": "7.18.2"
},
"engines": {
"node": ">=20.0.0"
},
"peerDependencies": {
"react": ">=18",
"react-dom": ">=18"
}
},
"node_modules/react-style-singleton": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
@@ -3393,6 +3445,12 @@
"semver": "bin/semver.js"
}
},
"node_modules/set-cookie-parser": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",

View File

@@ -19,7 +19,8 @@
"events": "^3.3.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-icons": "^5.5.0"
"react-icons": "^5.5.0",
"react-router-dom": "^7.18.2"
},
"devDependencies": {
"@eslint/js": "^9.39.1",

View File

@@ -1,237 +0,0 @@
:root {
color-scheme: dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: #edf3ff;
background: #0c111a;
font-synthesis: none;
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
min-width: 320px;
margin: 0;
background: #0c111a;
}
a {
text-decoration: none;
}
.page {
width: min(100% - 48px, 1120px);
margin: 0 auto;
padding: 20px 0 64px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
min-height: 56px;
border-bottom: 1px solid #29354a;
}
.brand {
display: inline-flex;
align-items: center;
gap: 10px;
color: #f5f8ff;
font-size: 18px;
font-weight: 750;
text-decoration: none;
}
.brand-mark {
display: grid;
width: 32px;
height: 32px;
place-items: center;
overflow: hidden;
border-radius: 8px;
background: #17325f;
}
.brand-mark img {
display: block;
width: 100%;
height: 100%;
}
.topbar nav,
.legal-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 18px;
}
.topbar nav a,
.legal-footer a {
color: #aebbd0;
font-size: 14px;
text-decoration: none;
}
.topbar nav a:hover,
.topbar nav a[aria-current="page"],
.legal-footer a:hover {
color: #ffffff;
}
.document {
width: min(100%, 790px);
margin: 72px auto 0;
}
.document-header {
padding-bottom: 34px;
border-bottom: 1px solid #29354a;
}
.eyebrow {
margin: 0 0 12px;
color: #72afff;
font-size: 13px;
font-weight: 750;
letter-spacing: 0;
text-transform: uppercase;
}
h1 {
max-width: 680px;
margin: 0;
color: #f4f7ff;
font-size: clamp(36px, 6vw, 56px);
letter-spacing: 0;
line-height: 1.04;
}
.updated {
margin: 16px 0 0;
color: #8f9db3;
font-size: 15px;
}
.document-content {
padding-top: 32px;
}
.document-content > :first-child {
margin-top: 0;
}
.lead {
max-width: 740px;
color: #d3dcec;
font-size: 19px;
line-height: 1.55;
}
h2 {
margin: 48px 0 16px;
padding-top: 30px;
border-top: 1px solid #29354a;
color: #f2f6ff;
font-size: clamp(21px, 3vw, 26px);
letter-spacing: 0;
line-height: 1.24;
}
p,
li {
color: #b7c3d6;
font-size: 16px;
line-height: 1.68;
}
p {
margin: 0 0 18px;
}
ul {
display: grid;
gap: 9px;
margin: 0 0 20px;
padding-left: 22px;
}
li::marker {
color: #72afff;
}
.document-content a {
color: #8fc0ff;
overflow-wrap: anywhere;
text-underline-offset: 3px;
}
.address {
padding: 18px 20px;
border-left: 2px solid #4c8fe8;
background: #121c2b;
color: #d6dfef;
white-space: pre-line;
}
.legal-footer {
justify-content: space-between;
margin-top: 80px;
padding-top: 24px;
border-top: 1px solid #29354a;
}
.legal-footer p {
margin: 0;
color: #77869d;
font-size: 13px;
}
@media (max-width: 640px) {
.page {
width: min(100% - 32px, 1120px);
padding-top: 12px;
}
.topbar {
align-items: flex-start;
flex-direction: column;
gap: 14px;
padding-bottom: 16px;
}
.topbar nav,
.legal-footer {
gap: 14px;
}
.document {
margin-top: 48px;
}
.document-header {
padding-bottom: 26px;
}
.lead {
font-size: 18px;
}
h2 {
margin-top: 40px;
padding-top: 26px;
}
.legal-footer {
align-items: flex-start;
flex-direction: column;
margin-top: 56px;
}
}

BIN
public/og.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -1,260 +0,0 @@
<!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>
<link rel="stylesheet" href="/legal.css" />
</head>
<body>
<main class="page">
<header class="topbar">
<a class="brand" href="/" aria-label="Rosetta home">
<span class="brand-mark"><img src="/rosetta-logo.png" alt="" /></span>
Rosetta
</a>
<nav aria-label="Legal pages">
<a href="/support/">Support</a>
<a href="/privacy/" aria-current="page">Privacy</a>
<a href="/terms/">Terms</a>
</nav>
</header>
<article class="document">
<header class="document-header">
<p class="eyebrow">Rosetta legal</p>
<h1>Privacy Policy</h1>
<p class="updated">Last updated: May 22, 2026</p>
</header>
<div class="document-content">
<p class="lead">
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
<a href="mailto:admin@rosetta.im">admin@rosetta.im</a>.
</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><br />
Support: <a href="/support/">https://rosetta.im/support/</a>
</p>
<p>Phone: <a href="tel:+85228910030">+852 2891 0030</a></p>
</div>
</article>
<footer class="legal-footer">
<p>&copy; 2026 ROSETTA CLOUD SERVICES LIMITED</p>
<nav aria-label="Footer links">
<a href="/">Rosetta home</a>
<a href="/support/">Support</a>
<a href="/terms/">Terms of Use</a>
</nav>
</footer>
</main>
</body>
</html>

View File

@@ -1,289 +0,0 @@
<!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>
<link rel="stylesheet" href="/legal.css" />
</head>
<body>
<main class="page">
<header class="topbar">
<a class="brand" href="/" aria-label="Rosetta home">
<span class="brand-mark"><img src="/rosetta-logo.png" alt="" /></span>
Rosetta
</a>
<nav aria-label="Legal pages">
<a href="/support/">Support</a>
<a href="/privacy/">Privacy</a>
<a href="/terms/" aria-current="page">Terms</a>
</nav>
</header>
<article class="document">
<header class="document-header">
<p class="eyebrow">Rosetta legal</p>
<h1>Terms of Use</h1>
<p class="updated">Last updated: May 22, 2026</p>
</header>
<div class="document-content">
<p class="lead">
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><br />
Support centre: <a href="/support/">https://rosetta.im/support/</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>
</div>
</article>
<footer class="legal-footer">
<p>&copy; 2026 ROSETTA CLOUD SERVICES LIMITED</p>
<nav aria-label="Footer links">
<a href="/">Rosetta home</a>
<a href="/support/">Support</a>
<a href="/privacy/">Privacy Policy</a>
</nav>
</footer>
</main>
</body>
</html>

View File

@@ -1,6 +1,7 @@
import '@mantine/core/styles.css';
import { MantineProvider } from '@mantine/core';
import { Route, Routes } from 'react-router-dom';
import { HeroTitle } from './components/HeroTitle/HeroTitle';
import { DownloadCenter } from './components/DownloadCenter/DownloadCenter';
import { FeaturesGrid } from './components/FeaturesGrid/FeaturesGrid';
@@ -8,17 +9,32 @@ import { SEO } from './components/SEO/SEO';
import './style.css'
import { MessageSteps } from './components/MessageSteps/MessageSteps';
import { Footer } from './components/Footer/Footer';
import { PrivacyPage } from './pages/PrivacyPage';
import { TermsPage } from './pages/TermsPage';
import { ScrollToTop } from './components/ScrollToTop/ScrollToTop';
function LandingPage() {
return (
<>
<SEO />
<HeroTitle />
<FeaturesGrid />
<MessageSteps />
<DownloadCenter />
<Footer />
</>
);
}
export default function App() {
return (
<MantineProvider>
<SEO />
<HeroTitle></HeroTitle>
<FeaturesGrid></FeaturesGrid>
<MessageSteps></MessageSteps>
<DownloadCenter></DownloadCenter>
<Footer></Footer>
<ScrollToTop />
<Routes>
<Route path="/" element={<LandingPage />} />
<Route path="/privacy" element={<PrivacyPage />} />
<Route path="/terms" element={<TermsPage />} />
</Routes>
</MantineProvider>
)
}

View File

@@ -1,4 +1,5 @@
import { Anchor, Text } from '@mantine/core';
import { Link } from 'react-router-dom';
import classes from './Footer.module.css';
const LEGAL_NAME = 'ROSETTA CLOUD SERVICES LIMITED';
@@ -15,10 +16,10 @@ export function Footer() {
<Anchor href="/support/" size="sm" c="dimmed">
Support
</Anchor>
<Anchor href="/privacy/" size="sm" c="dimmed">
<Anchor component={Link} to="/privacy" size="sm" c="dimmed">
Privacy Policy
</Anchor>
<Anchor href="/terms/" size="sm" c="dimmed">
<Anchor component={Link} to="/terms" size="sm" c="dimmed">
Terms of Use
</Anchor>
</nav>

View File

@@ -0,0 +1,163 @@
.page {
min-height: 100vh;
background:
radial-gradient(circle at 50% 0%, light-dark(rgba(34, 139, 230, 0.12), rgba(34, 139, 230, 0.16)), transparent 34rem),
light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-8));
}
.shell {
padding-top: var(--mantine-spacing-lg);
padding-bottom: calc(var(--mantine-spacing-xl) * 2);
}
.header {
min-height: 58px;
padding-bottom: var(--mantine-spacing-md);
border-bottom: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-5));
}
.brand {
display: inline-flex;
align-items: center;
gap: var(--mantine-spacing-xs);
color: light-dark(var(--mantine-color-dark-9), var(--mantine-color-white));
text-decoration: none;
}
.brand img {
border-radius: var(--mantine-radius-sm);
}
.main {
width: min(100%, 820px);
margin: 0 auto;
padding-top: 76px;
}
.intro {
padding: 0 var(--mantine-spacing-md) calc(var(--mantine-spacing-xl) * 1.5);
}
.title {
margin-top: var(--mantine-spacing-sm);
color: light-dark(var(--mantine-color-black), var(--mantine-color-white));
font-family: Outfit, var(--mantine-font-family);
font-size: clamp(40px, 7vw, 62px);
font-weight: 500;
letter-spacing: -0.03em;
line-height: 1.08;
}
.document {
padding: 44px 48px 52px;
background: light-dark(rgba(255, 255, 255, 0.9), rgba(20, 21, 23, 0.9));
border-color: light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5));
backdrop-filter: blur(12px);
}
.lead {
margin: 0;
color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0));
font-size: var(--mantine-font-size-lg);
line-height: 1.65;
}
.text,
.list {
color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1));
font-size: var(--mantine-font-size-md);
line-height: 1.7;
}
.text {
margin: 0 0 var(--mantine-spacing-md);
}
.text:last-child,
.address:last-child {
margin-bottom: 0;
}
.list {
margin-bottom: var(--mantine-spacing-md);
padding-left: var(--mantine-spacing-xs);
}
.list li::marker {
color: var(--mantine-color-blue-5);
}
.section {
margin-top: 42px;
padding-top: 36px;
border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5));
}
.sectionTitle {
margin: 0 0 var(--mantine-spacing-md);
color: light-dark(var(--mantine-color-dark-9), var(--mantine-color-white));
font-family: Outfit, var(--mantine-font-family);
font-size: clamp(22px, 3vw, 28px);
font-weight: 500;
line-height: 1.25;
}
.document a {
color: light-dark(var(--mantine-color-blue-7), var(--mantine-color-blue-3));
text-underline-offset: 3px;
overflow-wrap: anywhere;
}
.address {
margin: var(--mantine-spacing-md) 0;
border-left: 3px solid var(--mantine-color-blue-5);
background: light-dark(var(--mantine-color-blue-0), var(--mantine-color-dark-6));
}
.address p {
margin: 0;
color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0));
line-height: 1.65;
white-space: pre-line;
}
.footer {
margin-top: 72px;
padding-top: var(--mantine-spacing-lg);
border-top: 1px solid light-dark(var(--mantine-color-gray-3), var(--mantine-color-dark-5));
}
@media (max-width: 48em) {
.main {
padding-top: 52px;
}
.document {
padding: 32px 24px 40px;
}
}
@media (max-width: 36em) {
.shell {
padding-inline: var(--mantine-spacing-md);
}
.header {
align-items: flex-start;
flex-direction: column;
}
.intro {
padding-inline: 0;
}
.document {
margin-inline: calc(var(--mantine-spacing-xs) * -1);
padding-inline: 20px;
}
.footer {
align-items: flex-start;
flex-direction: column;
}
}

View File

@@ -0,0 +1,165 @@
import type { ReactNode } from 'react';
import {
Anchor,
Box,
Container,
Group,
List,
Paper,
Text,
Title,
} from '@mantine/core';
import { Link } from 'react-router-dom';
import { RosettaLogo } from '../RosettaLogo/RosettaLogo';
import classes from './LegalPage.module.css';
type LegalRoute = 'privacy' | 'terms';
interface LegalPageProps {
active: LegalRoute;
title: string;
updated: string;
children: ReactNode;
}
interface LegalSectionProps {
title: string;
children: ReactNode;
}
export function LegalPage({ active, title, updated, children }: LegalPageProps) {
const currentYear = new Date().getFullYear();
return (
<Box className={classes.page}>
<Container size="lg" className={classes.shell}>
<Group component="header" justify="space-between" className={classes.header}>
<Anchor
component={Link}
to="/"
className={classes.brand}
aria-label="Rosetta home"
>
<RosettaLogo size={34} />
<Text component="span" fw={700} fz="lg">
Rosetta
</Text>
</Anchor>
<Group component="nav" gap="lg" aria-label="Legal pages">
<Anchor href="/support/" c="dimmed" size="sm">
Support
</Anchor>
<Anchor
component={Link}
to="/privacy"
c={active === 'privacy' ? 'blue' : 'dimmed'}
fw={active === 'privacy' ? 600 : 400}
size="sm"
aria-current={active === 'privacy' ? 'page' : undefined}
>
Privacy
</Anchor>
<Anchor
component={Link}
to="/terms"
c={active === 'terms' ? 'blue' : 'dimmed'}
fw={active === 'terms' ? 600 : 400}
size="sm"
aria-current={active === 'terms' ? 'page' : undefined}
>
Terms
</Anchor>
</Group>
</Group>
<Box component="main" className={classes.main}>
<Box className={classes.intro}>
<Text tt="uppercase" fw={700} fz="xs" c="blue" lts="0.08em">
Rosetta legal
</Text>
<Title order={1} className={classes.title}>
{title}
</Title>
<Text c="dimmed" mt="md">
Last updated: {updated}
</Text>
</Box>
<Paper
component="article"
radius="lg"
withBorder
shadow="sm"
className={classes.document}
>
{children}
</Paper>
</Box>
<Group component="footer" justify="space-between" className={classes.footer}>
<Text c="dimmed" fz="xs">
&copy; {currentYear} ROSETTA CLOUD SERVICES LIMITED
</Text>
<Group component="nav" gap="md" aria-label="Footer links">
<Anchor component={Link} to="/" c="dimmed" size="xs">
Rosetta home
</Anchor>
<Anchor href="/support/" c="dimmed" size="xs">
Support
</Anchor>
<Anchor
component={Link}
to={active === 'privacy' ? '/terms' : '/privacy'}
c="dimmed"
size="xs"
>
{active === 'privacy' ? 'Terms of Use' : 'Privacy Policy'}
</Anchor>
</Group>
</Group>
</Container>
</Box>
);
}
export function LegalSection({ title, children }: LegalSectionProps) {
return (
<Box component="section" className={classes.section}>
<Title order={2} className={classes.sectionTitle}>
{title}
</Title>
{children}
</Box>
);
}
export function LegalText({
children,
lead = false,
}: {
children: ReactNode;
lead?: boolean;
}) {
return (
<Text component="p" className={lead ? classes.lead : classes.text}>
{children}
</Text>
);
}
export function LegalList({ children }: { children: ReactNode }) {
return (
<List spacing="xs" className={classes.list}>
{children}
</List>
);
}
export function LegalAddress({ children }: { children: ReactNode }) {
return (
<Paper radius="md" p="md" className={classes.address}>
<Text component="p">{children}</Text>
</Paper>
);
}

View File

@@ -5,28 +5,31 @@ interface SEOProps {
description?: string;
ogImage?: string;
keywords?: string;
canonical?: string;
}
export function SEO({
title = 'Rosetta - Secure Messaging for Everyone',
description = 'End-to-end encrypted messaging app with military-grade security. Download for Windows, Linux, and Android.',
ogImage = '/og-image.png',
keywords = 'secure messaging, encrypted chat, private messenger'
ogImage = '/og.png',
keywords = 'secure messaging, encrypted chat, private messenger',
canonical = 'https://rosetta.im/'
}: SEOProps) {
useEffect(() => {
// Update title
document.title = title;
// Update meta tags
updateMetaTag('name', 'description', description);
updateMetaTag('name', 'keywords', keywords);
updateMetaTag('property', 'og:title', title);
updateMetaTag('property', 'og:description', description);
updateMetaTag('property', 'og:image', ogImage);
updateMetaTag('property', 'og:url', canonical);
updateMetaTag('name', 'twitter:title', title);
updateMetaTag('name', 'twitter:description', description);
updateMetaTag('name', 'twitter:image', ogImage);
}, [title, description, ogImage, keywords]);
updateMetaTag('name', 'twitter:url', canonical);
updateCanonical(canonical);
}, [title, description, ogImage, keywords, canonical]);
return null;
}
@@ -42,3 +45,15 @@ function updateMetaTag(attr: string, name: string, content: string) {
element.setAttribute('content', content);
}
function updateCanonical(href: string) {
let element = document.querySelector<HTMLLinkElement>('link[rel="canonical"]');
if (!element) {
element = document.createElement('link');
element.rel = 'canonical';
document.head.appendChild(element);
}
element.href = href;
}

View File

@@ -0,0 +1,12 @@
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export function ScrollToTop() {
const { pathname } = useLocation();
useEffect(() => {
window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
}, [pathname]);
return null;
}

View File

@@ -1,7 +1,10 @@
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import App from './App.tsx'
createRoot(document.getElementById('root')!).render(
<App />
<BrowserRouter>
<App />
</BrowserRouter>
)

179
src/pages/PrivacyPage.tsx Normal file
View File

@@ -0,0 +1,179 @@
import { Anchor, List } from '@mantine/core';
import {
LegalAddress,
LegalList,
LegalPage,
LegalSection,
LegalText,
} from '../components/LegalPage/LegalPage';
import { SEO } from '../components/SEO/SEO';
export function PrivacyPage() {
return (
<>
<SEO
title="Privacy Policy for Rosetta"
description="Privacy Policy for Rosetta by ROSETTA CLOUD SERVICES LIMITED: how data is handled in the end-to-end encrypted messenger."
canonical="https://rosetta.im/privacy/"
keywords="Rosetta privacy policy, encrypted messenger privacy, data protection"
/>
<LegalPage active="privacy" title="Privacy Policy" updated="May 22, 2026">
<LegalText lead>
Rosetta IM is operated by ROSETTA CLOUD SERVICES LIMITED (&quot;Rosetta&quot;,
&quot;we&quot;, &quot;us&quot;, or &quot;our&quot;). 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.
</LegalText>
<LegalSection title="1. Information We Collect">
<LegalText>
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.
</LegalText>
<LegalList>
<List.Item>
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.
</List.Item>
<List.Item>
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.
</List.Item>
<List.Item>
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.
</List.Item>
<List.Item>
Support communications: if you contact us, we may process your email
address, message content, and any information you choose to provide.
</List.Item>
</LegalList>
</LegalSection>
<LegalSection title="2. Information We Do Not Collect for Advertising">
<LegalText>
We do not use third-party advertising SDKs, advertising trackers, or
cross-app tracking. We do not sell your personal information.
</LegalText>
</LegalSection>
<LegalSection title="3. How We Use Information">
<LegalText>We use information only to:</LegalText>
<LegalList>
<List.Item>provide, maintain, and secure Rosetta;</List.Item>
<List.Item>route encrypted messages between users;</List.Item>
<List.Item>deliver app updates and downloads;</List.Item>
<List.Item>
detect abuse, prevent fraud, and protect service integrity;
</List.Item>
<List.Item>respond to support requests;</List.Item>
<List.Item>comply with legal obligations.</List.Item>
</LegalList>
</LegalSection>
<LegalSection title="4. End-to-End Encryption">
<LegalText>
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&apos;
devices rather than as readable message history on our servers.
</LegalText>
</LegalSection>
<LegalSection title="5. Sharing of Information">
<LegalText>We may share limited information only with:</LegalText>
<LegalList>
<List.Item>
infrastructure and hosting providers that help us operate Rosetta;
</List.Item>
<List.Item>professional advisers, if necessary;</List.Item>
<List.Item>
authorities or other parties when required by law or to protect rights,
safety, and security.
</List.Item>
</LegalList>
<LegalText>
Any service provider that processes user data for us must protect it
consistently with this Privacy Policy.
</LegalText>
</LegalSection>
<LegalSection title="6. Retention">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="7. Your Choices and Rights">
<LegalText>
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{' '}
<Anchor href="mailto:admin@rosetta.im">admin@rosetta.im</Anchor>.
</LegalText>
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="8. Children">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="9. International Transfers">
<LegalText>
ROSETTA CLOUD SERVICES LIMITED may process information in countries other
than where you live. Where required, we use appropriate safeguards for
international transfers.
</LegalText>
</LegalSection>
<LegalSection title="10. Security">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="11. Changes to This Policy">
<LegalText>
We may update this Privacy Policy from time to time. If we make material
changes, we will update the &quot;Last updated&quot; date and, where
appropriate, provide additional notice.
</LegalText>
</LegalSection>
<LegalSection title="12. Contact">
<LegalAddress>
{'ROSETTA CLOUD SERVICES LIMITED\nRegistered address:\nUNIT 704C 7/F BLK 3 NAN FUNG IND CITY\n18 TIN HAU RD\nTUEN MUN\nHONG KONG'}
</LegalAddress>
<LegalText>
Email: <Anchor href="mailto:admin@rosetta.im">admin@rosetta.im</Anchor>
<br />
Support: <Anchor href="/support/">https://rosetta.im/support/</Anchor>
</LegalText>
<LegalText>
Phone: <Anchor href="tel:+85228910030">+852 2891 0030</Anchor>
</LegalText>
</LegalSection>
</LegalPage>
</>
);
}

222
src/pages/TermsPage.tsx Normal file
View File

@@ -0,0 +1,222 @@
import { Anchor, List } from '@mantine/core';
import { Link } from 'react-router-dom';
import {
LegalAddress,
LegalList,
LegalPage,
LegalSection,
LegalText,
} from '../components/LegalPage/LegalPage';
import { SEO } from '../components/SEO/SEO';
export function TermsPage() {
return (
<>
<SEO
title="Terms of Use for Rosetta"
description="Terms of Use and End User License Agreement for Rosetta by ROSETTA CLOUD SERVICES LIMITED."
canonical="https://rosetta.im/terms/"
keywords="Rosetta terms of use, end user license agreement, encrypted messenger terms"
/>
<LegalPage active="terms" title="Terms of Use" updated="May 22, 2026">
<LegalText lead>
These Terms of Use and End User License Agreement (&quot;Terms&quot;) govern
your use of Rosetta, an end-to-end encrypted messaging application operated by
ROSETTA CLOUD SERVICES LIMITED (&quot;Rosetta&quot;, &quot;we&quot;,
&quot;us&quot;, or &quot;our&quot;).
</LegalText>
<LegalText>
By downloading, installing, or using Rosetta, you agree to these Terms.
</LegalText>
<LegalSection title="1. Agreement Between You and Rosetta">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="2. License">
<LegalText>
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.
</LegalText>
<LegalText>
You may not copy, modify, reverse engineer, decompile, resell, sublicense,
rent, lease, or distribute Rosetta except as permitted by applicable law.
</LegalText>
</LegalSection>
<LegalSection title="3. Privacy">
<LegalText>
Your use of Rosetta is also governed by our Privacy Policy, available at{' '}
<Anchor component={Link} to="/privacy">
https://rosetta.im/privacy/
</Anchor>
.
</LegalText>
</LegalSection>
<LegalSection title="4. Encrypted Messaging">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="5. Acceptable Use">
<LegalText>You agree not to use Rosetta to:</LegalText>
<LegalList>
<List.Item>violate any law or regulation;</List.Item>
<List.Item>infringe the rights of others;</List.Item>
<List.Item>
send spam, malware, scams, threats, harassment, or unlawful content;
</List.Item>
<List.Item>
attempt to disrupt, overload, reverse engineer, or compromise Rosetta or
its infrastructure;
</List.Item>
<List.Item>
impersonate another person or misrepresent your identity;
</List.Item>
<List.Item>use Rosetta for any prohibited or sanctioned activity.</List.Item>
</LegalList>
</LegalSection>
<LegalSection title="6. No Emergency Use">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="7. User Content">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="8. Updates and Availability">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="9. Fees">
<LegalText>
Rosetta is currently offered as a free application unless stated otherwise.
If paid features, subscriptions, or in-app purchases are introduced through
Apple, Apple&apos;s payment and subscription terms will apply.
</LegalText>
</LegalSection>
<LegalSection title="10. Maintenance and Support">
<LegalText>
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.
</LegalText>
<LegalText>
Support contact:{' '}
<Anchor href="mailto:admin@rosetta.im">admin@rosetta.im</Anchor>
<br />
Support centre:{' '}
<Anchor href="/support/">https://rosetta.im/support/</Anchor>
</LegalText>
</LegalSection>
<LegalSection title="11. Warranty">
<LegalText>
Rosetta is provided &quot;as is&quot; and &quot;as available&quot; 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.
</LegalText>
</LegalSection>
<LegalSection title="12. Product Claims">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="13. Intellectual Property Claims">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="14. Legal Compliance">
<LegalText>
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
&quot;terrorist supporting&quot; country, and that you are not listed on any
U.S. Government list of prohibited or restricted parties.
</LegalText>
</LegalSection>
<LegalSection title="15. Third-Party Beneficiary">
<LegalText>
Apple and Apple&apos;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.
</LegalText>
</LegalSection>
<LegalSection title="16. Termination">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="17. Limitation of Liability">
<LegalText>
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.
</LegalText>
</LegalSection>
<LegalSection title="18. Governing Law">
<LegalText>
These Terms are governed by the laws of Hong Kong, unless local consumer
protection law requires otherwise.
</LegalText>
</LegalSection>
<LegalSection title="19. Contact">
<LegalAddress>
{'ROSETTA CLOUD SERVICES LIMITED\nRegistered address:\nUNIT 704C 7/F BLK 3 NAN FUNG IND CITY\n18 TIN HAU RD\nTUEN MUN\nHONG KONG'}
</LegalAddress>
<LegalText>
Email: <Anchor href="mailto:admin@rosetta.im">admin@rosetta.im</Anchor>
</LegalText>
<LegalText>
Phone: <Anchor href="tel:+85228910030">+852 2891 0030</Anchor>
</LegalText>
</LegalSection>
</LegalPage>
</>
);
}