diff --git a/.openai/hosting.json b/.openai/hosting.json new file mode 100644 index 0000000..b2b8c07 --- /dev/null +++ b/.openai/hosting.json @@ -0,0 +1,3 @@ +{ + "project_id": "appgprj_6a6bdf07874c81919af23407be23ff1a" +} diff --git a/index.html b/index.html index d249db7..3f09404 100644 --- a/index.html +++ b/index.html @@ -12,14 +12,14 @@ - + - + @@ -45,7 +45,7 @@ "ratingValue": "4.8", "ratingCount": "1500" }, - "image": "/og-image.png" + "image": "/og.png" } diff --git a/package-lock.json b/package-lock.json index d67f9f8..e96e953 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index ba29891..e7d1f96 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/public/legal.css b/public/legal.css deleted file mode 100644 index 778149a..0000000 --- a/public/legal.css +++ /dev/null @@ -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; - } -} diff --git a/public/og.png b/public/og.png new file mode 100644 index 0000000..1d82464 Binary files /dev/null and b/public/og.png differ diff --git a/public/privacy/index.html b/public/privacy/index.html deleted file mode 100644 index fb0d3ab..0000000 --- a/public/privacy/index.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - Privacy Policy for Rosetta - - - - - - -
-
- - - Rosetta - - -
- -
-
-

Rosetta legal

-

Privacy Policy

-

Last updated: May 22, 2026

-
- -
- -

- 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. -

- -

1. Information We Collect

-

- 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. -

-
    -
  • - 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. -
  • -
  • - 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. -
  • -
  • - 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. -
  • -
  • - Support communications: if you contact us, we may process your email - address, message content, and any information you choose to provide. -
  • -
- -

2. Information We Do Not Collect for Advertising

-

- We do not use third-party advertising SDKs, advertising trackers, or - cross-app tracking. We do not sell your personal information. -

- -

3. How We Use Information

-

We use information only to:

-
    -
  • provide, maintain, and secure Rosetta;
  • -
  • route encrypted messages between users;
  • -
  • deliver app updates and downloads;
  • -
  • detect abuse, prevent fraud, and protect service integrity;
  • -
  • respond to support requests;
  • -
  • comply with legal obligations.
  • -
- -

4. End-to-End Encryption

-

- 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. -

- -

5. Sharing of Information

-

We may share limited information only with:

-
    -
  • infrastructure and hosting providers that help us operate Rosetta;
  • -
  • professional advisers, if necessary;
  • -
  • - authorities or other parties when required by law or to protect rights, - safety, and security. -
  • -
-

- Any service provider that processes user data for us must protect it - consistently with this Privacy Policy. -

- -

6. Retention

-

- 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. -

- -

7. Your Choices and Rights

-

- 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. -

-

- 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. -

- -

8. Children

-

- 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. -

- -

9. International Transfers

-

- ROSETTA CLOUD SERVICES LIMITED may process information in countries other - than where you live. Where required, we use appropriate safeguards for - international transfers. -

- -

10. Security

-

- 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. -

- -

11. Changes to This Policy

-

- 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. -

- -

12. Contact

-

ROSETTA CLOUD SERVICES LIMITED -Registered address: -UNIT 704C 7/F BLK 3 NAN FUNG IND CITY -18 TIN HAU RD -TUEN MUN -HONG KONG

-

- Email: admin@rosetta.im
- Support: https://rosetta.im/support/ -

-

Phone: +852 2891 0030

-
-
- - -
- - diff --git a/public/terms/index.html b/public/terms/index.html deleted file mode 100644 index 6fe6227..0000000 --- a/public/terms/index.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - Terms of Use for Rosetta - - - - - - -
-
- - - Rosetta - - -
- -
-
-

Rosetta legal

-

Terms of Use

-

Last updated: May 22, 2026

-
- -
- -

- 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"). -

-

- By downloading, installing, or using Rosetta, you agree to these Terms. -

- -

1. Agreement Between You and Rosetta

-

- 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. -

- -

2. License

-

- 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. -

-

- You may not copy, modify, reverse engineer, decompile, resell, - sublicense, rent, lease, or distribute Rosetta except as permitted by - applicable law. -

- -

3. Privacy

-

- Your use of Rosetta is also governed by our Privacy Policy, available at - https://rosetta.im/privacy/. -

- -

4. Encrypted Messaging

-

- 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. -

- -

5. Acceptable Use

-

You agree not to use Rosetta to:

-
    -
  • violate any law or regulation;
  • -
  • infringe the rights of others;
  • -
  • send spam, malware, scams, threats, harassment, or unlawful content;
  • -
  • - attempt to disrupt, overload, reverse engineer, or compromise Rosetta - or its infrastructure; -
  • -
  • impersonate another person or misrepresent your identity;
  • -
  • use Rosetta for any prohibited or sanctioned activity.
  • -
- -

6. No Emergency Use

-

- 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. -

- -

7. User Content

-

- 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. -

- -

8. Updates and Availability

-

- 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. -

- -

9. Fees

-

- 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. -

- -

10. Maintenance and Support

-

- 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. -

-

- Support contact: admin@rosetta.im
- Support centre: https://rosetta.im/support/ -

- -

11. Warranty

-

- 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. -

- -

12. Product Claims

-

- 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. -

- -

13. Intellectual Property Claims

-

- 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. -

- -

14. Legal Compliance

-

- 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. -

- -

15. Third-Party Beneficiary

-

- 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. -

- -

16. Termination

-

- 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. -

- -

17. Limitation of Liability

-

- 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. -

- -

18. Governing Law

-

- These Terms are governed by the laws of Hong Kong, unless local consumer - protection law requires otherwise. -

- -

19. Contact

-

ROSETTA CLOUD SERVICES LIMITED -Registered address: -UNIT 704C 7/F BLK 3 NAN FUNG IND CITY -18 TIN HAU RD -TUEN MUN -HONG KONG

-

Email: admin@rosetta.im

-

Phone: +852 2891 0030

-
-
- - -
- - diff --git a/src/App.tsx b/src/App.tsx index cfc00f4..e84ec3e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -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 ( + <> + + + + + +