import SwiftUI struct SheetPreview: Decodable, Hashable, Sendable { let Rows: Int let Cols: Int let Empty: Bool let Cells: [SheetPreviewCell]? } struct SheetPreviewCell: Decodable, Hashable, Sendable { let R: Int let C: Int let Fill: String let Bold: Bool } /// Renders shape metadata only: no cell text, web view, or external image fetch. struct SheetThumbnail: View { private let preview: SheetPreview? var width: CGFloat = 52 var height: CGFloat = 68 init(_ preview: SheetPreview?, width: CGFloat = 52, height: CGFloat = 68) { self.preview = preview; self.width = width; self.height = height } var body: some View { Canvas { context, size in let border = Path(roundedRect: CGRect(origin: .zero, size: size).insetBy(dx: 0.5, dy: 0.5), cornerRadius: 3) context.fill(border, with: .color(.primary.opacity(0.025))) context.stroke(border, with: .color(.secondary.opacity(0.3)), lineWidth: 1) guard let preview, !preview.Empty, (1...12).contains(preview.Rows), (1...8).contains(preview.Cols) else { return } let width = (size.width - 8) / Double(preview.Cols) let height = (size.height - 8) / Double(preview.Rows) for cell in (preview.Cells ?? []).prefix(96) { guard (0..