diff --git a/Package.resolved b/Package.resolved index e2b4dea8..710aa97f 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "repositoryURL": "https://github.com/swiftwasm/JavaScriptKit.git", "state": { "branch": null, - "revision": "8ba4135d5fd6a734c3771ef3fac66896bbcb0214", - "version": "0.8.0" + "revision": "b7a02434c6e973c08c3fd5069105ef44dd82b891", + "version": "0.9.0" } }, { diff --git a/Package.swift b/Package.swift index be7f653d..0a7a20f8 100644 --- a/Package.swift +++ b/Package.swift @@ -39,7 +39,7 @@ let package = Package( // .package(url: /* package url */, from: "1.0.0"), .package( url: "https://github.com/swiftwasm/JavaScriptKit.git", - .upToNextMinor(from: "0.8.0") + .upToNextMinor(from: "0.9.0") ), .package(url: "https://github.com/MaxDesiatov/Runtime.git", from: "2.1.2"), .package(url: "https://github.com/TokamakUI/OpenCombine.git", from: "0.12.0-alpha2"), @@ -95,7 +95,8 @@ let package = Package( package: "JavaScriptKit", condition: .when(platforms: [.wasi]) ), - ] + ], + resources: [.copy("logo-header.png")] ), .target( name: "TokamakStaticDemo", diff --git a/README.md b/README.md index 252bd7a0..6a8d1c99 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Tokamak logo +Tokamak logo ## SwiftUI-compatible framework for building browser apps with WebAssembly diff --git a/Sources/TokamakCore/Views/Image.swift b/Sources/TokamakCore/Views/Image.swift new file mode 100644 index 00000000..77d1e195 --- /dev/null +++ b/Sources/TokamakCore/Views/Image.swift @@ -0,0 +1,57 @@ +// Copyright 2018-2020 Tokamak contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Created by Jed Fox on 07/01/2020. +// + +import Foundation + +public struct Image: View { + let label: Text? + let name: String + let bundle: Bundle? + + public init(_ name: String, bundle: Bundle? = nil) { + label = Text(name) + self.name = name + self.bundle = bundle + } + + public init(_ name: String, bundle: Bundle? = nil, label: Text) { + self.label = label + self.name = name + self.bundle = bundle + } + + public init(decorative name: String, bundle: Bundle? = nil) { + label = nil + self.name = name + self.bundle = bundle + } + + public var body: Never { + neverBody("Image") + } +} + +/// This is a helper class that works around absence of "package private" access control in Swift +public struct _ImageProxy { + public let subject: Image + + public init(_ subject: Image) { self.subject = subject } + + public var labelString: String? { subject.label?.storage.rawText } + public var name: String { subject.name } + public var path: String? { subject.bundle?.path(forResource: subject.name, ofType: nil) } +} diff --git a/Sources/TokamakDOM/Core.swift b/Sources/TokamakDOM/Core.swift index cecdf4c1..40d92fd7 100644 --- a/Sources/TokamakDOM/Core.swift +++ b/Sources/TokamakDOM/Core.swift @@ -94,6 +94,7 @@ public typealias GeometryReader = TokamakCore.GeometryReader public typealias GridItem = TokamakCore.GridItem public typealias Group = TokamakCore.Group public typealias HStack = TokamakCore.HStack +public typealias Image = TokamakCore.Image public typealias LazyHGrid = TokamakCore.LazyHGrid public typealias LazyVGrid = TokamakCore.LazyVGrid public typealias List = TokamakCore.List diff --git a/Sources/TokamakDemo/TokamakDemo.swift b/Sources/TokamakDemo/TokamakDemo.swift index 976f41f7..235e0d5a 100644 --- a/Sources/TokamakDemo/TokamakDemo.swift +++ b/Sources/TokamakDemo/TokamakDemo.swift @@ -68,6 +68,9 @@ struct TokamakDemoView: View { NavigationView { () -> AnyView in let list = title( List { + Image("logo-header.png", label: Text("Tokamak Demo")) + .frame(height: 50) + .padding(.bottom, 20) Section(header: Text("Buttons")) { NavItem( "Counter", diff --git a/docs/logo-header.png b/Sources/TokamakDemo/logo-header.png similarity index 100% rename from docs/logo-header.png rename to Sources/TokamakDemo/logo-header.png diff --git a/Sources/TokamakStaticHTML/Views/Images/Image.swift b/Sources/TokamakStaticHTML/Views/Images/Image.swift new file mode 100644 index 00000000..b55e8e7e --- /dev/null +++ b/Sources/TokamakStaticHTML/Views/Images/Image.swift @@ -0,0 +1,40 @@ +// Copyright 2020 Tokamak contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Created by Max Desiatov on 11/04/2020. +// + +import TokamakCore + +public typealias Image = TokamakCore.Image + +extension Image: ViewDeferredToRenderer { + public var deferredBody: AnyView { + AnyView(_HTMLImage(proxy: _ImageProxy(self))) + } +} + +struct _HTMLImage: View { + let proxy: _ImageProxy + public var body: some View { + var attributes: [HTMLAttribute: String] = [ + "src": proxy.path ?? proxy.name, + "style": "max-width: 100%; max-height: 100%", + ] + if let label = proxy.labelString { + attributes["alt"] = label + } + return AnyView(HTML("img", attributes)) + } +} diff --git a/docs/progress.md b/docs/progress.md index 55a80abc..f2ab7c1b 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -26,7 +26,7 @@ Table columns: | | | | | --- | ---------------------------------------------------------------- | :-: | -| | [Image](https://developer.apple.com/documentation/swiftui/image) | | +| 🚧 | [Image](https://developer.apple.com/documentation/swiftui/image) | | ### Buttons