diff --git a/.resources/Recordings/AnalogClockWidget.gif b/.resources/Recordings/AnalogClockWidget.gif new file mode 100644 index 0000000..634acf6 Binary files /dev/null and b/.resources/Recordings/AnalogClockWidget.gif differ diff --git a/Frameworks/ClockRotationEffect.xcframework/Info.plist b/Frameworks/ClockRotationEffect.xcframework/Info.plist new file mode 100644 index 0000000..1220814 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/Info.plist @@ -0,0 +1,40 @@ + + + + + AvailableLibraries + + + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + ClockRotationEffect.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + LibraryIdentifier + ios-arm64 + LibraryPath + ClockRotationEffect.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/ClockRotationEffect b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/ClockRotationEffect new file mode 100755 index 0000000..9764079 Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/ClockRotationEffect differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h new file mode 100644 index 0000000..815d104 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h @@ -0,0 +1,219 @@ +// Generated by Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +#ifndef CLOCKROTATIONEFFECT_SWIFT_H +#define CLOCKROTATIONEFFECT_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +#else +# define SWIFT_RELEASES_ARGUMENT +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if __has_feature(modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="ClockRotationEffect",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop +#endif diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect.h b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect.h new file mode 100644 index 0000000..0b8c4b8 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Headers/ClockRotationEffect.h @@ -0,0 +1 @@ +#import diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Info.plist b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Info.plist new file mode 100644 index 0000000..8b03d7f Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Info.plist differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftdoc b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftdoc new file mode 100644 index 0000000..bbd1080 Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftdoc differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftinterface b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftinterface new file mode 100644 index 0000000..fb0f51d --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios.swiftinterface @@ -0,0 +1,19 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +// swift-module-flags: -target arm64-apple-ios15.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ClockRotationEffect +@_exported import ClockRotationEffect +import Foundation +import Swift +import SwiftUI +import WidgetKit +import _Concurrency +public enum ClockRotationPeriod { + case custom(Foundation.TimeInterval) + case secondHand, hourHand, miniuteHand +} +public struct ClockRotationModifier : SwiftUI.ViewModifier { + public init(period: ClockRotationEffect.ClockRotationPeriod, timezone: Foundation.TimeZone, anchor: SwiftUI.UnitPoint) + @_Concurrency.MainActor(unsafe) public func body(content: ClockRotationEffect.ClockRotationModifier.Content) -> some SwiftUI.View + + public typealias Body = @_opaqueReturnTypeOf("$s19ClockRotationEffect0aB8ModifierV4body7contentQr7SwiftUI05_ViewD8_ContentVyACG_tF", 0) __ +} diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/module.modulemap b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/module.modulemap new file mode 100644 index 0000000..a6df4e1 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64/ClockRotationEffect.framework/Modules/module.modulemap @@ -0,0 +1,11 @@ +framework module ClockRotationEffect { + umbrella header "ClockRotationEffect.h" + + export * + module * { export * } +} + +module ClockRotationEffect.Swift { + header "ClockRotationEffect-Swift.h" + requires objc +} diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/ClockRotationEffect b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/ClockRotationEffect new file mode 100755 index 0000000..9965127 Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/ClockRotationEffect differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h new file mode 100644 index 0000000..1656ac5 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect-Swift.h @@ -0,0 +1,444 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +#ifndef CLOCKROTATIONEFFECT_SWIFT_H +#define CLOCKROTATIONEFFECT_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +#else +# define SWIFT_RELEASES_ARGUMENT +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if __has_feature(modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="ClockRotationEffect",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +#ifndef CLOCKROTATIONEFFECT_SWIFT_H +#define CLOCKROTATIONEFFECT_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +#else +# define SWIFT_RELEASES_ARGUMENT +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#if !defined(SWIFT_EXTERN) +# if defined(__cplusplus) +# define SWIFT_EXTERN extern "C" +# else +# define SWIFT_EXTERN extern +# endif +#endif +#if __has_feature(modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="ClockRotationEffect",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop +#endif + +#endif diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect.h b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect.h new file mode 100644 index 0000000..0b8c4b8 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Headers/ClockRotationEffect.h @@ -0,0 +1 @@ +#import diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Info.plist b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Info.plist new file mode 100644 index 0000000..96baa49 Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Info.plist differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftdoc b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftdoc new file mode 100644 index 0000000..eb115bc Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftdoc differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftinterface b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftinterface new file mode 100644 index 0000000..efcedc8 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/arm64-apple-ios-simulator.swiftinterface @@ -0,0 +1,19 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +// swift-module-flags: -target arm64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ClockRotationEffect +@_exported import ClockRotationEffect +import Foundation +import Swift +import SwiftUI +import WidgetKit +import _Concurrency +public enum ClockRotationPeriod { + case custom(Foundation.TimeInterval) + case secondHand, hourHand, miniuteHand +} +public struct ClockRotationModifier : SwiftUI.ViewModifier { + public init(period: ClockRotationEffect.ClockRotationPeriod, timezone: Foundation.TimeZone, anchor: SwiftUI.UnitPoint) + @_Concurrency.MainActor(unsafe) public func body(content: ClockRotationEffect.ClockRotationModifier.Content) -> some SwiftUI.View + + public typealias Body = @_opaqueReturnTypeOf("$s19ClockRotationEffect0aB8ModifierV4body7contentQr7SwiftUI05_ViewD8_ContentVyACG_tF", 0) __ +} diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftdoc new file mode 100644 index 0000000..cd06f41 Binary files /dev/null and b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftdoc differ diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftinterface b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftinterface new file mode 100644 index 0000000..d1dbf7a --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/ClockRotationEffect.swiftmodule/x86_64-apple-ios-simulator.swiftinterface @@ -0,0 +1,19 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.6.1 (swiftlang-5.6.0.323.66 clang-1316.0.20.12) +// swift-module-flags: -target x86_64-apple-ios15.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name ClockRotationEffect +@_exported import ClockRotationEffect +import Foundation +import Swift +import SwiftUI +import WidgetKit +import _Concurrency +public enum ClockRotationPeriod { + case custom(Foundation.TimeInterval) + case secondHand, hourHand, miniuteHand +} +public struct ClockRotationModifier : SwiftUI.ViewModifier { + public init(period: ClockRotationEffect.ClockRotationPeriod, timezone: Foundation.TimeZone, anchor: SwiftUI.UnitPoint) + @_Concurrency.MainActor(unsafe) public func body(content: ClockRotationEffect.ClockRotationModifier.Content) -> some SwiftUI.View + + public typealias Body = @_opaqueReturnTypeOf("$s19ClockRotationEffect0aB8ModifierV4body7contentQr7SwiftUI05_ViewD8_ContentVyACG_tF", 0) __ +} diff --git a/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/module.modulemap b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/module.modulemap new file mode 100644 index 0000000..a6df4e1 --- /dev/null +++ b/Frameworks/ClockRotationEffect.xcframework/ios-arm64_x86_64-simulator/ClockRotationEffect.framework/Modules/module.modulemap @@ -0,0 +1,11 @@ +framework module ClockRotationEffect { + umbrella header "ClockRotationEffect.h" + + export * + module * { export * } +} + +module ClockRotationEffect.Swift { + header "ClockRotationEffect-Swift.h" + requires objc +} diff --git a/README.md b/README.md index ac7de0c..5e24118 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,9 @@ A demo project showing different types of Widgets created with SwiftUI and Widge 1. [Gallery](#gallery) - 2. [Installation](#installation) - 3. [License](#license) + 2. [Unofficial gallery](#unofficial) + 3. [Installation](#installation) + 4. [License](#license) @@ -172,6 +173,31 @@ A demo project showing different types of Widgets created with SwiftUI and Widge +## Unofficial gallery + +Please be aware that the folowing widgets use private API. This means they not necessarily have to pass Apple Review and you use them at your own risk. + + + + + + + + + + + + + + +
+ Analog Clock +
+ + Analog Clock Widget + +
+ ## Installation It is recommended to download the whole project to keep the configuration intact as some widgets depend on the App Group capability or integrate with the main App. diff --git a/Shared/WidgetType.swift b/Shared/WidgetType.swift index 9e2bd0f..34fdcd1 100644 --- a/Shared/WidgetType.swift +++ b/Shared/WidgetType.swift @@ -23,6 +23,7 @@ import Foundation enum WidgetType: String { + case analogClock case appGroup case coreData case countdown diff --git a/Widget Examples.xcodeproj/project.pbxproj b/Widget Examples.xcodeproj/project.pbxproj index 4e2deb8..7c033ba 100644 --- a/Widget Examples.xcodeproj/project.pbxproj +++ b/Widget Examples.xcodeproj/project.pbxproj @@ -28,6 +28,11 @@ E54214152538AFF000CCC9C3 /* SharedViewWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542140E2538AF8500CCC9C3 /* SharedViewWidgetEntryView.swift */; }; E54214262538B77500CCC9C3 /* DataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = E54214212538B76C00CCC9C3 /* DataModel.xcdatamodeld */; }; E54214292538B77900CCC9C3 /* PersistenceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542141D2538B68200CCC9C3 /* PersistenceController.swift */; }; + E542EED92BD565CD00964BEB /* AnalogClockWidget+EntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542EED52BD565CD00964BEB /* AnalogClockWidget+EntryView.swift */; }; + E542EEDA2BD565CD00964BEB /* AnalogClockWidget+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542EED62BD565CD00964BEB /* AnalogClockWidget+Provider.swift */; }; + E542EEDB2BD565CD00964BEB /* AnalogClockWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542EED72BD565CD00964BEB /* AnalogClockWidget.swift */; }; + E542EEDC2BD565CD00964BEB /* AnalogClockWidget+Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = E542EED82BD565CD00964BEB /* AnalogClockWidget+Entry.swift */; }; + E542EEDE2BD56EE700964BEB /* ClockRotationEffect.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = E542EEDD2BD56EE700964BEB /* ClockRotationEffect.xcframework */; }; E55498382551D2160066870B /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55498372551D2160066870B /* Person.swift */; }; E5619C572A6986D900F94132 /* DeepLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5619C562A6986D900F94132 /* DeepLink.swift */; }; E5619C582A6986D900F94132 /* DeepLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5619C562A6986D900F94132 /* DeepLink.swift */; }; @@ -226,6 +231,11 @@ E54214192538B58600CCC9C3 /* CoreDataWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataWidget.swift; sourceTree = ""; }; E542141D2538B68200CCC9C3 /* PersistenceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceController.swift; sourceTree = ""; }; E54214222538B76C00CCC9C3 /* DataModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = DataModel.xcdatamodel; sourceTree = ""; }; + E542EED52BD565CD00964BEB /* AnalogClockWidget+EntryView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AnalogClockWidget+EntryView.swift"; sourceTree = ""; }; + E542EED62BD565CD00964BEB /* AnalogClockWidget+Provider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AnalogClockWidget+Provider.swift"; sourceTree = ""; }; + E542EED72BD565CD00964BEB /* AnalogClockWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnalogClockWidget.swift; sourceTree = ""; }; + E542EED82BD565CD00964BEB /* AnalogClockWidget+Entry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AnalogClockWidget+Entry.swift"; sourceTree = ""; }; + E542EEDD2BD56EE700964BEB /* ClockRotationEffect.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ClockRotationEffect.xcframework; path = Frameworks/ClockRotationEffect.xcframework; sourceTree = ""; }; E55497C8255180D90066870B /* DynamicIntentWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicIntentWidget.swift; sourceTree = ""; }; E55498372551D2160066870B /* Person.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; E5619C562A6986D900F94132 /* DeepLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLink.swift; sourceTree = ""; }; @@ -291,6 +301,7 @@ buildActionMask = 2147483647; files = ( E517B3832A62D6B7009072A3 /* SwiftUI.framework in Frameworks */, + E542EEDE2BD56EE700964BEB /* ClockRotationEffect.xcframework in Frameworks */, E517B3822A62D6B7009072A3 /* WidgetKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -330,6 +341,17 @@ path = Extensions; sourceTree = ""; }; + E52FE12F2BD552CE00141AC0 /* AnalogClock */ = { + isa = PBXGroup; + children = ( + E542EED72BD565CD00964BEB /* AnalogClockWidget.swift */, + E542EED82BD565CD00964BEB /* AnalogClockWidget+Entry.swift */, + E542EED52BD565CD00964BEB /* AnalogClockWidget+EntryView.swift */, + E542EED62BD565CD00964BEB /* AnalogClockWidget+Provider.swift */, + ); + path = AnalogClock; + sourceTree = ""; + }; E542134D253879B700CCC9C3 = { isa = PBXGroup; children = ( @@ -367,6 +389,7 @@ E542136E25387A0200CCC9C3 /* Frameworks */ = { isa = PBXGroup; children = ( + E542EEDD2BD56EE700964BEB /* ClockRotationEffect.xcframework */, E542136F25387A0200CCC9C3 /* WidgetKit.framework */, E542137125387A0200CCC9C3 /* SwiftUI.framework */, ); @@ -377,6 +400,7 @@ isa = PBXGroup; children = ( E542137425387A0300CCC9C3 /* WidgetBundle.swift */, + E52FE12F2BD552CE00141AC0 /* AnalogClock */, E54213C7253891CB00CCC9C3 /* AppGroupWidget */, E54214182538B57400CCC9C3 /* CoreDataWidget */, E542139A2538806F00CCC9C3 /* CountdownWidget */, @@ -903,8 +927,10 @@ E580A5D72A6E9A270007BA39 /* Logger.swift in Sources */, E58BB8F12A62D92700DA8303 /* PersistenceController.swift in Sources */, E58BB8D32A62D89500DA8303 /* EnvironmentWidget+Entry.swift in Sources */, + E542EEDA2BD565CD00964BEB /* AnalogClockWidget+Provider.swift in Sources */, E58BB8C62A62D88500DA8303 /* CountdownWidget+Provider.swift in Sources */, E58BB8BF2A62D86D00DA8303 /* AppGroupWidget+EntryView.swift in Sources */, + E542EEDB2BD565CD00964BEB /* AnalogClockWidget.swift in Sources */, E5B345282A67E56900702B86 /* Delivery.swift in Sources */, E5DCA18E2A683DFC00C59A50 /* LiveActivityView+Icon.swift in Sources */, E58246912A64560D008180CC /* InteractiveWidget+EntryView.swift in Sources */, @@ -952,6 +978,7 @@ E58BB8BB2A62D86500DA8303 /* WidgetBundle.swift in Sources */, E58BB8F32A62E31900DA8303 /* IntentWidget+Entry.swift in Sources */, E58BB8C72A62D88500DA8303 /* CountdownWidget.swift in Sources */, + E542EED92BD565CD00964BEB /* AnalogClockWidget+EntryView.swift in Sources */, E58BB8C22A62D87200DA8303 /* CoreDataWidget.swift in Sources */, E58BB8F92A62E32C00DA8303 /* IntentWidget+Intent.swift in Sources */, E58BB8D12A62D89500DA8303 /* EnvironmentWidget.swift in Sources */, @@ -960,6 +987,7 @@ E57C3DEA2A66C8C2002CF144 /* Array+Extensions.swift in Sources */, E5B3453C2A682EB000702B86 /* Date+Extensions.swift in Sources */, E58BB8EC2A62D90C00DA8303 /* NetworkWidget.swift in Sources */, + E542EEDC2BD565CD00964BEB /* AnalogClockWidget+Entry.swift in Sources */, E582467F2A643D9B008180CC /* NetworkWidget+Provider.swift in Sources */, E58BB8EE2A62D90C00DA8303 /* WebRepository.swift in Sources */, E58BB8F02A62D92400DA8303 /* DataModel.xcdatamodeld in Sources */, @@ -1044,7 +1072,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Widgets/Supporting Files/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = Widgets; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2020-Present Paweł Wiszenko."; + INFOPLIST_KEY_NSHumanReadableCopyright = "© 2020-Present Paweł Wiszenko"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1077,7 +1105,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Widgets/Supporting Files/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = Widgets; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2020-Present Paweł Wiszenko."; + INFOPLIST_KEY_NSHumanReadableCopyright = "© 2020-Present Paweł Wiszenko"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Widgets/AnalogClock/AnalogClockWidget+Entry.swift b/Widgets/AnalogClock/AnalogClockWidget+Entry.swift new file mode 100644 index 0000000..1e1c9a6 --- /dev/null +++ b/Widgets/AnalogClock/AnalogClockWidget+Entry.swift @@ -0,0 +1,37 @@ +// The MIT License (MIT) +// +// Copyright (c) 2020-Present Paweł Wiszenko +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import WidgetKit + +extension AnalogClockWidget { + struct Entry: TimelineEntry { + var date: Date = .now + } +} + +// MARK: - Data + +extension AnalogClockWidget.Entry { + static var placeholder: Self { + .init() + } +} diff --git a/Widgets/AnalogClock/AnalogClockWidget+EntryView.swift b/Widgets/AnalogClock/AnalogClockWidget+EntryView.swift new file mode 100644 index 0000000..bc200ad --- /dev/null +++ b/Widgets/AnalogClock/AnalogClockWidget+EntryView.swift @@ -0,0 +1,118 @@ +// The MIT License (MIT) +// +// Copyright (c) 2020-Present Paweł Wiszenko +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import ClockRotationEffect +import SwiftUI + +extension AnalogClockWidget { + struct EntryView: View { + let entry: Entry + + var body: some View { + VStack(alignment: .leading) { + WidgetHeaderView(title: "Analog Clock") + Spacer() + contentView + Spacer() + } + .containerBackground(.clear, for: .widget) + } + } +} + +// MARK: - Content + +extension AnalogClockWidget.EntryView { + private var contentView: some View { + ZStack { + faceView + hourHandView + minuteHandView + secondHandView + knobView + } + } + + private var faceView: some View { + Circle() + .fill(.background) + .stroke(.gray) + .frame(width: 100, height: 100) + .frame(maxWidth: .infinity) + } + + private var hourHandView: some View { + RoundedRectangle(cornerRadius: 10) + .fill(gradient()) + .frame(width: 4, height: 50) + .clockRotation(.hourHand) + } + + private var minuteHandView: some View { + RoundedRectangle(cornerRadius: 10) + .fill(gradient()) + .frame(width: 3, height: 70) + .clockRotation(.miniuteHand) + } + + private var secondHandView: some View { + RoundedRectangle(cornerRadius: 10) + .fill(gradient()) + .frame(width: 2, height: 90) + .clockRotation(.secondHand) + } + + private var knobView: some View { + Circle() + .fill(.brown) + .frame(width: 3, height: 3) + } +} + +// MARK: - Helpers + +extension AnalogClockWidget.EntryView { + private func gradient() -> LinearGradient { + .init( + gradient: .init( + stops: [ + .init(color: .brown, location: 0.5), + .init(color: .clear, location: 0.5) + ] + ), + startPoint: .top, + endPoint: .bottom + ) + } +} + +extension View { + fileprivate func clockRotation(_ period: ClockRotationPeriod) -> some View { + modifier( + ClockRotationModifier( + period: period, + timezone: .current, + anchor: .center + ) + ) + } +} diff --git a/Widgets/AnalogClock/AnalogClockWidget+Provider.swift b/Widgets/AnalogClock/AnalogClockWidget+Provider.swift new file mode 100644 index 0000000..a41e110 --- /dev/null +++ b/Widgets/AnalogClock/AnalogClockWidget+Provider.swift @@ -0,0 +1,39 @@ +// The MIT License (MIT) +// +// Copyright (c) 2020-Present Paweł Wiszenko +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import WidgetKit + +extension AnalogClockWidget { + struct Provider: TimelineProvider { + func placeholder(in context: Context) -> Entry { + .placeholder + } + + func getSnapshot(in context: Context, completion: @escaping (Entry) -> Void) { + completion(.placeholder) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + completion(.init(entries: [.placeholder], policy: .never)) + } + } +} diff --git a/Widgets/AnalogClock/AnalogClockWidget.swift b/Widgets/AnalogClock/AnalogClockWidget.swift new file mode 100644 index 0000000..0f97a28 --- /dev/null +++ b/Widgets/AnalogClock/AnalogClockWidget.swift @@ -0,0 +1,45 @@ +// The MIT License (MIT) +// +// Copyright (c) 2020-Present Paweł Wiszenko +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import SwiftUI +import WidgetKit + +struct AnalogClockWidget: Widget { + private let kind = WidgetType.analogClock.kind + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { + EntryView(entry: $0) + } + .configurationDisplayName("Analog Clock Widget") + .description("Display an analog clock that animates the rotation of its hands.") + .supportedFamilies([.systemSmall]) + } +} + +// MARK: - Preview + +#Preview(as: .systemSmall) { + AnalogClockWidget() +} timeline: { + AnalogClockWidget.Entry.placeholder +} diff --git a/Widgets/AnalogClock/README.md b/Widgets/AnalogClock/README.md new file mode 100644 index 0000000..36ad173 --- /dev/null +++ b/Widgets/AnalogClock/README.md @@ -0,0 +1,7 @@ +# Analog Clock Widget + +Display an analog clock that animates the rotation of its hands. + +## Preview + +![Analog Clock Widget](../../.resources/Recordings/AnalogClockWidget.gif) diff --git a/Widgets/CountdownWidget/CountdownWidget+Entry.swift b/Widgets/CountdownWidget/CountdownWidget+Entry.swift index 74f0a39..b63ceae 100644 --- a/Widgets/CountdownWidget/CountdownWidget+Entry.swift +++ b/Widgets/CountdownWidget/CountdownWidget+Entry.swift @@ -33,7 +33,7 @@ extension CountdownWidget { // MARK: - CountdownState extension CountdownWidget.Entry { - enum CountdownState { + enum CountdownState: Codable { case counting case nearEnd case end diff --git a/Widgets/WidgetBundle.swift b/Widgets/WidgetBundle.swift index 18118bf..7b2ec2d 100644 --- a/Widgets/WidgetBundle.swift +++ b/Widgets/WidgetBundle.swift @@ -33,6 +33,7 @@ struct WidgetExamplesWidgetBundle: WidgetBundle { struct WidgetBundle1: WidgetBundle { var body: some Widget { + AnalogClockWidget() AppGroupWidget() CoreDataWidget() CountdownWidget()