Files
Vincent ff4a0c6bc4 Browser pairing, notifications, element hiding; drop the top bar
Pairing decrypts a Chromium browser's cookie store (PBKDF2-HMAC-SHA1
against its Keychain key, then AES-128-CBC) and injects the result into
WKHTTPCookieStore. Only the configured apps' hosts and their sign-in
hosts survive the filter. Browsers are offered most-recently-used first,
since the first entry becomes the default and someone with four
Chromium browsers installed wants the one they actually browse in.

WKWebView defines window.Notification but it does nothing: constructing
one throws no error and shows no banner, so a page believes it notified
you. Measured on the machine as `api=function shim=no` before the shim
was made unconditional; `from page: Odoo - Test notification -> raised`
after.

Anything on a page can be right-clicked away. The rule is re-asserted on
every navigation, because the injected script only carries a snapshot
from when the view was built and a selector added since would otherwise
come back on reload.

The top bar is gone. Navigation lives beside the cog, the nav carries
the traffic lights, and two-finger swipe goes back and forward.

The seed is now the real app list, scoped to exact hosts so a Drive link
inside Gmail switches rather than being swallowed.
2026-09-01 12:17:31 +02:00

42 lines
1.8 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024">
<!--
The app drawn as itself: a dark window, a sky rail down the left with one
active dot, and the tool it is showing beside it. Legible at 32px, where
all that survives is a dark tile with a blue edge and a bright mark.
-->
<defs>
<linearGradient id="tile" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#1e293b"/>
<stop offset="100%" stop-color="#0b1220"/>
</linearGradient>
<linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#38bdf8"/>
<stop offset="100%" stop-color="#0284c7"/>
</linearGradient>
<clipPath id="tileClip">
<rect x="64" y="64" width="896" height="896" rx="205"/>
</clipPath>
</defs>
<rect x="64" y="64" width="896" height="896" rx="205" fill="url(#tile)"/>
<g clip-path="url(#tileClip)">
<!-- The nav, running the full height the way it does in the window. -->
<rect x="64" y="64" width="236" height="896" fill="url(#rail)"/>
<!-- Three apps; the lit one is the app you are in. -->
<circle cx="182" cy="330" r="37" fill="#ffffff"/>
<circle cx="182" cy="512" r="30" fill="#ffffff" opacity="0.5"/>
<circle cx="182" cy="694" r="30" fill="#ffffff" opacity="0.5"/>
<!-- The tool on the right, in the same rhythm as the dots. -->
<rect x="392" y="304" width="430" height="52" rx="26" fill="#94a3b8"/>
<rect x="392" y="486" width="344" height="52" rx="26" fill="#64748b"/>
<rect x="392" y="668" width="268" height="52" rx="26" fill="#475569"/>
</g>
<!-- A hairline lift, so the tile does not sit flat on a dark background. -->
<rect x="64" y="64" width="896" height="896" rx="205" fill="none"
stroke="#ffffff" stroke-opacity="0.10" stroke-width="3"/>
</svg>