Compare commits
6 Commits
80daaa29dc
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a60e606de | |||
| e045909acb | |||
| 40411104d6 | |||
| c6e9fccc9a | |||
| ede56e5bbd | |||
| ef2968707e |
BIN
public/Gaze Exports/Gaze-iOS-Dark-1024x1024@1x.png
Normal file
BIN
public/Gaze Exports/Gaze-iOS-Dark-1024x1024@1x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
public/Gaze Exports/Gaze-iOS-Default-1024x1024@1x.png
Normal file
BIN
public/Gaze Exports/Gaze-iOS-Default-1024x1024@1x.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
public/look-away.png
Normal file
BIN
public/look-away.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 585 KiB |
@@ -160,10 +160,10 @@ function AppLayout(props: { children: any }) {
|
|||||||
<LeftBar />
|
<LeftBar />
|
||||||
<div
|
<div
|
||||||
id="center-body"
|
id="center-body"
|
||||||
class="bg-base relative h-screen w-screen overflow-x-hidden md:ml-62.5 md:w-[calc(100vw-500px)] 2xl:ml-72 2xl:w-[calc(100vw-576px)]"
|
class="bg-base relative h-screen w-screen overflow-x-hidden md:ml-[250px] md:w-[calc(100vw-500px)]"
|
||||||
>
|
>
|
||||||
<noscript>
|
<noscript>
|
||||||
<div class="bg-yellow text-crust border-text fixed top-0 z-150 border-b-2 p-4 text-center font-semibold md:w-[calc(100vw-500px)] xl:ml-72 xl:w-[calc(100vw-576px)]">
|
<div class="bg-yellow text-crust border-text fixed top-0 z-150 border-b-2 p-4 text-center font-semibold md:w-[calc(100vw-500px)]">
|
||||||
JavaScript is disabled. Features will be limited.
|
JavaScript is disabled. Features will be limited.
|
||||||
</div>
|
</div>
|
||||||
</noscript>
|
</noscript>
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ export function LeftBar() {
|
|||||||
const handleLinkClick = () => {
|
const handleLinkClick = () => {
|
||||||
if (
|
if (
|
||||||
typeof window !== "undefined" &&
|
typeof window !== "undefined" &&
|
||||||
window.innerWidth < BREAKPOINTS.MOBILE
|
window.innerWidth < BREAKPOINTS.MOBILE_MAX_WIDTH
|
||||||
) {
|
) {
|
||||||
setLeftBarVisible(false);
|
setLeftBarVisible(false);
|
||||||
}
|
}
|
||||||
@@ -301,7 +301,7 @@ export function LeftBar() {
|
|||||||
|
|
||||||
if (ref) {
|
if (ref) {
|
||||||
const handleKeyDown = (e: KeyboardEvent) => {
|
const handleKeyDown = (e: KeyboardEvent) => {
|
||||||
const isMobile = window.innerWidth < BREAKPOINTS.MOBILE;
|
const isMobile = window.innerWidth < BREAKPOINTS.MOBILE_MAX_WIDTH;
|
||||||
|
|
||||||
if (!isMobile || !leftBarVisible()) return;
|
if (!isMobile || !leftBarVisible()) return;
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@ export function LeftBar() {
|
|||||||
const getMainNavStyles = () => {
|
const getMainNavStyles = () => {
|
||||||
const baseStyles = {
|
const baseStyles = {
|
||||||
"transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)",
|
"transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)",
|
||||||
width: windowWidth() < 1536 ? "250px" : "288px",
|
width: "250px",
|
||||||
"padding-top": "env(safe-area-inset-top)",
|
"padding-top": "env(safe-area-inset-top)",
|
||||||
"padding-bottom": "env(safe-area-inset-bottom)"
|
"padding-bottom": "env(safe-area-inset-bottom)"
|
||||||
};
|
};
|
||||||
@@ -456,7 +456,7 @@ export function LeftBar() {
|
|||||||
<a
|
<a
|
||||||
href={`/blog/${post.title}`}
|
href={`/blog/${post.title}`}
|
||||||
onClick={handleLinkClick}
|
onClick={handleLinkClick}
|
||||||
class="hover:text-subtext0 block w-52 transition-transform duration-200 ease-in-out hover:-translate-y-0.5 hover:scale-105 hover:font-bold"
|
class="hover:text-subtext0 block w-fit transition-transform duration-200 ease-in-out hover:-translate-y-0.5 hover:scale-105 hover:font-bold"
|
||||||
>
|
>
|
||||||
<Typewriter class="flex flex-col" keepAlive={false}>
|
<Typewriter class="flex flex-col" keepAlive={false}>
|
||||||
<div class="relative overflow-hidden">
|
<div class="relative overflow-hidden">
|
||||||
@@ -607,16 +607,16 @@ export function RightBar() {
|
|||||||
<aside
|
<aside
|
||||||
ref={ref}
|
ref={ref}
|
||||||
aria-label="Links and activity"
|
aria-label="Links and activity"
|
||||||
class="border-l-overlay2 bg-base fixed right-0 z-50 hidden h-dvh w-fit border-l-2 transition-transform duration-500 ease-out md:block"
|
class="border-l-overlay2 bg-base fixed right-0 z-50 hidden h-dvh w-62.5 border-l-2 transition-transform duration-500 ease-out md:block"
|
||||||
classList={{
|
classList={{
|
||||||
"translate-x-full": !rightBarVisible(),
|
"translate-x-full": !rightBarVisible(),
|
||||||
"translate-x-0": rightBarVisible()
|
"translate-x-0": rightBarVisible()
|
||||||
}}
|
}}
|
||||||
style={{
|
style={{
|
||||||
"transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)",
|
"transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)",
|
||||||
width: "250px",
|
|
||||||
"box-shadow": "inset 6px 0 16px -6px rgba(0, 0, 0, 0.1)",
|
"box-shadow": "inset 6px 0 16px -6px rgba(0, 0, 0, 0.1)",
|
||||||
"padding-top": "env(safe-area-inset-top)",
|
"padding-top": "env(safe-area-inset-top)",
|
||||||
|
width: "250px",
|
||||||
"padding-bottom": "env(safe-area-inset-bottom)",
|
"padding-bottom": "env(safe-area-inset-bottom)",
|
||||||
"scrollbar-width": "none"
|
"scrollbar-width": "none"
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function DownloadsPage() {
|
|||||||
|
|
||||||
<div class="flex flex-col items-center gap-3">
|
<div class="flex flex-col items-center gap-3">
|
||||||
<span class="text-subtext0 font-mono text-sm">
|
<span class="text-subtext0 font-mono text-sm">
|
||||||
platform: macOS (13.0+)
|
platform: macOS (14.6+)
|
||||||
</span>
|
</span>
|
||||||
<Button
|
<Button
|
||||||
variant="download"
|
variant="download"
|
||||||
|
|||||||
57
src/routes/marketing/gaze.tsx
Normal file
57
src/routes/marketing/gaze.tsx
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import { PageHead } from "~/components/PageHead";
|
||||||
|
import DownloadOnAppStoreDark from "~/components/icons/DownloadOnAppStoreDark";
|
||||||
|
import { useDarkMode } from "~/context/darkMode";
|
||||||
|
|
||||||
|
export default function GazeMarketing() {
|
||||||
|
const { isDark } = useDarkMode();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<PageHead
|
||||||
|
title="Gaze - Eye Health Reminder"
|
||||||
|
description="A macOS menu bar app that helps you remember to take breaks and rest your eyes. Download Gaze today."
|
||||||
|
/>
|
||||||
|
<div class="relative h-full">
|
||||||
|
<div class="fixed inset-0 z-0 overflow-hidden brightness-75">
|
||||||
|
<img
|
||||||
|
src="/look-away.png"
|
||||||
|
alt="background"
|
||||||
|
class="h-full w-full object-cover select-none"
|
||||||
|
style={{
|
||||||
|
"pointer-events": "none"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="relative z-10 flex h-full flex-col items-center justify-center text-white backdrop-blur">
|
||||||
|
<div>
|
||||||
|
<img
|
||||||
|
src={
|
||||||
|
isDark()
|
||||||
|
? "/Gaze Exports/Gaze-iOS-Dark-1024x1024@1x.png"
|
||||||
|
: "/Gaze Exports/Gaze-iOS-Default-1024x1024@1x.png"
|
||||||
|
}
|
||||||
|
alt="Gaze App Icon"
|
||||||
|
height={128}
|
||||||
|
width={128}
|
||||||
|
class="object-cover object-center"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<h1 class="py-4 text-center text-5xl font-bold">Gaze</h1>
|
||||||
|
<p class="text-text mb-8 text-xl">
|
||||||
|
Eye and posture health reminder for macOS
|
||||||
|
</p>
|
||||||
|
<div class="flex space-x-4">
|
||||||
|
<a
|
||||||
|
class="my-auto transition-all duration-200 ease-out active:scale-95"
|
||||||
|
href="https://apps.apple.com"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<DownloadOnAppStoreDark size={50} />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
110
src/routes/privacy-policy/gaze.tsx
Normal file
110
src/routes/privacy-policy/gaze.tsx
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import { A } from "@solidjs/router";
|
||||||
|
import { PageHead } from "~/components/PageHead";
|
||||||
|
|
||||||
|
export default function PrivacyPolicy() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<PageHead
|
||||||
|
title="Privacy Policy - Gaze"
|
||||||
|
description="Privacy policy for Gaze, a macOS eye health reminder app."
|
||||||
|
/>
|
||||||
|
<div class="min-h-screen px-[8vw] py-[10vh]">
|
||||||
|
<div class="py-4 text-xl">Gaze's Privacy Policy</div>
|
||||||
|
<div class="py-2">Last Updated: February 9, 2026</div>
|
||||||
|
<div class="py-2">
|
||||||
|
Welcome to Gaze ('We', 'Us', 'Our').
|
||||||
|
Your privacy is important to us. This privacy policy will help you
|
||||||
|
understand our policies and procedures related to the collection, use,
|
||||||
|
and storage of personal information from our users.
|
||||||
|
</div>
|
||||||
|
<ol>
|
||||||
|
<div class="py-2">
|
||||||
|
<div class="pb-2 text-lg">
|
||||||
|
<span class="-ml-4 pr-2">1.</span> Personal Information
|
||||||
|
</div>
|
||||||
|
<div class="pl-4">
|
||||||
|
<div class="pb-2">
|
||||||
|
<div class="-ml-6">(a) Collection of Personal Data:</div> Gaze
|
||||||
|
is designed with privacy as a core principle. We currently do
|
||||||
|
not collect, store, or share any personal information from our
|
||||||
|
users. The app runs entirely on your device and does not require
|
||||||
|
any account creation or data transmission to external servers.
|
||||||
|
</div>
|
||||||
|
<div class="pb-2">
|
||||||
|
<div class="-ml-6">(b) Future Data Collection:</div> We may in
|
||||||
|
the future implement optional features such as analytics or
|
||||||
|
crash reporting. If we do, we will clearly inform users through
|
||||||
|
a privacy policy update and obtain explicit consent before
|
||||||
|
collecting any data.
|
||||||
|
</div>
|
||||||
|
<div class="pb-2">
|
||||||
|
<div class="-ml-6">(c) Data Removal:</div> Since we do not
|
||||||
|
collect any personal information, there is no data to remove. If
|
||||||
|
you have any concerns about our practices, please contact{" "}
|
||||||
|
<A href="/contact" class="text-blue hover-underline-animation">
|
||||||
|
here
|
||||||
|
</A>
|
||||||
|
.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="py-2">
|
||||||
|
<div class="pb-2 text-lg">
|
||||||
|
<span class="-ml-4 pr-2">2.</span> Third-Party Access
|
||||||
|
</div>
|
||||||
|
<div class="pb-2 pl-4">
|
||||||
|
<div class="-ml-6">(a) No Third-Party Sharing:</div> We do not
|
||||||
|
share, sell, or transfer any personal information to third
|
||||||
|
parties. Currently, Gaze does not utilize any third-party services
|
||||||
|
that would collect user data. Any future third-party services we
|
||||||
|
may use will be transparently disclosed in our privacy policy.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="py-2">
|
||||||
|
<div class="pb-2 text-lg">
|
||||||
|
<span class="-ml-4 pr-2">3.</span> Security
|
||||||
|
</div>
|
||||||
|
<div class="pb-2 pl-4">
|
||||||
|
<div class="-ml-6">(a) Data Protection:</div> Because Gaze does
|
||||||
|
not collect or store any personal information, there is minimal
|
||||||
|
data security risk. The app runs locally on your device using
|
||||||
|
standard macOS security practices. Any configuration data stored
|
||||||
|
locally on your device is encrypted using system-provided
|
||||||
|
mechanisms.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="py-2">
|
||||||
|
<div class="pb-2 text-lg">
|
||||||
|
<span class="-ml-4 pr-2">4.</span> Changes to the Privacy Policy
|
||||||
|
</div>
|
||||||
|
<div class="pb-2 pl-4">
|
||||||
|
<div class="-ml-6">(a) Updates:</div> We may update this privacy
|
||||||
|
policy periodically, especially if we introduce new features that
|
||||||
|
involve data collection. Any changes to this privacy policy will
|
||||||
|
be posted on this page. We encourage users to review this policy
|
||||||
|
regularly to stay informed about how we protect their information.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="py-2">
|
||||||
|
<div class="pb-2 text-lg">
|
||||||
|
<span class="-ml-4 pr-2">5.</span> Contact Us
|
||||||
|
</div>
|
||||||
|
<div class="pb-2 pl-4">
|
||||||
|
<div class="-ml-6">(a) Reaching Out:</div> If there are any
|
||||||
|
questions or comments regarding this privacy policy, you can
|
||||||
|
contact us{" "}
|
||||||
|
<A href="/contact" class="text-blue hover-underline-animation">
|
||||||
|
here
|
||||||
|
</A>
|
||||||
|
.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user