Migrate ClideTheme.of(context) reads across the widget, feature, and shell layers to the unified ClideSettings.theme.of(context) facade (D-101), so theme/i18n/fonts/settings share one widget-facing entry. The facade delegates straight to ClideTheme, so behaviour is unchanged — goldens are unmoved. The low-level theme provider keeps its direct ClideTheme.of: the facade is built on it, and the two kernel sites (ClideTheme's own definition + the panels drag-resize widget) stay direct to avoid a widgets→kernel import cycle. Dead controller.dart/kernel.dart imports left by the sweep removed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
35 lines
1.2 KiB
Dart
35 lines
1.2 KiB
Dart
import 'package:clide/widgets/src/clide_settings.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
/// Thin themed scrollbar. Tier-0 shell; more refined scrolling (velocity
|
|
/// multiplier, keyboard nav) lands with the editor.
|
|
class ClideScrollbar extends StatelessWidget {
|
|
const ClideScrollbar({super.key, required this.controller, required this.child, this.axis = Axis.vertical});
|
|
|
|
final ScrollController controller;
|
|
final Widget child;
|
|
final Axis axis;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final tokens = ClideSettings.theme.of(context).surface;
|
|
return ScrollbarTheme(
|
|
slider: tokens.scrollbarSlider,
|
|
sliderHover: tokens.scrollbarSliderHover,
|
|
track: tokens.scrollbarTrack,
|
|
child: RawScrollbar(controller: controller, thumbColor: tokens.scrollbarSlider, thickness: 8, radius: const Radius.circular(4), child: child),
|
|
);
|
|
}
|
|
}
|
|
|
|
class ScrollbarTheme extends InheritedWidget {
|
|
const ScrollbarTheme({super.key, required this.slider, required this.sliderHover, required this.track, required super.child});
|
|
|
|
final Color slider;
|
|
final Color sliderHover;
|
|
final Color track;
|
|
|
|
@override
|
|
bool updateShouldNotify(ScrollbarTheme old) => slider != old.slider || sliderHover != old.sliderHover || track != old.track;
|
|
}
|