Skip to content

Release v1.5.0: log redesign + iOS 17 baseline#56

Merged
tashda merged 4 commits into
mainfrom
dev
May 1, 2026
Merged

Release v1.5.0: log redesign + iOS 17 baseline#56
tashda merged 4 commits into
mainfrom
dev

Conversation

@tashda
Copy link
Copy Markdown
Owner

@tashda tashda commented May 1, 2026

Summary

Visual + functional overhaul of the Activity log surface, plus iOS 17 baseline and a small toolbar polish.

  • Activity log + log detail + Recent Events card + Group compact card all share one aesthetic now: device image (or group icon) as the leading avatar, category as a bottom-trailing corner badge, severity tints the row title, no chevrons. Log detail uses a stacked title + timestamp subtitle in the nav bar (Phone/Messages pattern).
  • Z2M attribution: bridge/response/device/... and <device>/action-style publishes now resolve to the real device/group (via payload.data.id / data.to / data.friendly_name, falling back to scanning payload.error for a known device name when responses fail). Fixed the payload extractor that was truncating JSON at embedded single quotes ('office_remote', didn't).
  • Cleaner state changes: dropped elapsed, dropped empty-string transitions, formatted filter_age / device_age as durations (4 mo instead of 177242), removed the duplicate full-payload snapshot under state-change diffs, and scoped the device-state card to actual device exposes so bridge errors show only the hero card.
  • iOS 17 baseline: deployment target lowered from iOS 18 to 17. This also clears the iOS 26 toolbar/tab-bar gap on the Logs page.
  • Toolbar polish: bulk-OTA ProgressView no longer renders smaller than the glyph it replaces.

Issues closed

Commits

  • bae5cc6 Lower deployment target to iOS 17
  • 58217be Bump MARKETING_VERSION to 1.5.0
  • 7c3ff21 Logs: redesign rows + detail, attribute bridge events, clean state changes
  • 47c38e9 Bulk OTA toolbar spinner: use default size

Test plan

  • Activity log: device images render without circle clipping; group rows show member-avatar icon; bridge OTA responses (success and error) attribute to the device, not bridge/response/...; remote button presses produce one row, not three
  • Log detail: title + timestamp stacked in nav bar; long error strings wrap fully; bridge error logs show only the hero card (no empty exposes section); state-change logs show only the diff (no duplicate payload snapshot); filter_age reads as 4 mo not 177242
  • Home page Recent Events: matches activity row aesthetic
  • Group compact card matches device compact card structure
  • Bulk OTA: spinner in toolbar is the same size as the up-arrow glyph
  • App still builds and launches on iOS 17 simulator

tashda and others added 4 commits May 1, 2026 09:37
Add `Shellbee/Shared/Compat/iOS26Compat.swift` with helpers that keep
native iOS 26 styling (Liquid Glass, minimized search toolbar, indefinite
bounce) and fall back to iOS 17 equivalents. Migrate all call sites.
Split `MainTabView` into `Tab { }` (iOS 18) vs classic `.tabItem` (iOS 17)
and force opaque `UITabBar` appearance on iOS 17/18 so the tab bar no
longer fades transparent at the scroll edge. `MeshGradient` falls back to
`LinearGradient`. Replace `arrow.trianglehead.2.clockwise` (SF Symbols 6)
with `arrow.triangle.2.circlepath`. Replace widget `.repeat(.continuous)`
with `.repeating`.

Refs #49
…anges

Refs #52: redesign Activity rows, log detail header, home Recent Events
card, and group compact card to share one aesthetic — device image
avatar with category corner badge, severity title color, no chevrons.

Refs #53: attribute bridge/response/* and <device>/action publishes to
the right device or group. Resolves payload.data.id / data.to /
data.friendly_name and falls back to scanning payload.error for known
device names. Fixes the payload extractor that was truncating JSON at
embedded single quotes.

Refs #54: filter elapsed and empty-string transitions from diffs,
format filter_age / device_age as durations, drop the full-payload
snapshot under state-change diffs, scope the device-state card to
actual exposes, and stop truncating long string values in BeautifulRow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop .controlSize(.small) on the ProgressView so the spinner matches
the surrounding arrow.up.circle glyph it replaces.

Fixes #55

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@tashda tashda added this to the v1.5.0 milestone May 1, 2026
@tashda tashda added enhancement New feature or request area:ui UI / UX redesign priority:medium labels May 1, 2026
@tashda tashda self-assigned this May 1, 2026
@tashda tashda added the bug Something isn't working label May 1, 2026
@tashda tashda merged commit f813b9a into main May 1, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment