diff --git a/site/404.html b/site/404.html index f0a7a17..b5680bd 100644 --- a/site/404.html +++ b/site/404.html @@ -10,7 +10,7 @@ - + diff --git a/site/assets/page.js b/site/assets/page.js index 447c3c8..278913d 100644 --- a/site/assets/page.js +++ b/site/assets/page.js @@ -1,29 +1,8 @@ -/* Upright site: page behavior outside the demo stages. Reveals sections as they scroll in, - gives the nav a hairline once the page scrolls, and wires up the copy buttons. No +/* Upright site: page behavior outside the demo stages. Gives the nav a hairline once the page scrolls, and wires up the copy buttons. No dependencies, no tracking. */ (() => { 'use strict'; - const RM = window.matchMedia('(prefers-reduced-motion: reduce)').matches; - - // ---------- Reveal on scroll ---------- - - const reveals = document.querySelectorAll('.reveal'); - if (RM || !('IntersectionObserver' in window)) { - reveals.forEach((el) => el.classList.add('in')); - } else { - const io = new IntersectionObserver( - (entries) => { - for (const e of entries) { - if (!e.isIntersecting) continue; - e.target.classList.add('in'); - io.unobserve(e.target); - } - }, - { rootMargin: '0px 0px -8% 0px', threshold: 0.08 } - ); - reveals.forEach((el) => io.observe(el)); - } // ---------- Nav ---------- diff --git a/site/assets/site.css b/site/assets/site.css index d38fb3c..76a2471 100644 --- a/site/assets/site.css +++ b/site/assets/site.css @@ -1027,21 +1027,13 @@ code { from { transform: translateY(14px); } to { transform: none; } } -.hero-copy > * { animation: fade-up 0.9s var(--ease-out) both; } -.hero-copy > :nth-child(2) { animation-delay: 0.05s; } -.hero-copy > :nth-child(3) { animation-delay: 0.1s; } -.hero-copy > :nth-child(4) { animation-delay: 0.15s; } -.hero-copy > :nth-child(5) { animation-delay: 0.2s; } -.hero-demo { animation: rise 1.1s 0.2s var(--ease-out) both; } +.hero-copy > * { animation: fade-up 0.4s var(--ease-out) both; } +.hero-copy > :nth-child(2) { animation-delay: 0.03s; } +.hero-copy > :nth-child(3) { animation-delay: 0.06s; } +.hero-copy > :nth-child(4) { animation-delay: 0.09s; } +.hero-copy > :nth-child(5) { animation-delay: 0.12s; } +.hero-demo { animation: rise 0.45s 0.08s var(--ease-out) both; } -.js .reveal { - opacity: 0; - transform: translateY(28px); - transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); -} -.js .reveal.in { opacity: 1; transform: none; } -.js .privacy-grid .reveal:nth-child(2) { transition-delay: 0.08s; } -.js .privacy-grid .reveal:nth-child(3) { transition-delay: 0.16s; } @keyframes gp-dot { 0%, 20%, 40%, 60%, 80%, 100% { transform: none; } @@ -1077,7 +1069,6 @@ code { .faq details[open] .faq-a, .gp-dot, .gpad li { animation: none !important; } - .js .reveal { opacity: 1; transform: none; transition: none; } .btn, .mice-grid li { transition: none; } .btn:active{ transform: none; }@media (hover: hover) and (pointer: fine){.mice-grid li:hover{ transform: none; }} @@ -1995,3 +1986,12 @@ code { .canvas *::before, .canvas *::after { transition: none !important; animation: none !important; } } + +/* Touch: 44 px hit areas in the header and footer without changing the look. */ +@media (pointer: coarse) { + .nav-gh, .nav-end .btn-sm { position: relative; } + .nav-gh::after { content: ""; position: absolute; inset: -13px -10px; } + .nav-end .btn-sm::after { content: ""; position: absolute; inset: -7px -4px; } + .footer nav { gap: 0; } + .footer nav a { padding-block: 10px; } +} diff --git a/site/index.html b/site/index.html index 0730878..43bb690 100644 --- a/site/index.html +++ b/site/index.html @@ -28,7 +28,7 @@ - + @@ -127,13 +127,13 @@

Your Logitech mouse,
without Logi Options+.

-
+

Features

Everything Logi Options+ did for your buttons, in one small native app.

Upright lives in the menu bar, looks like part of macOS, and only does what you set up.

-
+

Buttons

Give every button a job.

@@ -154,7 +154,7 @@

Give every button a job.

-
+

Gestures

One button, five actions.

@@ -173,7 +173,7 @@

One button, five actions.

-
+

Per-app profiles

Different buttons for different apps.

@@ -184,7 +184,7 @@

Different buttons for different apps.

-
+

Several mice · Battery alerts

Every mouse you own, at once.

@@ -196,7 +196,7 @@

Every mouse you own, at once.

-
+

Pointer speed

Pick a speed. Keep it.

@@ -208,7 +208,7 @@

Pick a speed. Keep it.

-
+

Wheel vs trackpad

Set the wheel apart from the trackpad.

@@ -223,29 +223,29 @@

Set the wheel apart from the trackpad.

-
+

Privacy

Leaves nothing behind.

Upright talks to your mouse and nothing else. It doesn't phone home or collect anything.

-
+

Nothing written to the mouse

Buttons are only diverted while Upright runs. Quit it, or switch the mouse off and on, and every button is back to factory behavior.

-
+

No drivers, no daemon

One native SwiftUI app in your menu bar. No kernel extension, no background service, no Logitech software and no account.

-
+

Never reads your typing

Upright only opens Logitech HID interfaces and only sends the actions you assign. Keyboards are never opened.

-
+

What Upright touches

Your mouse
Buttons diverted while it runs, handed back when it quits
@@ -254,7 +254,7 @@

Never reads your typing

Permissions
Accessibility, to send the actions you assign
-
+
HID++ 2.0 over USB, Bluetooth and receivers 0x1B04 REPROG_CONTROLS_V4 0x2201 ADJUSTABLE_DPI @@ -265,12 +265,12 @@

Never reads your typing

-
+

Supported mice

Built on the MX Vertical. Ready for more.

The MX Vertical is tested on real hardware. Twenty-two more models are in the catalog, built from published device data and tested against Upright's mouse simulator, so they're expected to work but haven't been verified on hardware yet.

-
    +
    • MX Vertical @@ -297,7 +297,7 @@

      Built on the MX Vertical. Ready for more.

    • Pebble M350Published data
    • M185 / M235 / M310Published data
    -
    +

    Connections: USB cable, Bluetooth, Unifying, Bolt and Nano receivers. G-series and PRO gaming mice keep their buttons in onboard profiles and aren't supported.