refactor(theme): route consumer reads through ClideSettings.theme (T-473)

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>
This commit is contained in:
2026-06-17 21:47:15 +02:00
co-authored by Claude Opus 4.8
parent 1c79c9c4dc
commit 18cd945380
83 changed files with 174 additions and 187 deletions
@@ -5928,3 +5928,4 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5KEAJ8KRWVV7ZSG6H7A0', 'description', NULL, 'Per D-101. Migrate i18n reads (ClideKernel.of(context).i18n[.string]) to ClideSettings.i18n.of(context). The facade delegates to the same I18n service, so behaviour is unchanged; mechanical sweep in batches.', NULL, '2026-06-17 19:03:22', '2026-06-17 19:03:22.235', '2026-06-17 19:03:22.235', NULL, '5d617ff30e22d3b4c57ca6325920d91a', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDTCGG5Z0KNQKF89W1VZSQ8', 'status', 'backlog', 'done', NULL, '2026-06-17 19:35:22', '2026-06-17 19:35:22.690', '2026-06-17 19:35:22.690', NULL, '580448456994d6acecc88cfbd40a595f', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5KEAJ8KRWVV7ZSG6H7A0', 'status', 'backlog', 'done', NULL, '2026-06-17 19:37:39', '2026-06-17 19:37:39.813', '2026-06-17 19:37:39.813', NULL, 'd59d0df2b693a0616265dd5e39559dc0', 2) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5GVH3FTCVDEC1QAFACY4', 'status', 'backlog', 'done', NULL, '2026-06-17 19:47:02', '2026-06-17 19:47:02.941', '2026-06-17 19:47:02.941', NULL, '28625100d88cacac15cabe97754fcdc5', 2) ON CONFLICT(hash) DO NOTHING;
+1
View File
@@ -7247,3 +7247,4 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5KEAJ8KRWVV7ZSG6H7A0', 'task', '06FD07ECS3GK2V7Z2WYYPJHJYC', 'Migrate i18n consumers (ClideKernel.i18n → ClideSettings.i18n.of) per D-101', 'Per D-101. Migrate i18n reads (ClideKernel.of(context).i18n[.string]) to ClideSettings.i18n.of(context). The facade delegates to the same I18n service, so behaviour is unchanged; mechanical sweep in batches.', 'backlog', 'medium', NULL, NULL, NULL, '2026-06-17 19:00:21.490', '2026-06-17 19:03:22.235', NULL, '16d6229039400bd826a77a08eca9573b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDTCGG5Z0KNQKF89W1VZSQ8', 'task', '06FD07ECS3GK2V7Z2WYYPJHJYC', 'Migrate 11 context-less mono-font sites onto ClideSettings.fonts (thread family through helpers)', 'Per D-101. The 11 sites that need a BuildContext threaded from the nearest context-bearing caller (resolve ClideSettings.fonts.monoOf(context) and pass the family in): prompt_card.dart toolEditBody/toolReadLikeBody/toolPathLine (top-level fns); conversation_view.dart _toolResult; welcome_view.dart _tipRow; search_panel_view.dart _base getter; clide_markdown.dart _inlineElementSpan/_recordLinkSpan/_fileLinkSpan (static span chain). Until done, these render the default JetBrains Mono regardless of the mono-font setting.', 'done', 'medium', NULL, NULL, NULL, '2026-06-17 18:48:11.649', '2026-06-17 19:35:22.690', NULL, '7dd6dae4197fc95d0bc6becfad4eecbb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5KEAJ8KRWVV7ZSG6H7A0', 'task', '06FD07ECS3GK2V7Z2WYYPJHJYC', 'Migrate i18n consumers (ClideKernel.i18n → ClideSettings.i18n.of) per D-101', 'Per D-101. Migrate i18n reads (ClideKernel.of(context).i18n[.string]) to ClideSettings.i18n.of(context). The facade delegates to the same I18n service, so behaviour is unchanged; mechanical sweep in batches.', 'done', 'medium', NULL, NULL, NULL, '2026-06-17 19:00:21.490', '2026-06-17 19:37:39.813', NULL, 'fc64918991f0c9133419ee51227e1939', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FDDX5GVH3FTCVDEC1QAFACY4', 'task', '06FD07ECS3GK2V7Z2WYYPJHJYC', 'Migrate theme consumers (ClideTheme.of → ClideSettings.theme.of) per D-101', 'Per D-101. Migrate ClideTheme.of(context) consumers (hundreds of sites) to ClideSettings.theme.of(context). The facade already delegates to ClideTheme, so this is a mechanical, no-behavior-change sweep — do it in focused batches with analyze between, ideally via a scripted find/replace + import fixups.', 'done', 'medium', NULL, NULL, NULL, '2026-06-17 19:00:20.828', '2026-06-17 19:47:02.941', NULL, '8ea58b6162c81778a610f46b07585b05', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
+1 -2
View File
@@ -16,7 +16,6 @@ import 'package:clide/builtin/claude/src/image_thumbnail.dart';
import 'package:clide/builtin/claude/src/permission_mode_control.dart';
import 'package:clide/builtin/claude/src/running_indicator.dart';
import 'package:clide/builtin/claude/src/slash_commands.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/services.dart';
@@ -415,7 +414,7 @@ class _ClaudeComposerState extends State<ClaudeComposer> {
@override
Widget build(BuildContext context) {
final theme = ClideTheme.of(context).surface;
final theme = ClideSettings.theme.of(context).surface;
final hasText = _controller.text.isNotEmpty;
final fg = widget.enabled ? theme.globalForeground : theme.globalTextMuted;
+1 -1
View File
@@ -729,7 +729,7 @@ class _ClaudePaneState extends State<ClaudePane> {
@override
Widget build(BuildContext context) {
final title = widget.isPrimary ? 'claude — primary' : 'claude — secondary ${widget.secondaryIndex}';
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final Widget body;
if (_error != null) {
+1 -2
View File
@@ -8,7 +8,6 @@
library;
import 'package:clide/builtin/claude/src/task_list.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -30,7 +29,7 @@ class _ClaudeTaskDockState extends State<ClaudeTaskDock> {
final tasks = widget.tasks;
if (tasks.isEmpty) return const SizedBox.shrink(); // no chrome when empty
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final done = tasks.where((t) => t.status == TaskStatus.completed).length;
final inProgress = tasks.where((t) => t.status == TaskStatus.inProgress);
final current = inProgress.isEmpty ? null : inProgress.first.text;
@@ -175,7 +175,7 @@ class _ConversationCardState extends State<ConversationCard> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final content = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -27,7 +27,6 @@ import 'package:clide/kernel/src/facade.dart';
import 'package:clide/kernel/src/keymap/intents.dart';
import 'package:clide/kernel/src/keymap/pane_key_nav.dart';
import 'package:clide/kernel/src/syntax/language_map.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/src/terminal/terminal.dart';
import 'package:clide/widgets/widgets.dart';
@@ -293,7 +292,7 @@ class _ConversationViewState extends State<ConversationView> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final allItems = widget.controller.items;
// T-263/T-264: resolve each sidechain run → owning Agent card before
// culling, so the run is suppressed up top and folded into / nested under
+2 -2
View File
@@ -25,7 +25,7 @@ void openImageLightbox(BuildContext context, String path) {
}
Widget _placeholder(BuildContext context, double size) {
final t = ClideTheme.of(context).surface;
final t = ClideSettings.theme.of(context).surface;
return Container(
width: size,
height: size,
@@ -46,7 +46,7 @@ class ImageThumbnail extends StatelessWidget {
@override
Widget build(BuildContext context) {
final t = ClideTheme.of(context).surface;
final t = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: 'Image $_fileName',
@@ -45,7 +45,7 @@ class ActivityTabView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final latest = stats.latest;
final u = usage;
final sections = <MetaSection>[
@@ -41,7 +41,7 @@ class ConfigTabView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final cfg = config;
if (cfg == null) {
return metaPlaceholder('Claude environment not loaded.');
@@ -299,7 +299,7 @@ class _SettingControlRowState extends State<SettingControlRow> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.symmetric(vertical: kMetaRowPitch),
child: Row(
@@ -3,7 +3,6 @@
/// lib/widgets/ only when a second consumer appears.
library;
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -29,7 +28,7 @@ class MetaIconButton extends StatelessWidget {
onTap: onTap,
builder: (ctx, hovered, _) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 3, vertical: 2),
child: ClideIcon(painter, size: 12, color: hovered ? ClideTheme.of(ctx).surface.globalForeground : color),
child: ClideIcon(painter, size: 12, color: hovered ? ClideSettings.theme.of(ctx).surface.globalForeground : color),
),
),
);
@@ -70,7 +70,7 @@ class _AgentRosterRowState extends State<AgentRosterRow> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final managed = widget.orchestrator?.byMemberName(widget.member.name);
final color = teamColor(widget.member.color, fallback: tokens.globalForeground);
final st = widget.status;
@@ -4,7 +4,6 @@
library;
import 'package:clide/builtin/claude/src/meta_sidebar/models.dart';
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -16,7 +15,7 @@ class SidebarTabStrip extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
@@ -18,7 +18,7 @@ class TaskRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final marker = switch (task.status) {
'done' => '',
'claimed' => '',
@@ -48,7 +48,7 @@ class TeamTabView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (members.isEmpty) {
return metaPlaceholder('No team active.');
}
@@ -9,7 +9,6 @@
library;
import 'package:clide/builtin/claude/src/stream_json_session.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/services.dart';
@@ -130,7 +129,7 @@ class _ModelPickerCardState extends State<ModelPickerCard> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Focus(
autofocus: true,
onKeyEvent: _onKey,
@@ -88,13 +88,13 @@ class _PermissionModeControlState extends State<PermissionModeControl> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ClideAnchoredOverlay(
controller: _overlay,
side: ClideAnchorSide.above,
align: ClideAnchorAlign.end,
offset: const Offset(0, -6),
overlayBuilder: (ctx, ctrl) => ClideMenu(onClose: ctrl.close, minWidth: 180, entries: _entries(ClideTheme.of(ctx).surface)),
overlayBuilder: (ctx, ctrl) => ClideMenu(onClose: ctrl.close, minWidth: 180, entries: _entries(ClideSettings.theme.of(ctx).surface)),
anchor: ListenableBuilder(
listenable: _overlay,
builder: (ctx, _) {
+2 -3
View File
@@ -15,7 +15,6 @@ import 'dart:convert';
import 'package:clide/builtin/claude/src/stream_json_session.dart';
import 'package:clide/kernel/src/syntax/language_map.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/services.dart';
@@ -103,7 +102,7 @@ class _ToolPromptCardState extends State<ToolPromptCard> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final (accent, label, children) = widget.prompt.isQuestion ? _question(tokens) : _permission(tokens);
// Autofocus the card so number keys pick a button/option on appear (T-240).
// _onKey self-guards via hasPrimaryFocus, so once the user clicks a note
@@ -607,7 +606,7 @@ class _NoteFieldState extends State<_NoteField> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: double.infinity,
decoration: BoxDecoration(
+1 -2
View File
@@ -5,7 +5,6 @@
library;
import 'package:clide/builtin/claude/src/session_index.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/services.dart';
@@ -60,7 +59,7 @@ class _SessionPickerDialogState extends State<SessionPickerDialog> {
@override
Widget build(BuildContext context) {
final theme = ClideTheme.of(context).surface;
final theme = ClideSettings.theme.of(context).surface;
return Focus(
autofocus: true,
onKeyEvent: _onKey,
+1 -2
View File
@@ -8,7 +8,6 @@ import 'dart:io';
import 'package:clide/builtin/claude/src/session_index.dart';
import 'package:clide/builtin/claude/src/session_picker.dart' show relativeTime;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/services.dart';
@@ -55,7 +54,7 @@ class _SessionStorageDialogState extends State<SessionStorageDialog> {
@override
Widget build(BuildContext context) {
final theme = ClideTheme.of(context).surface;
final theme = ClideSettings.theme.of(context).surface;
return Focus(
autofocus: true,
onKeyEvent: _onKey,
@@ -122,7 +122,7 @@ class _TeamChatSidebarState extends State<TeamChatSidebar> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final messages = widget.model.messages;
return Column(
@@ -291,7 +291,7 @@ class _TeamChatPaneState extends State<TeamChatPane> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final messages = widget.model.messages;
return Column(
+1 -1
View File
@@ -73,7 +73,7 @@ class _TeamPanelHostState extends State<TeamPanelHost> {
@override
Widget build(BuildContext context) {
if (_members.isEmpty) return widget.lead;
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return LayoutBuilder(
builder: (context, constraints) {
@@ -92,8 +92,8 @@ class _DecisionDetailViewState extends State<DecisionDetailView> {
final d = _decision;
if (d == null) return const Padding(padding: EdgeInsets.all(12), child: ClideText('Select a decision to view details.', muted: true));
final tokens = ClideTheme.of(context).surface;
final isDark = ClideTheme.of(context).dark;
final tokens = ClideSettings.theme.of(context).surface;
final isDark = ClideSettings.theme.of(context).dark;
final typeColors = DecisionTypeColors.forTheme(dark: isDark);
final id = d['id'] as String? ?? '';
@@ -128,7 +128,7 @@ class _DecisionsViewState extends State<DecisionsView> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (_loading) return const Center(child: ClideText('Loading decisions...', muted: true));
if (_error != null) return Padding(padding: const EdgeInsets.all(12), child: ClideText(_error!, muted: true));
if (_decisions.isEmpty) {
@@ -153,7 +153,7 @@ class _DecisionsViewState extends State<DecisionsView> {
final questions = filtered.where((d) => d.type == 'question').toList();
final rejected = filtered.where((d) => d.type == 'rejected').toList();
final isDark = ClideTheme.of(context).dark;
final isDark = ClideSettings.theme.of(context).dark;
final typeColors = DecisionTypeColors.forTheme(dark: isDark);
return Column(
+1 -2
View File
@@ -9,7 +9,6 @@ library;
import 'package:clide/builtin/deeplink/src/deep_link.dart';
import 'package:clide/clide.dart';
import 'package:clide/extension/extension.dart';
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -68,7 +67,7 @@ class _DeepLinkConfirmDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final t = ClideTheme.of(context).surface;
final t = ClideSettings.theme.of(context).surface;
return ClideSurface(
width: 440,
color: t.modalSurfaceBackground,
+4 -4
View File
@@ -86,7 +86,7 @@ class _DiffViewState extends State<DiffView> {
return ListenableBuilder(
listenable: c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
label: 'diff view',
container: true,
@@ -136,7 +136,7 @@ class _DiffToolbar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
@@ -180,7 +180,7 @@ class _FileDiff extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final path = diff['path'] as String? ?? '';
final isBinary = diff['binary'] as bool? ?? false;
final isNew = diff['new'] as bool? ?? false;
@@ -264,7 +264,7 @@ class _DiffLineRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final kind = line['kind'] as String? ?? 'context';
final text = line['text'] as String? ?? '';
final oldLineNo = line['oldLineNo'] as num?;
+1 -1
View File
@@ -311,7 +311,7 @@ class _EditorViewState extends State<EditorView> {
@override
Widget build(BuildContext context) {
final c = _controller;
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
_text.tokens = tokens;
if (c == null) return const SizedBox.shrink();
@@ -1,4 +1,3 @@
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -17,7 +16,7 @@ class ExtensionsNotice extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
+3 -3
View File
@@ -202,7 +202,7 @@ class _DirRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final expanded = controller.isExpanded(path);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final selected = path == selectedPath;
return Semantics(
button: true,
@@ -263,7 +263,7 @@ class _Row extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final leftPadding = 8.0 + (depth * 14.0);
return ClideTappable(
onTap: onTap,
@@ -301,7 +301,7 @@ class _FilteredFileRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ClideTappable(
onTap: () => openWorkspaceFile(ClideKernel.of(context), entry.path),
builder: (context, hovered, _) => Container(
+7 -7
View File
@@ -68,7 +68,7 @@ class _GitPanelViewState extends State<GitPanelView> {
return ListenableBuilder(
listenable: c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
label: 'git panel',
container: true,
@@ -143,7 +143,7 @@ class _BranchHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final branch = controller.branch ?? '(detached)';
final parts = <String>[branch];
if (controller.ahead > 0) parts.add('${controller.ahead}');
@@ -173,7 +173,7 @@ class _CommitInput extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
child: Column(
@@ -239,7 +239,7 @@ class _FileGroup extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
@@ -271,7 +271,7 @@ class _GitFileRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final path = entry['path'] as String? ?? '';
final name = path.split('/').last;
final indexState = entry['indexState'] as String?;
@@ -352,7 +352,7 @@ class _SmallAction extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: semanticsLabel ?? label,
@@ -376,7 +376,7 @@ class _DiscardConfirmDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final name = path.split('/').last;
return Container(
width: 360,
+3 -3
View File
@@ -56,7 +56,7 @@ class _GitStatusItemState extends State<GitStatusItem> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (_branch == null) return const SizedBox.shrink();
final parts = <String>[_branch!];
if (_ahead > 0) parts.add('$_ahead');
@@ -143,7 +143,7 @@ class _BranchPickerState extends State<_BranchPicker> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Focus(
focusNode: _focus,
onKeyEvent: _onKey,
@@ -215,7 +215,7 @@ class _BranchRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ClideTappable(
onTap: onTap,
cursor: onTap != null ? SystemMouseCursors.click : MouseCursor.defer,
+1 -1
View File
@@ -8,7 +8,7 @@ class ToolStatusItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.toolchain,
builder: (ctx, _) {
+1 -1
View File
@@ -13,7 +13,7 @@ class AboutDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: 480,
padding: const EdgeInsets.all(20),
+2 -2
View File
@@ -110,7 +110,7 @@ class _OpenFolderDialogState extends State<OpenFolderDialog> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: 420,
padding: const EdgeInsets.all(20),
@@ -173,7 +173,7 @@ class NotARepoDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: 420,
padding: const EdgeInsets.all(20),
+2 -2
View File
@@ -142,7 +142,7 @@ class _TopMenuButtonState extends State<_TopMenuButton> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final open = widget.controller.openIndex == widget.index;
return ClideAnchoredOverlay(
controller: _overlay,
@@ -166,7 +166,7 @@ class _TopMenuButtonState extends State<_TopMenuButton> {
node.keybinding!,
fontSize: clideFontSmall,
fontFamily: ClideSettings.fonts.monoOf(context),
color: ClideTheme.of(ctx).surface.globalTextMuted,
color: ClideSettings.theme.of(ctx).surface.globalTextMuted,
)
: null,
onSelect: () => unawaited(widget.kernel.commands.execute(node.commandId)),
+1 -1
View File
@@ -53,7 +53,7 @@ class _DockStatusItemState extends State<DockStatusItem> {
return ListenableBuilder(
listenable: kernel.arrangement,
builder: (ctx, _) {
final tokens = ClideTheme.of(ctx).surface;
final tokens = ClideSettings.theme.of(ctx).surface;
final open = kernel.arrangement.isVisible(Slots.dock);
final errors = kernel.logRing.countAtLeast(LogLevel.error);
final warns = kernel.logRing.countAtLeast(LogLevel.warn) - errors;
+4 -4
View File
@@ -75,7 +75,7 @@ class _OutputViewState extends State<OutputView> {
return ListenableBuilder(
listenable: _c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final rows = _c.filtered;
return Semantics(
label: 'output log',
@@ -149,7 +149,7 @@ class _Chip extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: label,
@@ -177,7 +177,7 @@ class _JumpPill extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: 'jump to latest',
@@ -206,7 +206,7 @@ class _LogRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final fg = _levelColor(record.level, tokens);
final t = record.timestamp;
final hh = t.hour.toString().padLeft(2, '0');
+2 -2
View File
@@ -40,7 +40,7 @@ class _BacklinksViewState extends State<BacklinksView> {
return ListenableBuilder(
listenable: c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (c.activePath == null) {
return const Padding(padding: EdgeInsets.all(12), child: ClideText('Open a file to see its links.', muted: true));
}
@@ -110,7 +110,7 @@ class _LinkRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final target = link[pathKey] as String? ?? '';
final alias = link['alias'] as String?;
final display = alias ?? target;
+4 -4
View File
@@ -97,7 +97,7 @@ class _PqlSearchBodyState extends State<PqlSearchBody> {
return ListenableBuilder(
listenable: c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
@@ -174,7 +174,7 @@ class _SearchResultRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final path = entry['path'] as String? ?? '';
final score = (entry['score'] as num?)?.toDouble() ?? 0;
return Padding(
@@ -242,7 +242,7 @@ class _FileRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final path = entry['path'] as String? ?? '';
return Padding(
key: focusKey,
@@ -269,7 +269,7 @@ class _QueryResultRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final name = entry['name'] as String? ?? entry['path'] as String? ?? '';
final values = entry.entries.where((e) => e.key != 'name' && e.key != 'path').map((e) => '${e.key}: ${e.value}').join(' · ');
return Padding(
+2 -2
View File
@@ -42,7 +42,7 @@ class _ProblemsViewState extends State<ProblemsView> {
return ListenableBuilder(
listenable: c,
builder: (context, _) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
label: 'problems panel',
container: true,
@@ -104,7 +104,7 @@ class _ProblemRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
child: Column(
@@ -66,7 +66,7 @@ class _SearchPanelViewState extends State<SearchPanelView> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
@@ -90,7 +90,7 @@ class _SearchPanelViewState extends State<SearchPanelView> {
}
Widget _findBody() {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final c = _controller!;
return ListenableBuilder(
listenable: c,
@@ -443,7 +443,7 @@ class _MessageDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return _DialogFrame(
tokens: tokens,
children: [
@@ -468,7 +468,7 @@ class _ConfirmDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return _DialogFrame(
tokens: tokens,
children: [
@@ -68,7 +68,7 @@ class SettingsSearchResults extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
final store = ClideKernel.of(context).settings;
final registry = ClideKernel.of(context).settingsRegistry;
@@ -119,7 +119,7 @@ class _SectionCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.only(bottom: 18),
child: Column(
@@ -164,7 +164,7 @@ class _FieldRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final label = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -263,7 +263,7 @@ class _ToggleControl extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
checked: checked,
excludeSemantics: true,
@@ -315,7 +315,7 @@ class _SelectControlState extends State<_SelectControl> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ClideAnchoredOverlay(
controller: _overlay,
align: ClideAnchorAlign.end,
@@ -427,7 +427,7 @@ class _EditControlState extends State<_EditControl> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
textField: true,
label: widget.field.label,
@@ -504,7 +504,7 @@ class _ScopeTagState extends State<_ScopeTag> {
String _ns(String key, String fallback) => ClideSettings.i18n.of(context).string(key, namespace: _settingsNs, placeholder: fallback);
({String glyph, Color color, String tip, String label}) _appearance(SettingsScope? layer) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return switch (layer) {
SettingsScope.project => (
glyph: 'folder',
@@ -50,7 +50,7 @@ class _SettingsModalState extends State<SettingsModal> {
@override
Widget build(BuildContext context) {
final i = ClideSettings.i18n.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final title = i.string('modal.title', namespace: SettingsModal.ns, placeholder: 'Settings');
return Focus(
@@ -117,7 +117,7 @@ class _Header extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.fromLTRB(16, 12, 10, 12),
child: Row(
@@ -139,7 +139,7 @@ class _CloseButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
final label = i.string('modal.close', namespace: SettingsModal.ns, placeholder: 'Close');
final hint = i.string('modal.close.hint', namespace: SettingsModal.ns, placeholder: 'Close settings');
@@ -177,7 +177,7 @@ class _CategoryRail extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
final registry = ClideKernel.of(context).settingsRegistry;
final searching = query.trim().isNotEmpty;
@@ -241,7 +241,7 @@ class _RailRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final dim = matchCount == 0;
final fg = dim ? tokens.globalTextMuted : (selected ? tokens.globalForeground : tokens.sidebarForeground);
return Semantics(
@@ -311,7 +311,7 @@ class _EmptyState extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
return Center(
child: Padding(
+2 -2
View File
@@ -46,7 +46,7 @@ class ReaderActionBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Row(
mainAxisSize: MainAxisSize.min,
children: [
@@ -90,7 +90,7 @@ class ReaderPinButton extends StatelessWidget {
enabled: onTap != null,
active: pinned,
onTap: onTap,
tokens: ClideTheme.of(context).surface,
tokens: ClideSettings.theme.of(context).surface,
);
}
}
@@ -63,7 +63,7 @@ class _ThemeChip extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
selected: selected,
@@ -95,7 +95,7 @@ class _HcToggle extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
checked: checked,
label: label,
@@ -45,7 +45,7 @@ class _SettingsViewState extends State<SettingsView> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final i = ClideSettings.i18n.of(context);
final themes = baseThemes(widget.controller.available);
final currentBase = baseThemeName(widget.controller.currentName);
@@ -140,7 +140,7 @@ class _HighContrastToggleState extends State<_HighContrastToggle> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
checked: widget.checked,
label: widget.label,
@@ -200,7 +200,7 @@ class _ThemeRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final bg = selected ? tokens.listItemSelectedBackground : (hovered ? tokens.listItemHoverBackground : tokens.listItemBackground);
final fg = selected ? tokens.listItemSelectedForeground : tokens.listItemForeground;
return Semantics(
@@ -32,7 +32,7 @@ class _ThemeSwitcherStatusItemState extends State<ThemeSwitcherStatusItem> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
// Listen to both the theme (label changes) and the overlay (open state).
return ListenableBuilder(
listenable: Listenable.merge([_controller, _overlay]),
@@ -66,8 +66,8 @@ class _TicketDetailViewState extends State<TicketDetailView> {
final d = c.detail;
if (d == null) return const Padding(padding: EdgeInsets.all(12), child: ClideText('Select a ticket to view details.', muted: true));
final tokens = ClideTheme.of(ctx).surface;
final isDark = ClideTheme.of(ctx).dark;
final tokens = ClideSettings.theme.of(ctx).surface;
final isDark = ClideSettings.theme.of(ctx).dark;
final typeColors = TicketTypeColors.forTheme(dark: isDark);
return ClidePaneChrome(
+2 -2
View File
@@ -168,7 +168,7 @@ class _TicketsViewState extends State<TicketsView> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (_loading) return const Center(child: ClideText('Loading tickets...', muted: true));
if (_error != null) return Padding(padding: const EdgeInsets.all(12), child: ClideText(_error!, muted: true));
if (_tickets.isEmpty) return const Padding(padding: EdgeInsets.all(12), child: ClideText('No tickets.\nRun `pql ticket new` to create one.', muted: true));
@@ -197,7 +197,7 @@ class _TicketsViewState extends State<TicketsView> {
(byStatus[t.status ?? 'backlog'] ??= []).add(t);
}
final isDark = ClideTheme.of(context).dark;
final isDark = ClideSettings.theme.of(context).dark;
final typeColors = TicketTypeColors.forTheme(dark: isDark);
return Column(
+1 -2
View File
@@ -1,5 +1,4 @@
import 'package:clide/builtin/vim/src/vim_mode_service.dart';
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
@@ -17,7 +16,7 @@ class VimModeIndicator extends StatelessWidget {
listenable: service,
builder: (context, _) {
if (!service.enabled) return const SizedBox.shrink();
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: ClideText(
+3 -3
View File
@@ -12,7 +12,7 @@ class WelcomeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return LayoutBuilder(
builder: (context, c) {
// Tips card sits below the START/RECENT row when there's room
@@ -493,7 +493,7 @@ class _OpenProjectDialogState extends State<_OpenProjectDialog> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: 420,
padding: const EdgeInsets.all(20),
@@ -554,7 +554,7 @@ class _NotARepoDialog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: 420,
padding: const EdgeInsets.all(20),
+1 -1
View File
@@ -18,7 +18,7 @@ class HatBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return GestureDetector(
onPanStart: (_) => kernel.window.startDrag(),
child: Container(
+5 -5
View File
@@ -65,7 +65,7 @@ class RootLayout extends StatelessWidget {
height: dockHeight,
child: DecoratedBox(
decoration: BoxDecoration(
border: Border(top: BorderSide(color: ClideTheme.of(ctx).surface.chromeBorder)),
border: Border(top: BorderSide(color: ClideSettings.theme.of(ctx).surface.chromeBorder)),
),
child: SlotHost(slot: Slots.dock),
),
@@ -74,7 +74,7 @@ class RootLayout extends StatelessWidget {
Container(
height: statusHeight,
decoration: BoxDecoration(
border: Border(top: BorderSide(color: ClideTheme.of(ctx).surface.chromeBorder)),
border: Border(top: BorderSide(color: ClideSettings.theme.of(ctx).surface.chromeBorder)),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -136,7 +136,7 @@ class _BottomRail extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.panels,
builder: (ctx, _) {
@@ -202,7 +202,7 @@ class StatusbarCollapseToggle extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (!visible) return const SizedBox(width: 24);
// The chevron points the DIRECTION OF THE ACTION: collapsing tucks the pane
// toward its own edge, expanding brings it back toward the centre.
@@ -231,7 +231,7 @@ class StatusbarHost extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.panels,
builder: (ctx, _) {
+1 -1
View File
@@ -102,7 +102,7 @@ class _ProjectSwitcherDropdownState extends State<_ProjectSwitcherDropdown> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final recents = widget.kernel.project.recents;
final lf = _filter.toLowerCase();
final filtered = lf.isEmpty ? recents : recents.where((r) => r.name.toLowerCase().contains(lf) || r.path.toLowerCase().contains(lf)).toList();
+2 -2
View File
@@ -73,7 +73,7 @@ class RootShellState extends State<RootShell> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
// Resolve the user-selected fonts once (Settings → Appearance, T-460/T-471)
// and publish them via ClideFonts; the settings listener rebuilds this on a
// change so descendants re-read live. The UI font flows through the
@@ -326,7 +326,7 @@ class _WelcomeOverlay extends StatelessWidget {
listenable: kernel.project,
builder: (ctx, _) {
if (kernel.project.isOpen) return const SizedBox.shrink();
final tokens = ClideTheme.of(ctx).surface;
final tokens = ClideSettings.theme.of(ctx).surface;
return ColoredBox(color: tokens.globalBackground, child: const WelcomeView());
},
);
+7 -7
View File
@@ -52,7 +52,7 @@ class _SlotHostState extends State<SlotHost> {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return FocusScope(
node: _scope,
onFocusChange: _onFocusChange,
@@ -84,7 +84,7 @@ class _SlotBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
if (slot == Slots.sidebar) {
return _SidebarSlot(tabs: tabs, active: active, activeId: activeId, onSelect: (id) => kernel.panels.activateTab(slot, id));
@@ -125,7 +125,7 @@ class _SidebarSlot extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
color: tokens.chromeBackground,
alignment: Alignment.topLeft,
@@ -156,7 +156,7 @@ class _WorkspaceSlot extends StatelessWidget {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.arrangement,
builder: (ctx, _) {
@@ -218,7 +218,7 @@ class _RevealedTab extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Column(
children: [
Container(
@@ -277,7 +277,7 @@ class _EditorDragHandleState extends State<_EditorDragHandle> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final lineColor = (_hovered || _focused) ? tokens.panelActiveBorder : tokens.panelBorder;
final ratio = widget.arrangement.editorRatio;
@@ -356,7 +356,7 @@ class _ContextSlot extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(color: tokens.panelBackground, alignment: Alignment.topLeft, padding: const EdgeInsets.only(right: 2), child: active.build(context));
}
}
+1 -2
View File
@@ -1,4 +1,3 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
@@ -27,7 +26,7 @@ class ClideAccordion extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
import 'package:clide/widgets/src/clide_text.dart';
import 'package:flutter/widgets.dart';
@@ -27,7 +27,7 @@ class ClideButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final enabled = onPressed != null;
return Semantics(
+1 -2
View File
@@ -1,7 +1,6 @@
import 'dart:convert';
import 'package:clide/kernel/src/syntax/tree_sitter_service.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/typography.dart';
import 'package:flutter/widgets.dart';
@@ -51,7 +50,7 @@ class _ClideCodeBlockState extends State<ClideCodeBlock> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final style = TextStyle(
fontFamily: ClideSettings.fonts.monoOf(context),
fontFamilyFallback: clideMonoFamilyFallback,
+1 -2
View File
@@ -23,7 +23,6 @@
/// caller and passed in — this widget stays free of conversation semantics.
library;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/src/clide_card_metrics.dart';
import 'package:clide/widgets/src/clide_icon.dart';
@@ -88,7 +87,7 @@ class _ClideCollapserCardState extends State<ClideCollapserCard> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Padding(
padding: const EdgeInsets.only(bottom: kClideCardGap),
child: _expanded ? _expandedFrame(tokens) : _tickerRow(tokens),
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:flutter/widgets.dart';
class ClideDivider extends StatelessWidget {
@@ -9,7 +9,7 @@ class ClideDivider extends StatelessWidget {
@override
Widget build(BuildContext context) {
final color = ClideTheme.of(context).surface.dividerColor;
final color = ClideSettings.theme.of(context).surface.dividerColor;
return Container(width: axis == Axis.vertical ? thickness : null, height: axis == Axis.horizontal ? thickness : null, color: color);
}
}
+2 -2
View File
@@ -1,8 +1,8 @@
import 'package:clide/widgets/src/clide_settings.dart';
import 'dart:async';
import 'package:clide/kernel/src/events/message_bus.dart';
import 'package:clide/kernel/src/facade.dart';
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/icons/phosphor.dart';
import 'package:clide/widgets/src/typography.dart';
@@ -115,7 +115,7 @@ class _ClideFilterBoxState extends State<ClideFilterBox> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final hasText = _controller.text.isNotEmpty;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:flutter/widgets.dart';
/// Stateless painter producing a single-color icon. Every icon in
@@ -37,7 +37,7 @@ class ClideIcon extends StatelessWidget {
@override
Widget build(BuildContext context) {
final resolved = color ?? ClideTheme.of(context).surface.globalForeground;
final resolved = color ?? ClideSettings.theme.of(context).surface.globalForeground;
return SizedBox(
width: size,
height: size,
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
import 'package:flutter/widgets.dart';
@@ -56,7 +56,7 @@ class _RailButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
selected: active,
+2 -2
View File
@@ -10,7 +10,7 @@
/// kept here so the UX is ours.
library;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_text.dart';
@@ -115,7 +115,7 @@ class _ClideLightboxState extends State<ClideLightbox> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final size = MediaQuery.of(context).size;
return Focus(
focusNode: _focus,
+1 -2
View File
@@ -1,4 +1,3 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/src/clide_code_block.dart';
import 'package:clide/widgets/src/clide_divider.dart';
@@ -114,7 +113,7 @@ class ClideMarkdown extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final doc = md.Document(extensionSet: md.ExtensionSet.gitHubFlavored);
final nodes = doc.parseLines(source.split('\n'));
final hooks = ClideMarkdownHooks(
+2 -1
View File
@@ -8,6 +8,7 @@
/// quick-open) reuse identical key handling without [ClideMenu]'s rendering.
library;
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
@@ -250,7 +251,7 @@ class _ClideMenuState extends State<ClideMenu> {
@override
Widget build(BuildContext context) {
final t = ClideTheme.of(context).surface;
final t = ClideSettings.theme.of(context).surface;
final col = Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
+2 -2
View File
@@ -104,7 +104,7 @@ class _ClidePaletteState extends State<ClidePalette> {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.palette,
builder: (ctx, _) {
@@ -205,7 +205,7 @@ class _PaletteItemState extends State<_PaletteItem> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final selected = widget.highlighted;
return MouseRegion(
cursor: SystemMouseCursors.click,
+4 -4
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:flutter/widgets.dart';
import 'clide_divider.dart';
@@ -39,7 +39,7 @@ class ClidePaneChrome extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ColoredBox(
color: tokens.panelBackground,
child: Column(
@@ -59,7 +59,7 @@ class _CloseButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: 'Close pane',
@@ -90,7 +90,7 @@ class _Header extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
container: true,
explicitChildNodes: true,
+1 -2
View File
@@ -1,4 +1,3 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/kernel/src/theme/tokens.dart';
import 'package:clide/widgets/src/typography.dart';
import 'package:flutter/widgets.dart';
@@ -30,7 +29,7 @@ class ClidePtyView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
label: label,
textField: true,
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:flutter/widgets.dart';
/// Thin themed scrollbar. Tier-0 shell; more refined scrolling (velocity
@@ -12,7 +12,7 @@ class ClideScrollbar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ScrollbarTheme(
slider: tokens.scrollbarSlider,
sliderHover: tokens.scrollbarSliderHover,
+2 -2
View File
@@ -1,6 +1,6 @@
import 'package:clide/widgets/src/clide_settings.dart';
import 'dart:math' as math;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
import 'package:flutter/widgets.dart';
@@ -16,7 +16,7 @@ class ClideSpine extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final borderSide = BorderSide(color: tokens.dividerColor);
return Semantics(
+2 -2
View File
@@ -9,9 +9,9 @@
/// with bounded pumps.
library;
import 'package:clide/widgets/src/clide_settings.dart';
import 'dart:math' as math;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_svg_view.dart';
import 'package:flutter/widgets.dart';
@@ -61,7 +61,7 @@ class _ClideSpinnerState extends State<ClideSpinner> with SingleTickerProviderSt
@override
Widget build(BuildContext context) {
final color = widget.color ?? ClideTheme.of(context).surface.globalForeground;
final color = widget.color ?? ClideSettings.theme.of(context).surface.globalForeground;
// Tint every stroke of the multi-colour logo to one colour, keeping alpha.
final mark = ColorFiltered(
colorFilter: ColorFilter.mode(color, BlendMode.srcIn),
+2 -2
View File
@@ -8,7 +8,7 @@
/// children leave the seam for a fuller transition later.
library;
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_spinner.dart';
import 'package:clide/widgets/src/icons/check.dart';
@@ -45,7 +45,7 @@ class _ClideStatusIndicatorState extends State<ClideStatusIndicator> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final key = ValueKey('${widget.status.name}-$_seq');
final (Widget glyph, String label) = switch (widget.status) {
ClideRunStatus.running => (ClideSpinner(size: widget.size, color: tokens.globalTextMuted, key: key), 'running'),
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:flutter/widgets.dart';
/// Themed container. Replaces Material's Card / Scaffold body surfaces
@@ -17,7 +17,7 @@ class ClideSurface extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
width: width,
height: height,
+3 -3
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
import 'package:clide/widgets/src/clide_text.dart';
@@ -26,7 +26,7 @@ class ClideTabBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
container: true,
label: semanticContainerLabel,
@@ -54,7 +54,7 @@ class _Tab extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final fg = active ? tokens.tabActiveForeground : tokens.tabInactiveForeground;
return Semantics(
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/kernel.dart' show ClideTheme;
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_tooltip.dart';
import 'package:flutter/widgets.dart';
@@ -68,7 +68,7 @@ class _ClideTappableState extends State<ClideTappable> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final enabled = widget.onTap != null;
Widget child = MouseRegion(
cursor: enabled ? widget.cursor : SystemMouseCursors.forbidden,
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/typography.dart';
import 'package:flutter/widgets.dart';
@@ -36,7 +36,7 @@ class ClideText extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final resolved = color ?? (muted ? tokens.globalTextMuted : tokens.globalForeground);
return Text(
data,
+2 -1
View File
@@ -1,3 +1,4 @@
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/kernel/kernel.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
@@ -50,7 +51,7 @@ class _ClideToastState extends State<ClideToast> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final style = _styleFor(widget.entry.severity, tokens);
return AnimatedSlide(
offset: _shown ? Offset.zero : const Offset(0.25, 0),
+2 -2
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_text.dart';
import 'package:flutter/widgets.dart';
@@ -29,7 +29,7 @@ class _ClideTooltipState extends State<ClideTooltip> {
_entry = OverlayEntry(
builder: (ctx) {
final tokens = ClideTheme.of(ctx).surface;
final tokens = ClideSettings.theme.of(ctx).surface;
final tooltip = Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
+1 -1
View File
@@ -133,7 +133,7 @@ class _ExLineOverlayState extends State<ExLineOverlay> {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.exLine,
builder: (ctx, _) {
+6 -6
View File
@@ -1,4 +1,4 @@
import 'package:clide/kernel/src/theme/controller.dart';
import 'package:clide/widgets/src/clide_settings.dart';
import 'package:clide/widgets/src/clide_icon.dart';
import 'package:clide/widgets/src/clide_tappable.dart';
import 'package:clide/widgets/src/clide_text.dart';
@@ -105,7 +105,7 @@ class _TabStrip<T> extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final entries = controller.entries;
final activeId = controller.activeId;
@@ -185,7 +185,7 @@ class _ReorderableTabState<T> extends State<_ReorderableTab<T>> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final tabContent = _Tab<T>(entry: widget.entry, active: widget.active, onSelect: widget.onSelect, onClose: widget.onClose, tabHeight: widget.tabHeight);
@@ -238,7 +238,7 @@ class _DragFeedback extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Container(
height: tabHeight,
constraints: const BoxConstraints(minWidth: 96, maxWidth: 200),
@@ -271,7 +271,7 @@ class _TabState<T> extends State<_Tab<T>> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final fg = widget.active ? tokens.tabActiveForeground : tokens.tabInactiveForeground;
// Active tabs sit on the elevated chrome surface (panelHeader);
// inactive tabs blend into the tab bar.
@@ -343,7 +343,7 @@ class _AddButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return Semantics(
button: true,
label: 'New tab',
+2 -2
View File
@@ -150,7 +150,7 @@ class _QuickOpenOverlayState extends State<QuickOpenOverlay> {
@override
Widget build(BuildContext context) {
final kernel = ClideKernel.of(context);
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
return ListenableBuilder(
listenable: kernel.quickOpen,
builder: (ctx, _) {
@@ -262,7 +262,7 @@ class _QuickOpenItemState extends State<_QuickOpenItem> {
@override
Widget build(BuildContext context) {
final tokens = ClideTheme.of(context).surface;
final tokens = ClideSettings.theme.of(context).surface;
final selected = widget.highlighted;
// Split the basename from its directory so the filename reads first.
final slash = widget.path.lastIndexOf('/');