$ErrorActionPreference = 'Stop' $root = Split-Path -Parent $PSScriptRoot $page = Get-Content -LiteralPath (Join-Path $root 'pages/genealogy/g09-my-applications.vue') -Raw -Encoding utf8 $rules = @( '(?s)\.application-intro text:last-child\s*\{[^}]*font-size:\s*clamp\(15px, 24rpx, 18px\);', '(?s)\.application-card__time\s*\{[^}]*font-size:\s*clamp\(14px, 23rpx, 17px\);', '(?s)\.application-card__relation\s*\{[^}]*font-size:\s*clamp\(15px, 24rpx, 18px\);', '(?s)\.application-card__status\s*\{[^}]*font-size:\s*clamp\(15px, 25rpx, 18px\);', '(?s)\.application-card__hint\s*\{[^}]*font-size:\s*clamp\(14px, 23rpx, 17px\);', '(?s)\.application-card__action\s*\{[^}]*font-size:\s*clamp\(14px, 23rpx, 17px\);', '(?s)\.application-card__action\s*\{[^}]*white-space:\s*nowrap;', '(?s)\.application-card\s*\{[^}]*@include\s+adaptive\.adaptive-genealogy-list-card;[^}]*min-height:\s*210rpx;[^}]*margin-bottom:\s*12rpx;', '(?s)\.application-card__body\s*\{[^}]*min-height:\s*174rpx;[^}]*gap:\s*8rpx 14rpx;[^}]*padding:\s*26rpx 28rpx 22rpx 40rpx;', '(?s)\.application-state-card__copy text:last-child\s*\{[^}]*font-size:\s*clamp\(15px, 24rpx, 18px\);' ) if ($page -match '(?s)\.application-card\s*\{[^}]*background:\s*url\("/static/assets/modules/genealogy/transparent/list-slip-frame\.png"\)[^}]*100%\s+100%') { throw 'G09 application card must not stretch the complete frame asset to 100% 100%' } foreach ($rule in $rules) { if ($page -notmatch $rule) { throw "G09 readable visual rule missing: $rule" } } Write-Output 'G09-ALL-STATES-VISUAL-CONTRACT PASS'