diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..3f77a9e Binary files /dev/null and b/.DS_Store differ diff --git a/CoBiE/CoBiE Analog Clock/AppIntent.swift b/CoBiE/CoBiE Analog Clock/AppIntent.swift new file mode 100644 index 0000000..2957d19 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/AppIntent.swift @@ -0,0 +1,18 @@ +// +// AppIntent.swift +// CoBiE Analog Clock +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import WidgetKit +import AppIntents + +struct ConfigurationAppIntent: WidgetConfigurationIntent { + static var title: LocalizedStringResource { "Configuration" } + static var description: IntentDescription { "This is an example widget." } + + // An example configurable parameter. + @Parameter(title: "Favorite Emoji", default: "😃") + var favoriteEmoji: String +} diff --git a/CoBiE/CoBiE Analog Clock/Assets.xcassets/AccentColor.colorset/Contents.json b/CoBiE/CoBiE Analog Clock/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE Analog Clock/Assets.xcassets/AppIcon.appiconset/Contents.json b/CoBiE/CoBiE Analog Clock/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..3f00db4 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE Analog Clock/Assets.xcassets/Contents.json b/CoBiE/CoBiE Analog Clock/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE Analog Clock/Assets.xcassets/WidgetBackground.colorset/Contents.json b/CoBiE/CoBiE Analog Clock/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE Analog Clock/CoBiE_Analog_Clock.swift b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_Clock.swift new file mode 100644 index 0000000..a50c291 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_Clock.swift @@ -0,0 +1,67 @@ +// +// CoBiE_Analog_Clock.swift +// CoBiE Analog Clock +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import WidgetKit +import SwiftUI + +struct Provider: AppIntentTimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), configuration: ConfigurationAppIntent()) + } + + func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> SimpleEntry { + SimpleEntry(date: Date(), configuration: configuration) + } + + func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, configuration: configuration) + entries.append(entry) + } + + return Timeline(entries: entries, policy: .atEnd) + } + +// func relevances() async -> WidgetRelevances { +// // Generate a list containing the contexts this widget is relevant in. +// } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let configuration: ConfigurationAppIntent +} + +struct CoBiE_Analog_ClockEntryView : View { + var entry: Provider.Entry + + var body: some View { + VStack { + Text("Time:") + Text(entry.date, style: .time) + + Text("Favorite Emoji:") + Text(entry.configuration.favoriteEmoji) + } + } +} + +struct CoBiE_Analog_Clock: Widget { + let kind: String = "CoBiE_Analog_Clock" + + var body: some WidgetConfiguration { + AppIntentConfiguration(kind: kind, intent: ConfigurationAppIntent.self, provider: Provider()) { entry in + CoBiE_Analog_ClockEntryView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } + } +} diff --git a/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockBundle.swift b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockBundle.swift new file mode 100644 index 0000000..a65426d --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockBundle.swift @@ -0,0 +1,17 @@ +// +// CoBiE_Analog_ClockBundle.swift +// CoBiE Analog Clock +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import WidgetKit +import SwiftUI + +@main +struct CoBiE_Analog_ClockBundle: WidgetBundle { + var body: some Widget { + CoBiE_Analog_Clock() + CoBiE_Analog_ClockControl() + } +} diff --git a/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockControl.swift b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockControl.swift new file mode 100644 index 0000000..04568c4 --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/CoBiE_Analog_ClockControl.swift @@ -0,0 +1,77 @@ +// +// CoBiE_Analog_ClockControl.swift +// CoBiE Analog Clock +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import AppIntents +import SwiftUI +import WidgetKit + +struct CoBiE_Analog_ClockControl: ControlWidget { + static let kind: String = "no.kaizenkodo.CoBiE.CoBiE Analog Clock" + + var body: some ControlWidgetConfiguration { + AppIntentControlConfiguration( + kind: Self.kind, + provider: Provider() + ) { value in + ControlWidgetToggle( + "Start Timer", + isOn: value.isRunning, + action: StartTimerIntent(value.name) + ) { isRunning in + Label(isRunning ? "On" : "Off", systemImage: "timer") + } + } + .displayName("Timer") + .description("A an example control that runs a timer.") + } +} + +extension CoBiE_Analog_ClockControl { + struct Value { + var isRunning: Bool + var name: String + } + + struct Provider: AppIntentControlValueProvider { + func previewValue(configuration: TimerConfiguration) -> Value { + CoBiE_Analog_ClockControl.Value(isRunning: false, name: configuration.timerName) + } + + func currentValue(configuration: TimerConfiguration) async throws -> Value { + let isRunning = true // Check if the timer is running + return CoBiE_Analog_ClockControl.Value(isRunning: isRunning, name: configuration.timerName) + } + } +} + +struct TimerConfiguration: ControlConfigurationIntent { + static let title: LocalizedStringResource = "Timer Name Configuration" + + @Parameter(title: "Timer Name", default: "Timer") + var timerName: String +} + +struct StartTimerIntent: SetValueIntent { + static let title: LocalizedStringResource = "Start a timer" + + @Parameter(title: "Timer Name") + var name: String + + @Parameter(title: "Timer is running") + var value: Bool + + init() {} + + init(_ name: String) { + self.name = name + } + + func perform() async throws -> some IntentResult { + // Start the timer… + return .result() + } +} diff --git a/CoBiE/CoBiE Analog Clock/Info.plist b/CoBiE/CoBiE Analog Clock/Info.plist new file mode 100644 index 0000000..0f118fb --- /dev/null +++ b/CoBiE/CoBiE Analog Clock/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/CoBiE/CoBiE.xcodeproj/project.pbxproj b/CoBiE/CoBiE.xcodeproj/project.pbxproj new file mode 100644 index 0000000..887a7fe --- /dev/null +++ b/CoBiE/CoBiE.xcodeproj/project.pbxproj @@ -0,0 +1,807 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 4FF813CC2E00403F00D89535 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FF813CB2E00403E00D89535 /* WidgetKit.framework */; }; + 4FF813CE2E00403F00D89535 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FF813CD2E00403F00D89535 /* SwiftUI.framework */; }; + 4FF813DD2E00404000D89535 /* CoBiE Analog ClockExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4FF813C92E00403E00D89535 /* CoBiE Analog ClockExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4FF813A92E003FB600D89535 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4FF813912E003FB400D89535 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4FF813982E003FB400D89535; + remoteInfo = CoBiE; + }; + 4FF813B32E003FB600D89535 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4FF813912E003FB400D89535 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4FF813982E003FB400D89535; + remoteInfo = CoBiE; + }; + 4FF813DB2E00404000D89535 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4FF813912E003FB400D89535 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4FF813C82E00403E00D89535; + remoteInfo = "CoBiE Analog ClockExtension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 4FF813E22E00404000D89535 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4FF813DD2E00404000D89535 /* CoBiE Analog ClockExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4FF813992E003FB400D89535 /* CoBiE.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CoBiE.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4FF813A82E003FB600D89535 /* CoBiETests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoBiETests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4FF813B22E003FB600D89535 /* CoBiEUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoBiEUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4FF813C92E00403E00D89535 /* CoBiE Analog ClockExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "CoBiE Analog ClockExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4FF813CB2E00403E00D89535 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + 4FF813CD2E00403F00D89535 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4FF813DE2E00404000D89535 /* Exceptions for "CoBiE Analog Clock" folder in "CoBiE Analog ClockExtension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4FF813C82E00403E00D89535 /* CoBiE Analog ClockExtension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 4FF8139B2E003FB400D89535 /* CoBiE */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CoBiE; + sourceTree = ""; + }; + 4FF813AB2E003FB600D89535 /* CoBiETests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CoBiETests; + sourceTree = ""; + }; + 4FF813B52E003FB600D89535 /* CoBiEUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CoBiEUITests; + sourceTree = ""; + }; + 4FF813CF2E00403F00D89535 /* CoBiE Analog Clock */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4FF813DE2E00404000D89535 /* Exceptions for "CoBiE Analog Clock" folder in "CoBiE Analog ClockExtension" target */, + ); + path = "CoBiE Analog Clock"; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4FF813962E003FB400D89535 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813A52E003FB600D89535 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813AF2E003FB600D89535 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813C62E00403E00D89535 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4FF813CE2E00403F00D89535 /* SwiftUI.framework in Frameworks */, + 4FF813CC2E00403F00D89535 /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4FF813902E003FB400D89535 = { + isa = PBXGroup; + children = ( + 4FF8139B2E003FB400D89535 /* CoBiE */, + 4FF813AB2E003FB600D89535 /* CoBiETests */, + 4FF813B52E003FB600D89535 /* CoBiEUITests */, + 4FF813CF2E00403F00D89535 /* CoBiE Analog Clock */, + 4FF813CA2E00403E00D89535 /* Frameworks */, + 4FF8139A2E003FB400D89535 /* Products */, + ); + sourceTree = ""; + }; + 4FF8139A2E003FB400D89535 /* Products */ = { + isa = PBXGroup; + children = ( + 4FF813992E003FB400D89535 /* CoBiE.app */, + 4FF813A82E003FB600D89535 /* CoBiETests.xctest */, + 4FF813B22E003FB600D89535 /* CoBiEUITests.xctest */, + 4FF813C92E00403E00D89535 /* CoBiE Analog ClockExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 4FF813CA2E00403E00D89535 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4FF813CB2E00403E00D89535 /* WidgetKit.framework */, + 4FF813CD2E00403F00D89535 /* SwiftUI.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4FF813982E003FB400D89535 /* CoBiE */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FF813BC2E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiE" */; + buildPhases = ( + 4FF813952E003FB400D89535 /* Sources */, + 4FF813962E003FB400D89535 /* Frameworks */, + 4FF813972E003FB400D89535 /* Resources */, + 4FF813E22E00404000D89535 /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 4FF813DC2E00404000D89535 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4FF8139B2E003FB400D89535 /* CoBiE */, + ); + name = CoBiE; + packageProductDependencies = ( + ); + productName = CoBiE; + productReference = 4FF813992E003FB400D89535 /* CoBiE.app */; + productType = "com.apple.product-type.application"; + }; + 4FF813A72E003FB600D89535 /* CoBiETests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FF813BF2E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiETests" */; + buildPhases = ( + 4FF813A42E003FB600D89535 /* Sources */, + 4FF813A52E003FB600D89535 /* Frameworks */, + 4FF813A62E003FB600D89535 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4FF813AA2E003FB600D89535 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4FF813AB2E003FB600D89535 /* CoBiETests */, + ); + name = CoBiETests; + packageProductDependencies = ( + ); + productName = CoBiETests; + productReference = 4FF813A82E003FB600D89535 /* CoBiETests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4FF813B12E003FB600D89535 /* CoBiEUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FF813C22E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiEUITests" */; + buildPhases = ( + 4FF813AE2E003FB600D89535 /* Sources */, + 4FF813AF2E003FB600D89535 /* Frameworks */, + 4FF813B02E003FB600D89535 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4FF813B42E003FB600D89535 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4FF813B52E003FB600D89535 /* CoBiEUITests */, + ); + name = CoBiEUITests; + packageProductDependencies = ( + ); + productName = CoBiEUITests; + productReference = 4FF813B22E003FB600D89535 /* CoBiEUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 4FF813C82E00403E00D89535 /* CoBiE Analog ClockExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FF813DF2E00404000D89535 /* Build configuration list for PBXNativeTarget "CoBiE Analog ClockExtension" */; + buildPhases = ( + 4FF813C52E00403E00D89535 /* Sources */, + 4FF813C62E00403E00D89535 /* Frameworks */, + 4FF813C72E00403E00D89535 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4FF813CF2E00403F00D89535 /* CoBiE Analog Clock */, + ); + name = "CoBiE Analog ClockExtension"; + packageProductDependencies = ( + ); + productName = "CoBiE Analog ClockExtension"; + productReference = 4FF813C92E00403E00D89535 /* CoBiE Analog ClockExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4FF813912E003FB400D89535 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2600; + LastUpgradeCheck = 2600; + TargetAttributes = { + 4FF813982E003FB400D89535 = { + CreatedOnToolsVersion = 26.0; + }; + 4FF813A72E003FB600D89535 = { + CreatedOnToolsVersion = 26.0; + TestTargetID = 4FF813982E003FB400D89535; + }; + 4FF813B12E003FB600D89535 = { + CreatedOnToolsVersion = 26.0; + TestTargetID = 4FF813982E003FB400D89535; + }; + 4FF813C82E00403E00D89535 = { + CreatedOnToolsVersion = 26.0; + }; + }; + }; + buildConfigurationList = 4FF813942E003FB400D89535 /* Build configuration list for PBXProject "CoBiE" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4FF813902E003FB400D89535; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 4FF8139A2E003FB400D89535 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4FF813982E003FB400D89535 /* CoBiE */, + 4FF813A72E003FB600D89535 /* CoBiETests */, + 4FF813B12E003FB600D89535 /* CoBiEUITests */, + 4FF813C82E00403E00D89535 /* CoBiE Analog ClockExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4FF813972E003FB400D89535 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813A62E003FB600D89535 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813B02E003FB600D89535 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813C72E00403E00D89535 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4FF813952E003FB400D89535 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813A42E003FB600D89535 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813AE2E003FB600D89535 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4FF813C52E00403E00D89535 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4FF813AA2E003FB600D89535 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4FF813982E003FB400D89535 /* CoBiE */; + targetProxy = 4FF813A92E003FB600D89535 /* PBXContainerItemProxy */; + }; + 4FF813B42E003FB600D89535 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4FF813982E003FB400D89535 /* CoBiE */; + targetProxy = 4FF813B32E003FB600D89535 /* PBXContainerItemProxy */; + }; + 4FF813DC2E00404000D89535 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4FF813C82E00403E00D89535 /* CoBiE Analog ClockExtension */; + targetProxy = 4FF813DB2E00404000D89535 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4FF813BA2E003FB600D89535 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4FF813BB2E003FB600D89535 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 4FF813BD2E003FB600D89535 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiE; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 4FF813BE2E003FB600D89535 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiE; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 4FF813C02E003FB600D89535 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiETests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoBiE.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CoBiE"; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 4FF813C12E003FB600D89535 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiETests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoBiE.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CoBiE"; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 4FF813C32E003FB600D89535 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiEUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_TARGET_NAME = CoBiE; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 4FF813C42E003FB600D89535 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.kaizenkodo.CoBiEUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_TARGET_NAME = CoBiE; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 4FF813E02E00404000D89535 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "CoBiE Analog Clock/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "CoBiE Analog Clock"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "no.kaizenkodo.CoBiE.CoBiE-Analog-Clock"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 4FF813E12E00404000D89535 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "CoBiE Analog Clock/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "CoBiE Analog Clock"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 26.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "no.kaizenkodo.CoBiE.CoBiE-Analog-Clock"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4FF813942E003FB400D89535 /* Build configuration list for PBXProject "CoBiE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FF813BA2E003FB600D89535 /* Debug */, + 4FF813BB2E003FB600D89535 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FF813BC2E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FF813BD2E003FB600D89535 /* Debug */, + 4FF813BE2E003FB600D89535 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FF813BF2E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiETests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FF813C02E003FB600D89535 /* Debug */, + 4FF813C12E003FB600D89535 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FF813C22E003FB600D89535 /* Build configuration list for PBXNativeTarget "CoBiEUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FF813C32E003FB600D89535 /* Debug */, + 4FF813C42E003FB600D89535 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FF813DF2E00404000D89535 /* Build configuration list for PBXNativeTarget "CoBiE Analog ClockExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FF813E02E00404000D89535 /* Debug */, + 4FF813E12E00404000D89535 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4FF813912E003FB400D89535 /* Project object */; +} diff --git a/CoBiE/CoBiE.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CoBiE/CoBiE.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/CoBiE/CoBiE.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CoBiE/CoBiE.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate b/CoBiE/CoBiE.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..1a9619d Binary files /dev/null and b/CoBiE/CoBiE.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/CoBiE/CoBiE.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist b/CoBiE/CoBiE.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..8e4a0c5 --- /dev/null +++ b/CoBiE/CoBiE.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + CoBiE Analog ClockExtension.xcscheme_^#shared#^_ + + orderHint + 1 + + CoBiE.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/CoBiE/CoBiE/Assets.xcassets/AccentColor.colorset/Contents.json b/CoBiE/CoBiE/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CoBiE/CoBiE/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE/Assets.xcassets/AppIcon.appiconset/Contents.json b/CoBiE/CoBiE/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..ffdfe15 --- /dev/null +++ b/CoBiE/CoBiE/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,85 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE/Assets.xcassets/Contents.json b/CoBiE/CoBiE/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CoBiE/CoBiE/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoBiE/CoBiE/CoBiEApp.swift b/CoBiE/CoBiE/CoBiEApp.swift new file mode 100644 index 0000000..d369094 --- /dev/null +++ b/CoBiE/CoBiE/CoBiEApp.swift @@ -0,0 +1,32 @@ +// +// CoBiEApp.swift +// CoBiE +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import SwiftUI +import SwiftData + +@main +struct CoBiEApp: App { + var sharedModelContainer: ModelContainer = { + let schema = Schema([ + Item.self, + ]) + let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) + + do { + return try ModelContainer(for: schema, configurations: [modelConfiguration]) + } catch { + fatalError("Could not create ModelContainer: \(error)") + } + }() + + var body: some Scene { + WindowGroup { + ContentView() + } + .modelContainer(sharedModelContainer) + } +} diff --git a/CoBiE/CoBiE/ContentView.swift b/CoBiE/CoBiE/ContentView.swift new file mode 100644 index 0000000..2a6d853 --- /dev/null +++ b/CoBiE/CoBiE/ContentView.swift @@ -0,0 +1,66 @@ +// +// ContentView.swift +// CoBiE +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import SwiftUI +import SwiftData + +struct ContentView: View { + @Environment(\.modelContext) private var modelContext + @Query private var items: [Item] + + var body: some View { + NavigationSplitView { + List { + ForEach(items) { item in + NavigationLink { + Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") + } label: { + Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) + } + } + .onDelete(perform: deleteItems) + } +#if os(macOS) + .navigationSplitViewColumnWidth(min: 180, ideal: 200) +#endif + .toolbar { +#if os(iOS) + ToolbarItem(placement: .navigationBarTrailing) { + EditButton() + } +#endif + ToolbarItem { + Button(action: addItem) { + Label("Add Item", systemImage: "plus") + } + } + } + } detail: { + Text("Select an item") + } + } + + private func addItem() { + withAnimation { + let newItem = Item(timestamp: Date()) + modelContext.insert(newItem) + } + } + + private func deleteItems(offsets: IndexSet) { + withAnimation { + for index in offsets { + modelContext.delete(items[index]) + } + } + } +} + +#Preview { + ContentView() + .modelContainer(for: Item.self, inMemory: true) +} diff --git a/CoBiE/CoBiE/Item.swift b/CoBiE/CoBiE/Item.swift new file mode 100644 index 0000000..2060fa4 --- /dev/null +++ b/CoBiE/CoBiE/Item.swift @@ -0,0 +1,18 @@ +// +// Item.swift +// CoBiE +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import Foundation +import SwiftData + +@Model +final class Item { + var timestamp: Date + + init(timestamp: Date) { + self.timestamp = timestamp + } +} diff --git a/CoBiE/CoBiETests/CoBiETests.swift b/CoBiE/CoBiETests/CoBiETests.swift new file mode 100644 index 0000000..c2a853b --- /dev/null +++ b/CoBiE/CoBiETests/CoBiETests.swift @@ -0,0 +1,16 @@ +// +// CoBiETests.swift +// CoBiETests +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import Testing + +struct CoBiETests { + + @Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. + } + +} diff --git a/CoBiE/CoBiEUITests/CoBiEUITests.swift b/CoBiE/CoBiEUITests/CoBiEUITests.swift new file mode 100644 index 0000000..afca8b4 --- /dev/null +++ b/CoBiE/CoBiEUITests/CoBiEUITests.swift @@ -0,0 +1,41 @@ +// +// CoBiEUITests.swift +// CoBiEUITests +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import XCTest + +final class CoBiEUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + @MainActor + func testLaunchPerformance() throws { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } +} diff --git a/CoBiE/CoBiEUITests/CoBiEUITestsLaunchTests.swift b/CoBiE/CoBiEUITests/CoBiEUITestsLaunchTests.swift new file mode 100644 index 0000000..df58772 --- /dev/null +++ b/CoBiE/CoBiEUITests/CoBiEUITestsLaunchTests.swift @@ -0,0 +1,33 @@ +// +// CoBiEUITestsLaunchTests.swift +// CoBiEUITests +// +// Created by Oleksandr Kozachuk on 2025-06-16. +// + +import XCTest + +final class CoBiEUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + @MainActor + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/build-widget.sh b/build-widget.sh deleted file mode 100755 index 63cf673..0000000 --- a/build-widget.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Build the macOS Dashboard widget without duplicating code -set -euo pipefail - -WIDGET_NAME="CoBiEClock" -SRC_DIR="macos-widget" -BUILD_DIR="${WIDGET_NAME}.wdgt" - -# Clean previous build -rm -rf "$BUILD_DIR" -mkdir "$BUILD_DIR" - -# Copy unique widget files -cp "$SRC_DIR/Info.plist" "$SRC_DIR/index.html" "$BUILD_DIR/" - -# Copy shared files from repository root -cp clock.js cobie.js style.css logo.svg "$BUILD_DIR/" - -echo "Widget created: ${BUILD_DIR}" diff --git a/macos-widget/Info.plist b/macos-widget/Info.plist deleted file mode 100644 index 3d3359f..0000000 --- a/macos-widget/Info.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - CFBundleDisplayName - CoBiE Clock - CFBundleIdentifier - com.example.cobieclock - CFBundleVersion - 1.0 - CFBundlePackageType - BNDL - CFBundleSignature - ???? - MainHTML - index.html - - diff --git a/macos-widget/index.html b/macos-widget/index.html deleted file mode 100644 index 4f78146..0000000 --- a/macos-widget/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - CoBiE Clock - - - -
-
-
-
-
-
-
-
-
CoBiE Time
-
-
- - - -