diff --git a/next.config.js b/next.config.js index a05aabf..916a9a2 100644 --- a/next.config.js +++ b/next.config.js @@ -41,4 +41,4 @@ const nextConfig = (phase, { defaultConfig }) => { }; }; -module.exports = nextConfig; \ No newline at end of file +module.exports = nextConfig; diff --git a/src/app/feed.xml/route.ts b/src/app/feed.xml/route.ts index a0c9fc6..4b30045 100644 --- a/src/app/feed.xml/route.ts +++ b/src/app/feed.xml/route.ts @@ -77,49 +77,60 @@ function formatReleaseNote(releaseNote: ReleaseNote) { Thanks everyone for your feedback! ❤️

`; - if (releaseNote.image) { - content += `Release Image for version ${releaseNote.version}`; - } + } if (releaseNote.extra) { content += `

${releaseNote.extra.replace(/(\n)/g, "
")}

`; } - content += addReleaseNoteSection("⚠️ Breaking changes", releaseNote.breakingChanges); - content += addReleaseNoteSection("✓ Fixes", releaseNote.fixes?.map(fixToReleaseNote)); - content += addReleaseNoteSection("🖌 Theme Changes", releaseNote.themeChanges) - content += addReleaseNoteSection("⭐ Features", releaseNote.features); + content += addReleaseNoteSection( + "⚠️ Breaking changes", + releaseNote.breakingChanges, + ); + content += addReleaseNoteSection( + "✓ Fixes", + releaseNote.fixes?.map(fixToReleaseNote), + ); + content += addReleaseNoteSection( + "🖌 Theme Changes", + releaseNote.themeChanges, + ); + content += addReleaseNoteSection("⭐ Features", releaseNote.features); return content; } function addReleaseNoteSection(title: string, items?: string[]): string { - if (!items) { - return ""; - } + if (!items) { + return ""; + } - let content = `

${title}

`; - content += ``; - return content; + let content = `

${title}

`; + content += ``; + return content; } -function fixToReleaseNote(fix?: Exclude[number]) { - if (!fix || !fix.description || fix.description.length === 0) { - return ""; - } +function fixToReleaseNote( + fix?: Exclude[number], +) { + if (!fix || !fix.description || fix.description.length === 0) { + return ""; + } - let note = fix.description; - if (fix.issue) { - note += ` (#${fix.issue})`; - } - return note; + let note = fix.description; + if (fix.issue) { + note += ` (#${fix.issue})`; + } + return note; } diff --git a/src/app/globals.css b/src/app/globals.css index df514c6..3580dd5 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -49,11 +49,11 @@ --color-three: #ff2e63; */ - --color-1: 0 100% 63%; - --color-2: 270 100% 63%; - --color-3: 210 100% 63%; - --color-4: 195 100% 63%; - --color-5: 90 100% 63%; + --color-1: 0 100% 63%; + --color-2: 270 100% 63%; + --color-3: 210 100% 63%; + --color-4: 195 100% 63%; + --color-5: 90 100% 63%; } [data-theme="dark"], diff --git a/src/app/privacy-policy/markdown.css b/src/app/privacy-policy/markdown.css index cd68347..c273e4c 100644 --- a/src/app/privacy-policy/markdown.css +++ b/src/app/privacy-policy/markdown.css @@ -57,7 +57,7 @@ } code { - font-size: .8em; + font-size: 0.8em; background-color: var(--surface); padding: 0.2em 0.4em; border: 1px solid light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)); diff --git a/src/app/themes/page.tsx b/src/app/themes/page.tsx index b559de6..85c5d75 100644 --- a/src/app/themes/page.tsx +++ b/src/app/themes/page.tsx @@ -1,14 +1,14 @@ -'use client'; +"use client"; -import { useEffect } from 'react'; -import { useRouter } from 'next/navigation'; +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; export default function ThemesPage() { - const router = useRouter(); + const router = useRouter(); - useEffect(() => { - router.replace('/mods'); - }, [router]); + useEffect(() => { + router.replace("/mods"); + }, [router]); - return null; + return null; } diff --git a/src/components/CachedImage.tsx b/src/components/CachedImage.tsx index 4808a66..5d01dde 100644 --- a/src/components/CachedImage.tsx +++ b/src/components/CachedImage.tsx @@ -2,7 +2,6 @@ import Image from "next/image"; - const inDev = process.env.NODE_ENV === "development"; function imageLoader({ src }: { src: string }) { // Load locally if we are in development diff --git a/src/components/alert-modal.tsx b/src/components/alert-modal.tsx index c3a28f7..1d679e3 100644 --- a/src/components/alert-modal.tsx +++ b/src/components/alert-modal.tsx @@ -31,7 +31,7 @@ export const AlertModal = ({ -

+

Please select other formats if you want to install the Optimized version.

diff --git a/src/components/branding-assets.tsx b/src/components/branding-assets.tsx index 328d92f..53746a2 100644 --- a/src/components/branding-assets.tsx +++ b/src/components/branding-assets.tsx @@ -75,7 +75,12 @@ export function BrandingAssets() { CC BY-SA 4.0 . Thanks to{" "} - + Donno (mr. Logos) {" "} for the assets. diff --git a/src/components/browser-slider.tsx b/src/components/browser-slider.tsx index a0306a0..ab866db 100644 --- a/src/components/browser-slider.tsx +++ b/src/components/browser-slider.tsx @@ -6,34 +6,46 @@ import { Slider } from "./ui/slider"; import React from "react"; export default function BrowserComplexityExample() { - const [selectedImage, setSelectedImage] = React.useState([1]); - return ( -
-

How much browser do you want?

-

- Zen is designed to be simple and easy to use. We believe that the best software is - the one that you don't notice. However, we can assure you that if you want customization, we have you covered -

-
- 🌱 - - 🌳 -
-
- {[...Array(4)].map((_, i) => ( - - ))} -
-
- ) + const [selectedImage, setSelectedImage] = React.useState([1]); + return ( +
+

+ How much browser do you want? +

+

+ Zen is designed to be simple and easy to use. We believe that the best + software is the one that you don't notice. However, we can assure you + that if you want customization, we have you covered +

+
+ 🌱 + + 🌳 +
+
+ {[...Array(4)].map((_, i) => ( + + ))} +
+
+ ); } diff --git a/src/components/cool-header-text/cool-header-text.tsx b/src/components/cool-header-text/cool-header-text.tsx index 3eb9548..7b57a5c 100644 --- a/src/components/cool-header-text/cool-header-text.tsx +++ b/src/components/cool-header-text/cool-header-text.tsx @@ -1,14 +1,12 @@ -import s from './styles.module.css' +import s from "./styles.module.css"; export default function CoolHeaderText() { return ( <>
-

- Stay focused, browse faster with Zen -

+

Stay focused, browse faster with Zen

-
+
Alpha Version
diff --git a/src/components/cool-header-text/styles.module.css b/src/components/cool-header-text/styles.module.css index ed72c53..99138ec 100644 --- a/src/components/cool-header-text/styles.module.css +++ b/src/components/cool-header-text/styles.module.css @@ -1,24 +1,23 @@ @keyframes hueShift { - 0% { - filter: hue-rotate(0deg); - } - 50% { - filter: hue-rotate(170deg); - } - 100% { - filter: hue-rotate(0deg); - } - } - - .title { - background-clip: text; - background-image: linear-gradient(90deg, #0077e7, #01d8d1); - -webkit-background-clip: text; - color: transparent; - filter: hue-rotate(0deg); - animation: hueShift 10s infinite linear 1s; - padding-bottom: 8px; - user-select: none; - cursor: default; - } - \ No newline at end of file + 0% { + filter: hue-rotate(0deg); + } + 50% { + filter: hue-rotate(170deg); + } + 100% { + filter: hue-rotate(0deg); + } +} + +.title { + background-clip: text; + background-image: linear-gradient(90deg, #0077e7, #01d8d1); + -webkit-background-clip: text; + color: transparent; + filter: hue-rotate(0deg); + animation: hueShift 10s infinite linear 1s; + padding-bottom: 8px; + user-select: none; + cursor: default; +} diff --git a/src/components/create-theme.tsx b/src/components/create-theme.tsx index c987ca5..26f22e4 100644 --- a/src/components/create-theme.tsx +++ b/src/components/create-theme.tsx @@ -5,7 +5,6 @@ import { Button } from "./ui/button"; import React from "react"; import styled from "styled-components"; - import { Sheet, SheetContent, diff --git a/src/components/download/architecture-card.tsx b/src/components/download/architecture-card.tsx index 9e36c77..2591c92 100644 --- a/src/components/download/architecture-card.tsx +++ b/src/components/download/architecture-card.tsx @@ -1,4 +1,4 @@ -'use client'; +"use client"; import { Architecture } from "@/components/download/types"; import { ny } from "@/lib/utils"; diff --git a/src/components/download/form.tsx b/src/components/download/form.tsx index 843626a..71fb265 100644 --- a/src/components/download/form.tsx +++ b/src/components/download/form.tsx @@ -53,4 +53,4 @@ export const FieldDescription = styled.div` font-size: 1rem; color: #666; margin-bottom: 1rem; -`; \ No newline at end of file +`; diff --git a/src/components/download/mac-architecture-card.tsx b/src/components/download/mac-architecture-card.tsx index eab4f1a..add78cd 100644 --- a/src/components/download/mac-architecture-card.tsx +++ b/src/components/download/mac-architecture-card.tsx @@ -46,9 +46,7 @@ export const MacArchitectureCard = ({ >

{icon}

{label}

-

- {description} -

+

{description}

); }; diff --git a/src/components/download/platform-card.tsx b/src/components/download/platform-card.tsx index bbb517f..0cb4786 100644 --- a/src/components/download/platform-card.tsx +++ b/src/components/download/platform-card.tsx @@ -1,4 +1,4 @@ -'use client'; +"use client"; import { Platforms } from "@/components/download/types"; import { ny } from "@/lib/utils"; @@ -10,7 +10,7 @@ interface PlatformCardProps { } const PLATFORMS_DATA: Record< - Exclude, + Exclude, { label: string; icon: string; borderColor: string } > = { Windows: { diff --git a/src/components/download/tools/throw-confetti.ts b/src/components/download/tools/throw-confetti.ts index c6dc284..74dbfd0 100644 --- a/src/components/download/tools/throw-confetti.ts +++ b/src/components/download/tools/throw-confetti.ts @@ -1,28 +1,28 @@ import confetti from "canvas-confetti"; export const throwConfetti = () => { - const end = Date.now() + 3 * 1000; // 3 seconds - const colors = ["#a786ff", "#fd8bbc", "#eca184", "#f8deb1"]; - const frame = () => { - if (Date.now() > end) return; + const end = Date.now() + 3 * 1000; // 3 seconds + const colors = ["#a786ff", "#fd8bbc", "#eca184", "#f8deb1"]; + const frame = () => { + if (Date.now() > end) return; - confetti({ - particleCount: 2, - angle: 60, - spread: 55, - startVelocity: 60, - origin: { x: 0, y: 0.5 }, - colors, - }); - confetti({ - particleCount: 2, - angle: 120, - spread: 55, - startVelocity: 60, - origin: { x: 1, y: 0.5 }, - colors, - }); - requestAnimationFrame(frame); - }; - frame(); -}; \ No newline at end of file + confetti({ + particleCount: 2, + angle: 60, + spread: 55, + startVelocity: 60, + origin: { x: 0, y: 0.5 }, + colors, + }); + confetti({ + particleCount: 2, + angle: 120, + spread: 55, + startVelocity: 60, + origin: { x: 1, y: 0.5 }, + colors, + }); + requestAnimationFrame(frame); + }; + frame(); +}; diff --git a/src/components/download/types/index.ts b/src/components/download/types/index.ts index 1af7922..7e58a80 100644 --- a/src/components/download/types/index.ts +++ b/src/components/download/types/index.ts @@ -1,3 +1,3 @@ export type Platforms = "Windows" | "MacOS" | "Linux" | "Unsupported"; -export type Architecture = "specific" | "generic"; \ No newline at end of file +export type Architecture = "specific" | "generic"; diff --git a/src/components/download/windows-installer.tsx b/src/components/download/windows-installer.tsx index 1fa0f08..6339839 100644 --- a/src/components/download/windows-installer.tsx +++ b/src/components/download/windows-installer.tsx @@ -10,16 +10,16 @@ interface WindowsInstallerProps { flowIndex: number; platform: Platforms | null; selectedArchitecture: string; - setSelectedWindowsDownloadType: (value: string) => void; - selectedWindowsDownloadType: string; + setSelectedWindowsDownloadType: (value: string) => void; + selectedWindowsDownloadType: string; } export const WindowsInstaller = ({ flowIndex, platform, selectedArchitecture, - setSelectedWindowsDownloadType, - selectedWindowsDownloadType, + setSelectedWindowsDownloadType, + selectedWindowsDownloadType, }: WindowsInstallerProps) => { return ( { - const [feature, setFeature] = useState(""); - + const [feature, setFeature] = useState(""); + return (
diff --git a/src/components/features.tsx b/src/components/features.tsx index c9c1f6d..023444e 100644 --- a/src/components/features.tsx +++ b/src/components/features.tsx @@ -48,8 +48,8 @@ export default function Features() {

- With Zen Mods, you can customize your browsing experience - to reflect your unique style and preferences. Choose from a wide + With Zen Mods, you can customize your browsing experience to + reflect your unique style and preferences. Choose from a wide array of Mods, colors, and layouts to make Zen truly your own, transforming your browser into a personalized digital space.

diff --git a/src/components/mode-toggle.tsx b/src/components/mode-toggle.tsx index de2cb64..f07396f 100644 --- a/src/components/mode-toggle.tsx +++ b/src/components/mode-toggle.tsx @@ -12,12 +12,14 @@ export function ModeToggle() { setMounted(true); const savedTheme = localStorage.getItem("theme"); if (savedTheme) { - setTheme(savedTheme); + setTheme(savedTheme); } else { - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - setTheme(prefersDark ? "dark" : "light"); + const prefersDark = window.matchMedia( + "(prefers-color-scheme: dark)", + ).matches; + setTheme(prefersDark ? "dark" : "light"); } - }, [setTheme]); + }, [setTheme]); const toggleTheme = () => { const newTheme = theme === "light" ? "dark" : "light"; diff --git a/src/components/navigation.tsx b/src/components/navigation.tsx index 41de7e3..8be527e 100644 --- a/src/components/navigation.tsx +++ b/src/components/navigation.tsx @@ -122,9 +122,9 @@ export function Navigation() {
- +
- + @@ -186,8 +186,8 @@ export function Navigation() { target="_blank" rel="noopener noreferrer" > - Ko-fi is a way to support us with a one-time donation and help - us keep the project alive. + Ko-fi is a way to support us with a one-time donation and + help us keep the project alive. @@ -215,7 +215,10 @@ export function Navigation() {
- + v{latestRelease.version}
diff --git a/src/components/theme-card.tsx b/src/components/theme-card.tsx index bfaeb10..6b083d1 100644 --- a/src/components/theme-card.tsx +++ b/src/components/theme-card.tsx @@ -3,8 +3,13 @@ import { getThemeAuthorLink, ZenTheme } from "@/lib/mods"; import { TagIcon } from "lucide-react"; import { Badge } from "./ui/badge"; -import Link from "next/link"; -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "./ui/card"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "./ui/card"; export default function ThemeCard({ theme, @@ -15,10 +20,11 @@ export default function ThemeCard({ }) { const maxNameLen = 50; const maxDescLen = 100; - const authorLink = getThemeAuthorLink(theme); + const authorLink = getThemeAuthorLink(theme); return ( - { // IMPORTANT NOTE: We do NOT use a Link component here because of how zen manages site injection. // please for the love of god, dont change this to a Link component. Please. @@ -28,7 +34,8 @@ export default function ThemeCard({ if (e.button !== 0 && e.button !== 1) return; if (e.target instanceof HTMLAnchorElement) return; window.open(`/mods/${theme.id}`, e.button === 1 ? "_blank" : "_self"); - }}> + }} + >
- {theme.homepage && ( - e.stopPropagation()} - > - Homepage - - )} - {theme.homepage && authorLink && ( - · - )} - {authorLink && ( - e.stopPropagation()} - > - Author - - )} + {theme.homepage && ( + e.stopPropagation()} + > + Homepage + + )} + {theme.homepage && authorLink && ( + · + )} + {authorLink && ( + e.stopPropagation()} + > + Author + + )}
diff --git a/src/components/theme-page.tsx b/src/components/theme-page.tsx index a754760..a976901 100644 --- a/src/components/theme-page.tsx +++ b/src/components/theme-page.tsx @@ -19,7 +19,7 @@ export default async function ThemePage({ themeID }: { themeID: string }) { return (
-
+


-
@@ -92,7 +88,7 @@ export default async function ThemePage({ themeID }: { themeID: string }) { alt={theme.name} className="w-full rounded-2xl border-2 object-cover shadow" /> -
+
{readme === null ? ( ) : ( diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx index 968a70f..71381b2 100644 --- a/src/components/ui/card.tsx +++ b/src/components/ui/card.tsx @@ -1,76 +1,79 @@ -import * as React from "react" +import * as React from "react"; -import { ny } from "@/lib/utils" +import { ny } from "@/lib/utils"; const Card = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes + HTMLDivElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -
-)) -Card.displayName = "Card" +
+)); +Card.displayName = "Card"; const CardHeader = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes + HTMLDivElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -
-)) -CardHeader.displayName = "CardHeader" +
+)); +CardHeader.displayName = "CardHeader"; const CardTitle = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes + HTMLParagraphElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -

-)) -CardTitle.displayName = "CardTitle" +

+)); +CardTitle.displayName = "CardTitle"; const CardDescription = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes + HTMLParagraphElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -

-)) -CardDescription.displayName = "CardDescription" +

+)); +CardDescription.displayName = "CardDescription"; const CardContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes + HTMLDivElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -

-)) -CardContent.displayName = "CardContent" +
+)); +CardContent.displayName = "CardContent"; const CardFooter = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes + HTMLDivElement, + React.HTMLAttributes >(({ className, ...props }, ref) => ( -
-)) -CardFooter.displayName = "CardFooter" +
+)); +CardFooter.displayName = "CardFooter"; -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +}; diff --git a/src/components/ui/rainbow-button.tsx b/src/components/ui/rainbow-button.tsx index 9915fce..1634621 100644 --- a/src/components/ui/rainbow-button.tsx +++ b/src/components/ui/rainbow-button.tsx @@ -1,28 +1,28 @@ -import React from 'react' +import React from "react"; -import { ny } from '@/lib/utils' +import { ny } from "@/lib/utils"; interface RainbowButtonProps - extends React.ButtonHTMLAttributes {} + extends React.ButtonHTMLAttributes {} export function RainbowButton({ children, ...props }: RainbowButtonProps) { - return ( - - ) + // dark mode colors + "dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,hsl(var(--color-1)),hsl(var(--color-5)),hsl(var(--color-3)),hsl(var(--color-4)),hsl(var(--color-2)))]", + )} + {...props} + > + {children} + + ); } diff --git a/src/components/welcome.tsx b/src/components/welcome.tsx index 754527f..a3812a4 100644 --- a/src/components/welcome.tsx +++ b/src/components/welcome.tsx @@ -16,9 +16,10 @@ export default function WelcomePage() { Start using it by clicking on the sidebar icon or trying out the split view feature!

-

- - Zen Browser is still in development and may have bugs. This welcome page is under construction. +

+ + Zen Browser is still in development and may have bugs. This welcome page + is under construction.

); diff --git a/src/lib/mods.ts b/src/lib/mods.ts index 15ab37a..ddba844 100644 --- a/src/lib/mods.ts +++ b/src/lib/mods.ts @@ -38,7 +38,10 @@ function isValidDate(date: any): date is Date { * @param assignFutureDate - Whether to assign a future date if parsing fails. * @returns A valid Date object. */ -function parseDate(dateString: string | undefined, assignFutureDate: boolean = false): Date { +function parseDate( + dateString: string | undefined, + assignFutureDate: boolean = false, +): Date { const date = new Date(dateString || ""); if (isValidDate(date)) { return date; @@ -83,7 +86,10 @@ export async function getAllThemes(): Promise { homepage: theme.homepage, readme: theme.readme, preferences: theme.preferences, - isColorTheme: typeof theme.isColorTheme === 'boolean' ? theme.isColorTheme : false, + isColorTheme: + typeof theme.isColorTheme === "boolean" + ? theme.isColorTheme + : false, author: theme.author, version: theme.version, tags: uniqueTags, @@ -125,7 +131,7 @@ export function getThemesFromSearch( query: string, tags: string[], sortBy: string, - createdBefore?: Date + createdBefore?: Date, ): ZenTheme[] { const normalizedQuery = query.toLowerCase(); @@ -166,7 +172,9 @@ export function getThemesFromSearch( * @param id - The ID of the theme to retrieve. * @returns A promise that resolves to the ZenTheme object or undefined if not found. */ -export async function getThemeFromId(id: string): Promise { +export async function getThemeFromId( + id: string, +): Promise { const allThemes = await getAllThemes(); return allThemes.find((theme) => theme.id === id); } @@ -196,4 +204,4 @@ export async function getThemeMarkdown(theme: ZenTheme): Promise { */ export function getThemeAuthorLink(theme: ZenTheme): string { return `https://github.com/${theme.author}`; -} \ No newline at end of file +} diff --git a/src/lib/release-notes.ts b/src/lib/release-notes.ts index 680dda7..b7420dc 100644 --- a/src/lib/release-notes.ts +++ b/src/lib/release-notes.ts @@ -285,8 +285,7 @@ export const releaseNotes: ReleaseNote[] = [ issue: 76, }, { - description: - "Added more contrast to web context menus on light mods.", + description: "Added more contrast to web context menus on light mods.", issue: 88, }, { @@ -745,8 +744,7 @@ export const releaseNotes: ReleaseNote[] = [ issue: 1168, }, { - description: - "Theme Store settings page doesn't display installed mods", + description: "Theme Store settings page doesn't display installed mods", issue: 1125, }, { @@ -1104,51 +1102,54 @@ export const releaseNotes: ReleaseNote[] = [ }, ], }, - { + { version: "1.0.1-a.8", date: "10/10/2024", image: true, workflowId: 11279059812, - extra: "This release brings Zen to Firefox v131.0.2, which patches a significant security vulnerability.\n\nThis update improves the split view and pinned tabs features.\nWe have also released Zen Twilight; automated unstable builds where you can test out the latest features!", - features: [ - "Updated to the latest stable version of Firefox (131.0.2)", - "Added floating compact mode", - "Allow moving split view tabs with drag and drop functionality", - "Added option to reset pinned tabs to original state on close", - "Added support for syncing workspaces", - "Allow opening tabs by middle clicking the tab sidebar", - ], - fixes: [ - { - description: "Fixed tab sidebar flickering when on the right", - }, - { - description: "Fixed performance issue when scrolling", - }, - { - description: "Fixed buffering issues on YouTube" - }, - { - description: "Fixed Zen Mod settings page crashing when a mod ceases to exist" - }, - { - description: "Fixed extension menu breaking compact mode when held open", - issue: 1925 - }, - { - description: "Fixed internal keyboard shortcuts for macOS", - issue: 1629 - }, - { - description: "Fixed display issues with certain keyboard layouts", - issue: 1930 - }, - { - description: "Applied patches to fix CVE-2024-9680", - issue: 1993 - }, - ] - } + extra: + "This release brings Zen to Firefox v131.0.2, which patches a significant security vulnerability.\n\nThis update improves the split view and pinned tabs features.\nWe have also released Zen Twilight; automated unstable builds where you can test out the latest features!", + features: [ + "Updated to the latest stable version of Firefox (131.0.2)", + "Added floating compact mode", + "Allow moving split view tabs with drag and drop functionality", + "Added option to reset pinned tabs to original state on close", + "Added support for syncing workspaces", + "Allow opening tabs by middle clicking the tab sidebar", + ], + fixes: [ + { + description: "Fixed tab sidebar flickering when on the right", + }, + { + description: "Fixed performance issue when scrolling", + }, + { + description: "Fixed buffering issues on YouTube", + }, + { + description: + "Fixed Zen Mod settings page crashing when a mod ceases to exist", + }, + { + description: + "Fixed extension menu breaking compact mode when held open", + issue: 1925, + }, + { + description: "Fixed internal keyboard shortcuts for macOS", + issue: 1629, + }, + { + description: "Fixed display issues with certain keyboard layouts", + issue: 1930, + }, + { + description: "Applied patches to fix CVE-2024-9680", + issue: 1993, + }, + ], + }, ].reverse(); export function releaseNoteIsAlpha(note: ReleaseNote) { diff --git a/tailwind.config.ts b/tailwind.config.ts index e561a10..dca143d 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -22,9 +22,9 @@ const config = { fontFamily: { sans: ["var(--font-sans)", ...fontFamily.sans], }, - screens: { - "3xl": "2200px", - }, + screens: { + "3xl": "2200px", + }, colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", @@ -32,11 +32,11 @@ const config = { background: "hsl(var(--background))", foreground: "hsl(var(--foreground))", surface: "var(--surface)", - "color-1": "hsl(var(--color-1))", - "color-2": "hsl(var(--color-2))", - "color-3": "hsl(var(--color-3))", - "color-4": "hsl(var(--color-4))", - "color-5": "hsl(var(--color-5))", + "color-1": "hsl(var(--color-1))", + "color-2": "hsl(var(--color-2))", + "color-3": "hsl(var(--color-3))", + "color-4": "hsl(var(--color-4))", + "color-5": "hsl(var(--color-5))", primary: { DEFAULT: "hsl(var(--primary))", foreground: "hsl(var(--primary-foreground))", @@ -72,10 +72,10 @@ const config = { sm: "calc(var(--radius) - 4px)", }, keyframes: { - rainbow: { - "0%": { "background-position": "0%" }, - "100%": { "background-position": "200%" }, - }, + rainbow: { + "0%": { "background-position": "0%" }, + "100%": { "background-position": "200%" }, + }, orbit: { "0%": { transform: