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>
44 lines
1.2 KiB
Dart
44 lines
1.2 KiB
Dart
import 'package:clide/widgets/widgets.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
/// The ClideSettings.fonts facade (D-101): reads the active families from a
|
|
/// [ClideSettingsScope], or the bundled defaults outside one.
|
|
void main() {
|
|
testWidgets('fonts fall back to the bundled defaults without a scope', (tester) async {
|
|
late String mono;
|
|
late String ui;
|
|
await tester.pumpWidget(
|
|
Builder(
|
|
builder: (context) {
|
|
mono = ClideSettings.fonts.monoOf(context);
|
|
ui = ClideSettings.fonts.uiOf(context);
|
|
return const SizedBox();
|
|
},
|
|
),
|
|
);
|
|
expect(mono, clideMonoFamily);
|
|
expect(ui, clideUiFamily);
|
|
});
|
|
|
|
testWidgets('a scope provides the active families, read live', (tester) async {
|
|
late String mono;
|
|
late String ui;
|
|
await tester.pumpWidget(
|
|
ClideSettingsScope(
|
|
ui: 'Inter',
|
|
mono: 'FiraMono',
|
|
child: Builder(
|
|
builder: (context) {
|
|
mono = ClideSettings.fonts.monoOf(context);
|
|
ui = ClideSettings.fonts.uiOf(context);
|
|
return const SizedBox();
|
|
},
|
|
),
|
|
),
|
|
);
|
|
expect(mono, 'FiraMono');
|
|
expect(ui, 'Inter');
|
|
});
|
|
}
|