Conversation
Promote Logging to a proper section on the Settings page with three rows: an inline Logging Level picker (auto-commits on change, no helper text), the Logs viewer (moved up from Tools), and a new Log Output subpage. The old Logging hub → Basic/Advanced split was a dead layer: the row was titled "Logging" and navigated to a page also titled "Logging". Collapse it into a single LogOutputView covering outputs (console/file/syslog), file settings, rotation/retention, console JSON format, and the debug namespace filter. Reorder sections so Tools sits between Network and Application, matching the new hierarchy (bridge config → logging → integrations → network → tools → application). Drop the now-unused SettingsHighlight enum and the highlight-on-push affordance from AppNotificationSettingsView; the Bridge Log Level row there is now a read-only LabeledContent pointing to Settings → Logging. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rework PermitJoinActiveSheet to match Apple's visual language for
timer-style sheets (Timer, Screen Time, Fitness).
- Wrap the countdown in a circular progress ring (green stroke,
rounded line caps, rotated -90° so it drains clockwise from top).
The ring's trim is driven by remaining/totalDuration and animates
linearly each tick, giving a continuous "time remaining" visual
that replaces the separate text label.
- Remove the standalone "• Active" pulsing indicator and the
"Time remaining" caption — the ring itself now carries both
signals, which is the idiom Apple uses.
- Promote the "Disable Join" button from .bordered to
.borderedProminent tinted red, matching iOS's destructive
primary-action style (e.g. Find My "Erase This Device").
- Bump the target-name line ("Via all devices" / "Via <device>")
from tertiary to secondary foreground so it reads at a glance
without competing with the countdown.
No logic changes — the sheet's presentation, timer source, stop
callback, and dismiss behavior are unchanged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two independent UI polish changes landing together on
dev:1. Permit Join active sheet redesign
Before: a separate pulsing green "• Active" indicator, a bare thin-weight countdown, a tertiary "Time remaining" caption, and a grey
.bordered"Disable Join" pill. The composition read as a stack of unrelated elements rather than a cohesive sheet.After: a single circular progress ring centered in the sheet with the countdown inside it, plus a prominent red destructive button.
Changes in
Shellbee/Features/Home/PermitJoinActiveSheet.swiftZStacklayers a faint green background circle (.stroke(Color.green.opacity(0.15), lineWidth: 8)) over a trimmed foreground circle (.trim(from: 0, to: progress),lineCap: .round, rotated-90°) so the ring drains clockwise from the 12-o'clock position. Trim ratio isremaining / totalDuration, animated linearly each tick. It reuses the existingTimelineView(.periodic(from: .now, by: 1))— no new timer machinery.@State var pulseOpacityand.onAppearanimation. The animated ring now signals "active" on its own, matching Apple's Timer app..borderedto.borderedProminentwith.tint(.red). Matches iOS's destructive primary-action pattern (Find My "Erase This Device", Settings "Erase All Content…"). KeepscontrolSize(.large), full-width, androle: .destructivesemantics.Via all devices/Via <device>) from.tertiaryto.secondaryforeground and moved it below the ring withSpacing.xlpadding..mediumdetent, drag indicator), timer source,onStopcallback, dismiss flow, and the fallback radio-waves icon (whentotalDuration == 0) are all unchanged. Previews (Active,Via device,No timer) still cover the three states.2. Settings › Logging section restructure
LogOutputViewcovering outputs, file settings, rotation/retention, console JSON format, and debug namespace filter.Why
Before this change, tapping Logging navigated to a page also titled Logging, which offered two nested subpages (Basic, Advanced). A dead layer — the name collision plus indirection put the log level (the most commonly changed setting) three taps deep.
What changed
SettingsView— newloggingSectionwith inlinePickerfor log level and two NavLinks (Logs, Log Output). Tools section reordered below Network.LogOutputView(new) — consolidated settings page replacingLoggingHubView+LoggingBasicView+LoggingSettingsView.AppNotificationSettingsView— Bridge Log Level row is now read-onlyLabeledContentwith a footer pointing to Settings → Logging, since there's no longer a dedicated page to deep-link into.LoggingHubView.swift,LoggingBasicView.swift,LoggingSettingsView.swift,SettingsHighlight.swift.Test plan
Permit Join sheet
0:00onStopand dismissesSettings Logging
CI
🤖 Generated with Claude Code