import 'package:flutter/material.dart'; /// A single line of the text/code viewer: a right-aligned, non-selectable line /// number gutter plus the selectable line content, with zebra striping. class CodeLine extends StatelessWidget { final int number; final String text; final double gutterWidth; const CodeLine({ super.key, required this.number, required this.text, required this.gutterWidth, }); static const TextStyle _codeStyle = TextStyle( fontFamily: 'monospace', fontSize: 13, height: 1.4, ); @override Widget build(BuildContext context) { final theme = Theme.of(context); final isEven = number.isEven; return Container( color: isEven ? theme.colorScheme.surfaceContainerLow : null, padding: const EdgeInsets.only(left: 4, right: 12), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SelectionContainer.disabled( child: SizedBox( width: gutterWidth, child: Text( '$number', textAlign: TextAlign.right, style: _codeStyle.copyWith(color: theme.hintColor), ), ), ), const SizedBox(width: 8), Expanded(child: Text(text.isEmpty ? ' ' : text, style: _codeStyle)), ], ), ); } }