Skip to content

Conversation

@petkybenedek
Copy link
Contributor

@petkybenedek petkybenedek commented Nov 21, 2025

What's new

This PR adds support for the new Liquid Glass look and feel.

Approach

  • Custom toolbar colors are removed. They interfere with the Liquid Glass effect on toolbar elements.
  • Migrating to the new, system-provided navigation subtitle.
  • Removing custom split-view full-screen button, since there is a system provided one.

Implementation

  • Previously we used a custom implementation for navigation subtitles, but iOS 26 introduced a native way. Until we drop support for iOS 18, both the custom and the native implementation is used. This is the reason of the many iOS version conditions, which comes with the cost of code duplication, but only until we can delete the old custom implementations.
  • If more serious changes were needed for the new design, instead of many conditionals, I introduced "legacy" versions of properties, structs etc. In this case, the legacy version is exactly the same as before, with a deprecation warning and a message that indicates the existence of the non-legacy version. There's also a warning for the non-legacy versions. It's important to check and test both versions when making changes to either of them until we drop support for iOS 18, and remove the legacy versions.

Test plan

  • Verify that no screen has a custom toolbar color.
  • Verify all toolbar button icons are visible.

Screenshots

BeforeAfter

refs: MBL-19382
builds: All
affects: All
release note: Added support for Liquid Glass

Checklist

  • Follow-up e2e test ticket created
  • A11y checked
  • Tested on phone
  • Tested on tablet
  • Tested in dark mode
  • Tested in light mode
  • Approve from product

refs: MBL-19382
builds: All
affects: Student, Parent, Teacher
release note: Redesigned toolbars for iOS 26.
refs:
builds:
affects:
release note:

test plan:
# Conflicts:
#	Core/Core/Features/Assignments/AssignmentList/View/AssignmentListScreen.swift
#	Core/Core/Features/Dashboard/Container/View/DashboardContainerView.swift
#	Core/Core/Features/Grades/View/GradeListScreen.swift
#	Core/Core/Features/Planner/CalendarToDo/View/CalendarToDoDetailsScreen.swift
refs:
builds:
affects:
release note:

test plan:
@instructure instructure deleted a comment from claude bot Jan 6, 2026
@instructure instructure deleted a comment from claude bot Jan 6, 2026
# Conflicts:
#	Horizon/Horizon/Sources/Features/HorizonTabBar.swift
#	Horizon/Horizon/Sources/Features/HorizonTabBarController.swift
@instructure instructure deleted a comment from claude bot Jan 9, 2026
@instructure instructure deleted a comment from claude bot Jan 9, 2026
@instructure instructure deleted a comment from claude bot Jan 9, 2026
@instructure instructure deleted a comment from claude bot Jan 9, 2026
@petkybenedek petkybenedek requested a review from rh12 January 12, 2026 16:12
known issues: testEditCalendarTodoItem, testTodoListAndFilterFlow
@claude
Copy link

claude bot commented Jan 13, 2026

Claude Code Review

Updated: 2026-01-15

Critical Issues Found

  1. Logic Error - UINavigationBarExtensions.swift:38

    • Guard statement: guard let color, #unavailable(iOS 26) else { return }
    • This returns when iOS <26 AND color exists (inverted logic)
    • Navigation bar context colors won't be applied on iOS <26 when they should be
    • Fix: Separate the conditions into different guards
  2. Nil Crash Risk - DashboardContainerView.swift:125

    • navButtonView can remain nil after fallback check (line 120-123)
    • Sets popoverController.sourceView = nil without guard
    • Will cause popover positioning failure on iOS 18+
    • Fix: Add guard let navButtonView else { return } before assignment
  3. Force Unwraps - Brand.swift:129-158

    • buttonPrimaryText!, buttonSecondaryText!, etc. force unwrapped without nil checks
    • Crashes if nil values passed despite preceding optional bindings
    • ensureContrast() method called on potentially nil colors
    • Fix: Use optional binding or nil-coalescing operators

Context

  • 221 files modified spanning iOS 26 redesign affecting UI across all apps
  • Code compiles successfully (CI passing)
  • Deprecation pattern with legacy versions is correct

❌ Issues found

@instructure instructure deleted a comment from claude bot Jan 15, 2026
@instructure instructure deleted a comment from claude bot Jan 15, 2026
@instructure instructure deleted a comment from claude bot Jan 15, 2026
@instructure instructure deleted a comment from claude bot Jan 15, 2026
@instructure instructure deleted a comment from claude bot Jan 15, 2026
@instructure instructure deleted a comment from claude bot Jan 15, 2026
return controller
}

public override func viewDidLoad() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The separators in the UIKit list screens (Discussions, Quizzes, etc.) are doubled on iOS 26 (they are normal for 18 or before this PR)

Copy link
Collaborator

@vargaat vargaat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The swipe to back gesture inside a course sub menu (assignment, pages, etc) is really hard to perform on my 26.2 iPad.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants