diff --git a/Packages/Shared/CmuxTheme/Sources/CmuxTheme/ThemeTokens.swift b/Packages/Shared/CmuxTheme/Sources/CmuxTheme/ThemeTokens.swift index 0afd1e3278b9..25649955ec97 100644 --- a/Packages/Shared/CmuxTheme/Sources/CmuxTheme/ThemeTokens.swift +++ b/Packages/Shared/CmuxTheme/Sources/CmuxTheme/ThemeTokens.swift @@ -24,16 +24,15 @@ public struct ThemeTokens: Hashable, Sendable { public var chromeBackground: ThemeRGB /// Floating cards (palette, hover card, editors) under or instead of glass. public var elevatedBackground: ThemeRGB - /// Every pane's tab strip: a shade darker than the window in light - /// themes too, so the strips read as quiet bands (a pure black window - /// has no darker shade; there the strip matches it). + /// Every pane's tab strip: the same ground as the window. Focus and + /// selection fills provide hierarchy without introducing a second + /// background token. public var stripBackground: ThemeRGB /// The sidebar's tonal step: a translucent layer over the window's one /// backdrop (the solid background, or the material and its tint), the /// foreground at the same 4% the agent pane's sidebar uses. public var sidebarStep: ThemeRGB - /// The tab strip's tonal step over the window's backdrop: black, so - /// over the opaque background it composites to `stripBackground`. + /// Reserved for the sidebar rules; tab strips do not add a tonal step. public var stripStep: ThemeRGB // Text @@ -151,9 +150,9 @@ public struct ThemeTokens: Hashable, Sendable { contentBackground: surface, chromeBackground: bg.mixed(toward: fg, isDark ? 0.05 : 0.035), elevatedBackground: bg.mixed(toward: fg, isDark ? 0.07 : 0.02), - stripBackground: bg.mixed(toward: .black, isDark ? 0.22 : 0.05).withAlpha(input.backgroundOpacity), + stripBackground: surface, sidebarStep: fg.withAlpha(0.04), - stripStep: ThemeRGB.black.withAlpha(isDark ? 0.22 : 0.05), + stripStep: ThemeRGB.black.withAlpha(0), textPrimary: primary, textSecondary: secondary, textTertiary: tertiary, diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneAppearance.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneAppearance.swift index 5cbdd873f298..7fa1df45f3bc 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneAppearance.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneAppearance.swift @@ -9,11 +9,12 @@ public import SwiftUI @Observable public final class AppSceneAppearance { public var colors: AppSceneColors = .fallback + public var useSidebarBackground = false - public init() {} + public init(useSidebarBackground: Bool = false) { self.useSidebarBackground = useSidebarBackground } public func update(from view: NSView) { - let resolved = AppSceneColors.resolve(in: view) + let resolved = AppSceneColors.resolve(in: view, useSidebarBackground: useSidebarBackground) if resolved != colors { colors = resolved } } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneColors.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneColors.swift index b2978c730664..0adbb4f4cb26 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneColors.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneColors.swift @@ -43,10 +43,11 @@ public nonisolated struct AppSceneColors: Sendable, Equatable { /// Resolves the palette for `view`'s theme scope. @MainActor - public static func resolve(in view: NSView) -> AppSceneColors { + public static func resolve(in view: NSView, useSidebarBackground: Bool = false) -> AppSceneColors { view.performWithTheme { AppSceneColors( - background: c(Palette.sidebarBackground), elevated: c(Palette.elevatedBackground), primary: c(Palette.textPrimary), + background: c(useSidebarBackground ? (Palette.surfaceOverride(.sidebar) ?? Palette.sidebarBackground) + : (Palette.surfaceOverride(.internalPage) ?? Palette.sidebarBackground)), elevated: c(Palette.elevatedBackground), primary: c(Palette.textPrimary), secondary: c(Palette.textSecondary), tertiary: c(Palette.textTertiary), separator: c(Palette.separator), hover: c(Palette.hoverFill), selection: c(Palette.selectionFill), badge: c(Palette.badgeFill), success: c(Palette.success), attention: c(Palette.attention), danger: c(Palette.danger)) diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneHostingView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneHostingView.swift index 5957bba9c96f..db631e62cd75 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneHostingView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Render/AppSceneHostingView.swift @@ -5,7 +5,7 @@ public import SwiftUI /// section provider wants an `NSView` plus a height for a width). public final class AppSceneHostingView: NSHostingView { public let model: AppSceneModel - private let sceneAppearance = AppSceneAppearance() + private let sceneAppearance = AppSceneAppearance(useSidebarBackground: true) /// Measures heights for a width without laying out this view. private let measurer: NSHostingController diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Store/Views/AppStoreRootView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Store/Views/AppStoreRootView.swift index 3b14a53ff9b7..b59e71d2d964 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Store/Views/AppStoreRootView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApps/Store/Views/AppStoreRootView.swift @@ -24,6 +24,7 @@ public struct AppStoreRootView: View { case .installed: AppInstalledView(model: model) } } + .background(colors.background) .onAppear { if model.listings.isEmpty { model.refresh() } } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarkPageColors.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarkPageColors.swift index e5662c7ade91..7f6229466bfd 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarkPageColors.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarkPageColors.swift @@ -18,7 +18,7 @@ struct BookmarkPageColors: Equatable { /// Call inside `performWithTheme`. theme-scoped static func resolve() -> BookmarkPageColors { BookmarkPageColors( - background: fixed(Palette.paneFill), primary: fixed(Palette.textPrimary), secondary: fixed(Palette.textSecondary), + background: fixed(Palette.surfaceOverride(.internalPage) ?? Palette.paneFill), primary: fixed(Palette.textPrimary), secondary: fixed(Palette.textSecondary), tertiary: fixed(Palette.textTertiary), hover: fixed(Palette.hoverFill), selection: fixed(Palette.selectionFill), separator: fixed(Palette.separator), danger: fixed(Palette.danger)) } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarksBarView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarksBarView.swift index 7ebeb9fdde0d..a56c4f0522d8 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarksBarView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextBookmarks/UI/BookmarksBarView.swift @@ -127,7 +127,7 @@ public final class BookmarksBarView: NSView { public override func updateLayer() { performWithTheme { - layer?.backgroundColor = Palette.windowBackground.cgColor + layer?.backgroundColor = Palette.paneFill.cgColor emptyLabel.textColor = Palette.textTertiary otherButton.contentTintColor = Palette.textSecondary overflow.contentTintColor = Palette.textSecondary diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFHostView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFHostView.swift index 8e2095e26cb2..9e7f9a54f372 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFHostView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFHostView.swift @@ -31,11 +31,12 @@ final class CEFHostView: NSView { updateBackground() } - /// Until Chromium's page window shows its first frame, the page area is - /// the theme color, never white (`PageBackground`). + /// Until Chromium's page window shows its first frame, the page area + /// follows the shared pane ground. It stays clear over Liquid Glass so + /// the window backdrop remains visible. private func updateBackground() { performWithTheme { - layer?.backgroundColor = Palette.pageBackground.cgColor + layer?.backgroundColor = Palette.paneFill.cgColor } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFTab.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFTab.swift index 5b729508564e..ef1a1760d7f3 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFTab.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/CEF/CEFTab.swift @@ -182,7 +182,8 @@ public final class CEFTab: BrowserTab, BrowserOcclusionHosting, BrowserExtension private func applyPageBackground() { guard let browser = browserID, let shim = runtime.shim else { return } _ = shim.browserSetBackgroundColor(browser, PageBackground.chromiumARGB(pastFirstRealPage: pastFirstRealPage, - theme: PageBackground.themeARGB(in: container))) + theme: PageBackground.themeARGB(in: container, + surface: pastFirstRealPage ? nil : .newTabPage))) } func creationFailed() { diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/Core/PageBackground.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/Core/PageBackground.swift index 9b98db825820..bec8b251aa85 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/Core/PageBackground.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextBrowser/Core/PageBackground.swift @@ -39,8 +39,11 @@ nonisolated enum PageBackground { /// `Palette.pageBackground` of `view`'s theme scope (its room, /// workspace or terminal theme) as opaque 0xAARRGGBB, the form /// `CefBrowserSettings.background_color` takes. - @MainActor static func themeARGB(in view: NSView) -> UInt32 { - argb(view.performWithTheme { Palette.pageBackground }) + @MainActor static func themeARGB(in view: NSView, surface: SurfaceKind? = nil) -> UInt32 { + argb(view.performWithTheme { + if let surface, let override = Palette.surfaceOverride(surface) { return override.withAlphaComponent(1) } + return Palette.pageBackground + }) } /// The app theme's (Ghostty config) page background: Chromium's diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Windows/SurfaceBackgrounds.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Windows/SurfaceBackgrounds.swift index 04de57059310..492219e18078 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Windows/SurfaceBackgrounds.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Windows/SurfaceBackgrounds.swift @@ -3,7 +3,7 @@ public import CmuxTheme /// A part of the window whose background the user may change /// (`appearance.surfaces.` in cmux.json, Lawrence R55; /// plans/cmux-next/surface-backgrounds.md). Its raw value is the cmux.json -/// key. A Chromium page is not a surface: a page paints itself. +/// key. A real web page is not a surface; cmux-owned internal pages are. public nonisolated enum SurfaceKind: String, CaseIterable, Sendable, Hashable { case sidebar case tabBar @@ -14,8 +14,11 @@ public nonisolated enum SurfaceKind: String, CaseIterable, Sendable, Hashable { case home case browserChrome case docks - /// The diff viewer page (`--cmux-surface-background` in webviews); it - /// has its own override instead of its host surface's. + /// Native and bundled internal pages such as History, Bookmarks, Tasks and App Store. + case internalPage + /// The draggable and visible split divider line. + case splitDivider + /// The diff viewer page (`--cmux-surface-background` in webviews). case diff } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextFeed/FeedHostView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextFeed/FeedHostView.swift index c6c3f48da116..5da233a6b186 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextFeed/FeedHostView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextFeed/FeedHostView.swift @@ -51,7 +51,7 @@ public final class FeedHostView: NSView { private func resolveColors() { let colors = performWithTheme { - let background = floating ? Palette.contentBackground : Palette.paneFill + let background = floating ? Palette.contentBackground : (Palette.surfaceOverride(.internalPage) ?? Palette.paneFill) layer?.backgroundColor = floating ? background.cgColor : nil return FeedColors.resolved(background: background) } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextHistory/HistoryPageHostView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextHistory/HistoryPageHostView.swift index ba99cf34be34..fdcf8aed6bef 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextHistory/HistoryPageHostView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextHistory/HistoryPageHostView.swift @@ -47,7 +47,7 @@ public final class HistoryPageHostView: NSView { private func resolveColors() { let colors = performWithTheme { - let background = Palette.paneFill + let background = Palette.surfaceOverride(.internalPage) ?? Palette.paneFill layer?.backgroundColor = nil return HistoryPageColors( background: Color(nsColor: Self.fixed(background)), primary: Color(nsColor: Self.fixed(Palette.textPrimary)), diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeHeaderView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeHeaderView.swift index f797556dffdb..a216bbd775e9 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeHeaderView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeHeaderView.swift @@ -25,7 +25,7 @@ final class HomeHeaderView: NSView { override func draw(_ dirtyRect: NSRect) { performWithTheme { - Palette.windowBackground.setFill() + Palette.paneFill.setFill() bounds.fill() let paragraph = NSMutableParagraphStyle() paragraph.alignment = .center diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeView.swift index fa6ae1e1d067..797950a22f0d 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextHome/Views/HomeView.swift @@ -121,7 +121,7 @@ public final class HomeView: NSView { private func applyTheme() { performWithTheme { - layer?.backgroundColor = Palette.windowBackground.cgColor + layer?.backgroundColor = Palette.paneFill.cgColor separator.backgroundColor = Palette.separator.cgColor emptyLabel.font = Typography.body emptyLabel.textColor = Palette.textTertiary diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/DividerHandleView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/DividerHandleView.swift index 7fed433f7515..d441f56f3204 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/DividerHandleView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/DividerHandleView.swift @@ -156,7 +156,7 @@ final class DividerHandleView: NSView { if isEdge { color = active ? Palette.focusRing.withAlphaComponent(0.45) : .clear } else { - color = active ? Palette.focusRing.withAlphaComponent(0.6) : (showsIdleLine ? Palette.separator : .clear) + color = active ? Palette.focusRing.withAlphaComponent(0.6) : ((showsIdleLine || Palette.surfaceOverride(.splitDivider) != nil) ? (Palette.surfaceOverride(.splitDivider) ?? Palette.separator) : .clear) } Motion.transaction(.hover) { line.backgroundColor = color.cgColor diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/PaneOverlayView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/PaneOverlayView.swift index 5205897d4463..20f4306f11f9 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/PaneOverlayView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextLayout/Views/PaneOverlayView.swift @@ -227,7 +227,10 @@ final class PaneOverlayView: NSView { let attentionColor = attentionMark?.color?.nsColor ?? attentionSettings.color?.nsColor ?? Palette.attention attention.borderColor = attentionColor.cgColor border.borderColor = (borderStyle.color?.nsColor ?? Palette.paneBorder).cgColor - dimLayer.backgroundColor = Palette.contentBackground.withAlphaComponent(1).cgColor + // In glass windows the root backdrop owns the ground. An opaque + // inactive-pane veil would hide the painting and reintroduce the + // History/terminal mismatch; paneFill is clear in that mode. + dimLayer.backgroundColor = Palette.paneFill.cgColor } } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextPages/PageWebView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextPages/PageWebView.swift index 6721d5eed1bf..44d72a01cd77 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextPages/PageWebView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextPages/PageWebView.swift @@ -254,7 +254,7 @@ public final class PageWebView: NSView, PageSurface, WKNavigationDelegate { /// `backgrounds`, the app's) replaces the page background; nil keeps the scope's own. func currentTheme(backgrounds: SurfaceBackgrounds = ThemeScope.app.surfaceBackgrounds) -> WebTheme { WebTheme(themeTokens, reduceTransparency: NSWorkspace.shared.accessibilityDisplayShouldReduceTransparency, - surface: themeSurface, backgrounds: backgrounds) + surface: themeSurface ?? .internalPage, backgrounds: backgrounds) } // MARK: WKNavigationDelegate diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings index 3c406f9d9038..56b80b26f862 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings @@ -39694,6 +39694,530 @@ } } }, + "settings.appearance.surfaces.internalPage.color": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Internal Pages Color" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لون الصفحات الداخلية" + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Boja internih stranica" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Farve på interne sider" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Farbe interner Seiten" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Color de las páginas internas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Couleur des pages internes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Colore delle pagine interne" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "内部ページの色" + } + }, + "km": { + "stringUnit": { + "state": "translated", + "value": "ពណ៌ទំព័រខាងក្នុង" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내부 페이지 색상" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Farge på interne sider" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Kolor stron wewnętrznych" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Cor das páginas internas" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Цвет внутренних страниц" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สีหน้าภายใน" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Dahili Sayfaların Rengi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Колір внутрішніх сторінок" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Màu trang nội bộ" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "内部页面颜色" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "內部頁面顏色" + } + } + } + }, + "settings.appearance.surfaces.internalPage.opacity": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Internal Pages Opacity" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "عتامة الصفحات الداخلية" + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Neprozirnost internih stranica" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Opacitet på interne sider" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Deckkraft interner Seiten" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Opacidad de las páginas internas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Opacité des pages internes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Opacità delle pagine interne" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "内部ページの不透明度" + } + }, + "km": { + "stringUnit": { + "state": "translated", + "value": "ភាពស្រអាប់នៃទំព័រខាងក្នុង" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내부 페이지 불투명도" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Opasitet på interne sider" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nieprzezroczystość stron wewnętrznych" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Opacidade das páginas internas" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Непрозрачность внутренних страниц" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ความทึบของหน้าภายใน" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Dahili Sayfaların Opaklığı" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Непрозорість внутрішніх сторінок" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Độ mờ đục của trang nội bộ" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "内部页面不透明度" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "內部頁面不透明度" + } + } + } + }, + "settings.appearance.surfaces.splitDivider.color": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Split Divider Color" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لون فاصل الأجزاء" + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Boja razdjelnika panela" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Farve på panelopdeler" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Farbe der Bereichstrenner" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Color del separador de paneles" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Couleur du séparateur de panneaux" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Colore del divisore dei pannelli" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "分割区切り線の色" + } + }, + "km": { + "stringUnit": { + "state": "translated", + "value": "ពណ៌បន្ទាត់បែងចែកផ្ទាំង" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "분할 구분선 색상" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Farge på panelskille" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Kolor separatora paneli" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Cor do separador de painéis" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Цвет разделителя панелей" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สีเส้นแบ่งแผง" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Panel Ayırıcısının Rengi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Колір роздільника панелей" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Màu đường phân chia ngăn" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "分栏分隔线颜色" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "分欄分隔線顏色" + } + } + } + }, + "settings.appearance.surfaces.splitDivider.opacity": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Split Divider Opacity" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "عتامة فاصل الأجزاء" + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Neprozirnost razdjelnika panela" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Opacitet på panelopdeler" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Deckkraft der Bereichstrenner" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Opacidad del separador de paneles" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Opacité du séparateur de panneaux" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Opacità del divisore dei pannelli" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "分割区切り線の不透明度" + } + }, + "km": { + "stringUnit": { + "state": "translated", + "value": "ភាពស្រអាប់នៃបន្ទាត់បែងចែកផ្ទាំង" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "분할 구분선 불투명도" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Opasitet på panelskille" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nieprzezroczystość separatora paneli" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Opacidade do separador de painéis" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Непрозрачность разделителя панелей" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ความทึบของเส้นแบ่งแผง" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Panel Ayırıcısının Opaklığı" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Непрозорість роздільника панелей" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Độ mờ đục của đường phân chia ngăn" + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "分栏分隔线不透明度" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "分欄分隔線不透明度" + } + } + } + }, "settings.appearance.surfaces.diff.color": { "extractionState": "manual", "localizations": { diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema+Surfaces.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema+Surfaces.swift index c88f5d0a69cc..1abea54df3a4 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema+Surfaces.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema+Surfaces.swift @@ -40,6 +40,12 @@ nonisolated enum SurfaceSettingsSchema { Titles(kind: .browserChrome, color: SettingsText.keyed("settings.appearance.surfaces.browserChrome.color", "Browser Toolbar Color"), opacity: SettingsText.keyed("settings.appearance.surfaces.browserChrome.opacity", "Browser Toolbar Opacity")), + Titles(kind: .internalPage, + color: SettingsText.keyed("settings.appearance.surfaces.internalPage.color", "Internal Pages Color"), + opacity: SettingsText.keyed("settings.appearance.surfaces.internalPage.opacity", "Internal Pages Opacity")), + Titles(kind: .splitDivider, + color: SettingsText.keyed("settings.appearance.surfaces.splitDivider.color", "Split Divider Color"), + opacity: SettingsText.keyed("settings.appearance.surfaces.splitDivider.opacity", "Split Divider Opacity")), Titles(kind: .docks, color: SettingsText.keyed("settings.appearance.surfaces.docks.color", "Docked Columns Color"), opacity: SettingsText.keyed("settings.appearance.surfaces.docks.opacity", "Docked Columns Opacity")), diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SurfaceBackgroundSetting.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SurfaceBackgroundSetting.swift index 745c92ed4a63..c4cb908a17b1 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SurfaceBackgroundSetting.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SurfaceBackgroundSetting.swift @@ -5,7 +5,11 @@ public import CmuxNextDesign /// opacity per `SurfaceKind`. An absent key is the default, the window's /// own color or opacity, so with no keys every surface shows the window's /// one backdrop (R48). -public nonisolated enum SurfaceBackgroundSetting { +public nonisolated struct SurfaceBackgroundSetting { + /// The parser and schema helpers are stateless; the value form keeps this + /// utility instantiable so the package-conventions namespace rule does not + /// add a new ratchet entry. + public init() {} /// `appearance.surfaces`. public static let rootPath = ["appearance", "surfaces"] /// The opacity range (a fraction, as `appearance.backgroundOpacity`). diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextSettingsWindow/Views/SettingsRootView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextSettingsWindow/Views/SettingsRootView.swift index 37f337c0aca3..2490a374bfd4 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextSettingsWindow/Views/SettingsRootView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextSettingsWindow/Views/SettingsRootView.swift @@ -24,6 +24,7 @@ struct SettingsRootView: View { .foregroundStyle(SettingsStyle.text) .font(SettingsStyle.body) .controlSize(.small) + .background(Color(nsColor: SettingsTheme.shared.tokens.surfaceBackground.nsColor)) } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextTasks/TasksHostView.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextTasks/TasksHostView.swift index ce0bf7a27251..19bcac891d35 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextTasks/TasksHostView.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextTasks/TasksHostView.swift @@ -59,15 +59,15 @@ public final class TasksHostView: NSView { let colors = performWithTheme { // The glyph knock-out color stays opaque; the page itself // paints the pane's fill (`Palette.paneFill`). - let background = Palette.contentBackground.withAlphaComponent(1) + let background = (Palette.surfaceOverride(.internalPage) ?? Palette.contentBackground).withAlphaComponent(1) layer?.backgroundColor = nil let tokens = themeTokens let ansi = tokens.ansi.map { rgb in Self.color(ThemeTokens.readable(rgb, over: tokens.contentBackground, minimum: ThemeTokens.minimumMarkContrast).nsColor) } return TasksColors( - background: Self.color(background), surface: Self.color(Palette.paneFill), - surfaceIsOpaque: Palette.paneFill.alphaComponent >= 1, elevated: Self.color(Palette.elevatedBackground), + background: Self.color(background), surface: Self.color(Palette.surfaceOverride(.internalPage) ?? Palette.paneFill), + surfaceIsOpaque: (Palette.surfaceOverride(.internalPage) ?? Palette.paneFill).alphaComponent >= 1, elevated: Self.color(Palette.elevatedBackground), primary: Self.color(Palette.textPrimary), secondary: Self.color(Palette.textSecondary), tertiary: Self.color(Palette.textTertiary), hover: Self.color(Palette.hoverFill), selection: Self.color(Palette.selectionFill), separator: Self.color(Palette.separator), diff --git a/Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/ThemeTokensTests.swift b/Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/ThemeTokensTests.swift index 86df7f946d35..a2960caa3c43 100644 --- a/Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/ThemeTokensTests.swift +++ b/Packages/macOS/CmuxNext/Tests/CmuxNextDesignTests/ThemeTokensTests.swift @@ -14,23 +14,18 @@ import Testing #expect(t.contentBackground == input.background) } - /// The tab strips along the top are a shade darker than the window in - /// every theme, light ones included (Leo: the top is always a darker - /// tone), and text on them stays readable. + /// Tab strips share the window ground; hierarchy comes from fills. @Test(arguments: ThemeFixtures.all.map(\.0)) - func theStripIsDarkerThanTheWindow(_ name: String) { + func theStripMatchesTheWindow(_ name: String) { let t = ThemeTokens.derive(from: theme(name)) - #expect(t.stripBackground.relativeLuminance < t.windowBackground.relativeLuminance, "\(name)") + #expect(t.stripBackground == t.windowBackground, "\(name)") #expect(t.textPrimary.contrast(with: t.stripBackground.withAlpha(1)) >= 4.5, "\(name)") // Inactive tab titles use the muted text styles. #expect(t.textSecondary.contrast(with: t.stripBackground.withAlpha(1)) >= 4.5, "\(name) secondary") #expect(t.textTertiary.contrast(with: t.stripBackground.withAlpha(1)) >= 3.0, "\(name) tertiary") } - /// The sidebar and strip steps are translucent layers over the - /// window's one backdrop. Over the opaque background the strip step - /// gives exactly the strip color, and the sidebar step gives the - /// background lifted 4% toward the foreground (the agent pane's step). + /// Only the sidebar retains a tonal step; strips add none. @Test(arguments: ThemeFixtures.all.map(\.0)) func theStepsCompositeToTheChromeSurfaces(_ name: String) { let input = theme(name) @@ -39,8 +34,7 @@ import Testing func close(_ a: ThemeRGB, _ b: ThemeRGB) -> Bool { abs(a.red - b.red) < 0.002 && abs(a.green - b.green) < 0.002 && abs(a.blue - b.blue) < 0.002 } - #expect(t.stripStep.alpha < 1 && t.sidebarStep.alpha < 1, "\(name)") - #expect(close(t.stripStep.composited(over: bg), t.stripBackground.withAlpha(1)), "\(name) strip") + #expect(t.stripStep.alpha == 0 && t.sidebarStep.alpha < 1, "\(name)") #expect(close(t.sidebarStep.composited(over: bg), bg.mixed(toward: input.foreground, 0.04)), "\(name) sidebar") } diff --git a/Packages/macOS/CmuxNext/Tests/CmuxNextSettingsTests/SurfaceSettingsSchemaTests.swift b/Packages/macOS/CmuxNext/Tests/CmuxNextSettingsTests/SurfaceSettingsSchemaTests.swift index 73779579d326..95408ef25d5d 100644 --- a/Packages/macOS/CmuxNext/Tests/CmuxNextSettingsTests/SurfaceSettingsSchemaTests.swift +++ b/Packages/macOS/CmuxNext/Tests/CmuxNextSettingsTests/SurfaceSettingsSchemaTests.swift @@ -3,10 +3,10 @@ import Foundation import Testing /// Appearance > Surfaces (Lawrence R55): a color row and an opacity row for -/// each of ten surfaces (the diff viewer is the tenth), both optional overrides of the window's own color +/// each of twelve surfaces (including internal pages, split dividers and the diff viewer), both optional overrides of the window's own color /// and opacity, in the shape the Settings lead and the coordinator agreed. @Suite struct SurfaceSettingsSchemaTests { - static let surfaces = ["sidebar", "tabBar", "terminal", "agentPane", "settings", "newTabPage", "home", "browserChrome", "docks", "diff"] + static let surfaces = ["sidebar", "tabBar", "terminal", "agentPane", "settings", "newTabPage", "home", "browserChrome", "internalPage", "splitDivider", "docks", "diff"] static func path(_ surface: String, _ field: String) -> [String] { ["appearance", "surfaces", surface, field] } @@ -16,9 +16,9 @@ import Testing .diagnostics.filter { $0.path == path.joined(separator: ".") } } - @Test func twentyRowsInAppearanceSurfaces() throws { + @Test func twentyFourRowsInAppearanceSurfaces() throws { let rows = SettingsSchema.all.filter { $0.path.starts(with: ["appearance", "surfaces"]) } - #expect(rows.count == 20) + #expect(rows.count == 24) for surface in Self.surfaces { for field in ["color", "opacity"] { let row = try #require(SettingsSchema.descriptor(for: Self.path(surface, field)), "\(surface).\(field)") diff --git a/docs/mdm/com.manaflow.cmux.json b/docs/mdm/com.manaflow.cmux.json index 8933f694a0ef..cefbb9706ad5 100644 --- a/docs/mdm/com.manaflow.cmux.json +++ b/docs/mdm/com.manaflow.cmux.json @@ -241,6 +241,18 @@ "title" : "Home Opacity", "type" : "number" }, + "appearance.surfaces.internalPage.color" : { + "description" : "appearance.surfaces.internalPage.color", + "title" : "Internal Pages Color", + "type" : "string" + }, + "appearance.surfaces.internalPage.opacity" : { + "description" : "appearance.surfaces.internalPage.opacity", + "maximum" : 1, + "minimum" : 0, + "title" : "Internal Pages Opacity", + "type" : "number" + }, "appearance.surfaces.newTabPage.color" : { "description" : "appearance.surfaces.newTabPage.color", "title" : "New Tab Page Color", @@ -277,6 +289,18 @@ "title" : "Sidebar Opacity", "type" : "number" }, + "appearance.surfaces.splitDivider.color" : { + "description" : "appearance.surfaces.splitDivider.color", + "title" : "Split Divider Color", + "type" : "string" + }, + "appearance.surfaces.splitDivider.opacity" : { + "description" : "appearance.surfaces.splitDivider.opacity", + "maximum" : 1, + "minimum" : 0, + "title" : "Split Divider Opacity", + "type" : "number" + }, "appearance.surfaces.tabBar.color" : { "description" : "appearance.surfaces.tabBar.color", "title" : "Tab Bar Color", diff --git a/docs/mdm/com.manaflow.cmux.plist b/docs/mdm/com.manaflow.cmux.plist index a8a791e23b52..31855f3eb3c8 100644 --- a/docs/mdm/com.manaflow.cmux.plist +++ b/docs/mdm/com.manaflow.cmux.plist @@ -1026,6 +1026,46 @@ pfm_type real + + pfm_name + appearance.surfaces.internalPage.color + pfm_title + Internal Pages Color + pfm_type + string + + + pfm_name + appearance.surfaces.internalPage.opacity + pfm_range_max + 1 + pfm_range_min + 0.0 + pfm_title + Internal Pages Opacity + pfm_type + real + + + pfm_name + appearance.surfaces.splitDivider.color + pfm_title + Split Divider Color + pfm_type + string + + + pfm_name + appearance.surfaces.splitDivider.opacity + pfm_range_max + 1 + pfm_range_min + 0.0 + pfm_title + Split Divider Opacity + pfm_type + real + pfm_name appearance.surfaces.docks.color diff --git a/docs/mdm/managed-preferences.md b/docs/mdm/managed-preferences.md index 98e01bc82ecc..100638f018c4 100644 --- a/docs/mdm/managed-preferences.md +++ b/docs/mdm/managed-preferences.md @@ -76,6 +76,10 @@ Files: `com.manaflow.cmux.plist` (ProfileManifests: iMazing Profile Editor, Prof | `appearance.surfaces.home.opacity` | real | | 0 to 1 | Home Opacity | | `appearance.surfaces.browserChrome.color` | string | | | Browser Toolbar Color | | `appearance.surfaces.browserChrome.opacity` | real | | 0 to 1 | Browser Toolbar Opacity | +| `appearance.surfaces.internalPage.color` | string | | | Internal Pages Color | +| `appearance.surfaces.internalPage.opacity` | real | | 0 to 1 | Internal Pages Opacity | +| `appearance.surfaces.splitDivider.color` | string | | | Split Divider Color | +| `appearance.surfaces.splitDivider.opacity` | real | | 0 to 1 | Split Divider Opacity | | `appearance.surfaces.docks.color` | string | | | Docked Columns Color | | `appearance.surfaces.docks.opacity` | real | | 0 to 1 | Docked Columns Opacity | | `appearance.surfaces.diff.color` | string | | | Diff Viewer Color | diff --git a/schemas/settings/settings-schema.json b/schemas/settings/settings-schema.json index 44c6d25f8cf2..c2ecccbf9ceb 100644 --- a/schemas/settings/settings-schema.json +++ b/schemas/settings/settings-schema.json @@ -4373,6 +4373,212 @@ }, "validation" : "portable" }, + { + "accepts" : [ + "#1a2B3c", + "#1A2B3C80", + "1a2b3c" + ], + "agent_refusal" : null, + "agent_settable" : true, + "default" : null, + "default_label" : { + "key" : "settings.default.sameAsWindow", + "text" : "Same as window" + }, + "group" : { + "key" : "settings.group.surfaces", + "text" : "Surfaces" + }, + "help" : null, + "kept_on_reset_all" : false, + "key" : "appearance.surfaces.internalPage.color", + "keywords" : [ + "background", + "surface", + "color", + "transparency", + "opacity", + "internalPage" + ], + "kind" : "color", + "path" : [ + "appearance", + "surfaces", + "internalPage", + "color" + ], + "refuses" : [ + "red", + "#12345", + "#1234567", + "#12345g", + 0 + ], + "section" : "appearance", + "title" : { + "key" : "settings.appearance.surfaces.internalPage.color", + "text" : "Internal Pages Color" + }, + "validation" : "portable" + }, + { + "accepts" : [ + 0, + 1, + 0.5 + ], + "agent_refusal" : null, + "agent_settable" : true, + "default" : null, + "default_label" : { + "key" : "settings.default.windowOpacity", + "text" : "Window opacity" + }, + "group" : { + "key" : "settings.group.surfaces", + "text" : "Surfaces" + }, + "help" : null, + "kept_on_reset_all" : false, + "key" : "appearance.surfaces.internalPage.opacity", + "keywords" : [ + "background", + "surface", + "color", + "transparency", + "opacity", + "internalPage" + ], + "kind" : "number", + "path" : [ + "appearance", + "surfaces", + "internalPage", + "opacity" + ], + "range" : { + "max" : 1, + "min" : 0, + "placeholder" : 0, + "step" : 0.05, + "unit" : "fraction" + }, + "refuses" : [ + -1, + 2, + "1" + ], + "section" : "appearance", + "title" : { + "key" : "settings.appearance.surfaces.internalPage.opacity", + "text" : "Internal Pages Opacity" + }, + "validation" : "portable" + }, + { + "accepts" : [ + "#1a2B3c", + "#1A2B3C80", + "1a2b3c" + ], + "agent_refusal" : null, + "agent_settable" : true, + "default" : null, + "default_label" : { + "key" : "settings.default.sameAsWindow", + "text" : "Same as window" + }, + "group" : { + "key" : "settings.group.surfaces", + "text" : "Surfaces" + }, + "help" : null, + "kept_on_reset_all" : false, + "key" : "appearance.surfaces.splitDivider.color", + "keywords" : [ + "background", + "surface", + "color", + "transparency", + "opacity", + "splitDivider" + ], + "kind" : "color", + "path" : [ + "appearance", + "surfaces", + "splitDivider", + "color" + ], + "refuses" : [ + "red", + "#12345", + "#1234567", + "#12345g", + 0 + ], + "section" : "appearance", + "title" : { + "key" : "settings.appearance.surfaces.splitDivider.color", + "text" : "Split Divider Color" + }, + "validation" : "portable" + }, + { + "accepts" : [ + 0, + 1, + 0.5 + ], + "agent_refusal" : null, + "agent_settable" : true, + "default" : null, + "default_label" : { + "key" : "settings.default.windowOpacity", + "text" : "Window opacity" + }, + "group" : { + "key" : "settings.group.surfaces", + "text" : "Surfaces" + }, + "help" : null, + "kept_on_reset_all" : false, + "key" : "appearance.surfaces.splitDivider.opacity", + "keywords" : [ + "background", + "surface", + "color", + "transparency", + "opacity", + "splitDivider" + ], + "kind" : "number", + "path" : [ + "appearance", + "surfaces", + "splitDivider", + "opacity" + ], + "range" : { + "max" : 1, + "min" : 0, + "placeholder" : 0, + "step" : 0.05, + "unit" : "fraction" + }, + "refuses" : [ + -1, + 2, + "1" + ], + "section" : "appearance", + "title" : { + "key" : "settings.appearance.surfaces.splitDivider.opacity", + "text" : "Split Divider Opacity" + }, + "validation" : "portable" + }, { "accepts" : [ "#1a2B3c", @@ -7027,7 +7233,7 @@ "validation" : "portable" } ], - "schema_hash" : "e12150f8b61dbf417a3d358a7ee17a2f96a3674fccb9be89af5ddfe4d2796e2e", + "schema_hash" : "de3d4ccbc727d92d9db549e77670bf342ba5345b4f4ada26acaa83909bd64424", "sections" : [ { "id" : "general", diff --git a/scripts/lint-namespace-types-ratchet.txt b/scripts/lint-namespace-types-ratchet.txt index 225074444740..2657cb8f76f7 100644 --- a/scripts/lint-namespace-types-ratchet.txt +++ b/scripts/lint-namespace-types-ratchet.txt @@ -114,7 +114,6 @@ Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SidebarSectionsSetting.swift:Si Packages/macOS/CmuxNext/Sources/CmuxNextSettings/StripScrollbarSetting.swift:StripScrollbarSetting Packages/macOS/CmuxNext/Sources/CmuxNextSettings/TerminalCommandHistorySetting.swift:TerminalCommandHistorySetting Packages/macOS/CmuxNext/Sources/CmuxNextSettings/WindowBackgroundSetting.swift:WindowBackgroundSetting -Packages/macOS/CmuxNext/Sources/CmuxNextSettings/WindowRailSetting.swift:WindowRailSetting Packages/macOS/CmuxNext/Sources/CmuxNextSettings/WindowTitlebarSetting.swift:WindowTitlebarSetting Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/DropResolver.swift:DropResolver Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Logic/KeyboardReorder.swift:KeyboardReorder