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.
+
+
+
## 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()