feat(draw): data-lightbox tap-to-zoom on the drawing card (T-318)

A data-lightbox element gets a tap target (click cursor) over its region;
DrawingCard exposes an onLightbox callback, which the conversation wires to
open the whole drawing in a ClideLightbox (zoomable). Completes the
per-object overlay — captions + lightbox — and T-318's defined scope.
Widget-tested (the tap fires the callback).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 22:40:26 +02:00
co-authored by Claude Opus 4.8
parent 3e43746c17
commit b1ec4afe15
3 changed files with 72 additions and 24 deletions
+14 -1
View File
@@ -24,6 +24,7 @@ import 'package:clide/builtin/claude/src/prompt_card.dart';
import 'package:clide/builtin/claude/src/transcript_reader.dart';
import 'package:clide/src/svg/svg_document.dart' show buildSvgDocument;
import 'package:clide/widgets/src/draw/drawing_card.dart';
import 'package:clide/widgets/src/svg/svg_painter.dart' show SvgView;
import 'package:clide/builtin/claude/src/workflow_run.dart';
import 'package:clide/kernel/src/facade.dart';
import 'package:clide/kernel/src/keymap/intents.dart';
@@ -711,10 +712,22 @@ class _ConversationTurn extends StatelessWidget {
/// CustomPaint engine (D-103), display-only per D-78, with an optional
/// label/description caption.
Widget _drawing(BuildContext context, DrawingMessage m) {
final doc = buildSvgDocument(m.svg);
return ConversationCard(
accent: tokens.globalTextMuted,
label: ClideSettings.i18n.string(context, 'conversation.label.drawing', namespace: 'builtin.claude', placeholder: 'drawing'),
body: DrawingCard(document: buildSvgDocument(m.svg), label: m.label, description: m.description),
body: DrawingCard(
document: doc,
label: m.label,
description: m.description,
// A data-lightbox element opens the whole drawing, zoomable (T-318).
onLightbox: () => ClideKernel.of(context).dialog.show<Object>(
(ctx, dismiss) => ClideLightbox(
onDismiss: dismiss,
child: SvgView(document: doc),
),
),
),
);
}