diff --git a/.gitignore b/.gitignore index 6f2e965..ebff54d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# various IDEs and backup files +.vscode/ +.idea/ +**/*~ + # dependencies /node_modules /.pnp diff --git a/package-lock.json b/package-lock.json index 5facd13..4409bd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "styled-components": "^6.1.12", "tailwind-merge": "^2.5.1", "tailwindcss-animate": "^1.0.7", + "zen-website": "file:", "zod": "^3.23.8" }, "devDependencies": { @@ -16693,9 +16694,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "peer": true, "dependencies": { "debug": "2.6.9", @@ -16780,20 +16781,29 @@ } }, "node_modules/serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "peer": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -19421,6 +19431,10 @@ "integrity": "sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==", "peer": true }, + "node_modules/zen-website": { + "resolved": "", + "link": true + }, "node_modules/zod": { "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", diff --git a/package.json b/package.json index 4e230ee..229d41b 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "styled-components": "^6.1.12", "tailwind-merge": "^2.5.1", "tailwindcss-animate": "^1.0.7", + "zen-website": "file:", "zod": "^3.23.8" }, "devDependencies": { diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 65d37e4..4a32d17 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -19,6 +19,7 @@ export default function PrivacyPolicy() { * [**Onno**](https://www.onnno.nl/index.html): logo designer. * [**Jafeth Garro**](https://iamjafeth.com/): Documentation writer. * **Peter Jung**: general contributor and AUR maintainer. +* [**Bryan Galdámez**](https://josuegalre.netlify.app/): Huge contributor on theme functionalities * [**Gunir**](https://github.com/gunir): Active contributor. * [**n7itro**](https://github.com/n7itro): Active contributor. * [**Canoa**](https://thatcanoa.org/) Active contributor, and very active in issue handling diff --git a/src/app/globals.css b/src/app/globals.css index 064b2c8..8cf74e2 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -3,95 +3,106 @@ @tailwind utilities; @layer base { - :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; - --radius: 0.5rem; + --radius: 0.5rem; - /* Custom properties */ - --navigation-height: 3.5rem; - --color-one: #ffbd7a; + /* Custom properties */ + --navigation-height: 3.5rem; + --color-one: #ffbd7a; - --color-two: #fe8bbb; - --color-three: #9e7aff; + --color-two: #fe8bbb; + --color-three: #9e7aff; - --surface: rgb(245, 245, 245); + --surface: rgb(245, 245, 245); - /* + /* --color-one: #37ecba; --color-two: #72afd3; --color-three: #ff2e63; */ - } + } - [data-theme='dark'], .dark { - --background: 5 5 5; - --foreground: 0 0% 98%; + [data-theme="dark"], + .dark { + --background: 5 5 5; + --foreground: 0 0% 98%; - --surface: rgb(23, 23, 23); + --surface: rgb(23, 23, 23); - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - --color-one: #6aa8e2; - } + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --color-one: #6aa8e2; + } } @layer base { - html { - @apply scroll-smooth; - } - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -} \ No newline at end of file + html { + @apply scroll-smooth; + } + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} + +::selection { + color: hsl(var(--primary-foreground)); + background: hsl(var(--primary)); +} + +::-moz-selection { + color: hsl(var(--primary-foreground)); + background: hsl(var(--primary)); +} diff --git a/src/app/privacy-policy/markdown.css b/src/app/privacy-policy/markdown.css index 293b725..0e754f2 100644 --- a/src/app/privacy-policy/markdown.css +++ b/src/app/privacy-policy/markdown.css @@ -1,37 +1,58 @@ - #policy h1 { - font-size: 2em; + font-size: 2.5em; margin: 0.67em 0; font-weight: bold; } +#policy { + padding-top: 2.5em; + margin-top: 4em; +} + + #policy h1:first-child { margin-top: 0 !important; } #policy h2 { - font-size: 1.5em; + font-size: 2em; margin: 0.83em 0; font-weight: bold; } #policy h3 { - font-size: 1.17em; + font-size: 1.5em; margin: 1em 0; + font-weight: semi-bold; } #policy ul { - margin: 1em; + margin: 1em 0; } #policy li { list-style: circle; + margin-left: 1.1em; + font-size: 1.1em; } +/* Link styles */ #policy a { color: #007bff; + transition: color 0.2s ease-in-out; +} + +#policy a:hover { + text-decoration: underline; + color: #0056b3; } #policy hr { - margin: 2em 0; + margin: 2em 0; + border: 1px solid #ddd; +} + +#policy p { + margin: 1em 0; + line-height: 1.6; } diff --git a/src/app/privacy-policy/page.tsx b/src/app/privacy-policy/page.tsx index fda0c6e..5bf55bf 100644 --- a/src/app/privacy-policy/page.tsx +++ b/src/app/privacy-policy/page.tsx @@ -15,7 +15,7 @@ export default function PrivacyPolicy() { # Privacy Policy * Last updated: 2024-08-12 -# Introduction +## Introduction Welcome to Zen Browser! Your privacy is our priority. This Privacy Policy outlines the types of personal information we collect, how we use it, and the steps we take to protect your data when you use Zen Browser. ## 1. Information We Do Not Collect @@ -23,56 +23,56 @@ Zen Browser is designed with privacy in mind. We do not collect, store, or share * Crash reports can be sent to Mozilla Firefox. But, we do not collect any crash reports. Crash reports are sent securely to Mozilla Firefox to help improve the stability of the browser. They do not contain any personal information. -## 1.1. No Telemetry +### **1.1. No Telemetry** We do not collect any telemetry data. However, you can opt-in to share telemetry data to Mozilla for the improvement of FireFox (the base upon which the Zen Browser is built). It will be treated in accordance with their Privacy Policy which you can read about [here](https://www.mozilla.org/en-US/privacy/). -## 1.2. No Personal Data Collection +### **1.2. No Personal Data Collection** Zen Browser does not collect any personal information such as your IP address, browsing history, search queries, or form data. -## 1.3. No Third-Party Tracking +### **1.3. No Third-Party Tracking** We do not allow third-party trackers or analytics tools to operate within Zen Browser. Your browsing activity remains entirely private and is not shared with any third party. Mozilla is not considered a third party as it is the base of Zen Browser. -# 2. Information Stored Locally on Your Device -## 2.1. Browsing Data +## 2. Information Stored Locally on Your Device +### **2.1. Browsing Data** Zen Browser stores certain data locally on your device to enhance your browsing experience. This includes: * **Cookies**: Cookies are stored locally on your device and are not shared with Zen Browser or any third party. You have full control over the management of cookies through the browser’s settings. * **Cache and Temporary Files**: Zen Browser may store cache files and other temporary data locally to improve performance. These files can be cleared at any time through the browser’s settings. -## 2.2. Settings and Preferences +### **2.2. Settings and Preferences** Any customizations, settings, and preferences you make within Zen Browser are stored locally on your device. We do not have access to or control over this data. -# 3. Sync Feature +## 3. Sync Feature Zen Browser offers a "Sync" feature, this is implemented using Mozilla Firefox's Sync feature. This feature allows you to synchronize your bookmarks, history, passwords, and other data across multiple devices. For this feature to work, your data is encrypted and stored on Mozilla’s servers and is treated in accordance with their Privacy Policy. We, at Zen, cannot view any of this data. * [Mozilla Firefox Sync](https://www.mozilla.org/en-US/privacy/mozilla-accounts/) * [This is how we store your passwords](https://support.mozilla.org/en-US/kb/how-firefox-securely-saves-passwords#:~:text=Firefox%20Desktop%20encrypts%20your%20passwords,cryptography%20to%20obscure%20your%20passwords.) -# 4. Data Security +## 4. Data Security Although Zen Browser does not collect your data, we are committed to protecting the information that is stored locally on your device and, if you use the Sync feature, the encrypted data stored on Mozilla's servers. We recommend that you use secure passwords, enable device encryption, and regularly update your software to ensure your data remains safe. * Note that most of the security measures are taken care by Mozilla Firefox. -# 5. Your Control -## 5.1. Data Deletion +## 5. Your Control +### **5.1. Data Deletion** You have full control over all data stored locally on your device by Zen Browser. You can clear your browsing data, cookies, and cache at any time using the browser’s settings. -## 5.2. Do Not Track +### **5.2. Do Not Track** Zen Browser automatically honors "Do Not Track" requests by default. We ensure that no tracking of your activity occurs, in compliance with this setting. -# 6. Our Website and Services +## 6. Our Website and Services When you click on the "Download" button on our website, a number in the database is incremented to track the number of downloads. This is done to understand the popularity of the browser. No personal data is collected during the process. -## 6.1. External links +### **6.1. External links** Zen Browser may contain links to external websites or services that are not owned or operated by us. We are not responsible for the content or privacy practices of these sites. We recommend that you review the privacy policies of these sites before providing them with any personal information. -# 7. Changes to This Privacy Policy +## 7. Changes to This Privacy Policy We may update this Privacy Policy from time to time to reflect changes in our practices or legal requirements. We will notify you of any significant changes by updating the effective date at the top of this policy. Continued use of Zen Browser after such changes constitutes your acceptance of the new terms. -# 8. Other telemetry done by Mozilla Firefox +## 8. Other telemetry done by Mozilla Firefox We try to disable all telemetry data collection in Zen Browser. But, we may have missed some. Check the below links for more information. @@ -80,7 +80,7 @@ You can also optionally enable telemetry data collection and other Mozilla Resea * Please check [Firefox Privacy Notice](https://www.mozilla.org/en-US/privacy/) for more information. -# 9. Contact Us +## 9. Contact Us If you have any questions or concerns about this Privacy Policy or Zen Browser, please contact us at: * Discord: [Zen Browser's Discord](https://discord.gg/zen-browser) diff --git a/src/components/features.tsx b/src/components/features.tsx index b480ddf..daa8d0f 100644 --- a/src/components/features.tsx +++ b/src/components/features.tsx @@ -95,7 +95,7 @@ export default function Features() {

Always up to date

-

Zen Browser is always up to date, ensuring that you have the latest features and security updates. With automatic updates, you can rest easy knowing that your browser is secure and up to date.

+

Zen Browser is built on top of Firefox, ensuring it always stays up to date with the latest features, security patches, and performance improvements.

@@ -237,7 +237,7 @@ export default function Features() {

Frequently Asked Questions

- is it firefox based? + Is it Firefox based? Yes, Zen Browser is focused on being always at the latest version of Firefox, ensuring that you have the latest security updates and features. @@ -262,7 +262,7 @@ export default function Features() {
- + + +
See what version of Firefox Zen uses diff --git a/src/components/mode-toggle.tsx b/src/components/mode-toggle.tsx index f4ac64f..ef4e1e8 100644 --- a/src/components/mode-toggle.tsx +++ b/src/components/mode-toggle.tsx @@ -1,50 +1,40 @@ "use client"; - import { useEffect, useState } from "react"; import { MoonIcon, SunIcon } from "@radix-ui/react-icons"; import { useTheme } from "next-themes"; import { Button } from "./ui/button"; export function ModeToggle() { - const { theme, setTheme } = useTheme(); + const { setTheme } = useTheme(); + const [currentTheme, setCurrentTheme] = useState('light'); + const [mounted, setMounted] = useState(false); - const toggleTheme = () => { - switch (theme) { - case "system": - setTheme("dark"); - break; - case "dark": - setTheme("light"); - break; - case "light": - setTheme("system"); - break; - } - }; + useEffect(() => { + setMounted(true); + const savedTheme = localStorage.getItem('theme') || 'light'; + setCurrentTheme(savedTheme); + setTheme(savedTheme); + }, [setTheme]); - // prevent hydration error - const [mounted, setMounted] = useState(false); + const toggleTheme = () => { + const newTheme = currentTheme === 'light' ? 'dark' : 'light'; + setCurrentTheme(newTheme); + setTheme(newTheme); + localStorage.setItem('theme', newTheme); + }; - useEffect(() => { - setMounted(true); - }, []); + if (!mounted) { + return null; + } - if (!mounted) { - return null; - } - - return ( - - ); -} + return ( + + ); +} \ No newline at end of file