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 {