import { readFileSync } from 'node:fs' import { describe, expect, it } from 'vitest' const source = readFileSync( new URL('./AppStoreApp.vue', import.meta.url), 'utf8', ) const navigationSource = source.slice( source.indexOf('') + ''.length, ) describe('AppStoreApp Sky navigation contract', () => { it('uses only the first-party Sky UI surface', () => { expect(source).not.toContain("from 'konsta/vue'") expect(source).not.toMatch(/<\/?k-[a-z]/) expect(source).toContain(' { expect(source).toContain("{ id: 'today', icon: Newspaper }") expect(source).toContain("{ id: 'apps', icon: Grid2X2 }") expect(source).toContain("{ id: 'games', icon: Gamepad2 }") expect(source).toContain("{ id: 'search', icon: Search }") expect(source).toContain('class="app-store-navigation"') expect(source).toContain('layout="full"') expect(source).toContain(' { expect(source).toContain('const hasSearchQuery = computed') expect(source).toContain('const searchRecommendations = computed') expect(source).toContain('const searchDiscoverCards = computed') expect(source).toContain('v-if="!hasSearchQuery"') expect(source).toContain( ":class=\"{ 'app-store-navbar--search': tab === 'search' }\"", ) expect(source).toMatch( /\.app-store-navbar--search\s*\{[^}]*margin-bottom:\s*-24px;/s, ) expect(source).toMatch( /\.app-store-navbar--search :deep\(\.sky-navbar__subnavbar\)\s*\{[^}]*- 24px/s, ) expect(source).toContain('class="store-search__recommendations"') expect(source).toMatch( /\.store-search__recommendations article\.store-search__recommendation--promoted\s*\{[^}]*margin:\s*0 calc\(0px - var\(--sky-space-2\)\);[^}]*border-radius:\s*var\(--sky-radius-control\);[^}]*padding:\s*var\(--sky-space-3\) var\(--sky-space-2\);[^}]*rgba\(10, 132, 255, 0\.18\)/s, ) expect(source).toContain('class="store-search__discover-grid"') expect(source).toContain( 'class="store-list store-list--browse store-list--search-results"', ) expect(source).not.toContain('.store-list--search-results article > button') expect(source).not.toContain('