color_scheme.go RawHistoryFolder
1package port
2
3// ColorSchemePreference represents the resolved color scheme preference.
4type ColorSchemePreference struct {
5 // PrefersDark indicates whether dark mode is preferred.
6 PrefersDark bool
7
8 // Source identifies which detector provided this preference.
9 // Empty string means fallback was used.
10 Source string
11}
12
13// ColorSchemeDetector detects the system's color scheme preference.
14// Multiple detectors can be registered with different priorities.
15type ColorSchemeDetector interface {
16 // Name returns a human-readable name for this detector.
17 Name() string
18
19 // Priority returns the detector's priority.
20 // Higher values = higher priority (checked first).
21 // Recommended ranges:
22 // - 100+: Runtime detectors (libadwaita, GTK Settings)
23 // - 50+: Config file detectors
24 // - 10+: Fallback detectors (gsettings, env vars)
25 Priority() int
26
27 // Available returns true if this detector can be used.
28 // For example, libadwaita detector returns false before adw.Init().
29 Available() bool
30
31 // Detect returns the detected preference and whether detection succeeded.
32 // Returns (preference, true) on success, (_, false) if unavailable or detection failed.
33 Detect() (prefersDark bool, ok bool)
34}
35
36// ToolkitAvailabilityNotifier signals that a toolkit (e.g., GTK/Adwaita) is available.
37type ToolkitAvailabilityNotifier interface {
38 MarkAvailable()
39}
40
41// ColorSchemeResolver resolves the effective color scheme preference.
42// It manages multiple detectors and respects config overrides.
43type ColorSchemeResolver interface {
44 // Resolve returns the current color scheme preference.
45 // It checks config for explicit overrides, then queries detectors by priority.
46 // If all detectors fail, defaults to dark mode.
47 Resolve() ColorSchemePreference
48
49 // RegisterDetector adds a detector to the resolver.
50 // Safe to call at any time; the resolver re-evaluates on next Resolve().
51 RegisterDetector(detector ColorSchemeDetector)
52
53 // Refresh forces re-evaluation of the color scheme.
54 // Call this after registering new detectors or when system preferences change.
55 // Returns the new preference.
56 Refresh() ColorSchemePreference
57
58 // OnChange registers a callback for color scheme changes.
59 // The callback is invoked when Refresh() results in a different preference.
60 // Returns a function to unregister the callback.
61 OnChange(callback func(ColorSchemePreference)) func()
62}