Skip to content

Redesign Permit Join sheet + restructure Settings Logging#7

Merged
tashda merged 2 commits into
mainfrom
dev
Apr 25, 2026
Merged

Redesign Permit Join sheet + restructure Settings Logging#7
tashda merged 2 commits into
mainfrom
dev

Conversation

@tashda

@tashda tashda commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Two independent UI polish changes landing together on dev:

  1. Native-iOS redesign of the Permit Join active sheet — swaps a bespoke layout for the timer/ring idiom Apple uses in Timer, Screen Time, and Fitness.
  2. Settings › Logging section restructure — flattens a redundant navigation layer and promotes Logging to a proper top-level section.

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.swift

  • Circular progress ring around the countdown. A ZStack layers 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 is remaining / totalDuration, animated linearly each tick. It reuses the existing TimelineView(.periodic(from: .now, by: 1)) — no new timer machinery.
  • Removed the "• Active" pulsing dot along with its @State var pulseOpacity and .onAppear animation. The animated ring now signals "active" on its own, matching Apple's Timer app.
  • Removed the "Time remaining" caption — redundant once the ring is present.
  • Promoted the "Disable Join" button from .bordered to .borderedProminent with .tint(.red). Matches iOS's destructive primary-action pattern (Find My "Erase This Device", Settings "Erase All Content…"). Keeps controlSize(.large), full-width, and role: .destructive semantics.
  • Bumped the target-name line (Via all devices / Via <device>) from .tertiary to .secondary foreground and moved it below the ring with Spacing.xl padding.
  • No behavior changes: sheet presentation (.medium detent, drag indicator), timer source, onStop callback, dismiss flow, and the fallback radio-waves icon (when totalDuration == 0) are all unchanged. Previews (Active, Via device, No timer) still cover the three states.

2. Settings › Logging section restructure

  • Promote Logging to a proper Settings section with three rows: inline Logging Level picker (auto-commits, no helper text), Logs viewer (moved up from Tools), and a new Log Output subpage.
  • Collapse the Logging hub → Basic/Advanced split into a single LogOutputView covering outputs, file settings, rotation/retention, console JSON format, and debug namespace filter.
  • Reorder sections: Bridge Configuration → Logging → Integrations → Network → Tools → Application.

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 — new loggingSection with inline Picker for log level and two NavLinks (Logs, Log Output). Tools section reordered below Network.
  • LogOutputView (new) — consolidated settings page replacing LoggingHubView + LoggingBasicView + LoggingSettingsView.
  • AppNotificationSettingsView — Bridge Log Level row is now read-only LabeledContent with a footer pointing to Settings → Logging, since there's no longer a dedicated page to deep-link into.
  • Deleted: LoggingHubView.swift, LoggingBasicView.swift, LoggingSettingsView.swift, SettingsHighlight.swift.

Test plan

Permit Join sheet

  • Home → Permit Join toolbar button → start a timed session (e.g. 4 min)
  • Ring appears full, drains smoothly, reaches empty exactly at 0:00
  • Countdown digits animate with numeric text transition
  • Tapping Disable Join (solid red prominent) fires onStop and dismisses
  • "No timer" state: radio-waves SF Symbol inside ring, ring stays full
  • Targeted state: "Via " renders correctly below the ring

Settings Logging

  • Settings → new Logging section renders with level picker, Logs, Log Output
  • Changing the Logging Level picker commits immediately (watch bridge info update)
  • Log Output page shows outputs, file settings (conditional on File toggle), rotation, console JSON, debug filter — Apply/Cancel toolbar works
  • Tools section now appears between Network and Application
  • Notifications page shows Bridge Log Level as read-only with the "Change in Settings → Logging" footer

CI

  • Fast CI green

🤖 Generated with Claude Code

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.
@tashda tashda changed the title Restructure Settings Logging section Redesign Permit Join sheet + restructure Settings Logging Apr 24, 2026
@tashda tashda merged commit 59b5ee4 into main Apr 25, 2026
1 check passed
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