Add accessibility settings preferences

This commit is contained in:
Joe Julian
2026-04-01 17:43:17 -07:00
parent 6b224cfde3
commit f3ee8794c6
5 changed files with 859 additions and 371 deletions
+77 -3
View File
@@ -2671,9 +2671,9 @@ func TestUIAccessibilityLabelsDescribeFocusableControls(t *testing.T) {
func TestFieldFocusAppearanceScalesForHighDPI(t *testing.T) {
t.Parallel()
lo := fieldFocusAppearance(unit.Metric{PxPerDp: 1, PxPerSp: 1}, true)
hi := fieldFocusAppearance(unit.Metric{PxPerDp: 2.5, PxPerSp: 2.5}, true)
unfocused := fieldFocusAppearance(unit.Metric{PxPerDp: 1, PxPerSp: 1}, false)
lo := fieldFocusAppearance(unit.Metric{PxPerDp: 1, PxPerSp: 1}, defaultAccessibilityPreferences(), true)
hi := fieldFocusAppearance(unit.Metric{PxPerDp: 2.5, PxPerSp: 2.5}, defaultAccessibilityPreferences(), true)
unfocused := fieldFocusAppearance(unit.Metric{PxPerDp: 1, PxPerSp: 1}, defaultAccessibilityPreferences(), false)
if got := lo.MinHeight; got != 44 {
t.Fatalf("fieldFocusAppearance(low).MinHeight = %d, want 44", got)
@@ -2935,6 +2935,26 @@ func TestUIStatusToastExpiresAfterConfiguredTimeout(t *testing.T) {
}
}
func TestUIReducedMotionKeepsStatusToastVisible(t *testing.T) {
t.Parallel()
now := time.Date(2026, time.March, 29, 12, 0, 0, 0, time.UTC)
u := newUIWithModel("desktop", vault.Model{})
u.now = func() time.Time { return now }
u.statusBannerTTL = statusBannerLong
u.applyAccessibilityPreferences(accessibilityPreferences{ReducedMotion: true})
u.showStatusMessage("synchronize vault complete")
if !u.statusExpiresAt.IsZero() {
t.Fatalf("statusExpiresAt with reduced motion = %v, want zero", u.statusExpiresAt)
}
now = now.Add(statusBannerLong * 2)
if got := u.statusToastSurface(); got.Kind != bannerStatus || got.Message != "synchronize vault complete" {
t.Fatalf("statusToastSurface() with reduced motion = %#v, want persistent status toast", got)
}
}
func TestUIAutofillStatusSurfaceUsesPendingApproval(t *testing.T) {
t.Parallel()
@@ -3538,6 +3558,60 @@ func TestUIDenseLayoutPreferencePersists(t *testing.T) {
}
}
func TestUIAccessibilityPreferencesPersist(t *testing.T) {
t.Parallel()
configPath := filepath.Join(t.TempDir(), "ui-prefs.json")
first := newUIWithSession("desktop", &session.Manager{})
first.uiPreferencesPath = configPath
first.applyAccessibilityPreferences(accessibilityPreferences{
DisplayDensity: displayDensityComfortable,
Contrast: contrastHigh,
ReducedMotion: true,
KeyboardFocus: keyboardFocusProminent,
})
first.saveUIPreferences()
second := newUIWithSession("desktop", &session.Manager{})
second.uiPreferencesPath = configPath
second.loadUIPreferences()
if second.denseLayout {
t.Fatal("denseLayout after reload = true, want comfortable layout preference")
}
if got := second.accessibilityPrefs; got != (accessibilityPreferences{
DisplayDensity: displayDensityComfortable,
Contrast: contrastHigh,
ReducedMotion: true,
KeyboardFocus: keyboardFocusProminent,
}) {
t.Fatalf("accessibilityPrefs after reload = %#v, want comfortable/high/reduced/prominent", got)
}
}
func TestFieldFocusAppearanceUsesAccessibilityPreferences(t *testing.T) {
t.Parallel()
metric := unit.Metric{PxPerDp: 1, PxPerSp: 1}
base := fieldFocusAppearance(metric, defaultAccessibilityPreferences(), true)
comfortable := fieldFocusAppearance(metric, accessibilityPreferences{
DisplayDensity: displayDensityComfortable,
Contrast: contrastHigh,
KeyboardFocus: keyboardFocusProminent,
}, true)
if comfortable.MinHeight <= base.MinHeight {
t.Fatalf("fieldFocusAppearance(comfortable).MinHeight = %d, want > %d", comfortable.MinHeight, base.MinHeight)
}
if comfortable.OutlineWidth <= base.OutlineWidth {
t.Fatalf("fieldFocusAppearance(prominent).OutlineWidth = %d, want > %d", comfortable.OutlineWidth, base.OutlineWidth)
}
if comfortable.OutlineColor.A <= base.OutlineColor.A {
t.Fatalf("fieldFocusAppearance(high contrast).OutlineColor.A = %d, want > %d", comfortable.OutlineColor.A, base.OutlineColor.A)
}
}
func TestUIEntryRowMetricsUseDenseLayout(t *testing.T) {
t.Parallel()