codify UI spacing constants (T-86)

Adds lib/widgets/src/spacing.dart with three categories of named
constants — insets (clideInsetHairline / Tight / Icon / Standard /
Text), gaps (clideGapTight / Standard / Section / SectionLarge /
Major / Column), and sizes (clideIconMicro / Caption / Standard /
HitTarget / Emphatic, clideControlHeight).

Migrates MultitabPane to consume the constants and updates the
ui-design geometry reference to point at them. Inline pixel
literals in widget code were drifting (12 here, 6 there, 28
elsewhere) — pulling them through named symbols makes the
"uniform inner spacing" rule enforceable instead of eyeballed.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-06 15:45:07 +02:00
co-authored by Claude
parent 29ac9b3caf
commit e329f1cc6f
7 changed files with 151 additions and 26 deletions
+8 -3
View File
@@ -1,3 +1,4 @@
import 'package:clide/widgets/src/icons/x.dart';
import 'package:clide/widgets/widgets.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -5,6 +6,10 @@ import 'package:flutter_test/flutter_test.dart';
import '../helpers/kernel_fixture.dart';
import '../helpers/widget_harness.dart';
Finder _closeIcons() => find.byWidgetPredicate(
(w) => w is ClideIcon && w.painter is CloseIcon,
);
MultitabEntry<String> entry(String id, {bool closeable = true, bool reorderable = true}) {
return MultitabEntry<String>(
id: id,
@@ -119,7 +124,7 @@ void main() {
// A pinned tab has no close target; a closeable one does (it's
// hidden via Opacity until hover, but still in the tree).
// Two tabs total, one × glyph for 's'.
expect(find.text('×'), findsOneWidget);
expect(_closeIcons(), findsOneWidget);
});
testWidgets('default close behavior removes the entry', (tester) async {
@@ -130,7 +135,7 @@ void main() {
harness(f, MultitabPane<String>(controller: c, bodyBuilder: body)),
);
await tester.tap(find.text('×'));
await tester.tap(_closeIcons());
await tester.pumpAndSettle();
expect(c.entries.map((e) => e.id), ['p']);
@@ -151,7 +156,7 @@ void main() {
);
// Both tabs are closeable; tap the first × encountered.
await tester.tap(find.text('×').first);
await tester.tap(_closeIcons().first);
await tester.pumpAndSettle();
expect(closed, isNotNull);