Skip to content

feat(ui): macOS 26 Liquid Glass redesign and first-launch flow - #8

Merged
bendns merged 3 commits into
mainfrom
feat/liquid-glass-ui
Oct 20, 2026
Merged

bendns merged 3 commits into
mainfrom
feat/liquid-glass-ui

Conversation

@bendns

@bendns bendns commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

UI refresh targeting macOS 26 (Liquid Glass), with a friendlier tone throughout.

Changes

Platform

  • Deployment target raised from 13.0 to 26.0. CI and release runners move from macos-15 to macos-26, because the Liquid Glass APIs need the macOS 26 SDK. If the PR's CI fails to find that runner, this is the line to look at.
  • ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME was never set, so the orange AccentColor asset (the brand color in the README cover) was ignored and the UI fell back to the system blue. It is now wired up.
  • The build has no warnings at the macOS 26 SDK. Removed: deprecated Text + concatenation, activate(ignoringOtherApps:), single-parameter onChange, and an unneeded nonisolated(unsafe).

Popover

  • A countdown ring around the posture icon, with symbol transitions and a bounce when the posture changes. These replace the scale pulse.
  • Glass prominent primary action, plus glass Snooze, Skip and Pause buttons in a GlassEffectContainer.
  • A "Standing today" card with progress toward a 3h daily goal (Presets.dailyStandGoal).
  • Status lines that use the schedule, e.g. "Enjoy lunch · back at 13:00", "Your day starts at 9:00", "Done for today. See you tomorrow!".
  • Per-second updates are limited to two TimelineViews.

First launch

  • New welcome window in three steps: intro, then mode cards plus work and lunch hours, then notification permission.
  • Permission is now asked in context instead of at app launch.
  • Existing users are detected through the stored posture date and skip the flow.

History

  • Toolbar with the Today/This Week picker, Export and Reset.
  • Summary cards: standing today vs goal, daily average, switch rate.
  • Hover tooltips on both charts, a legend, and a labeled goal rule.
  • ContentUnavailableView empty states.
  • In the week chart, standing is now stacked first. Before, the goal line was compared against sitting plus standing.

Settings and notifications

  • A 2x2 grid of mode cards replaces the 4-item segmented control that truncated labels. The redundant preview line under it is removed.
  • The Off/Home/Office day picker from refactor(schedule): 3-state segmented picker per day #4 is kept as is.
  • Several notification wordings rotate, and the action labels are clearer.

Performance

  • The popover's per-second clocks pause while the menu bar window is hidden (onWindowVisibilityChange + PausableEverySecondSchedule). A probe showed that a plain .periodic TimelineView keeps ticking after the window is ordered out.
  • History is kept in chronological order, and date-range lookups scan back from the end instead of filtering everything.
  • Events older than 365 days are dropped at launch. This bounds memory and the cost of rewriting history.json, but CSV export only covers the last year.

Testing

  • 57 unit tests pass (added HopFormatTests, a week-bucketing test, and history ordering, range and pruning tests).
  • I rendered the popover, welcome, history, week chart and General tab off-screen to check layout. Glass button backgrounds don't appear in off-screen renders, so the glass look still needs a check on a real display.

Not changed / follow-ups

  • The app icon is still green, which doesn't match the orange brand. Changing it is a design call, not done here.
  • macOS 27: nothing here uses private or deprecated APIs or OS version checks with an upper bound, but it hasn't been run on macOS 27.

Files changed

  • New: Hop/Design/WindowVisibility.swift, Hop/Models/Onboarding.swift, Hop/Views/Welcome/WelcomeView.swift, Hop/Views/Components/ModePicker.swift, Hop/Views/Components/TimePickers.swift (moved out of ScheduleTab), HopTests/HopFormatTests.swift
  • Hop/Design/DesignSystem.swift, Hop/Menu/MenuPopoverView.swift, Hop/HopApp.swift, Hop/AppDelegate.swift
  • Hop/Views/History/HistoryView.swift, TodayChart.swift, WeekChart.swift
  • Hop/Views/Settings/GeneralTab.swift, ScheduleTab.swift
  • Hop/Persistence/HistoryStore.swift, HopTests/HistoryStoreTests.swift
  • Hop/Models/Presets.swift, Hop/Scheduler/NotificationManager.swift, Hop/Scheduler/PostureScheduler.swift
  • project.yml, README.md, .github/workflows/ci.yml, .github/workflows/release.yml

Parts of this fix were generated with Claude Code assistance.

Base automatically changed from fix/code-review-findings to main October 20, 2026 13:16
- deployment target 13.0 -> 26.0, CI and release runners macos-15 -> macos-26
- set ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME so the orange
  AccentColor asset is actually used instead of the system blue
- popover: countdown ring, Liquid Glass actions, daily standing goal card,
  friendlier status lines
- first-launch welcome flow; notification permission asked in context
- history: summary cards, toolbar actions, chart tooltips, labeled goal,
  standing stacked first so it lines up with the goal
- settings: mode cards instead of a truncating segmented control
- varied notification copy; no deprecated APIs at the macOS 26 SDK
- pause the per-second TimelineViews while the menu bar window is occluded;
  a plain periodic schedule keeps ticking after the window is ordered out
- keep history in chronological order and scan date ranges from the end
- drop events older than 365 days at launch to bound memory and file rewrites
@bendns
bendns force-pushed the feat/liquid-glass-ui branch from abd7a71 to 5a6a8b4 Compare October 20, 2026 13:17
@bendns
bendns marked this pull request as ready for review October 20, 2026 13:29
@bendns
bendns marked this pull request as ready for review October 20, 2026 13:29
@bendns
bendns merged commit 749f2e2 into main Oct 20, 2026
1 check passed
@bendns
bendns deleted the feat/liquid-glass-ui branch October 20, 2026 13:29
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.

1 participant