Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288import SwiftUIimport WebKitimport CoreText
#if os(macOS)import AppKittypealias AeselImage = NSImagetypealias AeselColor = NSColortypealias AeselFont = NSFont
/// Keep WebKit setup and coordinators shared; only the SwiftUI adapter differs.protocol AeselWebViewRepresentable: NSViewRepresentable where NSViewType == WKWebView { func makeWebView(context: Context) -> WKWebView func updateWebView(_ view: WKWebView, context: Context) static func dismantleWebView(_ view: WKWebView, coordinator: Coordinator)}extension AeselWebViewRepresentable { func makeNSView(context: Context) -> WKWebView { makeWebView(context: context) } func updateNSView(_ view: WKWebView, context: Context) { updateWebView(view, context: context) } static func dismantleNSView(_ view: WKWebView, coordinator: Coordinator) { dismantleWebView(view, coordinator: coordinator) } static func dismantleWebView(_ view: WKWebView, coordinator: Coordinator) {}}#elseimport UIKittypealias AeselImage = UIImagetypealias AeselColor = UIColortypealias AeselFont = UIFont
protocol AeselWebViewRepresentable: UIViewRepresentable where UIViewType == WKWebView { func makeWebView(context: Context) -> WKWebView func updateWebView(_ view: WKWebView, context: Context) static func dismantleWebView(_ view: WKWebView, coordinator: Coordinator)}extension AeselWebViewRepresentable { func makeUIView(context: Context) -> WKWebView { makeWebView(context: context) } func updateUIView(_ view: WKWebView, context: Context) { updateWebView(view, context: context) } static func dismantleUIView(_ view: WKWebView, coordinator: Coordinator) { dismantleWebView(view, coordinator: coordinator) } static func dismantleWebView(_ view: WKWebView, coordinator: Coordinator) {}}#endif
extension Image { init(aeselImage: AeselImage) { #if os(macOS) self.init(nsImage: aeselImage) #else self.init(uiImage: aeselImage) #endif }}
extension WKWebView { var aeselOpacity: CGFloat { get { #if os(macOS) alphaValue #else alpha #endif } set { #if os(macOS) alphaValue = newValue #else alpha = newValue #endif } }}
enum ApplePlatform { static func setAppearance(_ view: WKWebView, colorScheme: ColorScheme) { #if os(macOS) view.appearance = NSAppearance(named: colorScheme == .dark ? .darkAqua : .aqua) #else view.overrideUserInterfaceStyle = colorScheme == .dark ? .dark : .light #endif } static func registerFonts() { #if os(macOS) if let url = Bundle.main.url(forResource: "ComicRelief-Bold", withExtension: "ttf") { CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) } #endif }
static func image(size: CGSize, drawing: @escaping () -> Void) -> AeselImage { #if os(macOS) return NSImage(size: size, flipped: true) { _ in drawing(); return true } #else let format = UIGraphicsImageRendererFormat.default() format.opaque = false return UIGraphicsImageRenderer(size: size, format: format).image { _ in drawing() } #endif }
static func cgImage(at url: URL) -> CGImage? { #if os(macOS) return NSImage(contentsOf: url)?.cgImage(forProposedRect: nil, context: nil, hints: nil) #else return UIImage(contentsOfFile: url.path)?.cgImage #endif }
static func image(cgImage: CGImage) -> AeselImage { #if os(macOS) return NSImage(cgImage: cgImage, size: CGSize(width: cgImage.width, height: cgImage.height)) #else return UIImage(cgImage: cgImage) #endif }
static func configureEmbeddedView(_ view: WKWebView) { view.underPageBackgroundColor = .clear #if os(iOS) view.isOpaque = false view.backgroundColor = .clear view.scrollView.backgroundColor = .clear view.scrollView.isScrollEnabled = false view.scrollView.contentInsetAdjustmentBehavior = .never view.isMultipleTouchEnabled = true #endif }}
extension View { @ViewBuilder func aeselKeyboardScrolling() -> some View { #if os(iOS) scrollDismissesKeyboard(.interactively) #else self #endif } @ViewBuilder func aeselSendLabel() -> some View { #if os(iOS) submitLabel(.send) #else self #endif } @ViewBuilder func aeselHelpSheet() -> some View { #if os(iOS) presentationDetents([.medium]) #else frame(minWidth: 420, minHeight: 340) #endif } @ViewBuilder func aeselSignInSheet() -> some View { #if os(macOS) frame(minWidth: 500, minHeight: 600) #else self #endif }}
#if os(macOS)/// Keep native window controls over the notebook's own title strip.private struct AeselWindowTitle: NSViewRepresentable { let title: String let paper: Color final class Carrier: NSView { var pieceTitle = "" var paperColor = NSColor.clear override func viewDidMoveToWindow() { super.viewDidMoveToWindow() DispatchQueue.main.async { [weak self] in self?.configure() } } func updateBacking() { guard let window else { return } // The window and hosting layer resize before SwiftUI's paper does. // Paint both backing surfaces so newly exposed pixels never flash white. window.backgroundColor = paperColor if let content = window.contentView { content.wantsLayer = true CATransaction.begin() CATransaction.setDisableActions(true) content.layer?.backgroundColor = paperColor.cgColor CATransaction.commit() } } func configure() { guard let window else { return } updateBacking() if window.toolbar != nil { window.toolbar = nil } window.toolbarStyle = .expanded window.styleMask.insert(.fullSizeContentView) window.titlebarAppearsTransparent = true window.titleVisibility = .hidden window.titlebarSeparatorStyle = .none if window.title != pieceTitle { window.title = pieceTitle } } } func makeNSView(context: Context) -> Carrier { let view = Carrier(); view.pieceTitle = title; view.paperColor = NSColor(paper); return view } func updateNSView(_ view: Carrier, context: Context) { view.pieceTitle = title view.paperColor = NSColor(paper) view.updateBacking() DispatchQueue.main.async { [weak view] in view?.configure() } }}#endif
extension View { @ViewBuilder func aeselWindowTitle(_ title: String, paper: Color) -> some View { #if os(macOS) background(AeselWindowTitle(title: title, paper: paper).frame(width: 0, height: 0)) #else self #endif }}
/// Only the empty header drags the window; document clicks belong to editing.#if os(macOS)struct AeselWindowDragArea: NSViewRepresentable { final class DragView: NSView { override func mouseDown(with event: NSEvent) { if event.clickCount == 2 { window?.zoom(nil) } else { window?.performDrag(with: event) } } } func makeNSView(context: Context) -> DragView { DragView() } func updateNSView(_ view: DragView, context: Context) {}}#elsestruct AeselWindowDragArea: View { var body: some View { Color.clear }}#endif
#if os(macOS)/// Place header controls above AppKit's title-bar event layer.struct AeselTitlebarAccessory<Content: View>: NSViewRepresentable { let content: Content init(@ViewBuilder content: () -> Content) { self.content = content() } final class Carrier: NSView { let accessory = NSTitlebarAccessoryViewController() let hosting = NSHostingView(rootView: AnyView(EmptyView())) weak var installedWindow: NSWindow? var resizeObserver: NSObjectProtocol? override init(frame: NSRect) { super.init(frame: frame) accessory.layoutAttribute = .right accessory.view = hosting } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidMoveToWindow() { super.viewDidMoveToWindow() DispatchQueue.main.async { [weak self] in self?.install() } } func install() { guard let window, installedWindow !== window else { return } detach() installedWindow = window resize() window.addTitlebarAccessoryViewController(accessory) resizeObserver = NotificationCenter.default.addObserver(forName: NSWindow.didResizeNotification, object: window, queue: .main) { [weak self] _ in self?.resize() } } func resize() { guard let installedWindow else { return } // Standard window buttons own the leftmost 64 physical points. hosting.setFrameSize(NSSize(width: max(0, installedWindow.frame.width - 64), height: 32)) } func detach() { if let resizeObserver { NotificationCenter.default.removeObserver(resizeObserver) } resizeObserver = nil if let window = installedWindow, let index = window.titlebarAccessoryViewControllers.firstIndex(of: accessory) { window.removeTitlebarAccessoryViewController(at: index) } installedWindow = nil } } func makeNSView(context: Context) -> Carrier { let view = Carrier(frame: .zero) view.hosting.rootView = AnyView(content) return view } func updateNSView(_ view: Carrier, context: Context) { view.hosting.rootView = AnyView(content) view.install() } static func dismantleNSView(_ view: Carrier, coordinator: ()) { view.detach() }}#endif