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 @@
-
+
## 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