Rework Freezmo panel around the app icon; drop stale screenshot; v2.2.16

This commit is contained in:
Martin Dvořák 2026-10-15 22:58:09 +02:00
commit 20f67910c4
13 changed files with 165 additions and 115 deletions

4
.gitignore vendored
View file

@ -79,3 +79,7 @@ graphify-out/cache/
graphify-out/cost.json
graphify-out/.graphify_python
graphify-out/.graphify_root
graphify-out/.graphify_labels.pending.json
graphify-out/.graphify_labels.json.sig
# dated graph backups written by `graphify update`
graphify-out/20*/

View file

@ -56,7 +56,7 @@ frosted-glass **web** site, and an alternate KDE/Plasma **desktop simulation**
utilities in the components (Tailwind is present via PostCSS but the look is
hand-written CSS).
- Path alias: `@/*` → `src/*`.
- Version: `2.2.15` (see `package.json`).
- Version: `2.2.16` (see `package.json`).
### Scripts
```bash
@ -173,8 +173,8 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark),
along with the row hairlines (`--index-line`). Above the split, the full-width
**Freezmo** launch panel (`.web-freezmo` — app-tinted glow, floating orbs,
gradient wordmark + "new" badge, feature bullets, Try/Source CTAs) is the one
place a **real screenshot** is used (`public/freezmo.png`, the live
study app). The two remaining feature panels (`.web-split`) stretch
place the **real app icon** is used (`public/freezmo.png`, the live
study app), floated beside the copy with a soft glow. The two remaining feature panels (`.web-split`) stretch
to equal height and share a fixed `16 / 10` `.fw` window (the `FeatureWindow`
component) — decorative, **asset-free CSS mock-ups** rather than screenshots:
Revival Inc. is a little necromancy game scene (night sky, moon, tombstones,
@ -195,7 +195,7 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark),
feature/app previews are `FeatureWindow` mock windows,
and `.win-desktop` carries a layered gradient "wallpaper" (there is no
`wallpaper.jpg`). Only the social SVGs, the site logo (`src/app/icon.png`),
the Freezmo screenshot (`public/freezmo.png`), the
the Freezmo app icon (`public/freezmo.png`), the
Joker easter egg (`joker.webp`) and the Gentoo mark (`gentoo.svg`) remain as
real image files.
- **Not a terminal.** The web theme deliberately has no TUI chrome: the hero is

View file

@ -7,7 +7,7 @@ from the saved theme, all from the same content:
- **`web`** (default) — a light, frosted-glass **website**: a sticky full-height sidebar
(section nav, light/dark switch, desktop switch) beside a column of glass cards — hero with
a socials row, quick tiles, the Freezmo feature panel (a real app screenshot) above the
a socials row, quick tiles, the Freezmo feature panel (a real app icon) above the
Revival Inc. / RustyWolf CSS mock windows, live services,
activity heatmap, projects and hardware (grouped index lists), and friends. Dark by default
with a persisted light mode, and fully responsive, so phones and desktops get the same shell.
@ -40,7 +40,7 @@ more.
(category headers, status/language chips, language-tinted dots on project rows, years — no emoji, no
screenshots), the desktop shell's app previews are the same CSS mock
windows (a git-forge page for GitDXD), and its wallpaper is a layered CSS gradient. The
only real images left are the logo, the social SVGs, the Freezmo screenshot, the Joker
only real images left are the logo, the social SVGs, the Freezmo app icon, the Joker
easter egg and the Gentoo mark.
- **Draggable desktop icons** — free placement that snaps to a measured grid, one icon per
cell, with a follow-the-cursor drag ghost. Icons shrink on cramped viewports so they never
@ -84,7 +84,7 @@ more.
used by the desktop theme's SMP menu and the in-desktop terminal.
- **Images:** `next/image` — only the logo (`src/app/icon.png`), the social SVGs, the Joker
easter egg and the Gentoo mark; all cards, feature/app previews and the wallpaper are CSS.
- **Version:** `2.2.15` (see `package.json`)
- **Version:** `2.2.16` (see `package.json`)
- **Dependencies:** `npm audit` reports **0 vulnerabilities**. `next` is kept at a patched
release (`>=16.3.6`) for the `next/og` RCE, and `brace-expansion` is force-upgraded via
`overrides`. `braces` (a transitive ESLint/`fast-glob` dependency) has **no upstream fix**,

View file

@ -1 +1,41 @@
{"0": "Desktop App Catalog", "1": "Deployment & Ops Docs", "2": "braces Package Metadata", "3": "Theme & Clock Components", "4": "braces Parsing Engine", "5": "Project Index Data", "6": "braces Character Constants", "7": "Next Config & API Routes", "8": "TypeScript Compiler Config", "9": "Root Package Dependencies", "10": "Root Dev Dependencies", "11": "Custom Dev Server", "12": "Debian Dependency Installer", "13": "brace-expansion Overrides", "14": "npm Scripts", "15": "Freezmo Icon Visual Identity", "16": "braces Public API Methods", "17": "Eye Logo & Favicon Assets", "18": "ESLint Configuration", "19": "Runtime Dependencies", "20": "Discord Icon Asset", "21": "Freezmo App Screenshot", "22": "Instagram Icon Asset", "23": "Gentoo Logo Asset", "24": "Reddit Icon Asset", "25": "Revival Inc. Game Favicon", "26": "TikTok Icon Asset", "27": "System Service Installer", "28": "Package allowScripts Overrides", "29": "PostCSS Configuration", "30": "GitHub Icon Asset", "31": "itch.io Icon Asset", "32": "Joker Character Image", "33": "LinkedIn Icon Asset", "34": "Quipee Logo Asset", "35": "Snapchat Icon Asset", "36": "SoundCloud Icon Asset", "37": "Twitter/X Icon Asset", "38": "Activities API Route", "39": "Heatmap API Route", "40": "Revival Inc. Page"}
{
"0": "Desktop App Catalog",
"1": "Deployment & Ops Docs",
"2": "braces Package Metadata",
"4": "braces Parsing Engine",
"5": "Project Index Data",
"6": "braces Character Constants",
"7": "Next Config & API Routes",
"8": "TypeScript Compiler Config",
"9": "Root Package Dependencies",
"10": "Root Dev Dependencies",
"11": "Custom Dev Server",
"12": "Debian Dependency Installer",
"13": "brace-expansion Overrides",
"14": "npm Scripts",
"15": "Freezmo Icon Visual Identity",
"16": "braces Public API Methods",
"17": "Eye Logo & Favicon Assets",
"18": "ESLint Configuration",
"19": "Runtime Dependencies",
"20": "Discord Icon Asset",
"22": "Instagram Icon Asset",
"23": "Gentoo Logo Asset",
"24": "Reddit Icon Asset",
"25": "Revival Inc. Game Favicon",
"26": "TikTok Icon Asset",
"27": "System Service Installer",
"28": "Package allowScripts Overrides",
"29": "PostCSS Configuration",
"30": "GitHub Icon Asset",
"31": "itch.io Icon Asset",
"32": "Joker Character Image",
"33": "LinkedIn Icon Asset",
"34": "Quipee Logo Asset",
"35": "Snapchat Icon Asset",
"36": "SoundCloud Icon Asset",
"37": "Twitter/X Icon Asset",
"38": "Activities API Route",
"39": "Heatmap API Route",
"40": "Revival Inc. Page"
}

View file

@ -1,20 +1,25 @@
# Graph Report - dvorakmortonxd.dev (2026-10-15)
## Corpus Check
- 63 files · ~107,169 words
- 43 files · ~105,962 words
- Verdict: corpus is large enough that graph structure adds value.
- Unclassified: 19 file(s) not represented in the graph (top: (none) 6, .ttf 3, .css 3)
## Summary
- 414 nodes · 577 edges · 41 communities (26 shown, 15 thin omitted)
- Extraction: 93% EXTRACTED · 7% INFERRED · 0% AMBIGUOUS · INFERRED: 39 edges (avg confidence: 0.85)
- 423 nodes · 591 edges · 42 communities (27 shown, 15 thin omitted)
- Extraction: 93% EXTRACTED · 7% INFERRED · 0% AMBIGUOUS · INFERRED: 44 edges (avg confidence: 0.89)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `6702ca8d`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- Desktop App Catalog
- Deployment & Ops Docs
- braces Package Metadata
- Theme & Clock Components
- WindowsDesktop.tsx
- braces Parsing Engine
- Project Index Data
- braces Character Constants
@ -32,7 +37,7 @@
- ESLint Configuration
- Runtime Dependencies
- Discord Icon Asset
- Freezmo App Screenshot
- AGENTS.md — cold-boot notes
- Instagram Icon Asset
- Gentoo Logo Asset
- Reddit Icon Asset
@ -49,68 +54,65 @@
- Snapchat Icon Asset
- SoundCloud Icon Asset
- Twitter/X Icon Asset
- useColorScheme.ts
## God Nodes (most connected - your core abstractions)
1. `WebLayout()` - 16 edges
1. `WebLayout()` - 18 edges
2. `compilerOptions` - 16 edges
3. `react` - 15 edges
4. `next` - 12 edges
5. `FeatureWindow()` - 11 edges
6. `useTheme()` - 11 edges
7. `WindowsDesktop()` - 8 edges
8. `Clock()` - 7 edges
9. `ContributionHeatmap()` - 7 edges
10. `CodingProjectIndex()` - 7 edges
5. `FeatureWindow()` - 12 edges
6. `useTheme()` - 12 edges
7. `AGENTS.md — cold-boot notes` - 12 edges
8. `WindowsDesktop()` - 9 edges
9. `ContributionHeatmap()` - 8 edges
10. `ServiceButton()` - 8 edges
## Surprising Connections (you probably didn't know these)
- `Revival Inc. Game` --conceptually_related_to--> `FeatureWindow CSS Mock Windows` [INFERRED]
public/llms.txt → README.md
- `GitDXD (Forgejo Git Forge)` --conceptually_related_to--> `Site API Proxy Routes` [INFERRED]
public/llms.txt → README.md
- `Vendored braces CVE Patch` --conceptually_related_to--> `Brace Bomb DoS / Geometric Complexity` [INFERRED]
agents.md → vendor/braces/README.md
- `FeatureWindow CSS Mock Windows` --references--> `Revival Inc. Pygbag Web Build` [EXTRACTED]
README.md → public/revival-inc/index.html
- `Vendored braces Patch` --references--> `braces Library` [EXTRACTED]
README.md → vendor/braces/README.md
- `How UI selection works` --references--> `ThemeScript()` [INFERRED]
AGENTS.md → src/app/components/ThemeScript.tsx
- `How UI selection works` --references--> `WebLayout()` [INFERRED]
AGENTS.md → src/app/components/WebLayout.tsx
- `How UI selection works` --references--> `useColorScheme()` [INFERRED]
AGENTS.md → src/app/components/useColorScheme.ts
- `Conventions & things that will bite you` --references--> `braces()` [INFERRED]
AGENTS.md → vendor/braces/index.js
- `Web theme + light/dark (v2.2 rework)` --references--> `ContributionHeatmap()` [INFERRED]
AGENTS.md → src/app/components/ContributionHeatmap.tsx
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **Two-Shell Theming Architecture** — readme_two_shells, readme_web_shell, readme_skeuo_shell, agents_theme_root [INFERRED 0.85]
- **Host-Allowlisted Proxy API Routes** — agents_ping_ssrf_allowlist, agents_frame_proxy, readme_api_routes [INFERRED 0.85]
- **Vendored braces CVE Patch Flow** — readme_vendored_braces_patch, agents_vendored_braces_patch, vendor_braces_readme_braces, vendor_braces_readme_brace_bomb [INFERRED 0.85]
- **Freezmo AI-graded quiz flow (app, quiz UI, sample question)** — public_freezmo_app_webp_image, public_freezmo_app_webp_freezmo_app, public_freezmo_app_webp_quiz_screen, public_freezmo_app_webp_schuman_plan_question [INFERRED 0.85]
- **Freezmo Icon Visual Identity** — public_freezmo_icon, public_freezmo_snowflake_symbol, public_freezmo_stacked_cards, public_freezmo_dark_squircle_frame [EXTRACTED 1.00]
- **** — public_revival_inc_favicon_png_image, public_revival_inc_favicon_png_revival_inc_game, public_revival_inc_favicon_png_game_controller_mark [INFERRED 0.75]
- **Site identity: eye logo used as app icon and in-page logo** — src_app_icon_png_image, src_app_icon_png_eye_logo, src_app_icon_png_favicon, src_app_components_jokerlogo_tsx_logo [INFERRED 0.85]
- **Freezmo Icon Visual Identity** — public_freezmo_icon, public_freezmo_snowflake_symbol, public_freezmo_stacked_cards, public_freezmo_dark_squircle_frame [EXTRACTED 1.00]
## Communities (41 total, 15 thin omitted)
## Communities (42 total, 15 thin omitted)
### Community 0 - "Desktop App Catalog"
Cohesion: 0.06
Nodes (41): react, ALACRITTY_APP, APP_BY_ID, AppDef, APPS, ContributionsApp(), createWebsiteApp(), EmbeddedSite() (+33 more)
Cohesion: 0.08
Nodes (33): Web theme + light/dark (v2.2 rework), react, ALACRITTY_APP, ContributionsApp(), FriendsApp(), GitdxdApp(), NEOFETCH, RevivalApp() (+25 more)
### Community 1 - "Deployment & Ops Docs"
Cohesion: 0.07
Nodes (37): agents.md Cold-Boot Notes, Custom Dev Server (dev-server.mjs), Header-Stripping Frame Proxy (api/frame), SSRF Host Allowlist (api/ping), ThemeRoot Shell Router, Desktop Icon Grid (useDesktopIcons.ts), Vendored braces CVE Patch, Autostart on Boot (systemd / OpenRC) (+29 more)
Cohesion: 0.09
Nodes (30): Autostart on Boot (systemd / OpenRC), Cloudflare Tunnel Reverse Proxy, PM2 Ecosystem Config File, Node.js >= 20.9.0 Requirement, PM2 Production Deployment (Debian/Alpine), Martin Dvořák (dvorakmortonxd), Coding Projects, Friends' Sites (+22 more)
### Community 2 - "braces Package Metadata"
Cohesion: 0.05
Nodes (37): ansi-colors, bash-path, gulp-format-md, mocha, author, bugs, url, contributors (+29 more)
### Community 3 - "Theme & Clock Components"
Cohesion: 0.10
Nodes (29): WelcomeApp(), Clock(), getTime(), subscribe(), JokerLogo(), ThemeRoot(), ColorScheme, DEFAULT_SCHEME (+21 more)
### Community 3 - "WindowsDesktop.tsx"
Cohesion: 0.08
Nodes (34): Conventions & things that will bite you, How UI selection works, APP_BY_ID, AppDef, APPS, createWebsiteApp(), EmbeddedSite(), WebsiteApp() (+26 more)
### Community 4 - "braces Parsing Engine"
Cohesion: 0.10
Nodes (17): compile, expand, parse, stringify, compile(), fill, utils, append() (+9 more)
### Community 5 - "Project Index Data"
Cohesion: 0.13
Nodes (21): HardwareApp(), ProjectsApp(), CodingProjectIndex(), CodingRow(), Group(), HARDWARE_GROUPS, HardwareProjectIndex(), HardwareRow() (+13 more)
Cohesion: 0.14
Nodes (20): HardwareApp(), ProjectsApp(), CodingProjectIndex(), CodingRow(), Group(), HARDWARE_GROUPS, HardwareProjectIndex(), HardwareRow() (+12 more)
### Community 6 - "braces Character Constants"
Cohesion: 0.11
@ -184,9 +186,9 @@ Nodes (4): dependencies, next, react, react-dom
Cohesion: 0.50
Nodes (4): Discord (chat platform brand mark), Discord Icon (SVG social link asset), Profile social link icon, SVG Repo (icon asset source)
### Community 21 - "Freezmo App Screenshot"
Cohesion: 0.83
Nodes (4): Freezmo study app, Freezmo App Screenshot (AI-graded quiz screen), Freezmo quiz screen with AI grading feedback, Schuman Plan history question (EU history 1945-1974)
### Community 21 - "AGENTS.md — cold-boot notes"
Cohesion: 0.11
Nodes (17): After finishing — push to git, AGENTS.md — cold-boot notes, Architecture, Bump the version on EVERY prompt — also do this every time, Design, Git, Gotcha: native drag hijacks the pointer gesture, graphify (+9 more)
### Community 22 - "Instagram Icon Asset"
Cohesion: 0.67
@ -208,25 +210,29 @@ Nodes (3): Game Controller Logo Mark, Revival Inc. Favicon (yellow character wit
Cohesion: 0.67
Nodes (3): TikTok, TikTok Logo Icon, SVG Repo
### Community 41 - "useColorScheme.ts"
Cohesion: 0.39
Nodes (7): ColorScheme, DEFAULT_SCHEME, getServerSnapshot(), getSnapshot(), setColorScheme(), subscribe(), useColorScheme()
## Knowledge Gaps
- **53 isolated node(s):** `react-dom`, `@svgr/webpack`, `@tailwindcss/postcss`, `@types/node`, `@types/react` (+48 more)
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 212 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
- **54 isolated node(s):** `react-dom`, `@svgr/webpack`, `@tailwindcss/postcss`, `@types/node`, `@types/react` (+49 more)
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 226 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
- **15 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `react` connect `Desktop App Catalog` to `Root Package Dependencies`, `Theme & Clock Components`, `Project Index Data`, `Next Config & API Routes`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **Why does `Conventions & things that will bite you` connect `WindowsDesktop.tsx` to `braces Public API Methods`, `AGENTS.md — cold-boot notes`?**
_High betweenness centrality (0.183) - this node is a cross-community bridge._
- **Are the 2 inferred relationships involving `WebLayout()` (e.g. with `How UI selection works` and `Web theme + light/dark (v2.2 rework)`) actually correct?**
_`WebLayout()` has 2 INFERRED edges - model-reasoned connections that need verification._
- **What connects `react-dom`, `@svgr/webpack`, `@tailwindcss/postcss` to the rest of the system?**
_53 weakly-connected nodes found - possible documentation gaps or missing edges._
_54 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Desktop App Catalog` be split into smaller, more focused modules?**
_Cohesion score 0.05584415584415584 - nodes in this community are weakly interconnected._
- **Why does `next` connect `Next Config & API Routes` to `Desktop App Catalog`, `Root Package Dependencies`, `Custom Dev Server`, `Theme & Clock Components`?**
_High betweenness centrality (0.092) - this node is a cross-community bridge._
_Cohesion score 0.0797872340425532 - nodes in this community are weakly interconnected._
- **Why does `braces()` connect `braces Public API Methods` to `WindowsDesktop.tsx`, `braces Parsing Engine`?**
_High betweenness centrality (0.150) - this node is a cross-community bridge._
- **Should `Deployment & Ops Docs` be split into smaller, more focused modules?**
_Cohesion score 0.07396870554765292 - nodes in this community are weakly interconnected._
- **Why does `KDE Plasma Desktop Simulation Shell` connect `Deployment & Ops Docs` to `Desktop App Catalog`?**
_High betweenness centrality (0.054) - this node is a cross-community bridge._
- **Should `braces Package Metadata` be split into smaller, more focused modules?**
_Cohesion score 0.05263157894736842 - nodes in this community are weakly interconnected._
_Cohesion score 0.08735632183908046 - nodes in this community are weakly interconnected._
- **Why does `next` connect `Next Config & API Routes` to `Desktop App Catalog`, `Root Package Dependencies`, `Custom Dev Server`, `WindowsDesktop.tsx`?**
_High betweenness centrality (0.126) - this node is a cross-community bridge._

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -24,10 +24,10 @@
"semantic_hash": "03388a201be8750ddcddb14dfbc34411"
},
"package.json": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675533,
"ast_hash": "9dc8d0f30ee052e4d46bfd2ee4ac5f61",
"semantic_hash": "9dc8d0f30ee052e4d46bfd2ee4ac5f61"
"mtime": 1792097800.6502452,
"seen": 1792097851.621277,
"ast_hash": "52b55982a20e4621bbf5c3d5b71cce72",
"semantic_hash": ""
},
"postcss.config.mjs": {
"mtime": 1790099669.0082622,
@ -114,10 +114,10 @@
"semantic_hash": "20e25c727b4bb982e5a22d65efece143"
},
"src/app/components/WebLayout.tsx": {
"mtime": 1792092782.574,
"seen": 1792093031.8826597,
"ast_hash": "323262c6d5c5735b3707d2421d89dbd1",
"semantic_hash": "323262c6d5c5735b3707d2421d89dbd1"
"mtime": 1792097800.6502452,
"seen": 1792097851.62133,
"ast_hash": "052b55c79df46ba5b1e8448149d4fd64",
"semantic_hash": ""
},
"src/app/components/WinWindow.tsx": {
"mtime": 1791733935.6454856,
@ -240,16 +240,10 @@
"semantic_hash": "b81dea2175efa2b0b6c38451ab5a4bbd"
},
"README.md": {
"mtime": 1791752424.8048594,
"seen": 1792088878.5676332,
"ast_hash": "56b4d66dfd84d63c081e89f9b83a2473",
"semantic_hash": "56b4d66dfd84d63c081e89f9b83a2473"
},
"agents.md": {
"mtime": 1791754434.7755237,
"seen": 1792088878.5676353,
"ast_hash": "0f3349e68bf149d70a6a28ae4b46b75e",
"semantic_hash": "0f3349e68bf149d70a6a28ae4b46b75e"
"mtime": 1792097800.6502452,
"seen": 1792097851.6214051,
"ast_hash": "4bb82eae835a1f9fb3bd13b54e9adeaa",
"semantic_hash": ""
},
"public/llms.txt": {
"mtime": 1790099669.0182621,
@ -281,12 +275,6 @@
"ast_hash": "3ade8600c72a99dac523ad990bd59e8b",
"semantic_hash": "3ade8600c72a99dac523ad990bd59e8b"
},
"public/freezmo-app.webp": {
"mtime": 1791751264.7117522,
"seen": 1792088878.5676477,
"ast_hash": "8cb16536265245385e56bda1eac49439",
"semantic_hash": "8cb16536265245385e56bda1eac49439"
},
"public/gentoo.svg": {
"mtime": 1790099669.0142622,
"seen": 1792088878.5676498,
@ -376,5 +364,11 @@
"seen": 1792093031.8827293,
"ast_hash": "6f69e16823f10d9c7af1625eff2b32e8",
"semantic_hash": "6f69e16823f10d9c7af1625eff2b32e8"
},
"AGENTS.md": {
"mtime": 1792097800.6502452,
"seen": 1792097851.621398,
"ast_hash": "c2418856058d91e442c35b5237ef54de",
"semantic_hash": ""
}
}

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "dvorakmortonxd",
"version": "2.2.15",
"version": "2.2.16",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "dvorakmortonxd",
"version": "2.2.15",
"version": "2.2.16",
"dependencies": {
"next": "^16.3.8",
"react": "^19.3.0",

View file

@ -1,6 +1,6 @@
{
"name": "dvorakmortonxd",
"version": "2.2.15",
"version": "2.2.16",
"private": true,
"scripts": {
"dev": "node scripts/dev-server.mjs",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View file

@ -271,13 +271,13 @@ export default function WebLayout() {
</a>
</div>
</div>
<div className="web-freezmo-shot">
<div className="web-freezmo-icon">
<Image
src="/freezmo.png"
alt="Freezmo quiz screen — a history question about the Schuman plan with AI grading feedback"
width={1941}
height={942}
sizes="(max-width: 900px) 100vw, 560px"
alt="Freezmo app icon — a blue snowflake over a stack of cards on a navy squircle"
width={512}
height={512}
sizes="(max-width: 900px) 45vw, 200px"
className="web-freezmo-img"
/>
</div>
@ -340,7 +340,7 @@ export default function WebLayout() {
</Section>
<footer className="web-footer glass">
<span className="web-footer-label">v2.2.15</span>
<span className="web-footer-label">v2.2.16</span>
© 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just
follow the GPL3.0 License)
</footer>

View file

@ -453,7 +453,7 @@ html[data-theme="web"] body {
FREEZMO FEATURE
Full-width launch panel for the live study app: blue app-
tinted glow, floating orbs, gradient wordmark/badge, feature
bullets and CTAs, with the real screenshot tilted into place.
bullets and CTAs, with the app icon floating beside the copy.
============================================================ */
.web-freezmo {
position: relative;
@ -605,33 +605,38 @@ html[data-theme="web"] body {
background: var(--btn-bg-hi, var(--glass-hi));
border-color: var(--accent-line);
}
.web-freezmo-shot {
.web-freezmo-icon {
position: relative;
display: grid;
place-items: center;
min-height: 100%;
padding: clamp(10px, 2.5vw, 26px) 0;
animation: freezmo-float 7s ease-in-out infinite;
}
.web-freezmo-shot::before {
.web-freezmo-icon::before {
content: "";
position: absolute;
inset: -14% -10% -18%;
width: min(76%, 240px);
aspect-ratio: 1;
border-radius: 50%;
background: radial-gradient(
60% 60% at 55% 45%,
color-mix(in srgb, var(--web-accent-2) 28%, transparent),
circle at 50% 44%,
color-mix(in srgb, var(--web-accent-2) 46%, transparent),
color-mix(in srgb, var(--web-accent) 24%, transparent) 46%,
transparent 70%
);
filter: blur(4px);
filter: blur(10px);
}
.web-freezmo-img {
position: relative;
display: block;
width: 100%;
width: clamp(128px, 26vw, 200px);
height: auto;
border-radius: 16px;
border: 1px solid var(--glass-border);
box-shadow: 0 34px 70px -34px rgba(8, 16, 40, 0.75);
transform: rotate(-1.2deg);
filter: drop-shadow(0 26px 44px rgba(8, 16, 40, 0.6));
transition: transform 0.35s ease;
}
.web-freezmo-shot:hover .web-freezmo-img {
transform: rotate(0deg) translateY(-3px);
.web-freezmo-icon:hover .web-freezmo-img {
transform: rotate(-3deg) scale(1.04);
}
@keyframes freezmo-float {
0%,
@ -643,7 +648,8 @@ html[data-theme="web"] body {
}
}
@media (prefers-reduced-motion: reduce) {
.web-freezmo-orb {
.web-freezmo-orb,
.web-freezmo-icon {
animation: none;
}
.web-freezmo-img {