Fix macOS native styling for search toolbar pickers and view options

The content type segmented picker rendered as a Liquid-Glass pill instead
of a native macOS segmented control. Wrapping a `.segmented` Picker in
`.opacity`/`.disabled`/`.accessibilityHidden`/`.fixedSize` (used to keep
toolbar items mounted-but-invisible for stable layout) inserts a hosting
layer that makes the toolbar fall back to the pill rendering.

- SearchView: filters button and content type picker are now always
  visible on macOS, rendered bare so `.segmented` keeps native styling.
- SearchView: don't reset the content type to .video on submit on macOS,
  so a pre-selected type (e.g. Playlists) is preserved (iOS unchanged).
- InstanceBrowseView: same pill fix, rendering the tab / content type
  pickers bare via conditional `if` instead of opacity-masking.
- ViewOptionsSheet / MediaBrowserViewOptionsSheet: use `.formStyle(.grouped)`
  for native macOS form styling in the options popover.
This commit is contained in:
Arkadiusz Fal
2026-06-15 08:07:40 +02:00
parent 77720ccea1
commit 1157eef201
4 changed files with 29 additions and 40 deletions

View File

@@ -357,30 +357,26 @@ struct InstanceBrowseView: View {
}
#if os(macOS)
if #available(macOS 26, *) {
// Search filters button appears only while showing search results.
// Items stay mounted (invisible/inert) otherwise so the toolbar layout is stable.
ToolbarItem(placement: .navigation) {
searchFiltersToolbarButton
.opacity(showsSearchFiltersInToolbar ? 1 : 0)
.disabled(!showsSearchFiltersInToolbar)
.accessibilityHidden(!showsSearchFiltersInToolbar)
// Render the items bare (conditional `if`, no opacity/disabled
// wrappers): wrapping a `.segmented` Picker inserts a hosting layer
// that makes the toolbar fall back to a Liquid-Glass pill instead of
// the native segmented control. The search filters button shows only
// while displaying search results; the principal picker swaps between
// the browse tab picker and the search content type picker.
if showsSearchFiltersInToolbar {
ToolbarItem(placement: .navigation) {
searchFiltersToolbarButton
}
}
.sharedBackgroundVisibility(showsSearchFiltersInToolbar ? .automatic : .hidden)
// Search content type picker while showing results, browse tab picker otherwise
ToolbarItem(placement: .principal) {
Group {
if isToolbarPickerVisible {
ToolbarItem(placement: .principal) {
if showsSearchFiltersInToolbar {
searchContentTypePicker
} else {
tabPicker
}
}
.fixedSize()
.opacity(isToolbarPickerVisible ? 1 : 0)
.disabled(!isToolbarPickerVisible)
.accessibilityHidden(!isToolbarPickerVisible)
}
.sharedBackgroundVisibility(isToolbarPickerVisible ? .automatic : .hidden)
} else if showsSearchFiltersInToolbar {
ToolbarItem(placement: .navigation) {
searchFiltersToolbarButton