The 1192-LOC sidebar monolith now keeps only its lifecycle — stats polling, team membership streams, primary-session binding, broker subscription, inject + accordion state — and switches between stateless, props-driven tab views under meta_sidebar/: - models.dart — SidebarTab/ConfigSection/ConfigPermKind enums, the MetaSection/MetaRow models, and the shared table geometry both Activity and Config render on - activity_tab.dart / team_tab.dart / config_tab.dart — the three bodies; accordion expansion stays in the parent (survives tab switches) and arrives as prop + callback - roster_row.dart, permission_badge.dart, task_row.dart, tab_strip.dart, icon_button.dart, inject_field.dart — the widgets Public API unchanged: ClaudeMetaSidebar stays put and SidebarTab is re-exported from the root file, so all 44 sidebar tests (and extension.dart) pass without a single edit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
38 lines
1.3 KiB
Dart
38 lines
1.3 KiB
Dart
/// Inline text input for injecting a message into a session (T-171).
|
|
/// Submits on Enter; Cancel is handled by the parent's icon button.
|
|
/// Split out of claude_meta_sidebar.dart (T-395).
|
|
library;
|
|
|
|
import 'package:clide/kernel/kernel.dart';
|
|
import 'package:clide/widgets/widgets.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
class InjectTextField extends StatelessWidget {
|
|
const InjectTextField({super.key, required this.controller, required this.tokens, required this.onSubmit});
|
|
|
|
final TextEditingController controller;
|
|
final SurfaceTokens tokens;
|
|
final void Function(String text) onSubmit;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
height: 22,
|
|
padding: const EdgeInsets.symmetric(horizontal: 6),
|
|
decoration: BoxDecoration(
|
|
color: tokens.panelBackground,
|
|
border: Border.all(color: tokens.panelBorder),
|
|
borderRadius: BorderRadius.circular(3),
|
|
),
|
|
child: EditableText(
|
|
controller: controller,
|
|
focusNode: FocusNode(debugLabel: 'inject-${controller.hashCode}')..requestFocus(),
|
|
style: TextStyle(fontFamily: 'JetBrains Mono', fontSize: clideFontSmall, color: tokens.globalForeground, height: 1.4),
|
|
cursorColor: tokens.globalFocus,
|
|
backgroundCursorColor: tokens.globalTextMuted,
|
|
onSubmitted: onSubmit,
|
|
),
|
|
);
|
|
}
|
|
}
|