diff --git a/tests/a01-a02-ui-contract.ps1 b/tests/a01-a02-ui-contract.ps1 index a096b9c..2be2e45 100644 --- a/tests/a01-a02-ui-contract.ps1 +++ b/tests/a01-a02-ui-contract.ps1 @@ -56,6 +56,43 @@ if ($pages.pages.Count -ne 52) { $entry = Get-Content -LiteralPath $entryPath -Raw -Encoding utf8 $globalStyles = Get-Content -LiteralPath $globalStylesPath -Raw -Encoding utf8 +# A01 owns content in normal document flow. Decorative artwork must not become +# a second full-page coordinate system. +foreach ($required in @( + 'class="auth-header"', + 'class="auth-header__image"', + 'a01-vnext-header-v1.png', + 'mode="widthFix"', + 'class="auth-paper"', + 'auth-page-paper.jpg' +)) { + Assert-Contains -Content $entry -Expected $required -Message "A01 adaptive structure is missing: $required" +} +foreach ($forbidden in @( + 'class="page-canvas"', + 'class="page-backdrop"', + 'a01-red-hall-ink-backdrop-v1.png', + 'mode="scaleToFill"', + '--auth-paper-start', + '1665rpx' +)) { + Assert-NotContains -Content $entry -Unexpected $forbidden -Message "A01 still uses rejected page coordinates: $forbidden" +} + +$pageRule = [regex]::Match($entry, '(?ms)^\.auth-page\s*\{(?.*?)^\}') +$paperRule = [regex]::Match($entry, '(?ms)^\.auth-paper\s*\{(?.*?)^\}') +$contentRule = [regex]::Match($entry, '(?ms)^\.login-content\s*\{(?.*?)^\}') +foreach ($rule in @($pageRule, $paperRule, $contentRule)) { + if (-not $rule.Success) { throw 'A01 adaptive layout rule is missing.' } +} +Assert-Contains -Content $pageRule.Groups['Body'].Value -Expected 'display: flex;' -Message 'A01 root must use flex flow.' +Assert-Contains -Content $pageRule.Groups['Body'].Value -Expected 'flex-direction: column;' -Message 'A01 root must stack header and paper.' +Assert-Contains -Content $pageRule.Groups['Body'].Value -Expected 'min-height: var(--app-viewport-height);' -Message 'A01 root must fill without locking content height.' +Assert-NotContains -Content $pageRule.Groups['Body'].Value -Unexpected 'height: var(--app-viewport-height);' -Message 'A01 root must not lock content to the viewport.' +Assert-Contains -Content $paperRule.Groups['Body'].Value -Expected 'flex: 1;' -Message 'A01 paper must receive remaining viewport space.' +Assert-Contains -Content $contentRule.Groups['Body'].Value -Expected 'justify-content: space-between;' -Message 'A01 must distribute spare height in normal flow.' +Assert-NotContains -Content $contentRule.Groups['Body'].Value -Unexpected 'grid-area:' -Message 'A01 interactive content must not overlap page artwork.' + # Typography has one owner, and the title decoration participates in normal flow. Assert-Contains -Content $globalStyles -Expected 'font-family: "STKaiti", "KaiTi", serif' -Message 'Global styles must own the STKaiti/KaiTi font contract.' Assert-NotContains -Content $entry -Unexpected 'font-family:' -Message 'A01 must inherit the global font contract instead of overriding it locally.' @@ -88,15 +125,14 @@ $brandSealRule = [regex]::Match($entry, '(?ms)^\.brand-seal\s*\{(?.*?)^\}' if (-not $brandSealRule.Success) { throw 'A01 is missing the brand seal style rule.' } -Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'width: 184rpx;' -Message 'A01 brand seal must use the approved smaller width.' -Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'height: 221rpx;' -Message 'A01 brand seal must preserve its aspect ratio at the approved smaller height.' -Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'margin-top: 64rpx;' -Message 'A01 brand seal must keep its approved vertical spacing in document flow.' -Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'justify-self: center;' -Message 'A01 brand seal must remain horizontally centered by grid alignment.' -Assert-NotContains -Content $brandSealRule.Groups['Body'].Value -Unexpected 'position:' -Message 'A01 brand seal must not use positioning for ordinary layout.' +Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'position: absolute;' -Message 'A01 brand seal must be scoped as decoration inside the header.' +Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'left: 50%;' -Message 'A01 brand seal must remain centered inside the header.' +Assert-Contains -Content $brandSealRule.Groups['Body'].Value -Expected 'transform: translateX(-50%);' -Message 'A01 brand seal must use header-local centering.' # Final decorative surfaces must come from real bitmap assets. foreach ($asset in @( - 'a01-red-hall-ink-backdrop-v1.png', + 'a01-vnext-header-v1.png', + 'auth-page-paper.jpg', 'brand-seal.png', 'a01-vnext-divider-v1.png', 'a01-scroll-primary-v3.png',