[iOS] Admin Dashboard - Active Devices Icons (#1275)

* Add Device images & Reference using the Enum as a filler if the NowPlayingItem is Nil

* Localize DeviceTypes.DisplayTitles

* Review changes. Last potential TODO: Image: ImageResource might not be the correct format

* DeviceType is needed to build tvOS

* Mirror Jellyfin-Blue-Blob for SVG configuration. Use ImageResource for the Device/Client Images

* Merge missing }

* Don't recreate the ImageResource since it's already generated.

* New webOS logo! Fix tvOS not having the new logos

* use if let, implicit self

* use secondary system fill for other

---------

Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
This commit is contained in:
Joe 2024-10-15 21:34:38 -06:00 committed by GitHub
parent 0148e46afb
commit 50e0cfef73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
48 changed files with 723 additions and 18 deletions

View File

@ -0,0 +1,276 @@
//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import SwiftUI
enum DeviceType: String, Displayable, Codable, CaseIterable {
case android
case apple
case chrome
case edge
case edgechromium
case finamp
case firefox
case homeAssistant
case html5
case kodi
case msie
case opera
case playstation
case roku
case safari
case samsungtv
case webos
case windows
case xbox
case other
// MARK: - Display Title
var displayTitle: String {
switch self {
case .android:
return "Android"
case .apple:
return "Apple"
case .chrome:
return "Chrome"
case .edge:
return "Edge"
case .edgechromium:
return "Edge Chromium"
case .finamp:
return "Finamp"
case .firefox:
return "Firefox"
case .homeAssistant:
return "Home Assistant"
case .html5:
return "HTML5"
case .kodi:
return "Kodi"
case .msie:
return "Internet Explorer"
case .opera:
return "Opera"
case .playstation:
return "PlayStation"
case .roku:
return "Roku"
case .safari:
return "Safari"
case .samsungtv:
return "Samsung TV"
case .webos:
return "WebOS"
case .windows:
return "Windows"
case .xbox:
return "Xbox"
case .other:
return "Other"
}
}
// MARK: - Initialize the Client
init(client: String?, deviceName: String?) {
guard let client = client?.lowercased() else {
self = .other
return
}
switch client {
/* Android or Findroid */
case let str where str.range(of: #"android|findroid"#, options: .regularExpression) != nil:
self = .android
/* Apple devices: iOS, tvOS, iPadOS, Swiftfin, or Infuse */
case let str where str.range(of: #"ios|tvos|ipados|swiftfin|infuse"#, options: .regularExpression) != nil:
self = .apple
/* Finamp */
case let str where str.range(of: #"finamp"#, options: .regularExpression) != nil:
self = .finamp
/* Home Assistant or HomeAssistant */
case let str where str.range(of: #"home.assistant|homeassistant"#, options: .regularExpression) != nil:
self = .homeAssistant
/* Jellyfin Web or JellyfinWeb (Vue versions included) */
case let str where str.range(of: #"jellyfin.web|jellyfinweb"#, options: .regularExpression) != nil:
self = DeviceType(webBrowser: deviceName)
/* Kodi or JellyCon */
case let str where str.range(of: #"kodi|jellycon"#, options: .regularExpression) != nil:
self = .kodi
/* LG TV, LG Smart TV, or WebOS devices */
case let str where str.range(of: #"lg.+tv|webos"#, options: .regularExpression) != nil:
self = .webos
/* PlayStation: Sony PS3, PS4, or any PlayStation */
case let str where str.range(of: #"sony\sps[3-4]|playstation"#, options: .regularExpression) != nil:
self = .playstation
/* Roku devices */
case let str where str.range(of: #"roku"#, options: .regularExpression) != nil:
self = .roku
/* Samsung TV, Samsung Smart TV, or devices running Tizen */
case let str where str.range(of: #"samsung.+tv|tizen"#, options: .regularExpression) != nil:
self = .samsungtv
/* Xbox One or any Xbox device */
case let str where str.range(of: #"xbox"#, options: .regularExpression) != nil:
self = .xbox
/* Default case for anything else */
default:
self = .other
}
}
// MARK: - Initialize the Browser if Jellyfin-Web
private init(webBrowser: String?) {
guard let webBrowser = webBrowser?.lowercased() else {
self = .html5
return
}
switch webBrowser {
/* Matches any string containing 'chrome' */
case let str where str.range(of: #"chrome"#, options: .regularExpression) != nil:
self = .chrome
/* Matches any string containing 'edge chromium' or 'edgechromium' */
case let str where str.range(of: #"edge.chromium|edgechromium"#, options: .regularExpression) != nil:
self = .edgechromium
/* Matches any string containing 'edge' but not 'chromium' */
case let str
where str.range(of: #"edge"#, options: .regularExpression) != nil && str
.range(of: #"chromium"#, options: .regularExpression) == nil:
self = .edge
/* Matches any string containing 'firefox' */
case let str where str.range(of: #"firefox"#, options: .regularExpression) != nil:
self = .firefox
/* Matches any string containing 'internet explorer', 'IE', 'MSIE', or 'MSFT IE' */
case let str
where str.range(of: #"internet.explorer|internetexplorer|ie\d|ie.\d|msie|msft.ie"#, options: .regularExpression) != nil:
self = .msie
/* Matches any string containing 'opera' */
case let str where str.range(of: #"opera"#, options: .regularExpression) != nil:
self = .opera
/* Matches any string containing 'safari' */
case let str where str.range(of: #"safari"#, options: .regularExpression) != nil:
self = .safari
/* Default case for anything else */
default:
self = .html5
}
}
// MARK: - Client Image
var image: ImageResource {
switch self {
case .android:
return .deviceClientAndroid
case .apple:
return .deviceClientApple
case .chrome:
return .deviceBrowserChrome
case .edge:
return .deviceBrowserEdge
case .edgechromium:
return .deviceBrowserEdgechromium
case .finamp:
return .deviceClientFinamp
case .firefox:
return .deviceBrowserFirefox
case .homeAssistant:
return .deviceOtherHomeassistant
case .html5:
return .deviceBrowserHtml5
case .kodi:
return .deviceClientKodi
case .msie:
return .deviceBrowserMsie
case .opera:
return .deviceBrowserOpera
case .playstation:
return .deviceClientPlaystation
case .roku:
return .deviceClientRoku
case .safari:
return .deviceBrowserSafari
case .samsungtv:
return .deviceClientSamsungtv
case .webos:
return .deviceClientWebos
case .windows:
return .deviceClientWindows
case .xbox:
return .deviceClientXbox
case .other:
return .deviceOtherOther
}
}
// MARK: - Client Color
var clientColor: Color {
switch self {
case .android:
return Color(red: 0.18, green: 0.8, blue: 0.44) // Android Green
case .apple:
return Color(red: 0.35, green: 0.35, blue: 0.35) // Apple Gray
case .chrome:
return Color(red: 0.98, green: 0.75, blue: 0.18) // Chrome Yellow
case .edge:
return Color(red: 0.19, green: 0.31, blue: 0.51) // Edge Gray
case .edgechromium:
return Color(red: 0.0, green: 0.45, blue: 0.75) // Edge Chromium Blue
case .firefox:
return Color(red: 1.0, green: 0.33, blue: 0.0) // Firefox Orange
case .finamp:
return Color(red: 0.61, green: 0.32, blue: 0.88) // Finamp Purple
case .homeAssistant:
return Color(red: 0.0, green: 0.55, blue: 0.87) // Home Assistant Blue
case .kodi:
return Color(red: 0.0, green: 0.58, blue: 0.83) // Kodi Blue
case .msie:
return Color(red: 0.0, green: 0.53, blue: 1.0) // Internet Explorer Blue
case .opera:
return Color(red: 1.0, green: 0.0, blue: 0.0) // Opera Red
case .playstation:
return Color(red: 0.0, green: 0.32, blue: 0.65) // PlayStation Blue
case .roku:
return Color(red: 0.31, green: 0.09, blue: 0.55) // Roku Purple
case .safari:
return Color(red: 0.0, green: 0.48, blue: 1.0) // Safari Blue
case .samsungtv:
return Color(red: 0.0, green: 0.44, blue: 0.74) // Samsung Blue
case .webos:
return Color(red: 0.6667, green: 0.1569, blue: 0.2745) // WebOS Pink
case .xbox:
return Color(red: 0.0, green: 0.5, blue: 0.0) // Xbox Green
default:
return Color.secondarySystemFill
}
}
}

View File

@ -11,6 +11,13 @@ import JellyfinAPI
extension SessionInfo {
var device: DeviceType {
DeviceType(
client: client,
deviceName: deviceName
)
}
var playMethodDisplayTitle: String? {
guard nowPlayingItem != nil, let playState, let playMethod = playState.playMethod else { return nil }

View File

@ -9,8 +9,11 @@
/* Begin PBXBuildFile section */
091B5A8A2683142E00D78B61 /* ServerDiscovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091B5A872683142E00D78B61 /* ServerDiscovery.swift */; };
091B5A8D268315D400D78B61 /* ServerDiscovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091B5A872683142E00D78B61 /* ServerDiscovery.swift */; };
4E0253BD2CBF0C06007EB9CD /* DeviceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E12F9152CBE9615006C217E /* DeviceType.swift */; };
4E0A8FFB2CAF74D20014B047 /* TaskCompletionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */; };
4E0A8FFC2CAF74D20014B047 /* TaskCompletionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */; };
4E11805F2CBF52380077A588 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5377CBF8263B596B003A4E83 /* Assets.xcassets */; };
4E12F9172CBE9619006C217E /* DeviceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E12F9152CBE9615006C217E /* DeviceType.swift */; };
4E16FD512C0183DB00110147 /* LetterPickerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD502C0183DB00110147 /* LetterPickerButton.swift */; };
4E16FD532C01840C00110147 /* LetterPickerBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD522C01840C00110147 /* LetterPickerBar.swift */; };
4E16FD572C01A32700110147 /* LetterPickerOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD562C01A32700110147 /* LetterPickerOrientation.swift */; };
@ -57,6 +60,8 @@
4EB1A8CA2C9A766200F43898 /* ActiveSessionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8C92C9A765800F43898 /* ActiveSessionsView.swift */; };
4EB1A8CC2C9B1BA200F43898 /* ServerTaskButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8CB2C9B1B9700F43898 /* ServerTaskButton.swift */; };
4EB1A8CE2C9B2D0800F43898 /* ActiveSessionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8CD2C9B2D0100F43898 /* ActiveSessionRow.swift */; };
4EB4ECE32CBEFC4D002FF2FC /* SessionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */; };
4EB4ECE42CBEFC4D002FF2FC /* SessionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */; };
4EB7B33B2CBDE645004A342E /* ChevronAlertButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB7B33A2CBDE63F004A342E /* ChevronAlertButton.swift */; };
4EBE06462C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */; };
4EBE06472C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */; };
@ -1023,6 +1028,7 @@
/* Begin PBXFileReference section */
091B5A872683142E00D78B61 /* ServerDiscovery.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerDiscovery.swift; sourceTree = "<group>"; };
4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskCompletionStatus.swift; sourceTree = "<group>"; };
4E12F9152CBE9615006C217E /* DeviceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceType.swift; sourceTree = "<group>"; };
4E16FD502C0183DB00110147 /* LetterPickerButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerButton.swift; sourceTree = "<group>"; };
4E16FD522C01840C00110147 /* LetterPickerBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerBar.swift; sourceTree = "<group>"; };
4E16FD562C01A32700110147 /* LetterPickerOrientation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerOrientation.swift; sourceTree = "<group>"; };
@ -1057,6 +1063,7 @@
4EB1A8C92C9A765800F43898 /* ActiveSessionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveSessionsView.swift; sourceTree = "<group>"; };
4EB1A8CB2C9B1B9700F43898 /* ServerTaskButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerTaskButton.swift; sourceTree = "<group>"; };
4EB1A8CD2C9B2D0100F43898 /* ActiveSessionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveSessionRow.swift; sourceTree = "<group>"; };
4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionInfo.swift; sourceTree = "<group>"; };
4EB7B33A2CBDE63F004A342E /* ChevronAlertButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChevronAlertButton.swift; sourceTree = "<group>"; };
4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackCompatibility.swift; sourceTree = "<group>"; };
4EBE064C2C7EB6D3004A6C03 /* VideoPlayerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerType.swift; sourceTree = "<group>"; };
@ -3569,6 +3576,8 @@
E1ED7FDA2CAA4B6D00ACB6E3 /* PlayerStateInfo.swift */,
E1CB758A2C80F9EC00217C76 /* CodecProfile.swift */,
4EBE06502C7ED0E1004A6C03 /* DeviceProfile.swift */,
4E12F9152CBE9615006C217E /* DeviceType.swift */,
4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */,
4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */,
E1CB75712C80E71800217C76 /* DirectPlayProfile.swift */,
E1722DB029491C3900CC0239 /* ImageBlurHashes.swift */,
@ -4157,6 +4166,7 @@
53913BF026D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0826D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1126D323FE00EB3286 /* Localizable.strings in Resources */,
4E11805F2CBF52380077A588 /* Assets.xcassets in Resources */,
535870672669D21700D05A09 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -4279,6 +4289,7 @@
E1B490452967E26300D3EDCE /* PersistentLogHandler.swift in Sources */,
E193D53327193F7D00900D82 /* FilterCoordinator.swift in Sources */,
E18E021E2887492B0022598C /* RowDivider.swift in Sources */,
4EB4ECE42CBEFC4D002FF2FC /* SessionInfo.swift in Sources */,
E1DC983E296DEB9B00982F06 /* UnwatchedIndicator.swift in Sources */,
4E2AC4BF2C6C48D200DD600D /* CustomDeviceProfileAction.swift in Sources */,
4EBE06472C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */,
@ -4450,6 +4461,7 @@
E1575E6C293E77B5001665B1 /* SliderType.swift in Sources */,
E1E2F8402B757DFA00B75998 /* OnFinalDisappearModifier.swift in Sources */,
E17DC74B2BE740D900B42379 /* StoredValues+Server.swift in Sources */,
4E0253BD2CBF0C06007EB9CD /* DeviceType.swift in Sources */,
E10E842A29A587110064EA49 /* LoadingView.swift in Sources */,
E193D53927193F8E00900D82 /* SearchCoordinator.swift in Sources */,
E13316FF2ADE42B6009BF865 /* OnSizeChangedModifier.swift in Sources */,
@ -4678,6 +4690,7 @@
621338932660107500A81A2A /* String.swift in Sources */,
E17AC96F2954EE4B003D2BC2 /* DownloadListViewModel.swift in Sources */,
BD39577C2C113FAA0078CEF8 /* TimestampSection.swift in Sources */,
4EB4ECE32CBEFC4D002FF2FC /* SessionInfo.swift in Sources */,
4EC6C16B2C92999800FC904B /* TranscodeSection.swift in Sources */,
62C83B08288C6A630004ED0C /* FontPickerView.swift in Sources */,
E122A9132788EAAD0060FA63 /* MediaStream.swift in Sources */,
@ -5040,6 +5053,7 @@
E10B1EB62BD98C6600A92EAF /* AddUserRow.swift in Sources */,
E1CB75802C80F28F00217C76 /* SubtitleProfile.swift in Sources */,
E1DD20412BE1EB8C00C0DE51 /* AddUserButton.swift in Sources */,
4E12F9172CBE9619006C217E /* DeviceType.swift in Sources */,
E145EB422BE0A6EE003BF6F3 /* ServerSelectionMenu.swift in Sources */,
4E5E48E52AB59806003F1B48 /* CustomizeViewsSettings.swift in Sources */,
E14EA15E2BF6F72900DE757A /* PhotoPicker.swift in Sources */,

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "chrome.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Google Chrome icon</title><path d="M16.214 8.69l6.715-1.679A12.027 12.027 0 0 1 24 11.972C24 18.57 18.569 24 11.968 24c-.302 0-.605-.011-.907-.034l4.905-8.347c.356-.376.655-.803.881-1.271a5.451 5.451 0 0 0-.043-4.748 5.156 5.156 0 0 0-.59-.91zm-3.24 8.575l-2.121 6.682C4.738 23.345 0 18.14 0 11.977 0 9.592.709 7.26 2.038 5.279l4.834 8.377c.18.539 1.119 2.581 3.067 3.327.998.382 2.041.481 3.035.282zM11.973 7.62c-2.006.019-3.878 1.544-4.281 3.512a4.478 4.478 0 0 0 1.237 4.032c1.214 1.186 3.14 1.578 4.734.927 1.408-.576 2.47-1.927 2.691-3.431.272-1.856-.788-3.832-2.495-4.629a4.413 4.413 0 0 0-1.886-.411zM7.046 9.962L2.259 4.963A12.043 12.043 0 0 1 11.997 0c4.56 0 8.744 2.592 10.774 6.675H12.558c-1.811-.125-3.288.52-4.265 1.453a5.345 5.345 0 0 0-1.247 1.834z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 863 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "edge.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Microsoft Edge icon</title><path d="M23.158 14.25H7.821c0 .578.086 1.103.262 1.575.188.465.431.881.743 1.245.31.364.675.675 1.102.938.413.262.863.48 1.343.648.476.173.975.3 1.48.383a10.078 10.078 0 0 0 3.311-.026c.564-.105 1.111-.244 1.651-.42.54-.177 1.061-.387 1.583-.627.525-.24 1.057-.502 1.605-.795v5.085c-.612.3-1.212.552-1.812.769-.6.21-1.2.394-1.81.54-.612.15-1.23.263-1.865.33a18.41 18.41 0 0 1-1.957.105c-.9 0-1.77-.105-2.606-.311a10.217 10.217 0 0 1-2.355-.893 9.869 9.869 0 0 1-2.018-1.417 8.957 8.957 0 0 1-2.595-4.148 9.359 9.359 0 0 1-.356-2.61c0-.986.135-1.924.405-2.82.274-.9.66-1.717 1.17-2.467a8.92 8.92 0 0 1 1.856-1.999A9.82 9.82 0 0 1 9.426 5.91a5.206 5.206 0 0 0-1.163 1.774 7.671 7.671 0 0 0-.536 2.055h8.542c0-.863-.086-1.613-.262-2.258-.176-.645-.458-1.181-.851-1.605-.39-.427-.893-.75-1.512-.96-.618-.214-1.365-.322-2.238-.322-1.032 0-2.063.15-3.094.461-1.031.3-2.01.731-2.94 1.275-.93.551-1.785 1.2-2.565 1.942-.78.75-1.436 1.557-1.969 2.43a14 14 0 0 1 .649-2.913C1.798 6.863 2.21 6 2.706 5.2a11.606 11.606 0 0 1 1.74-2.152c.663-.645 1.398-1.2 2.212-1.65C7.472.949 8.334.585 9.272.34A13.4 13.4 0 0 1 12.257 0c.615 0 1.226.056 1.837.165.612.113 1.208.263 1.79.458 1.154.397 2.185.952 3.093 1.657a10.553 10.553 0 0 1 2.287 2.449c.62.926 1.088 1.95 1.41 3.063.323 1.114.488 2.273.488 3.477v2.981z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "edgechromium.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Microsoft Edge icon</title><path d="M21.86 17.86q.14 0 .25.12.1.13.1.25t-.11.33l-.32.46-.43.53-.44.5q-.21.25-.38.42l-.22.23q-.58.53-1.34 1.04-.76.51-1.6.91-.86.4-1.74.64t-1.67.24q-.9 0-1.69-.28-.8-.28-1.48-.78-.68-.5-1.22-1.17-.53-.66-.92-1.44-.38-.77-.58-1.6-.2-.83-.2-1.67 0-1 .32-1.96.33-.97.87-1.8.14.95.55 1.77.41.82 1.02 1.5.6.68 1.38 1.21.78.54 1.64.9.86.36 1.77.56.92.2 1.8.2 1.12 0 2.18-.24 1.06-.23 2.06-.72l.2-.1.2-.05zm-15.5-1.27q0 1.1.27 2.15.27 1.06.78 2.03.51.96 1.24 1.77.74.82 1.66 1.4-1.47-.2-2.8-.74-1.33-.55-2.48-1.37-1.15-.83-2.08-1.9-.92-1.07-1.58-2.33T.36 14.94Q0 13.54 0 12.06q0-.81.32-1.49.31-.68.83-1.23.53-.55 1.2-.96.66-.4 1.35-.66.74-.27 1.5-.39.78-.12 1.55-.12.7 0 1.42.1.72.12 1.4.35.68.23 1.32.57.63.35 1.16.83-.35 0-.7.07-.33.07-.65.23v-.02q-.63.28-1.2.74-.57.46-1.05 1.04-.48.58-.87 1.26-.38.67-.65 1.39-.27.71-.42 1.44-.15.72-.15 1.38zM11.96.06q1.7 0 3.33.39 1.63.38 3.07 1.15 1.43.77 2.62 1.93 1.18 1.16 1.98 2.7.49.94.76 1.96.28 1 .28 2.08 0 .89-.23 1.7-.24.8-.69 1.48-.45.68-1.1 1.22-.64.53-1.45.88-.54.24-1.11.36-.58.13-1.16.13-.42 0-.97-.03-.54-.03-1.1-.12-.55-.1-1.05-.28-.5-.19-.84-.5-.12-.09-.23-.24-.1-.16-.1-.33 0-.15.16-.35.16-.2.35-.5.2-.28.36-.68.16-.4.16-.95 0-1.06-.4-1.96-.4-.91-1.06-1.64-.66-.74-1.52-1.28-.86-.55-1.79-.89-.84-.3-1.72-.44-.87-.14-1.76-.14-1.55 0-3.06.45T.94 7.55q.71-1.74 1.81-3.13 1.1-1.38 2.52-2.35Q6.68 1.1 8.37.58q1.7-.52 3.58-.52Z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "firefox.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "html5.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>HTML5 icon</title><path d="M1.5 0h21l-1.91 21.563L11.977 24l-8.564-2.438L1.5 0zm7.031 9.75l-.232-2.718 10.059.003.23-2.622L5.412 4.41l.698 8.01h9.126l-.326 3.426-2.91.804-2.955-.81-.188-2.11H6.248l.33 4.171L12 19.351l5.379-1.443.744-8.157H8.531z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 345 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "msie.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Internet Explorer icon</title><path d="M22.8 7.381c1.125-2.7 1.2-4.95-.15-6.3-1.5-1.499-5.1-1.05-8.924.75h-.45c-2.7 0-5.324.976-7.274 2.7-1.65 1.5-2.85 3.45-3.375 5.625.375-.45 2.475-2.925 4.875-4.275.075 0 .675-.375.675-.375-.075 0-1.2 1.125-1.425 1.35-5.25 5.4-8.324 13.574-5.924 15.973 1.574 1.575 4.424 1.2 7.724-.6 1.425.675 3 .975 4.724.975 2.25 0 4.35-.6 6.15-1.8 1.874-1.2 3.224-3.074 4.05-5.249h-5.85c-.75 1.425-2.475 2.4-4.275 2.4-2.55 0-4.65-2.1-4.724-4.5V13.83h15.298v-.225c0-.375.075-.825.075-1.124 0-1.8-.45-3.525-1.2-5.1zM2.477 22.38c-1.2-1.2-.824-3.524.6-6.299.675 1.875 1.8 3.525 3.225 4.725.45.375.975.75 1.5 1.05-2.4 1.274-4.35 1.5-5.325.524zm15.374-11.398H8.702v-.075c.15-2.325 2.324-4.35 4.874-4.35 2.4 0 4.35 1.875 4.5 4.35v.075zm4.574-4.2c-.45-.75-1.05-1.5-1.725-2.1a11.213 11.213 0 0 0-3.6-2.25c2.4-1.124 4.425-1.274 5.475-.224.825.975.75 2.624-.15 4.574 0 .075 0 .075 0 0 0 .075 0 .075 0 0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1015 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "opera.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Opera icon</title><path d="M8.051 5.238c-1.328 1.566-2.186 3.883-2.246 6.48v.564c.061 2.598.918 4.912 2.246 6.479 1.721 2.236 4.279 3.654 7.139 3.654 1.756 0 3.4-.537 4.807-1.471C17.879 22.846 15.074 24 12 24c-.192 0-.383-.004-.57-.014C5.064 23.689 0 18.436 0 12 0 5.371 5.373 0 12 0h.045c3.055.012 5.84 1.166 7.953 3.055-1.408-.93-3.051-1.471-4.81-1.471-2.858 0-5.417 1.42-7.14 3.654h.003zM24 12c0 3.556-1.545 6.748-4.002 8.945-3.078 1.5-5.946.451-6.896-.205 3.023-.664 5.307-4.32 5.307-8.74 0-4.422-2.283-8.075-5.307-8.74.949-.654 3.818-1.703 6.896-.205C22.455 5.25 24 8.445 24 12z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 683 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "safari.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>safari icon</title><path d="M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12-5.373 12-12 12zm0-.75c6.213 0 11.25-5.037 11.25-11.25S18.213.75 12 .75.75 5.787.75 12 5.787 23.25 12 23.25zM12 2a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1A.25.25 0 0 1 12 2zm0 18.5a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1a.25.25 0 0 1 .25-.25zm7.071-15.571a.25.25 0 0 1 0 .353l-.707.708a.25.25 0 0 1-.354-.354l.708-.707a.25.25 0 0 1 .353 0zM5.99 18.01a.25.25 0 0 1 0 .354l-.708.707a.25.25 0 1 1-.353-.353l.707-.708a.25.25 0 0 1 .354 0zM4.929 4.93a.25.25 0 0 1 .353 0l.708.707a.25.25 0 0 1-.354.354l-.707-.708a.25.25 0 0 1 0-.353zM18.01 18.01a.25.25 0 0 1 .354 0l.707.708a.25.25 0 1 1-.353.353l-.708-.707a.25.25 0 0 1 0-.354zM2 12a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1A.25.25 0 0 1 2 12zm18.5 0a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1a.25.25 0 0 1-.25-.25zm-4.593-9.205a.25.25 0 0 1 .133.328l-.391.92a.25.25 0 1 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM8.68 19.825a.25.25 0 0 1 .132.327l-.39.92a.25.25 0 0 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM21.272 8.253a.25.25 0 0 1-.138.325l-.927.375a.25.25 0 1 1-.188-.464l.927-.374a.25.25 0 0 1 .326.138zm-17.153 6.93a.25.25 0 0 1-.138.326l-.927.374a.25.25 0 1 1-.188-.463l.927-.375a.25.25 0 0 1 .326.138zM8.254 2.728a.25.25 0 0 1 .325.138l.375.927a.25.25 0 0 1-.464.188l-.374-.927a.25.25 0 0 1 .138-.326zm6.93 17.153a.25.25 0 0 1 .326.138l.374.927a.25.25 0 1 1-.463.188l-.375-.927a.25.25 0 0 1 .138-.326zM2.795 8.093a.25.25 0 0 1 .328-.133l.92.391a.25.25 0 0 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zm17.03 7.228a.25.25 0 0 1 .327-.132l.92.39a.25.25 0 1 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zM12.879 12.879L11.12 11.12l-4.141 5.9 5.899-4.142zm6.192-7.95l-5.834 8.308-8.308 5.834 5.834-8.308 8.308-5.834z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "android.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M24 19H0a13.6 13.6 0 0 1 2.21-6.07A11.2 11.2 0 0 1 5.87 9.4l.41-.23-2.02-3.41a.51.51 0 0 1 .17-.7.5.5 0 0 1 .69.18l2.08 3.5a12.62 12.62 0 0 1 4.84-.9 12.2 12.2 0 0 1 4.75.9l2.07-3.5a.5.5 0 0 1 .7-.17.51.51 0 0 1 .16.7L17.7 9.19l.5.28a11.38 11.38 0 0 1 3.63 3.62A14.48 14.48 0 0 1 24 19zm-7.5-4.48a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1zm-11 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 563 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "apple.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Apple</title><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 663 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "finamp.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,7 @@
<svg role="img"
viewBox="0 0 210 297"
xmlns="http://www.w3.org/2000/svg">
<title>Finamp icon</title>
<path
d="M 69.370216,241.70457 C 50.612585,216.22412 40.075179,174.495 36.128998,110.06608 33.495274,67.065618 44.085825,59.226924 92.567634,68.292508 c 20.934416,3.914496 27.827066,4.198089 67.943236,2.795479 15.01644,-0.525043 24.24345,-0.51262 24.24345,0.03203 0,2.02352 -25.20667,26.40015 -30.51241,29.507633 -5.41098,3.16913 -5.88645,3.26795 -17.41763,3.61937 -7.67759,0.23415 -15.65652,-0.17009 -22.64411,-1.14686 -25.347573,-3.543166 -36.936862,-0.7853 -42.62579,10.14353 -1.529767,2.93881 -2.116814,6.06888 -2.414344,12.87312 -0.48661,11.12778 0.442174,17.231 6.870204,45.14563 8.542177,37.09557 9.801925,52.50941 5.33119,65.22953 -1.971968,5.6106 -5.317334,11.03143 -6.807825,11.03143 -0.483648,0 -2.807164,-2.61877 -5.163389,-5.81948 z m 35.127024,-56.85485 c -1.42116,-0.77103 -3.48289,-3.16401 -4.581609,-5.31769 -2.833376,-5.55388 -7.34604,-27.6604 -8.030213,-39.33817 -0.530095,-9.04772 -0.416003,-10.08518 1.345967,-12.2394 1.71807,-2.10052 2.566639,-2.33623 7.887475,-2.19094 8.99051,0.24553 36.88418,8.63901 44.81806,13.48633 4.77149,2.91519 5.6724,5.8241 3.30988,10.68687 -3.36134,6.91866 -25.14851,29.96587 -32.75071,34.64485 -3.38073,2.08076 -8.44917,2.194 -11.99885,0.2683 z"
style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "kodi.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-36.173 -93.796)">
<g transform="matrix(.08 0 0 .08 40.527 88.485)">
<path d="m53.295 119.35v-39.688h79.375v79.375h-79.375z" fill="#fcfdfd" stroke-width=".26458"/>
</g>
<g transform="matrix(1.3761 0 0 1.3825 -26.63 -38.456)" fill="#fff">
<path transform="matrix(.08 0 0 .08 40.527 88.485)" d="m86.822 141.89c-4.738-4.7596-5.2168-5.3235-5.2168-6.1442 0-0.82158 0.47505-1.3787 5.2329-6.1365 4.7552-4.7552 5.3153-5.2329 6.1353-5.2329 0.81617 0 1.3676 0.46161 5.7678 4.8286 4.8692 4.8324 5.6182 5.7452 5.6182 6.8466 0 0.41218-1.5697 2.1641-5.2274 5.834-4.8206 4.8367-5.3 5.2449-6.1603 5.2449-0.86046 0-1.3378-0.40681-6.1497-5.2406zm22.168-12.455c-0.43656-0.27248-2.9071-2.6371-5.4901-5.2547-4.1957-4.2519-4.6964-4.8534-4.6964-5.6418 0-0.7938 0.52954-1.414 5.2644-6.1655 4.6582-4.6746 5.362-5.2829 6.1127-5.2829 0.75071 0 1.4546 0.60829 6.1127 5.2829 4.7729 4.7898 5.2644 5.3668 5.2644 6.1818 0 0.81542-0.48628 1.3851-5.2394 6.1382-5.6104 5.6104-5.7707 5.7142-7.3283 4.742zm-40.16-5.2731c-3.5636-3.5816-4.9518-5.1483-4.9518-5.5886 0-0.75745 9.3384-10.601 10.057-10.601 0.2584 0 0.54208 0.18833 0.63041 0.41851s0.1606 4.7624 0.1606 10.072c0 9.1098-0.10948 10.677-0.74606 10.677-0.10905 0-2.4266-2.2396-5.1501-4.9768zm13.2-1.5272c-0.08833-0.23018-0.1606-5.3558-0.1606-11.39 0-8.9734 0.06852-11.102 0.37621-11.686 0.20691-0.39296 2.447-2.7683 4.9781-5.2785 4.3226-4.2871 4.6624-4.5641 5.5987-4.5641 0.94583 0 1.2591 0.26717 6.1277 5.2255 4.658 4.7439 5.1315 5.3102 5.1376 6.1439 6e-3 0.85888-0.67407 1.6-10.506 11.443-5.782 5.7887-10.71 10.525-10.952 10.525s-0.51144-0.18833-0.59977-0.41852z" fill="#fff" stroke-width=".26458"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "playstation.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>PlayStation icon</title><path d="M8.985 2.596v17.548l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.181.76.814.76 1.505v5.876c2.441 1.193 4.362-.002 4.362-3.153 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.391-1.502h-.002zm4.656 16.242l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.499v-2.385l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.029 5.437.661 1.848.601 2.041 1.472 1.576 2.072s-1.622 1.036-1.622 1.036l-8.544 3.107v-2.297l.02-.023zM1.808 18.6c-1.9-.545-2.214-1.668-1.352-2.321.801-.585 2.159-1.051 2.159-1.051l5.616-2.013v2.313L4.206 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.248 17v2.074c-.121.029-.256.044-.391.073-1.938.331-3.995.196-6.037-.479l-.012-.068z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 833 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "roku.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,7 @@
<svg role="img"
viewBox="0 0 210 297"
xmlns="http://www.w3.org/2000/svg">
<title>Roku icon</title>
<path
d="m 134.501,227.38486 c -2.44819,-3.39677 -5.40762,-7.5041 -6.57652,-9.1274 -1.16891,-1.6233 -2.87952,-3.99592 -3.80137,-5.27251 -0.92184,-1.27658 -2.32281,-3.22438 -3.11326,-4.32845 -0.79045,-1.10408 -2.21327,-3.08277 -3.16181,-4.39711 -0.94855,-1.31433 -2.22961,-3.09276 -2.84679,-3.95207 -0.61719,-0.8593 -1.69455,-2.35278 -2.39413,-3.31885 -2.14638,-2.96394 -6.73436,-9.33234 -7.77326,-10.78978 -0.54108,-0.75905 -1.27705,-1.7753 -1.63549,-2.25833 -0.35844,-0.48303 -1.44122,-1.97917 -2.40619,-3.32476 -0.96497,-1.34558 -2.64833,-3.6886 -3.74081,-5.20669 -1.09248,-1.5181 -2.68538,-3.73408 -3.53977,-4.92441 l -1.55344,-2.16423 h -7.897297 -7.897299 v 32.55754 32.55755 H 50.004612 23.84566 V 135.44907 37.462783 l 38.987503,0.0012 c 38.978177,0.0012 40.941657,0.02063 45.197897,0.447079 17.74196,1.77761 34.09908,8.541533 46.7415,19.328335 6.96873,5.945875 12.56918,13.064776 16.42102,20.873253 3.98038,8.069037 5.87088,16.23414 5.88243,25.40618 0.004,2.93097 -0.10859,4.42747 -0.56006,7.46502 -2.28584,15.37939 -11.4805,29.9398 -25.61296,40.55997 -1.74452,1.31096 -4.01525,2.86206 -6.70655,4.58113 l -1.03428,0.66066 0.98006,1.34477 c 1.16032,1.59211 3.19563,4.41968 5.98013,8.30794 1.11186,1.5526 3.05961,4.26259 4.32832,6.02221 1.2687,1.75961 3.07604,4.272 4.01629,5.58308 0.94025,1.31109 3.51501,4.89618 5.72168,7.96688 2.20667,3.07069 4.5993,6.40173 5.31692,7.40229 2.88999,4.02938 4.20775,5.86082 6.58996,9.15877 1.3707,1.89762 3.1781,4.41001 4.01644,5.58308 0.83834,1.17308 2.68173,3.74193 4.09641,5.70855 5.84268,8.12224 7.24486,10.07327 10.61731,14.77322 l 3.53351,4.92441 H 168.65572 138.95226 Z M 93.86514,135.44732 c 6.72676,-0.37308 12.60026,-2.55392 18.23498,-6.77066 2.29302,-1.71598 5.02043,-4.58492 6.86064,-7.21667 5.34727,-7.64731 7.16217,-17.51458 4.88138,-26.53915 -1.38094,-5.46408 -4.34944,-10.857153 -8.06981,-14.660971 -5.11636,-5.231116 -11.18225,-8.448076 -18.24084,-9.673774 -2.55155,-0.443066 -4.02597,-0.500864 -12.805103,-0.501964 l -8.562823,-0.0011 v 32.745739 32.74573 l 7.747316,-0.002 c 4.261024,-0.001 8.74044,-0.0575 9.95426,-0.1248 z"
fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "samsungtv.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Samsung icon</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "webOS.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174 43">
<defs>
<style>
.cls-1 {
fill: none;
}
.cls-2 {
fill: #fff;
}
</style>
</defs>
<g id="Layer_1-2" data-name="Layer_1">
<g>
<g id="webOS_OSE_logo_gray">
<g id="Group_1">
<path id="Path_1" class="cls-2" d="M142.85,28.88c0,8.85,6.09,13.28,14.95,13.28,9.96,0,14.95-3.87,14.95-10.51h0c0-7.63-4.99-9.23-14.95-12.06-6.88-1.81-10.86-3.61-10.86-7.95h0c0-5.08,3.81-7.43,10.8-7.43h0c6.57,0,10.91,2.3,10.91,9.18h2.99c0-8.85-5.54-12.17-13.84-12.17-8.86,0-13.84,3.32-13.84,9.96s4.98,8.97,13.84,11.49c7.35,2.03,11.96,2.94,11.96,8.98,0,5.06-4.37,7.53-11.99,7.53h0c-6.82,0-11.91-3.06-11.91-10.29h-2.99Z"/>
<path id="Path_2" class="cls-2" d="M120.15,1.22c-11.31,0-20.47,9.18-20.46,20.49,0,11.31,9.18,20.47,20.49,20.46,11.3,0,20.46-9.17,20.46-20.47,0-11.31-9.17-20.48-20.48-20.47,0,0,0,0,0,0M120.15,39.18c-9.66,0-17.49-7.84-17.48-17.49,0-9.66,7.84-17.49,17.49-17.48,9.66,0,17.48,7.83,17.48,17.49,0,9.66-7.83,17.49-17.49,17.49"/>
<path id="Path_3" class="cls-2" d="M84.16,12.28c-4.18,0-7.24,1.59-9.19,4.5V1.77h-2.99v25.45h2.99c0-7.52,3.34-11.96,9.19-11.96s9.19,4.43,9.19,11.96-3.34,11.96-9.19,11.96c-4.41,0-7.39-2.52-8.59-6.98h-3.1c1.34,6.35,5.43,9.96,11.7,9.96,7.75,0,12.18-5.53,12.18-14.94s-4.43-14.94-12.18-14.94"/>
<path id="Path_4" class="cls-2" d="M55.38,39.15c-5.85,0-9.19-4.42-9.19-11.92h21.37c0-9.41-4.43-14.94-12.18-14.94s-12.18,5.53-12.18,14.94,4.43,14.94,12.18,14.94c6.26,0,10.35-3.61,11.7-9.96h-3.11c-1.2,4.44-4.19,6.94-8.59,6.94M55.37,15.3c5.02,0,8.2,3.26,8.99,8.94h-17.98c.79-5.68,3.97-8.94,8.99-8.94"/>
<path id="Path_5" class="cls-2" d="M14.44,41.61l7.61-24.13,7.61,24.13h3.36l9.07-28.78h-3.13l-7.62,24.17-7.62-24.17h-3.34l-7.62,24.17L5.13,12.83H2l9.07,28.78h3.36Z"/>
</g>
</g>
<rect id="Rectangle_1" class="cls-1" width="174" height="43"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "windows.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Windows icon</title><path d="M0 3.449L9.75 2.1v9.451H0m10.949-9.602L24 0v11.4H10.949M0 12.6h9.75v9.451L0 20.699M10.949 12.6H24V24l-12.9-1.801" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 241 B

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "xbox.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Xbox icon</title><path d="M4.102 21.033C6.211 22.881 8.977 24 12 24c3.026 0 5.789-1.119 7.902-2.967 1.877-1.912-4.316-8.709-7.902-11.417-3.582 2.708-9.779 9.505-7.898 11.417zm11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912C23.002 17.48 24 14.861 24 12.004c0-3.34-1.365-6.362-3.57-8.536 0 0-.027-.022-.082-.042-.063-.022-.152-.045-.281-.045-.592 0-1.985.434-4.805 3.246zM3.654 3.426c-.057.02-.082.041-.086.042C1.365 5.642 0 8.664 0 12.004c0 2.854.998 5.473 2.661 7.533-1.401-2.605 3.579-9.951 6.08-12.91-2.82-2.813-4.216-3.245-4.806-3.245-.131 0-.223.021-.281.046v-.002zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545v.006z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 861 B

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "home-assistant.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "other.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 6h18V4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V6zm10 6H9v1.78c-.61.55-1 1.33-1 2.22s.39 1.67 1 2.22V20h4v-1.78c.61-.55 1-1.34 1-2.22s-.39-1.67-1-2.22V12zm-2 5.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM22 8h-6c-.5 0-1 .5-1 1v10c0 .5.5 1 1 1h6c.5 0 1-.5 1-1V9c0-.5-.5-1-1-1zm-1 10h-4v-8h4v8z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 453 B

View File

@ -10,8 +10,6 @@ import Defaults
import JellyfinAPI
import SwiftUI
// TODO: inactive session device image
extension ActiveSessionsView {
struct ActiveSessionRow: View {
@ -24,7 +22,6 @@ extension ActiveSessionsView {
private let onSelect: () -> Void
// parent list won't show row if value is nil anyways
private var session: SessionInfo {
box.value ?? .init()
}
@ -38,29 +35,44 @@ extension ActiveSessionsView {
private var rowLeading: some View {
// TODO: better handling for different poster types
Group {
if session.nowPlayingItem?.type == .audio {
ZStack {
Color.clear
if let nowPlayingItem = session.nowPlayingItem {
if nowPlayingItem.type == .audio {
ZStack {
Color.clear
ImageView(session.nowPlayingItem?.squareImageSources(maxWidth: 60) ?? [])
.failure {
SystemImageContentView(systemName: session.nowPlayingItem?.systemImage)
}
ImageView(nowPlayingItem.squareImageSources(maxWidth: 60))
.failure {
SystemImageContentView(systemName: nowPlayingItem.systemImage)
}
}
.squarePosterStyle()
.frame(width: 60, height: 60)
} else {
ZStack {
Color.clear
ImageView(nowPlayingItem.portraitImageSources(maxWidth: 60))
.failure {
SystemImageContentView(systemName: nowPlayingItem.systemImage)
}
}
.posterStyle(.portrait)
.frame(width: 60, height: 90)
}
.squarePosterStyle()
} else {
ZStack {
Color.clear
session.device.clientColor
ImageView(session.nowPlayingItem?.portraitImageSources(maxWidth: 60) ?? [])
.failure {
SystemImageContentView(systemName: session.nowPlayingItem?.systemImage)
}
Image(session.device.image)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 40)
}
.posterStyle(.portrait)
.squarePosterStyle()
.frame(width: 60, height: 60)
}
}
.frame(width: 60)
.frame(width: 60, height: 90)
.posterShadow()
.padding(.vertical, 8)
}