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// ColorSchemeResolver resolves the effective color scheme preference.
37// It manages multiple detectors and respects config overrides.
38type ColorSchemeResolver interface {
39 // Resolve returns the current color scheme preference.
40 // It checks config for explicit overrides, then queries detectors by priority.
41 // If all detectors fail, defaults to dark mode.
42 Resolve() ColorSchemePreference
43
44 // RegisterDetector adds a detector to the resolver.
45 // Safe to call at any time; the resolver re-evaluates on next Resolve().
46 RegisterDetector(detector ColorSchemeDetector)
47
48 // Refresh forces re-evaluation of the color scheme.
49 // Call this after registering new detectors or when system preferences change.
50 // Returns the new preference.
51 Refresh() ColorSchemePreference
52
53 // OnChange registers a callback for color scheme changes.
54 // The callback is invoked when Refresh() results in a different preference.
55 // Returns a function to unregister the callback.
56 OnChange(callback func(ColorSchemePreference)) func()
57}