diff --git a/agents.md b/agents.md index 81e1b49..0b858ec 100644 --- a/agents.md +++ b/agents.md @@ -129,11 +129,11 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark), content column of `.glass` panels: hero (with a compact "Find me" socials row), a `.web-quick` 2-up ("Right now" + "Gym PRs"), then services, activity, projects, hardware, features (Revival/RustyWolf) and friends. Friend cards are - **text-only** (name + domain β€” the web theme does not render `Friend.img` - avatars) in a `.friends-grid` that collapses to a 2Γ—2 grid on phones. - Projects/hardware - use a CSS multi-column **masonry** gallery (`.project-grid`) so short cards - don't leave half-empty grid slots. The two feature panels (`.web-split`) stretch + **text-only** (name + domain) in a `.friends-grid` that collapses to a 2Γ—2 + grid on phones; the desktop friend icons use a πŸ§™ emoji glyph (the old + per-friend SVGs are gone). Projects/hardware use a CSS multi-column + **masonry** gallery (`.project-grid`) so short cards don't leave half-empty + grid slots; on phones it drops to 2 columns with a shorter card image. The two feature panels (`.web-split`) stretch to equal height and share a fixed `16 / 10` `.web-shot` frame with `object-fit: cover` (+ `object-position: center top`), so source images with different aspect ratios still line up. The old stacked TUI panel layout and the @@ -245,12 +245,11 @@ with icons, it's almost certainly here. exceeded" (this bug has already happened once β€” see history below). ### Gotcha: native drag hijacks the pointer gesture -Icons whose glyph is an `` (the friend shortcuts that carry `Friend.img`, -e.g. `/skopec.svg`, `/bukovina.svg`, `/vlcak.svg`) can start the browser's -**native image drag**, which fires `pointercancel` and kills the custom drag. -Emoji-based icons are unaffected β€” including a friend with no `img` (`Friend.img` -is optional now; it falls back to the πŸ«‚ glyph), which makes this look like -"only some icons don't drag". +Icons whose glyph is an `` can start the browser's **native image drag**, +which fires `pointercancel` and kills the custom drag, while emoji-based icons +are unaffected (looks like "only some icons don't drag"). No desktop icon uses +an `` glyph now β€” the friends are πŸ§™ emoji like the rest β€” but the guard +below is kept in case an image glyph is reintroduced. Guard (already in place, keep it that way): - `draggable={false}` on the `` in `renderIcon`. @@ -381,8 +380,8 @@ knows about icon ids, via `APP_BY_ID`. two differ. `bukovinafilip.com`, `vlcak.me` and `k0t4tkos-portfolio.com` send no framing headers, so they frame the live site. `skopec.dev` sends `X-Frame-Options: SAMEORIGIN` on every path, so `friend.proxy` routes it - through `/api/frame`. `Friend.img` is optional and only feeds the desktop icon - / FriendsApp avatar β€” the web theme's friends section is text-only. + through `/api/frame`. Friend icons are a πŸ§™ emoji everywhere (no per-friend + images); the web theme's friends section is text-only. - `/api/frame` is a **host-allowlisted** header-stripping proxy for sites that refuse framing. It fetches the HTML server-side (so the upstream `X-Frame-Options` never reaches the browser), injects `` @@ -412,7 +411,7 @@ knows about icon ids, via `APP_BY_ID`. Theme + scheme are read pre-paint from `localStorage.theme` / `.scheme`, so a quick check is to set those in devtools and reload. - `next/image` is lazy by default, so a headless full-page screenshot shows the - below-the-fold feature shots and friend avatars as blank boxes. Scroll the page + below-the-fold feature shots as blank boxes. Scroll the page slowly first and they load; this is a capture artifact, not a bug. Headless Chromium lives at `~/.cache/ms-playwright/chromium-*/chrome-linux64/chrome` (drive it with `--headless=new --remote-debugging-port=…` and CDP). diff --git a/public/bukovina.svg b/public/bukovina.svg deleted file mode 100644 index 626de2d..0000000 --- a/public/bukovina.svg +++ /dev/null @@ -1,4626 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/skopec.svg b/public/skopec.svg deleted file mode 100644 index 3eff199..0000000 --- a/public/skopec.svg +++ /dev/null @@ -1,9125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/vlcak.svg b/public/vlcak.svg deleted file mode 100644 index 2223d79..0000000 --- a/public/vlcak.svg +++ /dev/null @@ -1,5992 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/components/WindowsDesktop.tsx b/src/app/components/WindowsDesktop.tsx index ae5e6a6..c41f4d5 100644 --- a/src/app/components/WindowsDesktop.tsx +++ b/src/app/components/WindowsDesktop.tsx @@ -76,8 +76,7 @@ const FRIEND_SHORTCUTS: Shortcut[] = friends.map((f, i) => ({ : f.url, embed: f.iframe, color: "#c0392b", - icon: "πŸ«‚", - image: f.img, + icon: "πŸ§™", desc: f.desc, })); @@ -363,8 +362,7 @@ export default function WindowsDesktop() { id: f.id, label: f.label, title: f.label, - glyph: "πŸ«‚", - image: f.image, + glyph: "πŸ§™", onOpen: () => openShortcut(f), })); const allEntries = [...leftEntries, ...serviceEntries, ...friendEntries]; @@ -505,17 +503,7 @@ export default function WindowsDesktop() { className="kickoff-item" onClick={() => openShortcut(f)} > - - {f.image && ( - {f.label} - )} - + {f.icon} {f.label} ))} diff --git a/src/app/components/apps.tsx b/src/app/components/apps.tsx index 1a9a726..e1e5d27 100644 --- a/src/app/components/apps.tsx +++ b/src/app/components/apps.tsx @@ -255,20 +255,7 @@ function FriendsApp() { key={idx} url={friend.realUrl || friend.url} className="friend" - icon={ - friend.img ? ( - {friend.name} - ) : ( - "πŸ«‚" - ) - } + icon="πŸ§™" name={friend.name} desc={friend.desc} /> diff --git a/src/app/data.ts b/src/app/data.ts index db31f33..6876eaa 100644 --- a/src/app/data.ts +++ b/src/app/data.ts @@ -23,12 +23,6 @@ export interface Friend { url: string; /** The live site: the window's `www` button and the status check use this. */ realUrl: string; - /** - * Desktop-icon avatar. Optional: the web theme's friends section is - * text-only (no SVG avatars), and a friend without one falls back to the - * generic glyph on the desktop. - */ - img?: string; desc: string; /** Render in an iframe in a desktop window. */ iframe: boolean; @@ -250,7 +244,6 @@ export const friends: Friend[] = [ // window loads the live site through /api/frame (see `proxy` below). url: "https://skopec.dev/", realUrl: "https://skopec.dev/", - img: "/skopec.svg", desc: "skopec.dev", iframe: true, proxy: true, @@ -259,7 +252,6 @@ export const friends: Friend[] = [ name: "Filip Bukovina", url: "https://bukovinafilip.com/", realUrl: "https://bukovinafilip.com/", - img: "/bukovina.svg", desc: "bukovinafilip.com", iframe: true, }, @@ -267,7 +259,6 @@ export const friends: Friend[] = [ name: "TomΓ‘Ε‘ Vlk", url: "https://vlcak.me", realUrl: "https://vlcak.me", - img: "/vlcak.svg", desc: "vlcak.me", iframe: true, }, diff --git a/src/app/skeuo.css b/src/app/skeuo.css index 0313f77..ff52f68 100644 --- a/src/app/skeuo.css +++ b/src/app/skeuo.css @@ -82,8 +82,8 @@ html[data-theme="skeuo"] body { text-shadow: 0 1px 3px rgba(0, 0, 0, 0.95); transition: background-color 0.12s ease, border-color 0.12s ease; /* Icons are dragged by our own pointer handlers. Without this, the browser's - native image/link drag hijacks the gesture (it fires pointercancel), which - broke dragging for icons whose glyph is an - the friend shortcuts. */ + native image/link drag hijacks the gesture (it fires pointercancel) for any + icon whose glyph is an ; kept in case one is reintroduced. */ -webkit-user-drag: none; user-select: none; } @@ -1182,10 +1182,6 @@ a.win-icon { .win-body .service-button:hover .service-desc { color: #d3dae3; } -.win-body .friend-icon { - filter: invert(1) brightness(1.5); -} - .win-body .project-card { border-color: #1b1e20; background: linear-gradient(to bottom, #31363b, #2a2e32); diff --git a/src/app/web.css b/src/app/web.css index 466b4d3..88562ba 100644 --- a/src/app/web.css +++ b/src/app/web.css @@ -562,7 +562,8 @@ html[data-theme="web"] body { color: var(--fg); } -/* Friend cards stack their round avatar above the name. */ +/* Friend cards centre their text (the web theme has no icon; the desktop + Friends app shows the wizard emoji above the name). */ .service-button.friend { flex-direction: column; text-align: center; @@ -592,23 +593,13 @@ html[data-theme="web"] body { transform: none; filter: none; } +/* The desktop Friends app shows a big wizard emoji in place of the old avatars. */ .service-button.friend .service-icon { width: 64px; height: 64px; - border-radius: 50%; - overflow: hidden; + font-size: 2.6rem; filter: none; } -.friend-icon { - display: block; - width: 64px; - height: 64px; - border-radius: 50%; - object-fit: cover; -} -html[data-theme="web"][data-scheme="dark"] .friend-icon { - filter: invert(1) brightness(1.5); -} /* ============================================================ PROJECTS / HARDWARE @@ -1129,8 +1120,25 @@ html[data-theme="web"][data-scheme="dark"] .heatmap-legend-cell[data-level="4"] font-size: 0.82rem; font-weight: 600; } + /* Projects/hardware gallery: 2-up on phones instead of one full-width card + per row, with a shorter image + tighter card so a row is compact. */ .project-grid { - columns: 1; + columns: 2; + column-gap: 10px; + } + .project-card { + margin-bottom: 10px; + padding: 10px; + } + .project-image { + height: 90px; + margin-bottom: 8px; + } + .project-title { + font-size: 0.88rem; + } + .project-desc { + font-size: 0.75rem; } .services-buttons, .services-buttons.services-main {