diff options
Diffstat (limited to 'Sources/NorgUI/Math/MathBlockView.swift')
| -rw-r--r-- | Sources/NorgUI/Math/MathBlockView.swift | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Sources/NorgUI/Math/MathBlockView.swift b/Sources/NorgUI/Math/MathBlockView.swift new file mode 100644 index 0000000..c29fdb6 --- /dev/null +++ b/Sources/NorgUI/Math/MathBlockView.swift @@ -0,0 +1,34 @@ +import SwiftUI + +/// Renders a `@math` block asynchronously with a fallback to `VerbatimBlock`. +struct MathBlockView: View { + @Environment(\.norgTheme) private var theme + + let latex: String + + @State private var rendered: NorgMathImage? + + var body: some View { + content + .task(id: renderKey) { + guard let renderer = theme.mathRenderer else { return } + rendered = await renderer.render( + latex: latex, mode: .block, fontSize: theme.mathFontSize, color: nil) + } + } + + @ViewBuilder + private var content: some View { + if let rendered { + rendered.swiftUIImage + .frame(width: rendered.size.width, height: rendered.size.height, alignment: .leading) + .padding(theme.verbatimPadding) + .frame(maxWidth: .infinity, alignment: .leading) + .background(theme.codeBackground, in: RoundedRectangle(cornerRadius: 8)) + } else { + VerbatimBlock(label: nil, content: latex) + } + } + + private var renderKey: String { "\(latex)@\(theme.mathFontSize)" } +} |