changeset 118:3269859fd31f

Merge pull request #17 from denniscm190/development Release new version committer: GitHub <noreply@github.com>
author Dennis C. M. <dennis@denniscm.com>
date Mon, 09 Aug 2021 17:05:10 +0100
parents a17e05c67dae (current diff) 7cdc06d6a9cc (diff)
children 4e46cc18fb78 462fb542f386
files Sources/StockChartsTests/Info.plist Sources/StockChartsTests/StockChartsTests.swift Sources/StockChartsWatchOS/Info.plist Sources/StockChartsWatchOSTests/Info.plist Sources/StockChartsWatchOSTests/StockChartsWatchOSTests.swift
diffstat 24 files changed, 692 insertions(+), 224 deletions(-) [+]
line wrap: on
line diff
--- a/.gitignore	Sat Jul 17 12:25:39 2021 +0100
+++ b/.gitignore	Mon Aug 09 17:05:10 2021 +0100
@@ -1,2 +1,135 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/xcode,macos,swift
+# Edit at https://www.toptal.com/developers/gitignore?templates=xcode,macos,swift
+
+### macOS ###
+# General
 .DS_Store
-.build
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Swift ###
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+## Obj-C/Swift specific
+*.hmap
+
+## App packaging
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Packages/
+# Package.pins
+# Package.resolved
+# *.xcodeproj
+# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
+# hence it is not needed unless you have added a package configuration file to your project
+# .swiftpm
+
+.build/
+
+# CocoaPods
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+# Pods/
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build/
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+# It is recommended to not store the screenshots in the git repo.
+# Instead, use fastlane to re-generate the screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots/**/*.png
+fastlane/test_output
+
+# Code Injection
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
+
+### Xcode ###
+# Xcode
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+
+
+
+## Gcc Patch
+/*.gcno
+
+### Xcode Patch ###
+*.xcodeproj/*
+!*.xcodeproj/project.pbxproj
+!*.xcodeproj/xcshareddata/
+!*.xcworkspace/contents.xcworkspacedata
+**/xcshareddata/WorkspaceSettings.xcsettings
+
+# End of https://www.toptal.com/developers/gitignore/api/xcode,macos,swift
Binary file .swiftpm/xcode/package.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/.swiftpm/xcode/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>SchemeUserState</key>
-	<dict>
-		<key>StockCharts.xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>0</integer>
-		</dict>
-	</dict>
-</dict>
-</plist>
--- a/README.md	Sat Jul 17 12:25:39 2021 +0100
+++ b/README.md	Mon Aug 09 17:05:10 2021 +0100
@@ -1,17 +1,16 @@
 <a href="https://www.producthunt.com/posts/stockcharts-for-swiftui?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-stockcharts-for-swiftui" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=295975&theme=dark" alt="StockCharts for SwiftUI - Display interactive stock charts easily 🎉 | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
 
 # SwiftUI Stock Charts 
-![Build Status](https://github.com/denniscm190/StockCharts/actions/workflows/swift.yml/badge.svg)
-[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fdenniscm190%2FStockCharts%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/denniscm190/StockCharts)
-[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fdenniscm190%2FStockCharts%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/denniscm190/StockCharts)   
+![Build Status](https://github.com/denniscm190/StockCharts/actions/workflows/swift.yml/badge.svg)   
 Display interactive stock charts easily 🎉
 
-<img width="374" alt="View1-Screenshot" src="https://user-images.githubusercontent.com/66180929/116898466-b207d000-ac36-11eb-8fb6-0a4f229307db.png">
-
 ## Instalation
 - In Xcode go to `File` -> `Swift packages` -> `Add package dependency`
 - Copy and paste `https://github.com/denniscm190/StockCharts.git`
 
+## Demo app
+[**Trades** is a SwiftUI app](https://github.com/denniscm190/trades-demo) with real use cases of the StockCharts `framework`.  
+
 ## Usage
 ```swift
 import StockCharts
@@ -19,14 +18,37 @@
 
 ### Line chart
 ```swift
-LineChartView(data: [Double], dates: [String]?, hours: [String]?, dragGesture: Bool?)
+let lineChartController = LineChartController(prices: [Double])
+LineChartView(lineChartController: lineChartController)
 ```
 
+You can customise the line chart with `LineChartController`
+
 ```swift
-data: [120.3, 121.0, 132.4, ...]
-dates: ["yyyy-MM-dd", "2021-01-01", "2021-01-02", ...]
-hours: ["10:20", "10:21", "10:22", ...]  // It could be any format
-dragGesture: false  // By default is true
+LineChartController(
+    prices: [Double],
+    dates: [String],
+    hours: [String],
+    labelColor: Color,
+    indicatorPointColor: Color,
+    showingIndicatorLineColor: Color,
+    flatTrendLineColor: Color,
+    uptrendLineColor: Color,
+    downtrendLineColor: Color,
+    dragGesture: Bool
+)
+```
+
+To enable the drag gesture set `dragGesture` to `true` in the `LineChartController `    
+
+```swift
+LineChartView(
+    lineChartController:
+        LineChartController(
+            prices: [Double],
+            dragGesture: true
+        )
+)
 ```
 <img width="374" alt="LineChartVideo" src="https://user-images.githubusercontent.com/66180929/116899623-137c6e80-ac38-11eb-8ec0-e678aea54062.gif">
 
--- a/Sources/StockCharts/CapsuleChart/CapsuleChartView.swift	Sat Jul 17 12:25:39 2021 +0100
+++ b/Sources/StockCharts/CapsuleChart/CapsuleChartView.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -9,11 +9,11 @@
 
 public struct CapsuleChartView: View {
     public var percentageOfWidth: CGFloat
-    public var style: CapsuleChartStyle
+    public var capsuleChartStyle: CapsuleChartStyle
     
     public init(percentageOfWidth: CGFloat, style: CapsuleChartStyle) {
         self.percentageOfWidth = percentageOfWidth
-        self.style = style
+        self.capsuleChartStyle = style
     }
     
     public var body: some View {
@@ -25,7 +25,7 @@
                         .opacity(0.2)
                     
                     Capsule()
-                        .foregroundColor(style.capsuleColor)
+                        .foregroundColor(capsuleChartStyle.capsuleColor)
                         .frame(width: proxy.size.width * percentageOfWidth)
                 }
                 .frame(height: 10)
--- a/Sources/StockCharts/LineChart/Helpers/ChartLabel.swift	Sat Jul 17 12:25:39 2021 +0100
+++ b/Sources/StockCharts/LineChart/Helpers/ChartLabel.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -8,32 +8,26 @@
 import SwiftUI
 
 public struct ChartLabel: View {
-    public var data: [Double]
-    public var dates: [String]?
-    public var hours: [String]?
-    public var style: LineChartStyle
+    public var lineChartController: LineChartController
     
     @Binding var indexPosition: Int  // Data point position
     
     public var body: some View {
         HStack {
-            Group {
-                if let dates = self.dates {
-                    let date = formatStringDate(dates[indexPosition])
-                    Text(date)
-                        .opacity(0.5)
-                }
-                if let hours = self.hours {
-                    let hour = hours[indexPosition]
-                    Text(hour)
-                        .opacity(0.5)
-                }
-                
-                Text("\(data[indexPosition], specifier: "%.2f")")
-                    .foregroundColor(style.labelColor)
-                
+            if let dates = lineChartController.dates {
+                let date = formatStringDate(dates[indexPosition])
+                Text(date)
+                    .opacity(0.5)
             }
-            .font(.caption)
+            
+            if let hours = lineChartController.hours {
+                let hour = hours[indexPosition]
+                Text(hour)
+                    .opacity(0.5)
+            }
+            
+            Text("\(lineChartController.prices[indexPosition], specifier: "%.2f")")
+                .foregroundColor(lineChartController.labelColor)
         }
     }
     
--- a/Sources/StockCharts/LineChart/Helpers/IndicatorPoint.swift	Sat Jul 17 12:25:39 2021 +0100
+++ b/Sources/StockCharts/LineChart/Helpers/IndicatorPoint.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -8,11 +8,11 @@
 import SwiftUI
 
 public struct IndicatorPoint: View {
-    public var style: LineChartStyle
+    public var lineChartController: LineChartController
     
     public var body: some View {
         Circle()
             .frame(width: 20, height: 20)
-            .foregroundColor(style.indicatorPointColor)
+            .foregroundColor(lineChartController.indicatorPointColor)
     }
 }
--- a/Sources/StockCharts/LineChart/Helpers/LineView.swift	Sat Jul 17 12:25:39 2021 +0100
+++ b/Sources/StockCharts/LineChart/Helpers/LineView.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -8,11 +8,7 @@
 import SwiftUI
 
 public struct LineView: View {
-    public var data: [Double]
-    public var dates: [String]?
-    public var hours: [String]?
-    public var dragGesture: Bool?
-    public var style: LineChartStyle
+    public var lineChartController: LineChartController
     
     @Binding var showingIndicators: Bool
     @Binding var indexPosition: Int
@@ -22,19 +18,19 @@
     public var body: some View {
         ZStack {
             GeometryReader { proxy in
-                LinePath(data: data, width: proxy.size.width, height: proxy.size.height, pathPoints: $pathPoints)
+                LinePath(data: lineChartController.prices, width: proxy.size.width, height: proxy.size.height, pathPoints: $pathPoints)
                     .stroke(colorLine(), lineWidth: 2)
             }
             
             if showingIndicators {
-                IndicatorPoint(style: style)
+                IndicatorPoint(lineChartController: lineChartController)
                     .position(x: IndicatorPointPosition.x, y: IndicatorPointPosition.y)
             }
         }
         .rotationEffect(.degrees(180), anchor: .center)
         .rotation3DEffect(.degrees(180), axis: (x: 0.0, y: 1.0, z: 0.0))
         .contentShape(Rectangle())  // Control tappable area
-        .gesture(dragGesture ?? true ?
+        .gesture(lineChartController.dragGesture ?
             LongPressGesture(minimumDuration: 0.2)
                 .sequenced(before: DragGesture(minimumDistance: 0, coordinateSpace: .local))
                 .onChanged({ value in  // Get value of the gesture
@@ -59,14 +55,14 @@
      Color path depending on data.
      */
     public func colorLine() -> Color {
-        var color = style.uptrendLineColor
+        var color = lineChartController.uptrendLineColor
         
         if showingIndicators {
-            color = style.showingIndicatorLineColor
-        } else if data.first! > data.last! {
-            color = style.downtrendLineColor
-        } else if data.first! == data.last! {
-            color = style.flatTrendLineColor
+            color = lineChartController.showingIndicatorLineColor
+        } else if lineChartController.prices.first! > lineChartController.prices.last! {
+            color = lineChartController.downtrendLineColor
+        } else if lineChartController.prices.first! == lineChartController.prices.last! {
+            color = lineChartController.flatTrendLineColor
         }
         
         return color
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockCharts/LineChart/LineChartController.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,55 @@
+//
+//  LineChartController.swift
+//  StockCharts
+//
+//  Created by Dennis Concepción Martín on 5/8/21.
+//
+
+import SwiftUI
+
+public class LineChartController {
+    
+    // MARK: - Data
+    public var prices: [Double]
+    public var dates: [String]?
+    public var hours: [String]?
+    
+    // MARK: - Style
+    public var labelColor: Color
+    public var indicatorPointColor: Color
+    public var showingIndicatorLineColor: Color
+    public var flatTrendLineColor: Color
+    public var uptrendLineColor: Color
+    public var downtrendLineColor: Color
+    
+    // MARK: - Interactions
+    public var dragGesture: Bool = false
+    
+    public init(
+        prices: [Double],
+        dates: [String]? = nil,
+        hours: [String]? = nil,
+        
+        labelColor: Color = .blue,
+        indicatorPointColor: Color = .blue,
+        showingIndicatorLineColor: Color = .blue,
+        flatTrendLineColor: Color = .purple,
+        uptrendLineColor: Color = .green,
+        downtrendLineColor: Color = .red,
+        
+        dragGesture: Bool = false
+    ) {
+        self.prices = prices
+        self.dates = dates
+        self.hours = hours
+        
+        self.labelColor = labelColor
+        self.indicatorPointColor = indicatorPointColor
+        self.showingIndicatorLineColor = showingIndicatorLineColor
+        self.flatTrendLineColor = flatTrendLineColor
+        self.uptrendLineColor = uptrendLineColor
+        self.downtrendLineColor = downtrendLineColor
+        
+        self.dragGesture = dragGesture
+    }
+}
--- a/Sources/StockCharts/LineChart/LineChartStyle.swift	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-//
-//  LineChartStyle.swift
-//  StockCharts
-//
-//  Created by Dennis Concepción Martín on 04/07/2021.
-//
-
-import SwiftUI
-
-public class LineChartStyle {
-    public var labelColor: Color
-    public var indicatorPointColor: Color
-    public var showingIndicatorLineColor: Color
-    public var flatTrendLineColor: Color
-    public var uptrendLineColor: Color
-    public var downtrendLineColor: Color
-    
-    public init(labelColor: Color, indicatorPointColor: Color, showingIndicatorLineColor: Color, flatTrendLineColor: Color, uptrendLineColor: Color, downtrendLineColor: Color) {
-        self.labelColor = labelColor
-        self.indicatorPointColor = indicatorPointColor
-        self.showingIndicatorLineColor = showingIndicatorLineColor
-        self.flatTrendLineColor = flatTrendLineColor
-        self.uptrendLineColor = uptrendLineColor
-        self.downtrendLineColor = downtrendLineColor
-    }
-}
--- a/Sources/StockCharts/LineChart/LineChartView.swift	Sat Jul 17 12:25:39 2021 +0100
+++ b/Sources/StockCharts/LineChart/LineChartView.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -8,32 +8,30 @@
 import SwiftUI
 
 public struct LineChartView: View {
-    public var data: [Double]
-    public var dates: [String]?
-    public var hours: [String]?
-    public var dragGesture: Bool?
-    public var style: LineChartStyle
+    public var lineChartController: LineChartController
     
     @State var showingIndicators = false
     @State var indexPosition = Int()
     
-    public init(data: [Double], dates: [String]?, hours: [String]?, dragGesture: Bool?, style: LineChartStyle) {
-        self.data = data
-        self.dates = dates
-        self.hours = hours
-        self.dragGesture = dragGesture
-        self.style = style
+    public init(lineChartController: LineChartController) {
+        self.lineChartController = lineChartController
     }
     
     public var body: some View {
-        if !data.isEmpty {
+        if lineChartController.prices.isEmpty {
+            
+        } else {
             VStack {
-                if dragGesture ?? true {
-                    ChartLabel(data: data, dates: dates, hours: hours, style: style, indexPosition: $indexPosition)
+                if lineChartController.dragGesture {
+                    ChartLabel(lineChartController: lineChartController, indexPosition: $indexPosition)
                         .opacity(showingIndicators ? 1: 0)
                 }
-
-                LineView(data: data, dates: dates, hours: hours, dragGesture: dragGesture, style: style, showingIndicators: $showingIndicators, indexPosition: $indexPosition)
+                
+                LineView(
+                    lineChartController: lineChartController,
+                    showingIndicators: $showingIndicators,
+                    indexPosition: $indexPosition
+                )
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsTests/Info.plist	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsTests/StockChartsTests.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,33 @@
+//
+//  StockChartsTests.swift
+//  StockChartsTests
+//
+//  Created by Dennis Concepción Martín on 30/4/21.
+//
+
+import XCTest
+@testable import StockCharts
+
+class StockChartsTests: XCTestCase {
+
+    override func setUpWithError() throws {
+        // Put setup code here. This method is called before the invocation of each test method in the class.
+    }
+
+    override func tearDownWithError() throws {
+        // Put teardown code here. This method is called after the invocation of each test method in the class.
+    }
+
+    func testExample() throws {
+        // This is an example of a functional test case.
+        // Use XCTAssert and related functions to verify your tests produce the correct results.
+    }
+
+    func testPerformanceExample() throws {
+        // This is an example of a performance test case.
+        self.measure {
+            // Put the code you want to measure the time of here.
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsWatchOS/Info.plist	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>$(CURRENT_PROJECT_VERSION)</string>
+</dict>
+</plist>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsWatchOS/StockChartsWatchOS.h	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,18 @@
+//
+//  StockChartsWatchOS.h
+//  StockChartsWatchOS
+//
+//  Created by Dennis Concepción Martín on 5/8/21.
+//
+
+#import <Foundation/Foundation.h>
+
+//! Project version number for StockChartsWatchOS.
+FOUNDATION_EXPORT double StockChartsWatchOSVersionNumber;
+
+//! Project version string for StockChartsWatchOS.
+FOUNDATION_EXPORT const unsigned char StockChartsWatchOSVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import <StockChartsWatchOS/PublicHeader.h>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsWatchOSTests/Info.plist	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleExecutable</key>
+	<string>$(EXECUTABLE_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundlePackageType</key>
+	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+</dict>
+</plist>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sources/StockChartsWatchOSTests/StockChartsWatchOSTests.swift	Mon Aug 09 17:05:10 2021 +0100
@@ -0,0 +1,33 @@
+//
+//  StockChartsWatchOSTests.swift
+//  StockChartsWatchOSTests
+//
+//  Created by Dennis Concepción Martín on 5/8/21.
+//
+
+import XCTest
+@testable import StockChartsWatchOS
+
+class StockChartsWatchOSTests: XCTestCase {
+
+    override func setUpWithError() throws {
+        // Put setup code here. This method is called before the invocation of each test method in the class.
+    }
+
+    override func tearDownWithError() throws {
+        // Put teardown code here. This method is called after the invocation of each test method in the class.
+    }
+
+    func testExample() throws {
+        // This is an example of a functional test case.
+        // Use XCTAssert and related functions to verify your tests produce the correct results.
+    }
+
+    func testPerformanceExample() throws {
+        // This is an example of a performance test case.
+        self.measure {
+            // Put the code you want to measure the time of here.
+        }
+    }
+
+}
--- a/StockCharts.xcodeproj/project.pbxproj	Sat Jul 17 12:25:39 2021 +0100
+++ b/StockCharts.xcodeproj/project.pbxproj	Mon Aug 09 17:05:10 2021 +0100
@@ -8,8 +8,17 @@
 
 /* Begin PBXBuildFile section */
 		950857AE266BDF62005357BA /* CapsuleChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950857AD266BDF62005357BA /* CapsuleChartView.swift */; };
-		954AA39E269209770006FD14 /* LineChartStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AA39D269209770006FD14 /* LineChartStyle.swift */; };
 		954AA3A026920D060006FD14 /* CapsuleChartStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AA39F26920D060006FD14 /* CapsuleChartStyle.swift */; };
+		954CEBEB26BBEEEB00B6E989 /* StockChartsWatchOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 954CEBE226BBEEEB00B6E989 /* StockChartsWatchOS.framework */; };
+		954CEBF026BBEEEB00B6E989 /* StockChartsWatchOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954CEBEF26BBEEEB00B6E989 /* StockChartsWatchOSTests.swift */; };
+		954CEBF226BBEEEB00B6E989 /* StockChartsWatchOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 954CEBE426BBEEEB00B6E989 /* StockChartsWatchOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		954CEBF926BBEF3100B6E989 /* LineChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770B9F263C590C003FA924 /* LineChartView.swift */; };
+		954CEBFB26BBEF3800B6E989 /* ChartLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA2263C5934003FA924 /* ChartLabel.swift */; };
+		954CEBFC26BBEF3B00B6E989 /* IndicatorPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA4263C594C003FA924 /* IndicatorPoint.swift */; };
+		954CEBFD26BBEF3E00B6E989 /* LinePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA6263C596E003FA924 /* LinePath.swift */; };
+		954CEBFE26BBEF4200B6E989 /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA8263C5988003FA924 /* LineView.swift */; };
+		954CEBFF26BBEF4700B6E989 /* CapsuleChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 950857AD266BDF62005357BA /* CapsuleChartView.swift */; };
+		954CEC0026BBEF4A00B6E989 /* CapsuleChartStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AA39F26920D060006FD14 /* CapsuleChartStyle.swift */; };
 		95770B8B263C57B5003FA924 /* StockCharts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95770B81263C57B5003FA924 /* StockCharts.framework */; };
 		95770B90263C57B5003FA924 /* StockChartsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770B8F263C57B5003FA924 /* StockChartsTests.swift */; };
 		95770B92263C57B5003FA924 /* StockCharts.h in Headers */ = {isa = PBXBuildFile; fileRef = 95770B84263C57B5003FA924 /* StockCharts.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -18,9 +27,18 @@
 		95770BA5263C594C003FA924 /* IndicatorPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA4263C594C003FA924 /* IndicatorPoint.swift */; };
 		95770BA7263C596E003FA924 /* LinePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA6263C596E003FA924 /* LinePath.swift */; };
 		95770BA9263C5988003FA924 /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95770BA8263C5988003FA924 /* LineView.swift */; };
+		958E4D3226BC3776003177DD /* LineChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958E4D3126BC3776003177DD /* LineChartController.swift */; };
+		958E4D3326BC3776003177DD /* LineChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958E4D3126BC3776003177DD /* LineChartController.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
+		954CEBEC26BBEEEB00B6E989 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 95770B78263C57B5003FA924 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 954CEBE126BBEEEB00B6E989;
+			remoteInfo = StockChartsWatchOS;
+		};
 		95770B8C263C57B5003FA924 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 95770B78263C57B5003FA924 /* Project object */;
@@ -32,25 +50,44 @@
 
 /* Begin PBXFileReference section */
 		950857AD266BDF62005357BA /* CapsuleChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapsuleChartView.swift; sourceTree = "<group>"; };
-		954AA39D269209770006FD14 /* LineChartStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartStyle.swift; sourceTree = "<group>"; };
 		954AA39F26920D060006FD14 /* CapsuleChartStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapsuleChartStyle.swift; sourceTree = "<group>"; };
+		954CEBE226BBEEEB00B6E989 /* StockChartsWatchOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StockChartsWatchOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		954CEBE426BBEEEB00B6E989 /* StockChartsWatchOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StockChartsWatchOS.h; sourceTree = "<group>"; };
+		954CEBE526BBEEEB00B6E989 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		954CEBEA26BBEEEB00B6E989 /* StockChartsWatchOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StockChartsWatchOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		954CEBEF26BBEEEB00B6E989 /* StockChartsWatchOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockChartsWatchOSTests.swift; sourceTree = "<group>"; };
+		954CEBF126BBEEEB00B6E989 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		95770B81263C57B5003FA924 /* StockCharts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StockCharts.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		95770B84263C57B5003FA924 /* StockCharts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StockCharts.h; sourceTree = "<group>"; };
 		95770B85263C57B5003FA924 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		95770B8A263C57B5003FA924 /* StockChartsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StockChartsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		95770B8F263C57B5003FA924 /* StockChartsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockChartsTests.swift; sourceTree = "<group>"; };
 		95770B91263C57B5003FA924 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		95770B9D263C58B1003FA924 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		95770B9F263C590C003FA924 /* LineChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartView.swift; sourceTree = "<group>"; };
 		95770BA2263C5934003FA924 /* ChartLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChartLabel.swift; sourceTree = "<group>"; };
 		95770BA4263C594C003FA924 /* IndicatorPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndicatorPoint.swift; sourceTree = "<group>"; };
 		95770BA6263C596E003FA924 /* LinePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinePath.swift; sourceTree = "<group>"; };
 		95770BA8263C5988003FA924 /* LineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineView.swift; sourceTree = "<group>"; };
 		95770BAA263C59A9003FA924 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
-		95770BB3263C5C2B003FA924 /* LICENSE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
+		958E4D3126BC3776003177DD /* LineChartController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineChartController.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
+		954CEBDF26BBEEEB00B6E989 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		954CEBE726BBEEEB00B6E989 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				954CEBEB26BBEEEB00B6E989 /* StockChartsWatchOS.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		95770B7E263C57B5003FA924 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
@@ -78,15 +115,30 @@
 			path = CapsuleChart;
 			sourceTree = "<group>";
 		};
+		954CEBE326BBEEEB00B6E989 /* StockChartsWatchOS */ = {
+			isa = PBXGroup;
+			children = (
+				954CEBE426BBEEEB00B6E989 /* StockChartsWatchOS.h */,
+				954CEBE526BBEEEB00B6E989 /* Info.plist */,
+			);
+			path = StockChartsWatchOS;
+			sourceTree = "<group>";
+		};
+		954CEBEE26BBEEEB00B6E989 /* StockChartsWatchOSTests */ = {
+			isa = PBXGroup;
+			children = (
+				954CEBEF26BBEEEB00B6E989 /* StockChartsWatchOSTests.swift */,
+				954CEBF126BBEEEB00B6E989 /* Info.plist */,
+			);
+			path = StockChartsWatchOSTests;
+			sourceTree = "<group>";
+		};
 		95770B77263C57B5003FA924 = {
 			isa = PBXGroup;
 			children = (
 				95770BAA263C59A9003FA924 /* Package.swift */,
-				95770B9D263C58B1003FA924 /* README.md */,
-				95770BB3263C5C2B003FA924 /* LICENSE.md */,
 				95770B85263C57B5003FA924 /* Info.plist */,
 				95770B9B263C57CA003FA924 /* Sources */,
-				95770B9C263C580C003FA924 /* Tests */,
 				95770B82263C57B5003FA924 /* Products */,
 			);
 			sourceTree = "<group>";
@@ -96,6 +148,8 @@
 			children = (
 				95770B81263C57B5003FA924 /* StockCharts.framework */,
 				95770B8A263C57B5003FA924 /* StockChartsTests.xctest */,
+				954CEBE226BBEEEB00B6E989 /* StockChartsWatchOS.framework */,
+				954CEBEA26BBEEEB00B6E989 /* StockChartsWatchOSTests.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -123,23 +177,18 @@
 			isa = PBXGroup;
 			children = (
 				95770B83263C57B5003FA924 /* StockCharts */,
+				95770B8E263C57B5003FA924 /* StockChartsTests */,
+				954CEBE326BBEEEB00B6E989 /* StockChartsWatchOS */,
+				954CEBEE26BBEEEB00B6E989 /* StockChartsWatchOSTests */,
 			);
 			path = Sources;
 			sourceTree = "<group>";
 		};
-		95770B9C263C580C003FA924 /* Tests */ = {
-			isa = PBXGroup;
-			children = (
-				95770B8E263C57B5003FA924 /* StockChartsTests */,
-			);
-			path = Tests;
-			sourceTree = "<group>";
-		};
 		95770B9E263C58F4003FA924 /* LineChart */ = {
 			isa = PBXGroup;
 			children = (
 				95770B9F263C590C003FA924 /* LineChartView.swift */,
-				954AA39D269209770006FD14 /* LineChartStyle.swift */,
+				958E4D3126BC3776003177DD /* LineChartController.swift */,
 				95770BA1263C5927003FA924 /* Helpers */,
 			);
 			path = LineChart;
@@ -159,6 +208,14 @@
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
+		954CEBDD26BBEEEB00B6E989 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				954CEBF226BBEEEB00B6E989 /* StockChartsWatchOS.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		95770B7C263C57B5003FA924 /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
@@ -170,6 +227,42 @@
 /* End PBXHeadersBuildPhase section */
 
 /* Begin PBXNativeTarget section */
+		954CEBE126BBEEEB00B6E989 /* StockChartsWatchOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 954CEBF726BBEEEB00B6E989 /* Build configuration list for PBXNativeTarget "StockChartsWatchOS" */;
+			buildPhases = (
+				954CEBDD26BBEEEB00B6E989 /* Headers */,
+				954CEBDE26BBEEEB00B6E989 /* Sources */,
+				954CEBDF26BBEEEB00B6E989 /* Frameworks */,
+				954CEBE026BBEEEB00B6E989 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = StockChartsWatchOS;
+			productName = StockChartsWatchOS;
+			productReference = 954CEBE226BBEEEB00B6E989 /* StockChartsWatchOS.framework */;
+			productType = "com.apple.product-type.framework";
+		};
+		954CEBE926BBEEEB00B6E989 /* StockChartsWatchOSTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 954CEBF826BBEEEB00B6E989 /* Build configuration list for PBXNativeTarget "StockChartsWatchOSTests" */;
+			buildPhases = (
+				954CEBE626BBEEEB00B6E989 /* Sources */,
+				954CEBE726BBEEEB00B6E989 /* Frameworks */,
+				954CEBE826BBEEEB00B6E989 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				954CEBED26BBEEEB00B6E989 /* PBXTargetDependency */,
+			);
+			name = StockChartsWatchOSTests;
+			productName = StockChartsWatchOSTests;
+			productReference = 954CEBEA26BBEEEB00B6E989 /* StockChartsWatchOSTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
 		95770B80263C57B5003FA924 /* StockCharts */ = {
 			isa = PBXNativeTarget;
 			buildConfigurationList = 95770B95263C57B5003FA924 /* Build configuration list for PBXNativeTarget "StockCharts" */;
@@ -215,6 +308,12 @@
 				LastSwiftUpdateCheck = 1250;
 				LastUpgradeCheck = 1250;
 				TargetAttributes = {
+					954CEBE126BBEEEB00B6E989 = {
+						CreatedOnToolsVersion = 12.5.1;
+					};
+					954CEBE926BBEEEB00B6E989 = {
+						CreatedOnToolsVersion = 12.5.1;
+					};
 					95770B80263C57B5003FA924 = {
 						CreatedOnToolsVersion = 12.5;
 						LastSwiftMigration = 1250;
@@ -239,11 +338,27 @@
 			targets = (
 				95770B80263C57B5003FA924 /* StockCharts */,
 				95770B89263C57B5003FA924 /* StockChartsTests */,
+				954CEBE126BBEEEB00B6E989 /* StockChartsWatchOS */,
+				954CEBE926BBEEEB00B6E989 /* StockChartsWatchOSTests */,
 			);
 		};
 /* End PBXProject section */
 
 /* Begin PBXResourcesBuildPhase section */
+		954CEBE026BBEEEB00B6E989 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		954CEBE826BBEEEB00B6E989 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		95770B7F263C57B5003FA924 /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -261,6 +376,29 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
+		954CEBDE26BBEEEB00B6E989 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				954CEBFD26BBEF3E00B6E989 /* LinePath.swift in Sources */,
+				954CEC0026BBEF4A00B6E989 /* CapsuleChartStyle.swift in Sources */,
+				954CEBFE26BBEF4200B6E989 /* LineView.swift in Sources */,
+				958E4D3326BC3776003177DD /* LineChartController.swift in Sources */,
+				954CEBF926BBEF3100B6E989 /* LineChartView.swift in Sources */,
+				954CEBFC26BBEF3B00B6E989 /* IndicatorPoint.swift in Sources */,
+				954CEBFB26BBEF3800B6E989 /* ChartLabel.swift in Sources */,
+				954CEBFF26BBEF4700B6E989 /* CapsuleChartView.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		954CEBE626BBEEEB00B6E989 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				954CEBF026BBEEEB00B6E989 /* StockChartsWatchOSTests.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		95770B7D263C57B5003FA924 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -269,10 +407,10 @@
 				95770BA3263C5934003FA924 /* ChartLabel.swift in Sources */,
 				954AA3A026920D060006FD14 /* CapsuleChartStyle.swift in Sources */,
 				95770BA7263C596E003FA924 /* LinePath.swift in Sources */,
+				958E4D3226BC3776003177DD /* LineChartController.swift in Sources */,
 				950857AE266BDF62005357BA /* CapsuleChartView.swift in Sources */,
 				95770BA9263C5988003FA924 /* LineView.swift in Sources */,
 				95770BA5263C594C003FA924 /* IndicatorPoint.swift in Sources */,
-				954AA39E269209770006FD14 /* LineChartStyle.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -287,6 +425,11 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
+		954CEBED26BBEEEB00B6E989 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 954CEBE126BBEEEB00B6E989 /* StockChartsWatchOS */;
+			targetProxy = 954CEBEC26BBEEEB00B6E989 /* PBXContainerItemProxy */;
+		};
 		95770B8D263C57B5003FA924 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 95770B80263C57B5003FA924 /* StockCharts */;
@@ -295,6 +438,102 @@
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
+		954CEBF326BBEEEB00B6E989 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				APPLICATION_EXTENSION_API_ONLY = YES;
+				CODE_SIGN_STYLE = Automatic;
+				DEFINES_MODULE = YES;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				INFOPLIST_FILE = Sources/StockChartsWatchOS/Info.plist;
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockChartsWatchOS;
+				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 7.4;
+			};
+			name = Debug;
+		};
+		954CEBF426BBEEEB00B6E989 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				APPLICATION_EXTENSION_API_ONLY = YES;
+				CODE_SIGN_STYLE = Automatic;
+				DEFINES_MODULE = YES;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				INFOPLIST_FILE = Sources/StockChartsWatchOS/Info.plist;
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockChartsWatchOS;
+				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 7.4;
+			};
+			name = Release;
+		};
+		954CEBF526BBEEEB00B6E989 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				INFOPLIST_FILE = Sources/StockChartsWatchOSTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockChartsWatchOSTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = watchos;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 7.4;
+			};
+			name = Debug;
+		};
+		954CEBF626BBEEEB00B6E989 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				INFOPLIST_FILE = Sources/StockChartsWatchOSTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockChartsWatchOSTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = watchos;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 7.4;
+			};
+			name = Release;
+		};
 		95770B93263C57B5003FA924 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
@@ -349,7 +588,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 12.3;
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				ONLY_ACTIVE_ARCH = YES;
@@ -409,7 +648,7 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 12.3;
+				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				SDKROOT = iphoneos;
@@ -440,7 +679,7 @@
 					"@executable_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.1;
+				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockCharts;
 				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -471,7 +710,7 @@
 					"@executable_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.1;
+				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.StockCharts;
 				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -531,6 +770,24 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
+		954CEBF726BBEEEB00B6E989 /* Build configuration list for PBXNativeTarget "StockChartsWatchOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				954CEBF326BBEEEB00B6E989 /* Debug */,
+				954CEBF426BBEEEB00B6E989 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		954CEBF826BBEEEB00B6E989 /* Build configuration list for PBXNativeTarget "StockChartsWatchOSTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				954CEBF526BBEEEB00B6E989 /* Debug */,
+				954CEBF626BBEEEB00B6E989 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 		95770B7B263C57B5003FA924 /* Build configuration list for PBXProject "StockCharts" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
--- a/StockCharts.xcodeproj/project.xcworkspace/contents.xcworkspacedata	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
-   version = "1.0">
-   <FileRef
-      location = "self:">
-   </FileRef>
-</Workspace>
--- a/StockCharts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>IDEDidComputeMac32BitWarning</key>
-	<true/>
-</dict>
-</plist>
Binary file StockCharts.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/StockCharts.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>SchemeUserState</key>
-	<dict>
-		<key>StockCharts.xcscheme_^#shared#^_</key>
-		<dict>
-			<key>orderHint</key>
-			<integer>0</integer>
-		</dict>
-	</dict>
-	<key>SuppressBuildableAutocreation</key>
-	<dict>
-		<key>95770B80263C57B5003FA924</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-		<key>95770B89263C57B5003FA924</key>
-		<dict>
-			<key>primary</key>
-			<true/>
-		</dict>
-	</dict>
-</dict>
-</plist>
--- a/Tests/StockChartsTests/Info.plist	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>$(DEVELOPMENT_LANGUAGE)</string>
-	<key>CFBundleExecutable</key>
-	<string>$(EXECUTABLE_NAME)</string>
-	<key>CFBundleIdentifier</key>
-	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>$(PRODUCT_NAME)</string>
-	<key>CFBundlePackageType</key>
-	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-</dict>
-</plist>
--- a/Tests/StockChartsTests/StockChartsTests.swift	Sat Jul 17 12:25:39 2021 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-//
-//  StockChartsTests.swift
-//  StockChartsTests
-//
-//  Created by Dennis Concepción Martín on 30/4/21.
-//
-
-import XCTest
-@testable import StockCharts
-
-class StockChartsTests: XCTestCase {
-
-    override func setUpWithError() throws {
-        // Put setup code here. This method is called before the invocation of each test method in the class.
-    }
-
-    override func tearDownWithError() throws {
-        // Put teardown code here. This method is called after the invocation of each test method in the class.
-    }
-
-    func testExample() throws {
-        // This is an example of a functional test case.
-        // Use XCTAssert and related functions to verify your tests produce the correct results.
-    }
-
-    func testPerformanceExample() throws {
-        // This is an example of a performance test case.
-        self.measure {
-            // Put the code you want to measure the time of here.
-        }
-    }
-
-}