{"id":18756235,"url":"https://github.com/simonberner/monthly-theme-widget","last_synced_at":"2025-09-01T13:31:54.418Z","repository":{"id":106073679,"uuid":"569797176","full_name":"simonberner/monthly-theme-widget","owner":"simonberner","description":"An iOS17+ Monthly Theme Widget 📅","archived":false,"fork":false,"pushed_at":"2023-12-16T15:05:31.000Z","size":3987,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-07T17:56:19.323Z","etag":null,"topics":["intents","widget"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simonberner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-23T16:26:40.000Z","updated_at":"2024-09-06T06:27:08.000Z","dependencies_parsed_at":"2023-12-16T16:24:53.615Z","dependency_job_id":"7a935dc7-f095-41b7-8191-d90a753af084","html_url":"https://github.com/simonberner/monthly-theme-widget","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonberner%2Fmonthly-theme-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonberner%2Fmonthly-theme-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonberner%2Fmonthly-theme-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonberner%2Fmonthly-theme-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simonberner","download_url":"https://codeload.github.com/simonberner/monthly-theme-widget/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231693385,"owners_count":18411894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["intents","widget"],"created_at":"2024-11-07T17:35:44.351Z","updated_at":"2024-12-29T01:58:52.220Z","avatar_url":"https://github.com/simonberner.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=center\u003eMonthly Theme Widget\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://en.wikipedia.org/wiki/IOS\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/iOS-17+-blue.svg?style=for-the-badge\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.swift.org/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Swift-5.9-brightgreen.svg?style=for-the-badge\u0026logo=swift\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://developer.apple.com/xcode/swiftui\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/SwiftUI-blue.svg?style=for-the-badge\u0026logo=swift\u0026logoColor=black\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://developer.apple.com/xcode\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Xcode-15.0-blue.svg?style=for-the-badge\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://mastodon.green/@simonberner\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Contact-@simonberner-orange?style=for-the-badge\" alt=\"mastodon.green/@simonberner\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://gitmoji.dev\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg?style=for-the-badge\" alt=\"Gitmoji\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/conventional-commits/conventionalcommits.org\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Conventional%20Commits-📝-lightgrey.svg?style=for-the-badge\" alt=\"Conventional Commits\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/license-MIT-black.svg?style=for-the-badge\" /\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\nA small project to learn the fundamentals of how to create a simple Widget with an intent and configuration for iOS 17+.\n\n---\n\n## Contents\n* [Functionality](#functionality)\n* [Tech Stack](#tech-stack)\n* [Frameworks](#frameworks)\n* [Device Compatibility](#device-compatibility)\n* [Screenshots](#screenshots)\n* [Learnings](#learnings)\n* [Code Comments](#code-comments)\n* [Pull Requests](#pull-requests)\n* [Credits](#credits)\n\n---\n\n## Functionality\nA simple Date Widget that changes the day at midnight and its theme every month. With iOS17+ it is also available in the [StandBy mode](https://support.apple.com/en-gb/guide/iphone/iph878d77632/ios).\n\n## Tech Stack\n- Xcode 15.0\n- Swift 5.9\n\n## Frameworks\n- SwiftUI\n- WidgetKit\n\n## Device Compatibility\n- iPhone with iOS 17+\n- iPad with iOS 17+\n\n## Screenshots\n| Widget Normal Font | Intent |\n| :---: | :---: |\n| \u003cimg src=\"AppScreenshots/MonthlyWidgetNormalFont.png\" height=\"100%\" width=\"100%\" \u003e | \u003cimg src=\"AppScreenshots/MonthlyWidgetIntent.png\" height=\"100%\" width=\"100%\" \u003e |\n\n| Configuration | Widget Fun Font |\n| :---: | :---: |\n| \u003cimg src=\"AppScreenshots/MonthlyWidgetConfiguration.png\" height=\"100%\" width=\"100%\" \u003e | \u003cimg src=\"AppScreenshots/MonthlyWidgetFunFont.png\" height=\"100%\" width=\"100%\" \u003e |\n\n| StandBy Mode (iOS17) |\n| :---: |\n| \u003cimg src=\"AppScreenshots/MonthlyWidgetStandBy.png\" height=\"100%\" width=\"100%\" \u003e |\n\n| Different Days Overview |\n| :---: |\n| \u003cimg src=\"AppScreenshots/MonthlyWidgetAll.png\" height=\"100%\" width=\"100%\" \u003e |\n\n## Learnings\n- A Widget comes in 4 \"fixed\" sizes: systemSmall, systemMedium, systemLarge, systemExtraLarge\n- The shape of a Widget is given\n- The content of a widget can only be implemented with SwiftUI (no UIKit)\n- The IntentTimelineProvider creates the timeline of the widget when to update its content:\n    - placehoder: dummy data (in case there is no data from the snapshot eg. network call needed)\n    - getSnapshot: how does the widget look right now (this state is shown in the widget gallery)\n    - getTimeline: this is where the timeline actually gets created. It consists of an Array of entries (the data)\n### Fonts\n- [Best Free Fonts for iOS app](https://sarunw.com/posts/free-fonts-ios/)\n- [List all fonts available on iOS device in console](https://gist.github.com/simonbromberg/24a48fb5e94b2bde82df1e5c97e733da)\n- [Old list of iOS fonts](http://iosfonts.com/)\n### Widget Intent \u0026 Configuration\n- 1. Create a intent definition file add some intents with parameters\n- 2. Add the IntentConfiguration to the Widget, which then takes in a IntentTimelineProvider\n\n## Code Comments\nI love putting in the effort of adding comments to my code, [here is why](https://www.youtube.com/watch?v=1NEa-OcsTow).\n\n## Pull Requests\nWhen I create PRs I stick to [this guideline](https://www.youtube.com/watch?v=_sfzAOfY8uc).\n\n## FAQ\n### Whats new for this App with iOS17?\n- App Intents for Widget-Configuration and interactive Widgets\n### Why is this App iOS17+ only?\n- Because I want to be able the new way of implementing App Intents in code rather than using the SiriKit definition file (prior to iOS17).\n- Because I don't want to fidle around with ``if #available(iOS 17, *) {...}``\n\n## Credits\n🙏🏽 Sean Allen iOS Courses\n\n\u003chr\u003e\n\u003cp align=\"center\"\u003e\nMade with a 🙂 \u003ca href=\"https://simonberner.dev\"\u003eSimon Berner\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonberner%2Fmonthly-theme-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonberner%2Fmonthly-theme-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonberner%2Fmonthly-theme-widget/lists"}