From 778cd8e7bfcd64607113a254c019e9979b3752a0 Mon Sep 17 00:00:00 2001 From: rain Date: Mon, 13 Jul 2026 16:00:22 +0800 Subject: [PATCH] fix: add A01 ornamental auth assets --- design-qa.md | 6 +-- docs/design/A01_启动登录引导_设计记录.md | 13 +++-- pages/auth/entry.vue | 51 +++++++++++++----- .../icons/auth/auth-button-corner-v1.png | Bin 0 -> 5096 bytes .../icons/auth/auth-divider-knot-v1.png | Bin 0 -> 6751 bytes .../assets/icons/auth/auth-title-cloud-v1.png | Bin 0 -> 15833 bytes tests/a01-a02-ui-contract.ps1 | 24 +++++++-- tests/a01-asset-alpha-audit.ps1 | 13 ++++- 8 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 static/assets/icons/auth/auth-button-corner-v1.png create mode 100644 static/assets/icons/auth/auth-divider-knot-v1.png create mode 100644 static/assets/icons/auth/auth-title-cloud-v1.png diff --git a/design-qa.md b/design-qa.md index 01717f9..9f82a44 100644 --- a/design-qa.md +++ b/design-qa.md @@ -3,17 +3,17 @@ - Source visual truth: `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png` - Target state: `412 × 915`, agreement unchecked. - Static contract: passed on 2026-07-13. -- Runtime screenshot: first capture reviewed on 2026-07-13; second capture pending. +- Runtime screenshot: first capture reviewed on 2026-07-13; second capture pending after the ornamental-asset calibration. ## Evidence - The first `412 × 915` runtime capture confirms that the red-header height, divider width, both button frames and registration-entry height are close to the reference. - The same capture shows the seal too high, title clouds too wide, both button content groups too far right, and an agreement row that is too wide and high. -- The second calibration adds sub-element anchors for those differences; the whole-image layer, registration side lines and four-corner button brackets remain forbidden. +- The second calibration replaces the incorrect shared cloud artwork with three dedicated transparent assets: button corner flourish, divider center knot and title-side cloud. It also aligns the agreement checkbox and copy on one non-wrapping center line. ## Remaining runtime evidence -- [P1] Capture the unchecked A-01 page at `412 × 915` in HBuilderX or Android, without browser chrome, after the second calibration and compare it against the source at the same scale. +- [P1] Capture the unchecked A-01 page at `412 × 915` in HBuilderX or Android, without browser chrome, after the ornamental-asset calibration and compare it against the source at the same scale. - [P1] Capture `320 × 568` after scrolling to confirm the agreement row and safe area are not clipped. - Confirm that selecting the agreement enables only the existing A-02 login route; the other entries remain local prepared-state prompts. diff --git a/docs/design/A01_启动登录引导_设计记录.md b/docs/design/A01_启动登录引导_设计记录.md index be96f74..a118c18 100644 --- a/docs/design/A01_启动登录引导_设计记录.md +++ b/docs/design/A01_启动登录引导_设计记录.md @@ -36,13 +36,13 @@ | 朱砂家祠头图 | 高 139px | 高 253rpx | | 红头谱印 | 比头图顶边低约 38px | `top: 70rpx` | | 标题区起点 | 红头后约 82px | `padding-top: 150rpx` | -| 标题两侧云纹 | 紧贴标题两侧,不扩张标题组宽度 | `56rpx × 34rpx`,标题左右各 12rpx | -| 标题分隔饰线 | 宽约 234px | 宽 426rpx;上、下间距独立 | +| 标题两侧云纹 | 紧贴标题两侧,不扩张标题组宽度 | 独立透明素材 `auth-title-cloud-v1.png`,`64rpx × 40rpx`,标题左右各 12rpx | +| 标题分隔饰线 | 宽约 234px,中心为对称小结 | 宽 426rpx;中结使用独立透明素材 `auth-divider-knot-v1.png`,上、下间距独立 | | 两个按钮 | x=60px,宽约 291px,高约 65px | `margin: 95rpx 110rpx 0`,高 118rpx | | 两按钮间距 | 约 28px | `margin-top: 51rpx` | -| 按钮内框与内容组 | 内框距外边约 3px;图标与文字整体偏左 | `inset: 6rpx`,内容组 `translateX(-20rpx)` | +| 按钮内框与内容组 | 内框距外边约 3px,四角有卷草角花;图标与文字整体偏左 | `inset: 6rpx`;四角使用同一张 `auth-button-corner-v1.png` 镜像;内容组 `translateX(-20rpx)` | | 注册入口 | 微信按钮后约 56px;无左右短线 | `margin-top: 98rpx` | -| 协议行 | 注册入口后约 77px;文案不应撑宽整行 | `margin-top: 141rpx`,字号 20rpx,复选框 30rpx,加安全区 | +| 协议行 | 注册入口后约 77px;复选框与全部文案同一水平线 | `margin-top: 141rpx`,字号与行高均为 20rpx / 30rpx,复选框 30rpx,`align-items: center`、`white-space: nowrap`,加安全区 | - 上表是 A-01 运行时布局数值的唯一所有者。320 × 568 时页面允许纵向滚动,根容器不得以 `overflow: hidden` 截断协议行或系统安全区;底部内边距包含 `env(safe-area-inset-bottom)`。 - 仅作静态设计验证,不代表 uni-app 运行时验收;页面实现后仍须在 Android 320 × 568、360 × 640、360 × 800、412 × 915 上重新验收。 @@ -62,6 +62,9 @@ | `docs/design/screens/A01-启动登录引导-效果稿-v3-文字注册入口.png` | A-01 视觉比对依据 | 已归档并由用户确认的 v3 效果稿 | `852 × 1846px` PNG;仅作真实 DOM 页面还原和运行时验收对照,不直接作为页面内容 | | `static/assets/backgrounds/auth-ancestral-header-v1.png`、`auth-rice-paper-v1.jpg`、`auth-ink-scenery-v1.png` | A-01 分层页面背景 | 2026-07-13 内置图像生成 | 当前 A-01 使用;不得复用 G-01 背景 | | `static/assets/icons/auth/login-outline-v1.png`、`static/assets/icons/auth/wechat-licensed-v1.png` | A-01 两个按钮图标 | 登录图标复用项目既有资产;微信图标来源与许可见旧记录 | 当前 A-01 使用;微信图标免费使用须在应用“关于/设置”及应用商店描述中保留 Icons8 署名链接 | +| `static/assets/icons/auth/auth-button-corner-v1.png` | 两个入口按钮的四角卷草装饰 | 2026-07-13 根据 412 × 915 视觉基准生成,去绿幕后保存 | `160 × 160px` 透明 PNG;同一张素材镜像至四角 | +| `static/assets/icons/auth/auth-divider-knot-v1.png` | 标题上下金线的中心对称中结 | 2026-07-13 根据 412 × 915 视觉基准生成,去绿幕后保存 | `160 × 96px` 透明 PNG;不得改用长祥云 | +| `static/assets/icons/auth/auth-title-cloud-v1.png` | “家谱”标题左右祥云 | 2026-07-13 根据 412 × 915 视觉基准生成,去绿幕后保存 | `200 × 120px` 透明 PNG;右侧只允许镜像该素材 | ## 4. 静态设计验收与剩余缺口 @@ -70,7 +73,7 @@ - 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。 - 仍未确定《家谱用户协议》与《隐私政策》的最终页面去向及返回路径;在这两页完成设计前,A-01 不得标记为完整设计完成。 - 页面实现阶段仍须按本记录在 Android 实机或同等运行环境复核四个尺寸的安全区、滚动与文字折行。 -- 2026-07-13 已按 412 × 915 参考图完成第一轮真实 DOM 校准;运行时截图显示容器位置已接近基准,但红头谱印、标题云纹、按钮内容组和协议行仍有子元素偏差,已进入第二轮校准。未取得第二轮同尺寸截图确认前不得标记 A-01 完成。 +- 2026-07-13 已按 412 × 915 参考图完成第二轮子元素校准:已补齐按钮四角透明角花、分隔线中心中结、标题独立祥云,并将协议复选框与文案改为单行居中对齐。未取得第二轮同尺寸运行时截图确认前不得标记 A-01 完成。 ## 5. 推进约束 diff --git a/pages/auth/entry.vue b/pages/auth/entry.vue index 0e4166d..b32b4c7 100644 --- a/pages/auth/entry.vue +++ b/pages/auth/entry.vue @@ -11,25 +11,29 @@ - + 家谱 - + - + 为家族留存可传承的记忆 - + + + + + 登录 @@ -37,6 +41,10 @@ + + + + 微信登录 @@ -170,10 +178,7 @@ const prepareAgreement = () => { line-height: 1; } -.title-cloud { - width: 56rpx; - height: 34rpx; -} +.title-cloud { width: 64rpx; height: 40rpx; } .title-cloud-left { margin-right: 0; } .title-cloud-right { margin-left: 0; transform: scaleX(-1); } @@ -233,8 +238,22 @@ const prepareAgreement = () => { border-radius: 2rpx; content: ''; pointer-events: none; + z-index: 1; } +.button-corner-asset { + position: absolute; + z-index: 2; + width: 54rpx; + height: 54rpx; + pointer-events: none; +} + +.button-corner-asset--top-left { top: 4rpx; left: 4rpx; } +.button-corner-asset--top-right { top: 4rpx; right: 4rpx; transform: scaleX(-1); } +.button-corner-asset--bottom-left { bottom: 4rpx; left: 4rpx; transform: scaleY(-1); } +.button-corner-asset--bottom-right { right: 4rpx; bottom: 4rpx; transform: scale(-1); } + .entry-button--primary { border-color: #9e170e; background: #b7170d; @@ -259,7 +278,7 @@ const prepareAgreement = () => { .entry-button--primary .entry-button__icon { filter: brightness(0) invert(1); } .entry-button__content { position: relative; - z-index: 1; + z-index: 3; display: flex; align-items: center; transform: translateX(-20rpx); @@ -284,13 +303,13 @@ const prepareAgreement = () => { .agreement-row { display: flex; - align-items: flex-start; + align-items: center; justify-content: center; margin-top: 141rpx; padding: 0 44rpx calc(32rpx + env(safe-area-inset-bottom)); color: #6b5a4a; font-size: 20rpx; - line-height: 1.7; + line-height: 30rpx; } .agreement-check { @@ -301,7 +320,7 @@ const prepareAgreement = () => { box-sizing: border-box; width: 30rpx; height: 30rpx; - margin: 7rpx 12rpx 0 0; + margin: 0 12rpx 0 0; border: 2rpx solid #b88d4b; border-radius: 50%; color: #fffaf0; @@ -310,6 +329,12 @@ const prepareAgreement = () => { } .agreement-check.checked { background: #b7170d; border-color: #b7170d; } -.agreement-copy { text-align: center; } +.agreement-copy { + display: flex; + align-items: center; + line-height: 30rpx; + text-align: center; + white-space: nowrap; +} .agreement-link { color: #b7170d; } diff --git a/static/assets/icons/auth/auth-button-corner-v1.png b/static/assets/icons/auth/auth-button-corner-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3020883070f8ad6653f697fb3c2df5c389f36e1 GIT binary patch literal 5096 zcmX|_cQ_l~_s5fv*n4lGYLD7l#Hvt~QcA^a6}3XNMvRDEMNo>Od}vdxS+yylN=vO8 zjZws^y;rSoKELnx`TcS3eeUy|bI&>N`?~*}M2p*S23lTP006*XY-C_b-V6UVY6y8v z8gQ2-Z$OkKTn|vu&%Z)GP`c}y=>h=NsdQ&9VDgy;X=H~202n*}HDI^jyN3V(Tez`- z?%iO=jp>kJw$TZ|wyrAppmSgi|EKl$2QFrgiggKLi>4A;VMMtI2n2qZCLoz~_vxRk zk|Hx7lkq@5&y2U8KgCLnn}*{i;$DC(3r%vfKox~ITegl0JOyJv3>=V#Poj^GH20J> zP)mIegL86}miu^8nDwZkG5=dO<6es&-EwPRh}nDZ#^n?Hs#5h4+NsvyN76GH%A{qK+%t=j0XOx)MN6jG$(%J7|rfE)=7jMF{65ox5A@OZ88uoj+~;81#JV zaY~+@Gfv}`Nwh=XB2@6LVkug;`ttc>eOv}H(BQ74$dQa>T4S!sL*J!z<|9k1s&`Yu zPp|Qn$UT~88KUWP`jMq_EB`}Mv_mqa8dYn&>Mf^1vhkrs$xG9rD&NtgDrIO`thvAV zTE_|BQ?mcfy>8?7;@SHov23{~ekfQbHdG9!TbLIcFZrs@UUY@qxuiGRkYYl1n(qewL)qJPVDmDb6hXhE%!71Vqj0!& z0F;ARRW)zMOm!mIHaz=hV7^K7GoRc&)wG3Zm-T?x?;;~+Ks~%l+^hv?W_D3QNbQ=^ zU_p!EtRYZ&v8+YX>3mi?r7PID_o8XRX*3?F-TP%W8SHV&U8qHirv~t4h48>4qjb;3 zZr>wqqv>zM{T*bSuDq25R9u}4GWE)sQ-p6mh_89o$F+Dr9w0kRF3_ldg=>u!jw8DE+DjC04csjo}b8|`kB$XEA? zp9zWQ6(6!Ml@Q}9G8sNhldqq4YrCIfFOz!rPAT`oi(_hr=-PJ%CQyt`D62{ywf46A zq@sm`A>3J@lf=wA<&V-WU90_O+~r^DgiBOp1A84%&5}tR7`h^3b_Zu<#s260C>ZVW#4^ai1(WgFXdS!Q*C(6a;FW|$ z1YC=BNizuKhb`~T>{L36e3#7%U2xW}byPJe&j?=NIJvPr-?W=bmAJc4s6jClp+>qs z5*tGk(NS{Lz0PYa&5PVu3hWH?s^}RmvchDV3xx+`&0=Gt8d7xJeRMH3aXxsO$Rx>y z+6Ryv{C)Amo`IvFu|>hW_v3=OHYIe(u~o5x)p^%}GHhqR1~}q&EI2;@8PaKK1v|C( zYwKs?G>Vo2G13r`>_{pa0yjLSJI~+UXI10ajP{;-3#yBxWi;<44A^xkP6a_x!wk@x zn*9dTIl?_uE!yeZ08Bvzc3H)C!I|2Z?mSR7?3}tjfBZ^n8+B12X~KV5rlo(#sCIt$ zxD3*e2F_wy*4r0tZO{6c0s|rBi8M3ete8tLtHQ7h=_^`$!hzOCv#&meGoLIK_X^xZ ze)s8Q#LCjFa+rJ&FpfF<*q3ZBCBqGAyA!bAM#Ed1|nJ& zV5D;$kTtrriJcczrb*p%o=|#TB`(ZXhc=t7#;VVNP|TRR`m2xWAlz9H``YV?;Ju7< zZqpr$ny(xpLYs81DbY$m$KZS%rF+TVtWvblLa-*2xQ!{mBTMISq)lJPkCFGy-ZhU- zsFSL8V&A_`S6S~A z^h>^#9=*+*IYQ63pFv(G-P;meG~?2Ygsz0HZMRIyrd9n}Lo?yA zcMC|@R3(GMH3pig@Iu~;NaUKg0>YwlvxD?^$>-H9o$NK|MEeQM47&PBLc!AC{Pcd$ zhqdE1i6#~IAPvNdMeptjB+E$GKx4y?9CY@g=ux56inpk8chsYPq=MXQtZo|JOOcoQ zKPHT~&toZ%KT851Q#^{YK2#MvAB$dTHAV(nz%2GxDI^ho7K|b6zN4p|_!W~AfM%U% zp1ktS_LVQzuLCQi=2g*1{TnE4fI1iG8=WBT!7v5O*8aiY^@c534|Ra#nowlh4e`e1 zk!~3n16PKwMz})WOF6KIImPG;Sd{P1!v@QBCMRo3-R3bW5y36+P`F0I*Pp&J5J%UU z&$yo31f{s$qgn05km8)op!M@1bde-&e@Vsp94|6IVQrjw?g`|xX{^*G4+O4wPw3ht z=qXK!5O;?YEFFzg`QFTXy#|V2sE*-;G*0FTd?&(znN)yT&w5E;u}^Mg6l0+- z+6yV;VXfPrCi&78j?)_*F+&hHY4Kfx`?xP9tWta4F2rsvjvr&LUwAb%f-WK)^X5G7 zz;`P9!-VV%$PxCo^)fqEG-t}|to1VJYi$R^_VhO$qkK*7k5^&fdo^Jv!Yxk@sYj?n z=T?q@39k5Q?enI}Q^-MlP5d$lkqA_mhb&S(c#}d>?~3a_?08db!E*RliRoy;uKNxrRm`#Urk6nE?4)liD(Dyd~QXrIdk{mlUi*ZA<}hO<+!O0d^Z0 zzB7Ur5|AKBa;MowlH2Mu3?)g zDRs@d-^efDEP0_HUvxivY$E!|_WM5wbCtz1U_%zjAud%ogjkh)W{5+N7wS&6cbv~> zT5vtbk07cxU(>;<0)z?9blr*hzCZnMZFELmB+nr!yebAIqOh5w^&c1czK9%@-yZ`) zfrT8Y&)gSm=e0mcmR>Jc0Wg2^%F7bKkK@*Bp!L$N$PjPh;Eyv1bB6>h*n5r3tr_t7 zJNB?8*`n?d?LyeunEGgaf#E$hpcoD=;e@^va#Ffzzwf%(kZW%j5d&WsxNx z)3{30=DF>Uz&(MRECENmFn%r?A4#NYsDDlW^5T(Hkm*syZ$(0L*tvw?{H?sK)Ll6z zjj`s?4co2U+Ts?kdu{9Gj@p5K@J*WryLl#{7vy44G#A(WcIJjIV}5s`T)>?u(G@N; z{;%h?D(#8RCXAZ4o7oU7Wa-F+hj2sGJl%=KKn`YWG z{c}Ckn6Zw#>U(P>D`qaKp*l0Z0QT_r9@c4ha>^F2Sa0V z&C+l~XMkapiffkukQ=sDbW+z>t2T!cYhU&p(dKs;F=t@ zpFOoIVs2S23Ob3UK2cF_HtZ!-v|DYbj$`1OZYwHC)A^ZocFzrX9gOVx4 zy!8!7zu(GK1g@@A=yvTUT#@F)x`{%8XSMU?1v6$iWNLfh06n+VNS%-~6PY2JQ%}s{ z3zZt17eVx5Gh7^#vqvh?jLS*Gk?uqs7*Z! zim2<-gC9bA98XD%a2ve{tz`KE>}1AV;K=(MAY6{h3$*fOJ9isuXRq(&3+YOPrOb`f zZ!Y8P#DAi!1nj6!d;)@!2>{dBzg3Gcn)XSvfWq7u1r2vgg*ql`GcWx{fi@^yN?+~mMAkJC>z(nQ% zI};-`>j?Za9B33;5UK`owg=gYtgxF>7P=k*?dJ)+hV?E9fRV`^YLCwQ3f6iF%r9;< zzaq&D1u__sea12QrR*33?&)(NTcIlUz8=~4M)M@rtK;GnPoh4VmZ-1E!Uex;EQc#Y zwG6*aU^k4N6I=F5)%8MS9<5Pp@Kq9dpTJ*+>4idOIKwo+sTkM>i&>A*?Z%9JEQbY` zaXw1|;BJ_#I;Tt^UmUe=R|=+l$hk3zkVw9K8$Vm8{*DgcPi+9;nXKlVdJ8aNpN@lq zj3#$M1=t7ef0YKnY`gI$lj;b@A1uxc`1=Yhm}e?o#41)+!&+w%3}Q^+gDB18Qhg~F zY!<^%643U@Pqc(}SXB8edSxG>z+x0+Vnjc3CrCzw@*)S9WqTdO>auO#Ro$()!i%HU zUF-xYq(H<)I(nQlaaqN-bZ`HyCC58Z#$I{k=8%do3m}s3troEC+6bp9C9W4#C7LE^ zD&AqSqxR4I4liz#f)(iTOL+0nfL2H3dB;YXY_=8${9nmGm5F^Rz`%9hgV}%*c7EAe z#mMxpaZtV4_@xGR-Doxz7YVgwoIZ-(fr8aVLcp*0)6_|m4OvE*cA*x>sz>0z6>C9* zDa$f{Mz0tE&RD8cXdmmBvg%RdzQrwhq{Q6k&5fpx63Q)BiHlnj?y%T+_@MKPz61LK zS-`>LkM|Y4o)w>B$dO5pCrE{H6=Yl#fBjOB9kMWa(8&yaSaoOjRmyOZFL=YfG*tgeqbSeOMf9RH-7mcr`_nH|83l%eXfecP)npc%0?QJyk? zFA0G0z`T>~4@VnreIS{rX%$E+rquaOowG>H)b#xEwST^+lUGK_cP4DTItjVi;ju@Fgdy&h))OZ#7d%)2yDP>-{jzbe>9PXdq#IPRxjuQpv} zGKwj@m}_(<3k~3))8W%%)1&NA>#7En9D&)O9w&giIs#9=iR%qk)j8YCK!l$diGj#s zS9M{;(&PS!fh<1aNfWFdVdQ>m=go|jwS`#>DA-rAc6_CJUie=wJQy{>_V50$A%W;j+(S)}r4>JmPQ{kG#;=Tay-a2i z%7fcu>|Esk>_Z?&ulwYXk@(GJ8dFH3z#UMP0Iq;6YVIo(VAni?Rmm@GsNBqC#PpU8 z`fyiX+Vp?;&sG8_t*!w|#bT&2LOj4!%oz1!x~rgBC!$|!x0lYp3aFs%iX4Eo%Bu7% z*f<7D-z0n*OM=3P3}DjrooqI>e&`mTGrQp z5%fkh5m%5w+WQn_b(kydHf*N|XZ`Q+n_?v G8T%ivgO0cW literal 0 HcmV?d00001 diff --git a/static/assets/icons/auth/auth-divider-knot-v1.png b/static/assets/icons/auth/auth-divider-knot-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7774e55a17a850141584f2ebdaeaf8b769de27 GIT binary patch literal 6751 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 U@hdOvKPiN!qM#vPD{C3{KTd}~5&!@I literal 0 HcmV?d00001 diff --git a/static/assets/icons/auth/auth-title-cloud-v1.png b/static/assets/icons/auth/auth-title-cloud-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..a93f82e66be89fb26db3ef5888cfe93531dee7e4 GIT binary patch literal 15833 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 literal 0 HcmV?d00001 diff --git a/tests/a01-a02-ui-contract.ps1 b/tests/a01-a02-ui-contract.ps1 index b787331..825850c 100644 --- a/tests/a01-a02-ui-contract.ps1 +++ b/tests/a01-a02-ui-contract.ps1 @@ -88,25 +88,43 @@ foreach ($requiredVisualAnchor in @( 'margin-top: 98rpx', 'margin-top: 141rpx', 'top: 70rpx', - 'width: 56rpx', + 'width: 64rpx', 'inset: 6rpx', 'entry-button__content', 'translateX(-20rpx)', + 'auth-button-corner-v1.png', + 'auth-divider-knot-v1.png', + 'auth-title-cloud-v1.png', + 'button-corner-asset', + 'align-items: center', + 'white-space: nowrap', 'font-size: 20rpx', 'width: 30rpx', 'height: 30rpx' )) { Assert-Contains -Content $entry -Expected $requiredVisualAnchor -Message "Missing A-01 calibrated visual anchor: $requiredVisualAnchor" } -foreach ($rejectedVisualConstruction in @('link-line', 'button-corner', 'class="auth-button primary-button"')) { +foreach ($rejectedVisualConstruction in @('link-line', 'button-corner--legacy', 'class="auth-button primary-button"')) { Assert-NotContains -Content $entry -Unexpected $rejectedVisualConstruction -Message "A-01 retains rejected visual construction: $rejectedVisualConstruction" } foreach ($forbiddenClass in @('entryGuideVisual', 'guide-art', 'entry-hit', 'width: 750rpx', 'min-height: 1625rpx')) { Assert-NotContains -Content $entry -Unexpected $forbiddenClass -Message "A-01 must not render the whole design image with $forbiddenClass" } -Assert-Contains -Content $entry -Expected '/static/assets/icons/action/create-cloud-v2.png' -Message 'A-01 title and divider must use the local auspicious-cloud asset' +Assert-NotContains -Content $entry -Unexpected '/static/assets/icons/action/create-cloud-v2.png' -Message 'A-01 must not reuse the mismatched create-cloud asset for its title or divider ornaments' Assert-Contains -Content $entry -Expected 'filter: brightness(0) invert(1)' -Message 'A-01 primary login icon must render in white' Assert-NotContains -Content $entry -Unexpected $dividerGlyph -Message 'A-01 divider must not use a text glyph as ornament' +if (([regex]::Matches($entry, 'button-corner-asset button-corner-asset--')).Count -ne 8) { + throw 'A-01 must render the generated ornamental corner asset in all four corners of both entry buttons' +} +if (([regex]::Matches($entry, 'auth-divider-knot-v1\.png')).Count -ne 2) { + throw 'A-01 must render the dedicated divider-knot asset above and below the subtitle' +} +if ($entry -notmatch '(?s)\.agreement-row\s*\{[^}]*align-items:\s*center') { + throw 'A-01 agreement checkbox and copy must align on one horizontal center line' +} +if ($entry -notmatch '(?s)\.agreement-copy\s*\{[^}]*white-space:\s*nowrap') { + throw 'A-01 agreement copy must remain on a single line' +} if ($entry -match '(?s)\.auth-page\s*\{[^}]*overflow\s*:\s*hidden') { throw 'A-01 must allow vertical scrolling on small screens' } diff --git a/tests/a01-asset-alpha-audit.ps1 b/tests/a01-asset-alpha-audit.ps1 index d872d6d..6e710d6 100644 --- a/tests/a01-asset-alpha-audit.ps1 +++ b/tests/a01-asset-alpha-audit.ps1 @@ -10,7 +10,10 @@ $backgrounds = @( ) $icons = @( 'static/assets/icons/auth/login-outline-v1.png', - 'static/assets/icons/auth/wechat-licensed-v1.png' + 'static/assets/icons/auth/wechat-licensed-v1.png', + 'static/assets/icons/auth/auth-button-corner-v1.png', + 'static/assets/icons/auth/auth-divider-knot-v1.png', + 'static/assets/icons/auth/auth-title-cloud-v1.png' ) foreach ($asset in $backgrounds + $icons) { @@ -37,7 +40,13 @@ foreach ($asset in $icons) { } $bitmap.Dispose() - if ($width -ne 96 -or $height -ne 96) { throw "$asset must be 96 x 96px." } + $expectedSize = switch ($asset) { + 'static/assets/icons/auth/auth-button-corner-v1.png' { @(160, 160) } + 'static/assets/icons/auth/auth-divider-knot-v1.png' { @(160, 96) } + 'static/assets/icons/auth/auth-title-cloud-v1.png' { @(200, 120) } + default { @(96, 96) } + } + if ($width -ne $expectedSize[0] -or $height -ne $expectedSize[1]) { throw "$asset must be $($expectedSize[0]) x $($expectedSize[1])px." } if (($corners | Where-Object { $_ -ne 0 }).Count -ne 0) { throw "$asset has opaque outer corners." } if ($visiblePixels -lt 80) { throw "$asset has no usable visible artwork." } Write-Output "PASS $asset transparent corners and visible artwork"