From a24cda989acd44705fd61166ffdae70a7db62ccf Mon Sep 17 00:00:00 2001 From: "smx.pusha" <139338836+smxpusha@users.noreply.github.com> Date: Thu, 20 Aug 2026 12:38:46 +0200 Subject: [PATCH] ENH - apply liquid glass across app controls --- frontend/src/ui/controls.css | 2 + frontend/src/ui/controls/SkyButton.test.ts | 3 + .../apps/AppStoreDetail.contract.test.ts | 18 +++- frontend/src/views/apps/AppStoreDetail.vue | 64 +++++++------ .../views/apps/CalculatorApp.contract.test.ts | 5 +- frontend/src/views/apps/CalculatorApp.vue | 12 +-- .../src/views/apps/CameraApp.contract.test.ts | 8 ++ frontend/src/views/apps/CameraApp.vue | 93 +++++++++---------- .../views/apps/FeatherApp.contract.test.ts | 14 ++- frontend/src/views/apps/FeatherApp.vue | 35 ++----- frontend/src/views/apps/FlareApp.vue | 16 ++-- frontend/src/views/apps/FlipTokApp.vue | 19 ++-- .../src/views/apps/MailApp.contract.test.ts | 7 +- frontend/src/views/apps/MailApp.vue | 10 +- .../src/views/apps/MapApp.contract.test.ts | 11 +++ frontend/src/views/apps/MapApp.vue | 16 ++-- frontend/src/views/apps/MemoryApp.vue | 20 ++-- .../views/apps/MessagesApp.contract.test.ts | 2 +- frontend/src/views/apps/MessagesApp.vue | 2 +- frontend/src/views/apps/MinesweeperApp.vue | 20 ++-- frontend/src/views/apps/NeonDropApp.vue | 34 ++++--- frontend/src/views/apps/NumberMergeApp.vue | 20 ++-- frontend/src/views/apps/PicstagramApp.vue | 60 +++++++----- frontend/src/views/apps/SkyFlappyApp.vue | 13 +-- .../src/views/apps/SkyUiApps.contract.test.ts | 27 ++++++ frontend/src/views/apps/SnakeApp.vue | 16 ++-- frontend/src/views/apps/TowerStackApp.vue | 24 +++-- frontend/src/views/apps/WeazelNewsApp.vue | 5 +- 28 files changed, 343 insertions(+), 233 deletions(-) diff --git a/frontend/src/ui/controls.css b/frontend/src/ui/controls.css index 53954fd..f0743fd 100644 --- a/frontend/src/ui/controls.css +++ b/frontend/src/ui/controls.css @@ -2854,6 +2854,8 @@ label.sky-list-item__row { .sky-glass--interactive { min-width: var(--sky-touch-target, 44px); min-height: var(--sky-touch-target, 44px); + -webkit-backdrop-filter: blur(18px) saturate(145%); + backdrop-filter: blur(18px) saturate(145%); cursor: pointer; } diff --git a/frontend/src/ui/controls/SkyButton.test.ts b/frontend/src/ui/controls/SkyButton.test.ts index 36e0275..70dc586 100644 --- a/frontend/src/ui/controls/SkyButton.test.ts +++ b/frontend/src/ui/controls/SkyButton.test.ts @@ -47,6 +47,9 @@ describe('SkyButton', () => { expect(controls).toMatch( /\.sky-glass\.sky-button--glass\s*\{[^}]*background:\s*var\(--sky-glass[^}]*box-shadow:\s*var\(--sky-shadow-glass\)/s, ) + expect(controls).toMatch( + /\.sky-glass--interactive\s*\{[^}]*-webkit-backdrop-filter:\s*blur\(18px\) saturate\(145%\);[^}]*backdrop-filter:\s*blur\(18px\) saturate\(145%\);/s, + ) }) it('keeps focus and pressed feedback on the contextual accent', () => { diff --git a/frontend/src/views/apps/AppStoreDetail.contract.test.ts b/frontend/src/views/apps/AppStoreDetail.contract.test.ts index 24b67eb..e40b65c 100644 --- a/frontend/src/views/apps/AppStoreDetail.contract.test.ts +++ b/frontend/src/views/apps/AppStoreDetail.contract.test.ts @@ -48,13 +48,11 @@ describe('AppStoreDetail contract', () => { expect(previewSource).toContain('v-if="previewImage && screen < 3"') expect(previewSource).toContain(':src="previewImage"') expect(previewSource).toContain('store-detail-preview__screenshot') - expect(previewSource).not.toContain("visual.scene ===") + expect(previewSource).not.toContain('visual.scene ===') expect(source).toContain('getAppStorePreviewVisual') expect(source).toContain('Apps.appStore.previews.${props.app.id}') expect(previewSource).toContain(':src="iconImage"') - expect(source).toMatch( - /previewScreens\s*=\s*\[0, 1, 2, 3, 4\] as const/, - ) + expect(source).toMatch(/previewScreens\s*=\s*\[0, 1, 2, 3, 4\] as const/) expect(previewSource).toContain('screen === 3') expect(previewSource).toContain('screen === 4') expect(previewSource).toContain('store-detail-preview__details') @@ -71,6 +69,16 @@ describe('AppStoreDetail contract', () => { expect(source).toContain('scrollToPreview(activePreviewIndex + 1)') expect(source).toContain('details.previousPreview') expect(source).toContain('details.nextPreview') - expect(source).toContain('.store-detail__toolbar button:hover') + expect(source).toContain('.store-detail__toolbar-button:hover') + }) + + it('uses shared liquid glass for toolbar and preview controls', () => { + expect(source).toContain("import { SkyButton } from '@/ui'") + expect(source.match(/ -import { - ChevronLeft, - ChevronRight, - Share2, - Star, -} from 'lucide-vue-next' +import { ChevronLeft, ChevronRight, Share2, Star } from 'lucide-vue-next' import { computed, ref } from 'vue' import { getPhoneAppLabel, isExternalPhoneApp } from '@/config/apps' import { usePhoneStore } from '@/stores/phone' import type { LaunchablePhoneAppDefinition } from '@/types/apps' +import { SkyButton } from '@/ui' import { getAppStorePreviewImage } from '@/utils/appStorePreviewImages' import { getAppStorePreviewVisual } from '@/utils/appStorePreviews' @@ -126,20 +122,28 @@ function updateActivePreview(): void {