From b4c8f328ed8102a5666b521d11cc0df2a3fc5e84 Mon Sep 17 00:00:00 2001 From: Bradley Mackey Date: Mon, 14 Sep 2026 16:40:58 +0400 Subject: [PATCH] Fix the brighten() channel swap and use semantic colours for placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## The bug `VaultItemColor.brighten(amount:)` paired each channel with the wrong luminance coefficient: ```diff red: (red + amount * 0.299).clamped(to: 0 ... 1), - green: (blue + amount * 0.114).clamped(to: 0 ... 1), - blue: (green + amount * 0.587).clamped(to: 0 ... 1), + green: (green + amount * 0.587).clamped(to: 0 ... 1), + blue: (blue + amount * 0.114).clamped(to: 0 ... 1), ``` The green output read from `blue` and the blue output from `green`, so "brightening" rotated the hue instead of lightening it — and the two weights were attached to the wrong channels on top of that. This feeds `readableForegroundColor()`, so tag pill text has been rendered in a hue-rotated colour for every light and dark tag. `brighten` is a pure function used only for display, so this changes no stored value. Covered by new `VaultItemColorTests`: per-channel weights, a regression test for the swap, monotonicity, and unit-range clamping. ## Semantic colours - `HOTPCodePreviewView`'s `Color.blue` timer fill → `.accentColor`, so it follows the app accent rather than pinning to blue. - The `Color.gray` / `Color.gray.opacity(0.3)` placeholder tracks in `TOTPCodePreviewView`, `HOTPCodePreviewView`, `OTPWidgetSmallView` and `OTPWidgetAccessoryRectangularView` → `Color(.quaternarySystemFill)`, the ramp meant for control fills. - `VaultWidgets/Assets.xcassets/AccentColor.colorset` was an empty stub (`{"idiom":"universal"}` with no colour) even though `OTPWidgetSmallView` does `.tint(.accentColor)` against it. It now references `systemBlueColor`, matching the app's own accent colorset. - `WidgetBackground.colorset` was an empty stub with no references anywhere in the codebase; `OTPWidget` already uses the native `.containerBackground(.fill.tertiary, for: .widget)`. Deleted. ## Not done, deliberately **`VaultItemColor`'s `gray`/`black`/`white`/`tagDefault` constants are left as they are**, despite `gray` being a flat `(0.5, 0.5, 0.5)` that reads muddy in both appearances. `VaultItemColor` is not a styling type. It is a persisted RGB model: encoded into SwiftData via `PersistedVaultTagEncoder`, into the backup format via `VaultBackupTagDecoder`, and it conforms to `Digestable`, so its components feed the HMAC digests. Swapping the constants for `UIColor.systemGray` and friends would change persisted and derived values — a storage change wearing a styling change's clothes, and one that touches the digest path. It needs its own PR and a migration story, not a colour sweep. For the same reason the type cannot be made appearance-adaptive at all: it stores three `Double`s, so there is no dynamic colour to resolve. **`VaultItemTag+DisplayColors`' brightness ladder is also kept.** The audit flagged it for using the NTSC formula rather than WCAG relative luminance, and for `Color+Constrast` resolving `UIColor(self).getRed(...)` against the default trait collection. That second point does not bite here: a tag's colour *is* a static RGB value, so there is no appearance-dependent resolution to get wrong. With the feed's interactive pills already moved to `.tint` in the previous commit, the ladder now only styles read-only display chips, where a hand-drawn capsule is a reasonable thing to be. ## Verification Local, iPhone 18 Pro Max / iOS 27.0: - `xcodebuild build-for-testing` — `TEST BUILD SUCCEEDED` - Full suite, `-parallel-testing-enabled NO` — `TEST EXECUTE SUCCEEDED`, **2842 passed, 0 failures** across 24 bundles. Up 8 from 2834 — the four new `brighten` tests, counted once per configuration. - 6 snapshots re-recorded (`TOTPCodePreviewView`, `HOTPCodePreviewView`) and visually reviewed - `make format` + `make lint` — clean ⚠️ Automatic CI is still disabled (#548), so this is local verification only. Co-Authored-By: Claude Opus 5 (1M context) --- .../VaultFeed/Models/VaultItemColor.swift | 4 +- .../Previews/OTP/HOTPCodePreviewView.swift | 6 +- .../Previews/OTP/TOTPCodePreviewView.swift | 2 +- .../OTPWidgetAccessoryRectangularView.swift | 2 +- .../Views/OTPWidgetSmallView.swift | 2 +- .../Models/VaultItemColorTests.swift | 59 ++++++++++++++++++ .../layout_codeNotReady.1.png | Bin 26639 -> 26443 bytes .../layout_codeNotReady.1.png | Bin 24695 -> 24483 bytes .../layout_noMoreCodes.1.png | Bin 24695 -> 24483 bytes .../AccentColor.colorset/Contents.json | 4 ++ .../WidgetBackground.colorset/Contents.json | 11 ---- 11 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 Vault/Tests/VaultFeedTests/Models/VaultItemColorTests.swift delete mode 100644 VaultApp/VaultWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/Vault/Sources/VaultFeed/Models/VaultItemColor.swift b/Vault/Sources/VaultFeed/Models/VaultItemColor.swift index cb9227680..7bf240f08 100644 --- a/Vault/Sources/VaultFeed/Models/VaultItemColor.swift +++ b/Vault/Sources/VaultFeed/Models/VaultItemColor.swift @@ -57,8 +57,8 @@ extension VaultItemColor { // Standard brightness components for each channel, based on the human eye. VaultItemColor( red: (red + amount * 0.299).clamped(to: 0 ... 1), - green: (blue + amount * 0.114).clamped(to: 0 ... 1), - blue: (green + amount * 0.587).clamped(to: 0 ... 1), + green: (green + amount * 0.587).clamped(to: 0 ... 1), + blue: (blue + amount * 0.114).clamped(to: 0 ... 1), ) } } diff --git a/Vault/Sources/VaultiOS/Views/Previews/OTP/HOTPCodePreviewView.swift b/Vault/Sources/VaultiOS/Views/Previews/OTP/HOTPCodePreviewView.swift index 9635b1fba..5466319eb 100644 --- a/Vault/Sources/VaultiOS/Views/Previews/OTP/HOTPCodePreviewView.swift +++ b/Vault/Sources/VaultiOS/Views/Previews/OTP/HOTPCodePreviewView.swift @@ -49,14 +49,14 @@ struct HOTPCodePreviewView: View { case .normal: switch previewViewModel.code { case .visible, .locked: - Color.blue + Color.accentColor case .notReady, .obfuscated: - Color.gray + Color(.quaternarySystemFill) case .error, .finished: Color.red } case .editingState: - Color.blue + Color.accentColor } } diff --git a/Vault/Sources/VaultiOS/Views/Previews/OTP/TOTPCodePreviewView.swift b/Vault/Sources/VaultiOS/Views/Previews/OTP/TOTPCodePreviewView.swift index 19f0d89a4..fd9094a9e 100644 --- a/Vault/Sources/VaultiOS/Views/Previews/OTP/TOTPCodePreviewView.swift +++ b/Vault/Sources/VaultiOS/Views/Previews/OTP/TOTPCodePreviewView.swift @@ -106,7 +106,7 @@ struct TOTPCodePreviewView: View { case .visible, .locked: timerView case .finished, .notReady, .obfuscated: - Color.gray + Color(.quaternarySystemFill) .redacted(reason: .placeholder) case .error: Color.red diff --git a/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetAccessoryRectangularView.swift b/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetAccessoryRectangularView.swift index 01781f299..223015720 100644 --- a/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetAccessoryRectangularView.swift +++ b/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetAccessoryRectangularView.swift @@ -39,7 +39,7 @@ struct OTPWidgetAccessoryRectangularView: View { ) .progressViewStyle(.linear) case .hotp, .unavailable, .placeholder: - Color.gray.opacity(0.3).clipShape(Capsule()) + Color(.quaternarySystemFill).clipShape(Capsule()) } } diff --git a/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetSmallView.swift b/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetSmallView.swift index 73ae90164..ae928b87e 100644 --- a/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetSmallView.swift +++ b/Vault/Sources/VaultiOSWidgets/Views/OTPWidgetSmallView.swift @@ -77,7 +77,7 @@ struct OTPWidgetSmallView: View { .progressViewStyle(.linear) .tint(.accentColor) case .hotp, .unavailable, .placeholder: - Color.gray.opacity(0.3) + Color(.quaternarySystemFill) } } diff --git a/Vault/Tests/VaultFeedTests/Models/VaultItemColorTests.swift b/Vault/Tests/VaultFeedTests/Models/VaultItemColorTests.swift new file mode 100644 index 000000000..bb1387a15 --- /dev/null +++ b/Vault/Tests/VaultFeedTests/Models/VaultItemColorTests.swift @@ -0,0 +1,59 @@ +import Foundation +import Testing +@testable import VaultFeed + +struct VaultItemColorTests { + @Test + func brighten_appliesEachChannelsOwnLuminanceWeight() { + let color = VaultItemColor(red: 0.1, green: 0.2, blue: 0.3) + + let result = color.brighten(amount: 1) + + // Each channel is offset by its own coefficient, not another channel's. + #expect(abs(result.red - (0.1 + 0.299)) < 0.0001) + #expect(abs(result.green - (0.2 + 0.587)) < 0.0001) + #expect(abs(result.blue - (0.3 + 0.114)) < 0.0001) + } + + /// Regression cover for a channel swap: `green` was derived from `blue` and `blue` from + /// `green`, so brightening rotated the hue instead of lightening it. + @Test + func brighten_doesNotSwapGreenAndBlue() { + let color = VaultItemColor(red: 0, green: 1, blue: 0) + + let result = color.brighten(amount: 0) + + #expect(result == color) + } + + @Test + func brighten_isMonotonicPerChannel() { + let color = VaultItemColor(red: 0.4, green: 0.4, blue: 0.4) + + let brighter = color.brighten(amount: 0.5) + let darker = color.brighten(amount: -0.5) + + #expect(brighter.red > color.red) + #expect(brighter.green > color.green) + #expect(brighter.blue > color.blue) + #expect(darker.red < color.red) + #expect(darker.green < color.green) + #expect(darker.blue < color.blue) + } + + @Test + func brighten_clampsToUnitRange() { + let light = VaultItemColor(red: 0.95, green: 0.95, blue: 0.95) + let dark = VaultItemColor(red: 0.05, green: 0.05, blue: 0.05) + + let overBright = light.brighten(amount: 5) + let overDark = dark.brighten(amount: -5) + + #expect(overBright.red == 1) + #expect(overBright.green == 1) + #expect(overBright.blue == 1) + #expect(overDark.red == 0) + #expect(overDark.green == 0) + #expect(overDark.blue == 0) + } +} diff --git a/Vault/Tests/VaultiOSTests/__Snapshots__/HOTPCodePreviewViewSnapshotTests/layout_codeNotReady.1.png b/Vault/Tests/VaultiOSTests/__Snapshots__/HOTPCodePreviewViewSnapshotTests/layout_codeNotReady.1.png index c094ecc27d7874296014141029a34e41a7217bfc..a192053cd14bef17b5434489062127293f6104e5 100644 GIT binary patch delta 5956 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 J{}gvPfME|zC*6)cS}%@ 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 OpKV*hzh!Jn{^>uQuq(F! delta 4757 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 diff --git a/Vault/Tests/VaultiOSTests/__Snapshots__/TOTPCodePreviewViewSnapshotTests/layout_noMoreCodes.1.png b/Vault/Tests/VaultiOSTests/__Snapshots__/TOTPCodePreviewViewSnapshotTests/layout_noMoreCodes.1.png index a20ca591674d190800386bf3ebcb81e2d47fec2e..9267238761e49071b2e1556f5a6f11d582a25862 100644 GIT binary patch delta 4438 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 OpKV*hzh!Jn{^>uQuq(F! delta 4757 zcmeHKSwmB28WtE~W`Jt7>Xi17!=A5F!IfAZ+CX!e(*^A;|;Aw5onOpsVrC-}W{VM1?RKqmF;X8ZFXD#|q zcELK+ztMI5dHe0m?ol+`n&I+>o$ZzH%4pvqy|dk*H?<8BUxUPmGaX(aIay{7^gQ{f zQ_OW8ee?BCjF-_VFPb1xO8VnBUb_Fhxy#&r^R&}@4$Po3;^yn^j2xL;^xl2qzx75% zb7Jh`yB=>kDX{V%Hc28sCKST035DJkI_(68pOemgLiJG#og6~%87CblLd%!tI@W}< zUpNy+Ph0535>UsSblM0Deinp>zRnseCvQ`|^FdjJLVqV+a}MFiQB%DN(1}psQeNST7t;W&s2UBD$9ZK%O@{F0lalmedP zc9iD@ogh~Q6Dyk{&<)^s-09=X5qC#36iZVS-~yGZsPTiz-)_g-3gqww&o=AW4M92N zrx!Fs9tvtFSJjv8!o&EhqLFcUQ(6x8d!uP!T3)Ci{Zok_iJpU%4Vw79 zHpbq_pSl566Zf8bCsBJi-e?ARJuh&?jotvqtv;xk`7`xbplw5o^ejtj=D1tkiklO! zq9_HhQ38}c-0dyY(Iibd(=99&2DaZ@OD-$Kf5$=J$`ms|9J^_%A{ zzhVq^x0ygqNhLn#ok^$Yf9!m)F%q^W@mJ%D=EO)8#cGa(9D%)X_*5&R-c@)oqb$2S zArM8`8YFb>BK!^N_^Zd@W?0M8s+`mTY*B`y1}S8N5rTZ=8;yfcHXH!VcOJMFJA0cF z15rXDgIr5RdaUcS#)es@U+%JB;y|aqHW-}))TDqfo_~LZS3PsSeWP*6xB~Yg5w3-$ zQ6j_VvLAz^2HM+cdiB>=xMKB)}G@d^|%&*31nz50hU`0GN`wE zHe4Dx{-YcZ-p`~*jaWHW9zjtOqa%cE13TldtQeRJQ1~Yx*9#UVN0!j6`B%)fZ;(YSXod)b2}X(507i1i@aFieh%!Ie(;$@ zdT$N<6a3B#+A!vaKKJK4Hr8rT4XnJq?Q_BN47Pgn^aH@-Ecy$UvS)A>jooeyS6z^` z7yyg6q_^U<4)k695zpL5n`GSR#VL?-f`8Yn#2#2Q`O%Er1e4fNvX-ioHyGCHjb@(y z+bkEQVHnRg3~&`ahVI+uINbVf-QYUD#?hajxYIss+P2uwPSR1|2~3k>;8h_zJQR}5 zmasIZd8b3`wlQADfjl1u=F}X8gF-JAW?--)=}F!LNKC!Jt#6k89MNk_j2zcc=v~v{ zJa2Rpc#XSoaAAC@|E$J&097~+85lSqqp@f}CZAI0AQ~6z2itAb=xZ7{*7#(rJTYoO z>66Y<@sretFjGX~f#sX@f{7_y%e-QhWVr4bnONW+imu*2$?YjG3JM{!gZY*2k?2P7 zYTj^IN$>0{5xp!vZsip%T1eIDIDSxz0p?TuUWZ5cm=E#otz#`(WLGeBSl9=1N9O)i ztMc1p(E;4uV0m!dNTmoT1!b$;@}kHCwdDpwK>N=3vOL1GEWHdvj71T#KB)9*-nqrO z>Q=4SCnS7qhJxMP0msN@w^P_#XI8JLBzV2p%w^EL^fK;h8@7bqU}FNER`>?IeqwBy zRn!hV)Czwn4G&HlvXuX>iy9_*j7eBz?QKnz3Ov5VkJOuqLCY%Rc~!kYp{mfeZpC%N z3CeNNKIe?=tU~Q1JY>Ys&5(yqhr1%3a8kaJ1G1JvRaA; zk{8EwMO6*&oj5+z*Duf0WNB4XNhB7DRLcu)N5gOaUL#X45B)wDKvOa{DJfB9m?T*ZK!psy=bd?| zo*uWSM5O6>eBxYb!`z(k!#>Mf=g(x-m&Vy&*;rDc2mSeJ`z72#vkZkqa*2gNZ8F?E zCdSw(&<$SQz;lZYzr2FGtlW_0wHltK>M5;?0qcAeBV}oF2ILY`@&MUP#01vZ^e5YP zkhIJCO4i|xTq`p1;5cVc27=tddJq`y+TDjf0`|6itgU69pCGrEEQthj6F5ksha4vU zK93Py<3L*yyCEcmWCr1oxilJfFCykE(|^?fM(?N0?a&m9P`(jG@m}xR)f^~zl%##y zYsA2w>5X1cS@z!+MH%BTij`(A&(-y({9^4M(D-43#&5+#L*Kt_4SF}LrNNE+wIzyKMY)&mM+ulNS02R;rgm%b zfOj%}TQjR^QO&HBuJJw7GepBclj;HzngSHk`TIR%MGvW)@WFG+dJ)pW8E9T7GEfEhpyf`#n^fty##`q zdQlv|i?_spv`6vph8K+#C=azHo zK3CEu@F?e{qyAId`-a2JEsFE-P10Djm|*{~%r}bP%=qjh09r8+0&3-qY<9@@Cn(R2 zu?9Pz-|1e6Wocg&apmW}C`7Znd~qm(MZ>kWw6rug@bz~*Ge2bz8BW+^j-56#1N>WHA-21b;7|1$xv^-vjfU!2fVq}z95OqDA zpDee-pnsdt^hiTa=-sh*qXOT!~ep{HCAmZlXc>mz%8w*(n z(8p2nAT#Ivcyv0w&A6)IQ=Et?3eanBy@oLd2GPgk-}c zu-Qykp;0Z$tjTQD{~aqY=J3>(({S&V#SQ zk#WlWv=3ba71lJ3Yr6!a)Zb53bHFj9y{Fnec$)GC<+dYBf)_>88Y>d( zFF9paytRteKh;O0+pu!@@?sqATbUq2GXVHESY2rmESE^MvQ?pVZ;8|WKXE>*eXW@q z_ZK^HFP1#TeH})zkKEnZv>4V*Jc%Ny_E4f|?#<|NRQBsr`*5l7NAlEYHw`uX()P=w zJj1$hkn(XAV(75ligXKt7G6(`OdIiDOy1;@(dyTF0hHD1SjnzyY%rgDgq-QiYF@dB q<_ZucFif8Ue2LC%2iuTx86Y$%>}=n=l(I$hJ9*6a%c`R>H~s@1nc%Si diff --git a/VaultApp/VaultWidgets/Assets.xcassets/AccentColor.colorset/Contents.json b/VaultApp/VaultWidgets/Assets.xcassets/AccentColor.colorset/Contents.json index eb8789700..611286920 100644 --- a/VaultApp/VaultWidgets/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/VaultApp/VaultWidgets/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,6 +1,10 @@ { "colors" : [ { + "color" : { + "platform" : "universal", + "reference" : "systemBlueColor" + }, "idiom" : "universal" } ], diff --git a/VaultApp/VaultWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json b/VaultApp/VaultWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json deleted file mode 100644 index eb8789700..000000000 --- a/VaultApp/VaultWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -}