Two empty states: first-time user (no permission) with platform-aware inline steps, and returning user (permission granted, no blockers) with compact CTA. Both use the same !hasBlockingPermission check — catches first-time AND revoked permission.
!hasBlockingPermission → State 1 (permission screen, catches both first-time AND revoked)blockers.isEmpty() → State 2 (returning user, compact empty)else → Blocker listAuthorizationCenter.shared.requestAuthorization.Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).expect/actual.rgba(86,62,0,0.06). Radius: 14dp. Icon square: 34dp, radius 9dp, background #ffbf00 (solid gold, same as button), icon color --br #815f00. Title: Plus Jakarta 13sp 700. Subtitle: 11sp stone.--gold #ffbf00), 16dp, deep brown text (--dp), Plus Jakarta 9sp 700. Step text: 11sp, bold keywords in --dp color.--gold #ffbf00. Text: --dp #563e00. Font: Plus Jakarta 15sp 700. Shield-check icon left. No gradient, no shadow — flat solid gold. DO NOT change this button design.--st #6b7280. 12sp 500. No underline, no border, no background. Just tappable text. Opens a bottom sheet with privacy/permission explainer.64dp, radius 18dp, background #ffbf00 (solid gold, same as button), icon --br. Title: 16sp 700. Subtitle: 12sp stone. "Create blocker" button: auto-width pill, gold, Plus Jakarta 14sp 700.