import SwiftUI import UniformTypeIdentifiers import AppKit @main struct MarkdownViewerApp: App { var body: some Scene { Settings { EmptyView() } .commands { CommandGroup(replacing: .newItem) { Button("Open Markdown File...") { openMarkdownFile() } .keyboardShortcut("o", modifiers: .command) } } } private func openMarkdownFile() { let panel = NSOpenPanel() panel.allowsMultipleSelection = true panel.canChooseDirectories = false panel.canChooseFiles = true panel.allowedContentTypes = [UTType.plainText, UTType(filenameExtension: "md")!] if panel.runModal() == .OK { for url in panel.urls { openNewWindow(for: url) } } } private func openNewWindow(for url: URL) { do { let content = try String(contentsOf: url, encoding: .utf8) let newWindow = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 800, height: 600), styleMask: [.titled, .closable, .resizable, .miniaturizable], backing: .buffered, defer: false ) newWindow.title = url.lastPathComponent newWindow.contentView = NSHostingView( rootView: MarkdownDocumentView( content: content, fileName: url.lastPathComponent ) ) newWindow.center() newWindow.makeKeyAndOrderFront(nil) } catch { print("Error reading file: \(error)") // Show error in a new window let newWindow = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 400, height: 200), styleMask: [.titled, .closable], backing: .buffered, defer: false ) newWindow.title = "Error" newWindow.contentView = NSHostingView( rootView: VStack { Image(systemName: "exclamationmark.triangle") .font(.system(size: 40)) .foregroundColor(.red) Text("Error loading file") .font(.headline) Text(error.localizedDescription) .font(.caption) .foregroundColor(.secondary) .multilineTextAlignment(.center) } .padding() ) newWindow.center() newWindow.makeKeyAndOrderFront(nil) } } }