Add `Image` implementation, bump JSKit to 0.9.0 (#155)

* Add Image view

* Add image to demo

* Update progress.md

* Alt text

* Use Bundle type to load images, remove systemName

* Add `logo-header.png` resource to `TokamakDemo`

* Reduce image size in the demo

* Allow bundles passed to `Image` to be optional

* Pass `nil` as a default `bundle` to `Image`

Co-authored-by: Max Desiatov <max@desiatov.com>
This commit is contained in:
Jed Fox 2020-12-04 06:19:55 -05:00 committed by GitHub
parent 9d347f49f3
commit 797c0d849f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 108 additions and 6 deletions

View File

@ -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"
}
},
{

View File

@ -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",

View File

@ -1,4 +1,4 @@
<img alt="Tokamak logo" src="docs/logo-header.png" width="640px"/>
<img alt="Tokamak logo" src="Sources/TokamakDemo/logo-header.png" width="640px"/>
## SwiftUI-compatible framework for building browser apps with WebAssembly

View File

@ -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) }
}

View File

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

View File

@ -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",

View File

Before

Width:  |  Height:  |  Size: 364 KiB

After

Width:  |  Height:  |  Size: 364 KiB

View File

@ -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))
}
}

View File

@ -26,7 +26,7 @@ Table columns:
| | | |
| --- | ---------------------------------------------------------------- | :-: |
| | [Image](https://developer.apple.com/documentation/swiftui/image) | |
| 🚧 | [Image](https://developer.apple.com/documentation/swiftui/image) | |
### Buttons