This commit is contained in:
mauro-balades
2024-09-29 19:24:40 +02:00
10 changed files with 164 additions and 114 deletions

1
public/uma.js Normal file
View File

@@ -0,0 +1 @@
!function(){"use strict";(t=>{const{screen:{width:e,height:a},navigator:{language:r},location:n,localStorage:i,document:c,history:o}=t,{hostname:s,href:u}=n,{currentScript:l,referrer:d}=c;if(!l)return;const f="data-",m=l.getAttribute.bind(l),h=m(f+"website-id"),p=m(f+"host-url"),g=m(f+"tag"),y="false"!==m(f+"auto-track"),b="true"===m(f+"exclude-search"),v=m(f+"domains")||"",S=v.split(",").map((t=>t.trim())),w=`${(p||""||l.src.split("/").slice(0,-1).join("/")).replace(/\/$/,"")}/api/send`,N=`${e}x${a}`,T=/data-umami-event-([\w-_]+)/,A=f+"umami-event",x=300,O=t=>{if(t){try{const e=decodeURI(t);if(e!==t)return e}catch(e){return t}return encodeURI(t)}},U=t=>{try{const{pathname:e,search:a}=new URL(t);t=e+a}catch(t){}return b?t.split("?")[0]:t},j=()=>({website:h,hostname:s,screen:N,language:r,title:O(q),url:O(D),referrer:O(_),tag:g||void 0}),k=(t,e,a)=>{a&&(_=D,D=U(a.toString()),D!==_&&setTimeout(I,x))},E=()=>!h||i&&i.getItem("umami.disabled")||v&&!S.includes(s),L=async(t,e="event")=>{if(E())return;const a={"Content-Type":"application/json"};void 0!==R&&(a["x-umami-cache"]=R);try{const r=await fetch(w,{method:"POST",body:JSON.stringify({type:e,payload:t}),headers:a}),n=await r.text();return R=n}catch(t){}},$=()=>{B||(I(),(()=>{const t=(t,e,a)=>{const r=t[e];return(...e)=>(a.apply(null,e),r.apply(t,e))};o.pushState=t(o,"pushState",k),o.replaceState=t(o,"replaceState",k)})(),(()=>{const t=new MutationObserver((([t])=>{q=t&&t.target?t.target.text:void 0})),e=c.querySelector("head > title");e&&t.observe(e,{subtree:!0,characterData:!0,childList:!0})})(),c.addEventListener("click",(async t=>{const e=t=>["BUTTON","A"].includes(t),a=async t=>{const e=t.getAttribute.bind(t),a=e(A);if(a){const r={};return t.getAttributeNames().forEach((t=>{const a=t.match(T);a&&(r[a[1]]=e(t))})),I(a,r)}},r=t.target,i=e(r.tagName)?r:((t,a)=>{let r=t;for(let t=0;t<a;t++){if(e(r.tagName))return r;if(r=r.parentElement,!r)return null}})(r,10);if(!i)return a(r);{const{href:e,target:r}=i,c=i.getAttribute(A);if(c)if("A"===i.tagName){const o="_blank"===r||t.ctrlKey||t.shiftKey||t.metaKey||t.button&&1===t.button;if(c&&e)return o||t.preventDefault(),a(i).then((()=>{o||(n.href=e)}))}else if("BUTTON"===i.tagName)return a(i)}}),!0),B=!0)},I=(t,e)=>L("string"==typeof t?{...j(),name:t,data:"object"==typeof e?e:void 0}:"object"==typeof t?t:"function"==typeof t?t(j()):j()),K=t=>L({...j(),data:t},"identify");t.umami||(t.umami={track:I,identify:K});let R,B,D=U(u),_=d!==s?d:"",q=c.title;y&&!E()&&("complete"===c.readyState?$():c.addEventListener("readystatechange",$,!0))})(window)}();

View File

@@ -24,17 +24,11 @@ export default async function RootLayout({
<html suppressHydrationWarning>
<head>
<link rel="me" href="https://fosstodon.org/@zenbrowser"></link>
<script
defer
data-domain="zen-browser.app"
src="https://plausible.io/js/script.js"
></script>
<link
rel="alternate"
type="application/rss+xml"
title="Zen Browser Release Notes"
href="https://www.zen-browser.app/feed.xml"
/>
{/* Analitics */}
<script defer data-domain="zen-browser.app" src="https://plausible.io/js/script.js"></script>
<script defer src="https://cdn.jsdelivr.net/gh/zen-browser/www/public/uma.js" data-host-url="https://uma.zen-browser.app" data-website-id="7148ef7c-5299-4ca1-9a18-9d6964e93b53" data-domains="zen-browser.app"></script>
{/* End */}
<link rel="alternate" type="application/rss+xml" title="Zen Browser Release Notes" href="https://www.zen-browser.app/feed.xml" />
</head>
<body className={inter.className}>
<ThemeProvider attribute="class" defaultTheme="dark">

View File

@@ -291,7 +291,7 @@ export default function CreateThemePage() {
<div className="ml-4 h-11 w-11 rounded-lg border bg-[var(--zen-dialog-background)]"></div>
</div>
<div className="text-md mt-8 font-bold text-muted-foreground">
Right now, we aren't taking more color themes for the browser,
Right now, we aren't taking more color Mods for the browser,
until we find a way to make it more accessible for everyone.
However, you can still create your own theme and share it with the
community.

View File

@@ -85,7 +85,7 @@ function Question() {
}
export default function Features() {
const [feature, setFeature] = useState("item-1");
const [feature, setFeature] = useState("");
return (
<section className="w-full flex-col" id="features">
<div className="mx-auto mt-16 flex w-full flex-col bg-surface shadow md:w-5/6 md:rounded-md lg:w-3/4 lg:flex-row">
@@ -98,16 +98,13 @@ export default function Features() {
<p className="mt-4 text-lg text-gray-600 dark:text-gray-300">
With Zen's Theme Store, you can customize your browsing experience
to reflect your unique style and preferences. Choose from a wide
array of themes, colors, and layouts to make Zen truly your own,
array of Mods, colors, and layouts to make Zen truly your own,
transforming your browser into a personalized digital space.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() => window.open("/themes", "_self")}
>
View Theme Store
</Button>
<Link href="/themes" prefetch={false}>
<Button className="mt-8">Browse Themes</Button>
</Link>
</div>
</div>
<hr />
@@ -122,12 +119,9 @@ export default function Features() {
performance improvements.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() => window.open("/download", "_self")}
>
Download Now
</Button>
<Link href="/download" prefetch={false}>
<Button className="mt-8">Download Now</Button>
</Link>
</div>
</div>
</div>
@@ -146,14 +140,9 @@ export default function Features() {
browser.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() =>
window.open("https://github.com/zen-browser", "_blank")
}
>
GitHub Page
</Button>
<a href="https://github.com/zen-browser" target="_blank">
<Button className="mt-8">GitHub</Button>
</a>
</div>
<div className="mt-14 w-full">
<div className="flex items-center">
@@ -247,12 +236,9 @@ export default function Features() {
multitasking.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() => window.open("/download", "_self")}
>
Download Now
</Button>
<Link href="/download" prefetch={false}>
<Button className="mt-8">Download Now</Button>
</Link>
</div>
</div>
</div>
@@ -307,24 +293,18 @@ export default function Features() {
secure, giving you peace of mind as you explore the web.
</p>
<div className="relative">
<Button
className="mt-8"
variant="ghost"
onClick={() =>
window.open("https://docs.zen-browser.app/security", "_blank")
}
>
Security in Zen{" "}
<ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
<Button
className="mt-8"
variant="ghost"
onClick={() => window.open("/privacy-policy", "_blank")}
>
Your Privacy{" "}
<ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
<a href="https://docs.zen-browser.app/security" target="_blank">
<Button className="mt-8" variant="ghost">
Security in Zen{" "}
<ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
</a>
<Link href="/privacy-policy" prefetch={false} target="_blank">
<Button className="mt-8" variant="ghost">
Your Privacy{" "}
<ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
</Link>
</div>
</div>
</div>
@@ -386,15 +366,13 @@ export default function Features() {
focus on your work.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() => window.open("/download", "_self")}
>
What are you waiting for?
</Button>
<Link href="/download" prefetch={false}>
<Button className="mt-8">What are you waiting for?</Button>
</Link>
</div>
</div>
</div>
<div className="mx-auto mt-36 flex w-full flex-col bg-surface shadow md:w-5/6 md:rounded-md lg:w-3/4 lg:flex-row">
<div className="relative flex w-full flex-col justify-center p-5 lg:w-1/2 lg:p-12">
<h1 className="text-4xl font-medium text-gray-800 dark:text-gray-100">
@@ -404,8 +382,9 @@ export default function Features() {
<Accordion
type="single"
value={feature}
onValueChange={setFeature}
defaultValue="item-1"
onValueChange={(value) =>
setFeature(value === feature ? "" : value)
}
className="mt-8"
>
<AccordionItem value="item-1">
@@ -429,13 +408,45 @@ export default function Features() {
<AccordionContent>
Zen Browser is built on top of Firefox, which is known for its
security features. We also have additional security features
like https only built into Zen Browser to help keep you safe
like HTTPS only built into Zen Browser to help keep you safe
online.
</AccordionContent>
</AccordionItem>
</Accordion>
</div>
<div className="relative h-auto overflow-hidden rounded-md lg:w-1/2">
{feature === "" && (
<div className="absolute flex h-full w-full items-center justify-center">
<div className="flex w-full flex-col items-center justify-center space-y-6">
<div className="flex h-fit w-full max-w-sm animate-fade-in items-center justify-center rounded-full border-2 border-white bg-surface p-4 shadow">
<Logo className="h-10 w-10" />
<span className="mx-4 text-4xl">+</span>
<svg
className="relative h-10 w-10 dark:fill-white"
xmlns="http://www.w3.org/2000/svg"
fillOpacity="context-fill-opacity"
>
<path
style={{ transform: "scale(2) translate(5%, 5%)" }}
d="M10.39 0C8.948.788 7.987 2.025 7.767 3.66c-1.017.162-1.768.781-1.768.781s.72-.44 1.736-.511a4.04 4.04 0 0 1 3.789 2.034s-.758-.62-1.928-.468c1.315.68 1.872 2.002 1.701 3.369-.17 1.367-1.183 2.435-2.354 2.723-1.171.287-2.333.099-3.229-.61-.896-.708-1.251-1.533-1.305-2.254.213-.533.541-.812 1.1-1.092.558-.279 1.422-.283 1.572-.283s.8-.507.95-.894c-.726-.363-1.292-.65-1.696-.934-.404-.283-.492-.534-1.012-.898-.307-1.006-.021-1.955-.021-1.955s-1.043.437-1.93 1.49c0 0-.342-.338-.28-2.006-.427.155-1.366 1.004-1.947 1.92a7.277 7.277 0 0 0-.798 1.723A8.296 8.296 0 0 0-.003 8a8 8 0 0 0 16 0c0-2.256-.93-4.252-2.188-5.002 0 0 .542.932.813 2.43-.4-1.04-1.235-2.166-1.877-2.844-.643-.678-2.068-1.88-2.357-2.584z"
/>
</svg>
</div>
<div className="flex h-fit w-full max-w-sm animate-fade-in items-center justify-center rounded-full border-2 border-white bg-surface p-4 shadow">
<LockClosedIcon className="h-10 w-10" />
<span className="mx-4 text-4xl">+</span>
<EyeClosedIcon className="h-10 w-10" />
</div>
<div className="flex h-fit w-full max-w-sm animate-fade-in items-center justify-center rounded-full border-2 border-white bg-surface p-4 shadow">
<ShieldCheck className="h-10 w-10" />
<span className="mx-4 text-4xl">+</span>
<ShieldAlertIcon className="h-10 w-10" />
</div>
</div>
</div>
)}
<CachedImage
width={1350}
height={900}
@@ -443,7 +454,7 @@ export default function Features() {
alt="Zen Browser"
className="robject-right ounded-md h-full w-full object-cover"
/>
{feature == "item-1" && (
{feature === "item-1" && (
<div className="absolute left-0 top-0 grid h-full w-full grid-rows-3">
<div></div>
<div className="tems-center m-auto flex h-fit w-fit animate-fade-in rounded-full border-2 border-white bg-surface p-4 shadow">
@@ -470,7 +481,8 @@ export default function Features() {
</a>
</div>
)}
{feature == "item-2" && (
{feature === "item-2" && (
<div className="absolute left-0 top-0 grid h-full w-full grid-rows-3">
<div></div>
<div className="tems-center m-auto flex h-fit w-fit animate-fade-in rounded-full border-2 border-white bg-surface p-4 shadow">
@@ -488,7 +500,8 @@ export default function Features() {
</a>
</div>
)}
{feature == "item-3" && (
{feature === "item-3" && (
<div className="absolute left-0 top-0 grid h-full w-full grid-rows-3">
<div></div>
<div className="tems-center m-auto flex h-fit w-fit animate-fade-in rounded-full border-2 border-white bg-surface p-4 shadow">
@@ -508,6 +521,7 @@ export default function Features() {
)}
</div>
</div>
<div className="mx-auto mt-36 flex w-full flex-col bg-surface p-5 shadow md:w-5/6 md:rounded-md lg:w-3/4 lg:flex-row lg:p-12">
<div className="flex flex-col justify-center p-16 lg:w-1/2">
<h3 className="text-4xl font-medium text-gray-800 dark:text-gray-100">
@@ -517,12 +531,9 @@ export default function Features() {
Download Zen Browser now and experience the future of browsing.
</p>
<div className="relative">
<Button
className="mt-8"
onClick={() => window.open("/download", "_self")}
>
Download Now
</Button>
<Link href="/download" prefetch={false}>
<Button className="mt-8">Download Now</Button>
</Link>
</div>
</div>
<div className="mx-2 h-[1px] border-t lg:h-[unset] lg:w-[1px] lg:border-l lg:border-t-0"></div>
@@ -536,23 +547,20 @@ export default function Features() {
cause.
</p>
<div className="relative mt-8 flex">
<Button
variant="ghost"
onClick={() =>
window.open("https://patreon.com/zen_browser", "_blank")
}
>
Patreon <ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
<Button
className="ml-8"
variant="ghost"
onClick={() =>
window.open("https://ko-fi.com/zen_browser", "_blank")
}
>
Ko-fi <ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
<a href="https://patreon.com/zen_browser" target="_blank">
<Button data-umami-event="patreon-feature" variant="ghost">
Patreon <ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
</a>
<a href="https://ko-fi.com/zen_browser" target="_blank">
<Button
data-umami-event="ko-fi-feature"
className="ml-8"
variant="ghost"
>
Ko-fi <ExternalLinkIcon className="ml-4 h-4 w-4 opacity-50" />
</Button>
</a>
</div>
</div>
</div>

View File

@@ -13,7 +13,7 @@ export default function Footer() {
<Logo />
<div className="mt-auto">
<h1 className="text-2xl font-bold opacity-80">Zen Browser</h1>
<a href="https://uptime.zen-browser.app/" className="py-2 px-3 w-fit mt-2 cursor-pointer rounded-md shadow bg-surface flex items-center">
<a data-umami-event="footer-status" href="https://uptime.zen-browser.app/" className="py-2 px-3 w-fit mt-2 cursor-pointer rounded-md shadow bg-surface flex items-center">
<div className="rounded-full size-3 bg-green-500 relative shadow">
<div className="rounded-full size-3 bg-green-500 animate-ping absolute top-[-0.2%] z-0" style={{ animationDuration: "1.7s" }}></div>
</div>
@@ -40,7 +40,7 @@ export default function Footer() {
<h2 className="text-md font-bold opacity-80">Get Started</h2>
<ul className="mt-4 font-normal opacity-70">
<li>
<a href="/themes">Themes</a>
<a href="/themes">Mods</a>
</li>
<li className="mt-2">
<a href="/download">Download</a>
@@ -54,7 +54,7 @@ export default function Footer() {
<h2 className="text-md font-bold opacity-80">Get Help</h2>
<ul className="mt-4 font-normal opacity-70">
<li>
<a href="https://discord.com/servers/mauro-s-little-sweatshop-1088172780480114748">
<a data-umami-event="footer-discord" href="https://discord.com/servers/mauro-s-little-sweatshop-1088172780480114748">
Discord
</a>
</li>
@@ -70,7 +70,7 @@ export default function Footer() {
<a href="/about">About Us</a>
</li>
<li className="mt-2">
<a href="/privacy-policy">Privacy Policy</a>
<a data-umami-event="footer-privacy-policy" href="/privacy-policy">Privacy Policy</a>
</li>
</ul>
</div>
@@ -93,10 +93,10 @@ export default function Footer() {
<h2 className="text-md mt-8 font-bold opacity-80">Support Us</h2>
<ul className="mt-4 font-normal opacity-70">
<li>
<a href="https://patreon.com/zen_browser">Patreon</a>
<a data-umami-event="patreon-fotter" href="https://patreon.com/zen_browser">Patreon</a>
</li>
<li className="mt-2">
<a href="https://ko-fi.com/zen_browser">Ko-fi</a>
<a data-umami-event="ko-fi-fotter" href="https://ko-fi.com/zen_browser">Ko-fi</a>
</li>
</ul>
</div>

View File

@@ -17,9 +17,9 @@ export default function MarketplacePage({ themes }: { themes: ZenTheme[] }) {
className="h-fit min-w-52 text-xs text-muted-foreground lg:mb-0"
offsetTop={120}
>
<h1 className="text-4xl font-bold lg:text-7xl">Themes Store</h1>
<h1 className="text-4xl font-bold lg:text-7xl">Mods Store</h1>
<p className="mt-4 text-lg text-muted-foreground">
Discover and install themes for Zen Browser.
Discover and install Mods for Zen Browser.
</p>
<ThemesSearch
input={searchInput}

View File

@@ -93,8 +93,8 @@ export function Navigation() {
<ListItem href="/download" title="Download">
Start using Zen Browser today with just a few clicks.
</ListItem>
<ListItem href="/themes" title="Themes Store">
Customize your browser with a variety of themes!
<ListItem href="/themes" title="Mods Store">
Customize your browser with a variety of Mods!
</ListItem>
<ListItem href="/release-notes" title="Release Notes">
Stay up to date with the latest changes.
@@ -109,20 +109,20 @@ export function Navigation() {
</NavigationMenuTrigger>
<NavigationMenuContent>
<ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[600px]">
<ListItem
<ListItem2
title="Patreon"
href="https://patreon.com/zen_browser?utm_medium=unknown&utm_source=join_link&utm_campaign=creatorshare_creator&utm_content=copyLink"
>
Support us on Patreon and get exclusive rewards and keep the
project alive.
</ListItem>
<ListItem
</ListItem2>
<ListItem2
title="Ko-Fi"
href="https://ko-fi.com/zen_browser?utm_medium=unknown&utm_source=join_link&utm_campaign=creatorshare_creator&utm_content=copyLink"
>
Ko-fi is a way to support us with a one-time donation and help
us keep the project alive.
</ListItem>
</ListItem2>
</ul>
</NavigationMenuContent>
</NavigationMenuItem>
@@ -173,4 +173,30 @@ const ListItem = React.forwardRef<
</li>
);
});
const ListItem2 = React.forwardRef<
React.ElementRef<"a">,
React.ComponentPropsWithoutRef<"a">
>(({ className, title, children, ...props }, ref) => {
return (
<li>
<NavigationMenuLink asChild>
<a
data-umami-event={title}
ref={ref}
className={ny(
"block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
className,
)}
{...props}
>
<div className="text-sm font-medium leading-none">{title}</div>
<p className="line-clamp-2 text-sm leading-snug text-muted-foreground">
{children}
</p>
</a>
</NavigationMenuLink>
</li>
);
});
ListItem.displayName = "ListItem";
ListItem.displayName = "ListItem2";

View File

@@ -50,6 +50,7 @@ export default async function ThemePage({ themeID }: { themeID: string }) {
<Button
className="mt-4 hidden !rounded-lg"
id="install-theme"
data-umami-event={`theme-${theme.id}-install`}
zen-theme-id={theme.id}
>
Install Theme 🎉
@@ -57,6 +58,7 @@ export default async function ThemePage({ themeID }: { themeID: string }) {
<Button
className="mt-4 hidden !rounded-lg"
id="install-theme-uninstall"
data-umami-event={`theme-${theme.id}-uninstall`}
zen-theme-id={theme.id}
>
Uninstall Theme

View File

@@ -23,7 +23,7 @@ export default function ThemesSearch({
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="Search themes"
placeholder="Search Mods"
className="w-full border-none bg-transparent text-black focus:border-none focus:outline-none focus:ring-0 dark:text-white"
/>
{/*

View File

@@ -994,7 +994,7 @@ export const releaseNotes: ReleaseNote[] = [
fixes: [
{
description: "The New Tab button is not visible",
isse: 1640,
issue: 1640,
},
{
description: "The Unified Extensions button is not visible",
@@ -1009,15 +1009,34 @@ export const releaseNotes: ReleaseNote[] = [
},
{
description: "Fixed an issue with reordering tabs",
},
{
description: "Fixed an issue with ⌘ keyboard shortcuts on macOS",
},
}
],
},
{
version: "1.0.1-a.5",
date: "24/09/2024",
image: false,
workflowId: 11020784612,
extra: "This update is a small patch to fix some issues that weren't addressed in the previous release!",
features: [
"Moved application menu button to the right",
"Added new shortcuts",
"Collapsed tab sidebar is now smaller"
],
fixes: [
{
description: "Fixed issue with hovering over window control buttons (macOS)",
},
{
description: "(Hopefully) resolved all issues with keyboard shortcuts",
issue: 1629
},
],
}
].reverse();
export function releaseNoteIsAlpha(note: ReleaseNote) {
"use client";
return note.version.includes("-a.");
}
}