Introduce ClideSettings, a single widget-facing facade for the app's live user preferences, namespaced by concern: ClideSettings.fonts.monoOf(context) / .fonts.uiOf(context), ClideSettings.theme.of(context), ClideSettings.i18n.of(context). "Plumb once, use many." Fonts are carried by a new root-provided ClideSettingsScope (resolved from the font settings in root_shell, rebuilt on change); theme and i18n delegate to their existing live providers (ClideTheme / the I18n service) so there's one source of truth and their many consumers migrate incrementally rather than in a big-bang. Reads outside a scope fall back to the bundled font defaults, so a widget renders without a provider (isolated tests). Migrate ~93 monospace-font call sites across 33 files from the clideMonoFamily const to ClideSettings.fonts.monoOf(context) — pure refactor, identical family when no override is set. 11 context-less helper sites (markdown static spans, a few top-level/static builders) keep the const for now and are tracked in T-472. Records D-101; updates the ui-design skill's font-family rule. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
2.7 KiB
Dart
65 lines
2.7 KiB
Dart
import 'package:clide/kernel/src/facade.dart' show ClideKernel;
|
|
import 'package:clide/kernel/src/i18n/i18n.dart' show I18n;
|
|
import 'package:clide/kernel/src/theme/controller.dart' show ClideTheme, ClideThemeData;
|
|
import 'package:clide/widgets/src/typography.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
/// One facade for the app's live user preferences — fonts, theme, and i18n —
|
|
/// read uniformly as `ClideSettings.fonts.monoOf(context)`,
|
|
/// `ClideSettings.theme.of(context)`, `ClideSettings.i18n.of(context)`. Plumb
|
|
/// once at the root, use many (D-101).
|
|
///
|
|
/// The values all originate in the kernel `SettingsStore`; this is the
|
|
/// widget-facing read side. Fonts are carried by [ClideSettingsScope] (the root
|
|
/// resolves them from the font settings and rebuilds on change, so dependents
|
|
/// re-read live). Theme and i18n **delegate** to their existing live providers
|
|
/// ([ClideTheme] / the `I18n` service) rather than duplicating them — one source
|
|
/// of truth, and consumers migrate onto this facade incrementally. Reads
|
|
/// outside a [ClideSettingsScope] fall back to the bundled font defaults, so a
|
|
/// widget never needs the scope to render (isolated tests).
|
|
abstract final class ClideSettings {
|
|
static const fonts = _Fonts();
|
|
static const theme = _Theme();
|
|
static const i18n = _I18n();
|
|
}
|
|
|
|
class _Fonts {
|
|
const _Fonts();
|
|
|
|
/// The active monospace family in scope, else the bundled default.
|
|
String monoOf(BuildContext context) => ClideSettingsScope.of(context)?.mono ?? clideMonoFamily;
|
|
|
|
/// The active UI family in scope, else the bundled default.
|
|
String uiOf(BuildContext context) => ClideSettingsScope.of(context)?.ui ?? clideUiFamily;
|
|
}
|
|
|
|
class _Theme {
|
|
const _Theme();
|
|
|
|
/// Resolved theme data for [context] — delegates to the [ClideTheme] provider.
|
|
ClideThemeData of(BuildContext context) => ClideTheme.of(context);
|
|
}
|
|
|
|
class _I18n {
|
|
const _I18n();
|
|
|
|
/// The i18n service for [context] — delegates to the kernel `I18n` service.
|
|
I18n of(BuildContext context) => ClideKernel.of(context).i18n;
|
|
}
|
|
|
|
/// Root-provided InheritedWidget carrying the live font families (D-101). The
|
|
/// root rebuilds it from the font settings on change; font dependents re-read
|
|
/// via [ClideSettings.fonts]. Theme/i18n have their own providers, so they are
|
|
/// not duplicated here.
|
|
class ClideSettingsScope extends InheritedWidget {
|
|
const ClideSettingsScope({super.key, required this.ui, required this.mono, required super.child});
|
|
|
|
final String ui;
|
|
final String mono;
|
|
|
|
static ClideSettingsScope? of(BuildContext context) => context.dependOnInheritedWidgetOfExactType<ClideSettingsScope>();
|
|
|
|
@override
|
|
bool updateShouldNotify(ClideSettingsScope old) => ui != old.ui || mono != old.mono;
|
|
}
|